首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ROS / MoveIt中四元数的实用理解

ROS / MoveIt中四元数的实用理解
EN

Stack Overflow用户
提问于 2020-03-24 22:02:42
回答 1查看 7.6K关注 0票数 0

博士:如何使用ROS MoveIt发送一个6自由度的机器人手臂“移动到(x,y,z,滚,俯仰,偏航)”命令?

我正试图使用,用ROS和MoveIt控制一个通用机器人6自由度机器人手臂。我错过了基本的“如何发送机器人末端执行器到这一点”的控制。我把“末端执行器”解释为机器人末端的“手”。直觉上,我想让末端效应器移动,使用如下所示:

代码语言:javascript
复制
pose_goal.position.x = x_coordinate # x, y, z, r, p, y are in a fixed reference frame
pose_goal.position.y = y_coordinate
pose_goal.position.z = z_coordinate
pose_goal.orientation.roll = roll_angle
pose_goal.orientation.pitch = pitch_angle
pose_goal.orientation.yaw = yaw_angle

move_group.set_pose_target(pose_goal)
plan = move_group.go(wait=True)

但是,geometry_msgs.msg.Pose()对象需要格式为(x,y,z,w)的四元数。

我做过/研究过的一些事情:

其他信息:

  • 在Ubuntu 18.04上运行ROS旋律
  • 在UR5和Gazebo中模拟RViz机器人手臂,但也有物理手臂

问题

  • 我的研究表明,四元数的形式(x,y,z,w)只描述3D空间中的旋转。如果机器人只获得旋转信息,它如何知道移动到哪个位置?
  • 我能从(x,y,z,滚,俯仰,偏航)转换成四元数吗?或者这些描述了两种不同的东西?
  • 四元数是否必须标准化,使平方之和等于1?如果是这样的话,我怎样才能告诉我的机器人手臂到达空间中的物理点,比如(0.5m,0.3m,0m)?
  • 有人能用四元数(4D)来解释旋转(3D)的外行术语吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-24 22:10:38

我的研究表明,四元数的形式(x,y,z,w)只描述3D空间中的旋转。如果机器人只获得旋转信息,它如何知道移动到哪个位置?

正确,四元数只描述框架的方向;您还需要指定框架的位置才能有完整的姿态。四元数只是一个不同的方式来描述一个物体的方向,另一种方式是,正如你已经提到的,使用欧拉角(偏航,音调,滚动)。

在使用pose_goal对象的情况下,您需要通过设置pose_goal.positionxyz组件(这是机器人在3D空间中的位置)来指定期望的/目标机器人姿态的位置,然后使用四元数表示法wxyz来设置pose_goal.orientation的组件(注意xyd14部分与您的位置向量不相同)来指定所需的机器人/目标机器人姿态的方向。一旦你同时定义了pose_goal.position和pose_goal.orientation,你就有了一个完整的姿势,可以发送到MoveIt!计划和执行。

我能从(x,y,z,滚,俯仰,偏航)转换成四元数吗?或者这些描述了两种不同的东西?

在这里,x, y, z,你的位置矢量与方向无关(因此与四元数无关),所以你的问题应该是,“我能把欧拉角(滚动,俯仰,偏航)转换成四元数吗?”答案是,是的,你可以把欧拉角转换成四元数,但这可能很棘手。如果您可以使用四元数表示方向(即,如果您已经有此信息),您应该使用它,因为四元数更健壮,而且它们没有奇异性(例如,欧拉角可能导致Gimbal锁,在特定的配置下,系统失去了一定程度的自由度)。

如果您可以访问四元数,使用它并忘记欧拉角,否则您可能想尝试使用ROS的tf库使用以下方式将欧拉角转换为四元数:

代码语言:javascript
复制
from tf.transformations import quaternion_from_euler

# Pose Position
pose_goal.position.x = x_coordinate
pose_goal.position.y = y_coordinate
pose_goal.position.z = z_coordinate

# Pose Orientation
quaternion = quaternion_from_euler(roll_angle, pitch_angle, yaw_angle)

pose.orientation.x = quaternion[0]
pose.orientation.y = quaternion[1]
pose.orientation.z = quaternion[2]
pose.orientation.w = quaternion[3]

move_group.set_pose_target(pose_goal)
plan = move_group.go(wait=True)

参见tf.transformations.quaternion_from_euler(ai, aj, ak, axes='sxyz'),其中ai、aj、ak分别为滚动、俯仰和偏航,axes参数定义了应用角度的顺序(这非常重要)。

(还没有亲自测试过,但可能值得一试)

有人能用四元数(4D)来解释旋转(3D)的外行术语吗?

四元数是有点复杂,但有一个伟大的视频这里解释他们的互动方式。一般来说,在我的经验中,四元数在一开始可能会有点令人沮丧,你可能会发现最初很难理解这个概念,所以在学习时要记住这一点,并且要有耐心!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60840019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档