ROS / MoveIt 中四元数的实际理解

Practical Understanding of Quaternions in ROS / MoveIt

tl;dr:如何使用 ROS MoveIt 向 6 自由度机器人手臂发送 "move to (x, y, z, roll, pitch, yaw)" 命令?

我正在尝试使用 Python 移动组界面,使用 ROS 和 MoveIt 控制 Universal Robots UR5 6 自由度机器人手臂。我缺少基本的 "how to send robot end effector to this point" 控件。我将 "end effector" 解释为机器人最后的 "hand"。直觉上,我想使用类似以下的方法使末端执行器移动:

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) 的四元数。

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

一些其他信息:

问题

My research says that a quaternion of form (x, y, z, w) describes rotation in 3D space only. How does the robot know what position to move to if it only gets rotation information?

正确,四元数描述了框架的方向;您还需要指定框架的位置以获得 complete 姿势。四元数只是描述物体方向的另一种方式,正如您已经提到的,另一种方式是使用 Euler Angles(Yaw、Pitch、Roll)。

对于 pose_goal 对象,您需要通过设置 xy 和 [=14] 来指定 desired/goal 机器人姿势的位置=] pose_goal.position 的组件(即机器人在 3D 中的位置 space),然后还使用四元数符号 w 指定 desired/goal 机器人姿势的方向, xyz 设置 pose_goal.orientation 的组件(注意 xyz 部分四元数与您的位置向量不同,它们是不同的东西)。一旦你定义了 pose_goal.positionpose_goal.orientation 你就完成了,你有一个完整的姿势,你可以发送到 MoveIt!计划和执行。

Can I convert from (x, y, z, roll, pitch, yaw) to a quaternion? Or do those describe two different things?

这里,x, y, z,是你的位置向量,它与方向无关(因此与四元数无关),所以你的问题应该是,"Can I convert Euler angles (roll, pitch, yaw) to a quaternion?",答案是,是的您可以将欧拉角转换为四元数,但这可能很棘手。如果您可以使用四元数表示方向(即,如果您已经有此信息),您应该使用它,因为四元数在数值上更稳健并且它们不受奇异性的影响(例如,欧拉角可能导致万向节锁在特定的位置配置你的系统失去了一定的自由度)。

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

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'),其中aiajak分别是roll、pitch和yaw,axes参数定义了应用角度(这非常重要)

(我自己还没有测试过,但可能值得努力)

Can someone provide a layman's terms explanation of describing rotation (3D) with a quaternion (4D)?

四元数有点复杂,但是有一个很棒的视频 here 以交互方式解释了它们。一般来说,根据我的经验,四元数一开始可能会有点令人沮丧,你可能会发现最初很难掌握这个概念,所以在学习它们时记住这一点并耐心等待!