由自由体基座组成的机器人的广义速度的结构是什么?
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
时,广义速度矢量的顺序被交换了。更准确地说,顺序是:
- 基地的3个angular速度
- 基地
的3个线性速度
- 机器人手臂的其他 56 个广义速度
我对此很困惑,因为我可以使用 SetPositions
和 SetVelocities
以及上面的点 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
。请参考文档。
我在使用 Drake 库时遇到了一个理论性的问题。我的机器人由一个自由体底座(浮动底座)组成,它连接有一个由关节和连杆组成的传统机器人手臂。
假设这个机器人的广义状态向量大小为 63。(来自 Drake)。此状态向量的前 7 个条目是 3 个笛卡尔位置和方向的 4 个四元数。这意味着广义速度向量为 62(线性和 angular 速度为 6 个条目)。 如果我根据前面描述的顺序方案构建我的状态向量(首先是 3 个位置,其次是 4 个四元数,然后是机器人手臂的 56 个关节状态),然后相应地设置机器人的位置,那么 Drake 会运行并且不会给出任何错误。
然而,取机器人末端执行器的雅可比行列式给出了一个奇怪的不匹配。在我看来,当使用 CalcJacobianTranslationalVelocity
命令获取 Jacobian x_dot = J * q_dot
时,广义速度矢量的顺序被交换了。更准确地说,顺序是:
- 基地的3个angular速度
- 基地 的3个线性速度
- 机器人手臂的其他 56 个广义速度
我对此很困惑,因为我可以使用 SetPositions
和 SetVelocities
以及上面的点 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
。请参考文档。