我正在使用 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 运动体,因此摩擦在我的结果中不起作用。