由自由体基座组成的机器人的广义速度的结构是什么?

What is the structure of the generalized velocities of a robot consisting of a free body base?

我在使用 Drake 库时遇到了一个理论性的问题。我的机器人由一个自由体底座(浮动底座)组成,它连接有一个由关节和连杆组成的传统机器人手臂。

假设这个机器人的广义状态向量大小为 63。(来自 Drake)。此状态向量的前 7 个条目是 3 个笛卡尔位置和方向的 4 个四元数。这意味着广义速度向量为 62(线性和 angular 速度为 6 个条目)。 如果我根据前面描述的顺序方案构建我的状态向量(首先是 3 个位置,其次是 4 个四元数,然后是机器人手臂的 56 个关节状态),然后相应地设置机器人的位置,那么 Drake 会运行并且不会给出任何错误。

然而,取机器人末端执行器的雅可比行列式给出了一个奇怪的不匹配。在我看来,当使用 CalcJacobianTranslationalVelocity 命令获取 Jacobian x_dot = J * q_dot 时,广义速度矢量的顺序被交换了。更准确地说,顺序是:

  1. 基地的3个angular速度
  2. 基地
  3. 的3个线性速度
  4. 机器人手臂的其他 56 个广义速度

我对此很困惑,因为我可以使用 SetPositionsSetVelocities 以及上面的点 1. 和 2. 的状态和速度向量来操纵和设置机器人的状态名单被交换了。 我错过了什么吗?

提前感谢您的帮助,

此致,

罗伯特

我们遵循 angular 数量先于平移数量的惯例。对于浮动基数,这意味着四个四元数在 xyz 转换之前出现,就像您在速度中看到的那样。

可能最安全的方法(就保证正确性而言)是使用上下文和 Drake 的 API 来做到这一点。例如。您可以将 MBP::SetFreeBodySpatialVelocity() 用于您的浮动底座和 Joint 方法用于手臂的其余部分(例如 RevoluteJoint::set_angular_rate()。完成后,您可以使用 MultibodyPlant::GetVelocities().[=20 检索一致的速度矢量=]

如果您想要一种更基于“索引”的方法,您可以执行以下操作。 每个浮体的自由度都从 Body::floating_velocities_start() 开始(请阅读文档,这是针对完整状态向量的。按照@sherm 在上一个答案中描述的顺序排列的 6 个数字)。 对于关节,您可以检索 Joint::velocity_start()Joint::num_velocities().

警告:虽然 Body::floating_velocities_start() 索引完整状态向量 x,但 Joint::velocity_start() 仅索引广义速度向量 v。请参考文档。