【问题标题】:Differential drive robots: converting wheel speeds to lin/ang velocities差速驱动机器人:将轮速转换为直线/直线速度
【发布时间】:2015-03-24 07:05:51
【问题描述】:

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

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

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

(2) 线性速度 = (forwardSpeed * cos(theta), forwardSpeed * sin(theta))

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

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

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

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

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

【问题讨论】:

    标签: box2d robotics kinematics


    【解决方案1】:

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

    【讨论】:

    • 看来我必须采纳您的建议并转向动态实体,因为我无法让超级简单的运动学版本工作。不过,问题是:如何制作一个旋转关节,将机器人的 2D 身体与 90 度的轮子连接起来?我不需要第三维来做吗?换句话说,轮子必须围绕 z 轴旋转才能推动机器人前进,但 Box2D 没有 z 轴,对吧?对不起,如果这个问题听起来很傻,但我对 Box2D 很陌生
    • 我想我可能忘记强调我在自上而下模式下使用 Box2D(即重力 = 0)。因此,我对如何通过旋转接头实现轮子感到困惑。
    • 没关系,找到你的教程:link :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2021-11-14
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    相关资源
    最近更新 更多