微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

  1. 基础的 3 个速度
  2. 基础的 3 个线速度
  3. 来自机械臂的其他 56 个广义速度

我对此感到非常困惑,因为我可以使用 SetPositionsSetVeLocities 以及上面列表中的点 1. 和 2. 所在的状态和速度向量来操纵和设置机器人的状态交换。 我错过了什么吗?

提前感谢您的帮助,

最好的问候,

罗伯特

解决方法

我们遵循角量先于平移量的惯例。对于浮动基数,这意味着四个四元数在 xyz 平移之前,正如您在速度中看到的那样。

,

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。