0

tl;dr:如何使用 ROS MoveIt 向 6 DOF 机器人手臂发送“移动到(x、y、z、roll、pitch、yaw)”命令?

我正在尝试使用 Python 移动组接口控制带有 ROS 和 MoveIt 的 Universal Robots UR5 6 自由度机械臂。我缺少基本的“如何将机器人末端执行器发送到这一点”控制。我将“末端执行器”解释为机器人的“手”。直观地说,我想使用以下方法使末端执行器移动:

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 Melodic
  • 在 RViz 和 Gazebo 中模拟 UR5 机械臂但也有物理手臂

问题

  • 我的研究表明,形式为 (x, y, z, w) 的四元数仅描述 3D 空间中的旋转。如果只获取旋转信息,机器人如何知道要移动到哪个位置?
  • 我可以从 (x, y, z, roll, pitch, yaw) 转换为四元数吗?还是那些描述了两种不同的事物?
  • 是否必须对四元数进行归一化以使平方和等于 1?如果是这样,我怎样才能告诉我的机器人手臂去空间中的一个物理点,比如(0.5m,0.3m,0m)?
  • 有人可以提供用四元数(4D)描述旋转(3D)的外行术语解释吗?
4

1 回答 1

1

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

正确,四元数仅描述框架的方向;您还需要指定框架的位置才能拥有完整的姿势。四元数只是描述物体方向的另一种方式,正如您已经提到的,另一种方式是使用欧拉角(Yaw,Pitch,Roll)。

对于您的对象,您需要通过设置,和组件(即机器人在 3D 空间中的位置)pose_goal来指定所需/目标机器人姿势的位置,然后还指定所需/目标机器人的方向通过使用四元数记法、和来设置姿势(请注意,四元数和部分四元数与您的位置向量不一样,它们是不同的东西)。一旦你定义了两者并完成了,你就有了一个完整的姿势,你可以发送到 MoveIt!计划和执行。xyzpose_goal.positionwxyzpose_goal.orientationxyzpose_goal.positionpose_goal.orientation

我可以从 (x, y, z, roll, pitch, yaw) 转换为四元数吗?还是那些描述了两种不同的事物?

在这里,x, y, z是您的位置向量,它与方向(因此与四元数)无关,所以您的问题应该是,“我可以将欧拉角(滚动、俯仰、偏航)转换为四元数吗?” 答案是,是的,您可以将欧拉角转换为四元数,但这可能很棘手。如果您可以使用四元数表示方向(即,如果您已经拥有此信息),您应该使用它,因为四元数在数值上更加稳健并且它们不会受到奇点的影响(例如,欧拉角可能会导致万向节锁定,在特定的配置您的系统会失去一定的自由度)。

如果您可以访问四元数,请使用它并忘记欧拉角,否则您可能想尝试使用 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参数定义了角度应用的顺序(这非常重要)

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

有人可以提供用四元数(4D)描述旋转(3D)的外行术语解释吗?

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

于 2020-03-24T22:10:38.373 回答