0

我正在使用 pyBox2D 对一个简单的差动驱动机器人(例如 e-Puck、Khepera 等)进行建模。这类机器人通常通过以弧度/秒为单位指示左右轮的速度来控制。
然而,Box2D 只能通过两个参数来控制(运动)体:线速度(以米/秒为单位,作为 2D 矢量)和角速度(以弧度/秒为单位)。我需要将我的轮速转换为线速度+角速度。

线速度实际上很简单。给定以米为单位的车轮半径 r,以弧度为单位的当前机器人方向 theta,前进速度只是两个车轮速度的平均值,以米/秒为单位,并根据当前方向减少为矢量:

(1) forwardSpeed = ((rightSpeed * r) + (leftSpeed * r)) / 2

(2) linearVelocity = (forwardSpeed * cos(theta), forwardSpeed * sin(theta))

不过,我无法完全弄清楚角速度的正确公式。直观地说,它应该是两个速度之间的差异,以车轮之间的距离为模:

(3) angularVelocity = (rightSpeed - leftSpeed)/wheelSeparation

在极限情况下:当 right = left 时,机器人在原地旋转,当 rightSpeed = 0 或 leftSpeed = 0 时,机器人围绕静止轮旋转(枢转),即在半径 = 的圆中轮子。

不过,我没有得到公式 (3) 的预期行为。作为测试,我将左轮速度设置为 0 并逐渐增加右轮速度的值。预期的行为是机器人应该以增加的速度围绕左轮旋转。相反,机器人以半径增加的圆圈旋转,即向外盘旋,这表明角速度不足。

请注意,我正在为机器人使用 Box2D 运动体,因此摩擦在我的结果中不起作用。

4

1 回答 1

0

请记住,Box2D 中的角速度在局部身体坐标中围绕原点 (0,0) 工作,这使得准确再现这种类型的运动非常尴尬。大概机器人的原点位于身体的中心,在这种情况下,您永远无法让它围绕一个轮子旋转(这需要旋转和平移)。实际上,将机器人建模为动态体并在车轮所在的位置施加力可能更容易。如果您不想处理摩擦损失等问题,您可以为每个车轮使用运动体,并通过旋转接头将它们连接到主(动态)体。

于 2015-03-25T20:48:52.430 回答