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) 的四元数。
我做过/研究的一些事情:
- 让 ROS 通过 Move Group Python Interface
与机器人对话并移动机器人
- 一般理解what a quaternion is
- ROS documentation on quaternions
- What's a Quaternion Rotation (Stack Overflow)
一些其他信息:
- 运行 ROS Melodic Ubuntu 18.04
- 在 RViz 和 Gazebo 中模拟 UR5 机器人手臂但也有物理手臂
问题
- 我的研究表明形式为 (x, y, z, w) 的四元数仅描述 3D space 中的旋转。如果机器人只得到旋转信息,它怎么知道要移动到什么位置?
- 我可以将 (x, y, z, roll, pitch, yaw) 转换为四元数吗?或者它们描述的是两种不同的东西吗?
- 是否必须对四元数进行归一化以使平方和等于一?如果是这样,我如何告诉我的机器人手臂去 space 中的一个物理点,比如 (0.5m, 0.3m, 0m)?
- 有人可以提供用四元数 (4D) 描述旋转 (3D) 的外行术语解释吗?
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
对象,您需要通过设置 x
、y
和 [=14] 来指定 desired/goal 机器人姿势的位置=] pose_goal.position
的组件(即机器人在 3D 中的位置 space),然后还使用四元数符号 w
指定 desired/goal 机器人姿势的方向, x
、y
和 z
设置 pose_goal.orientation
的组件(注意 x
、y
和 z
部分四元数与您的位置向量不同,它们是不同的东西)。一旦你定义了 pose_goal.position
和 pose_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')
,其中ai
、aj
、ak
分别是roll、pitch和yaw,axes
参数定义了应用角度(这非常重要)
(我自己还没有测试过,但可能值得努力)
Can someone provide a layman's terms explanation of describing
rotation (3D) with a quaternion (4D)?
四元数有点复杂,但是有一个很棒的视频 here 以交互方式解释了它们。一般来说,根据我的经验,四元数一开始可能会有点令人沮丧,你可能会发现最初很难掌握这个概念,所以在学习它们时记住这一点并耐心等待!
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) 的四元数。
我做过/研究的一些事情:
- 让 ROS 通过 Move Group Python Interface 与机器人对话并移动机器人
- 一般理解what a quaternion is
- ROS documentation on quaternions
- What's a Quaternion Rotation (Stack Overflow)
一些其他信息:
- 运行 ROS Melodic Ubuntu 18.04
- 在 RViz 和 Gazebo 中模拟 UR5 机器人手臂但也有物理手臂
问题
- 我的研究表明形式为 (x, y, z, w) 的四元数仅描述 3D space 中的旋转。如果机器人只得到旋转信息,它怎么知道要移动到什么位置?
- 我可以将 (x, y, z, roll, pitch, yaw) 转换为四元数吗?或者它们描述的是两种不同的东西吗?
- 是否必须对四元数进行归一化以使平方和等于一?如果是这样,我如何告诉我的机器人手臂去 space 中的一个物理点,比如 (0.5m, 0.3m, 0m)?
- 有人可以提供用四元数 (4D) 描述旋转 (3D) 的外行术语解释吗?
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
对象,您需要通过设置 x
、y
和 [=14] 来指定 desired/goal 机器人姿势的位置=] pose_goal.position
的组件(即机器人在 3D 中的位置 space),然后还使用四元数符号 w
指定 desired/goal 机器人姿势的方向, x
、y
和 z
设置 pose_goal.orientation
的组件(注意 x
、y
和 z
部分四元数与您的位置向量不同,它们是不同的东西)。一旦你定义了 pose_goal.position
和 pose_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')
,其中ai
、aj
、ak
分别是roll、pitch和yaw,axes
参数定义了应用角度(这非常重要)
(我自己还没有测试过,但可能值得努力)
Can someone provide a layman's terms explanation of describing rotation (3D) with a quaternion (4D)?
四元数有点复杂,但是有一个很棒的视频 here 以交互方式解释了它们。一般来说,根据我的经验,四元数一开始可能会有点令人沮丧,你可能会发现最初很难掌握这个概念,所以在学习它们时记住这一点并耐心等待!