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

Python 对ROS/MoveIt中四元数的实际理解,python,ros,quaternions,moveit,Python,Ros,Quaternions,Moveit,tl;dr:如何使用ROS MoveIt向6自由度机器人手臂发送“移动到(x、y、z、滚动、俯仰、偏航)”命令? 我正在尝试使用Python移动组界面,用ROS和MoveIt控制通用机器人UR5 6自由度机械臂。我缺少基本的“如何将机器人末端执行器发送到此点”控制。我把“末端效应器”解释为机器人末端的“手”。直观地说,我希望使用以下方法移动末端效应器: pose_goal.position.x = x_coordinate # x, y, z, r, p, y are in a fixed re

tl;dr:如何使用ROS MoveIt向6自由度机器人手臂发送“移动到(x、y、z、滚动、俯仰、偏航)”命令?

我正在尝试使用Python移动组界面,用ROS和MoveIt控制通用机器人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)的四元数

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

  • 让ROS和机器人说话并移动机器人穿过
其他一些信息:

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

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

正确,四元数仅描述帧的方向;您还需要指定帧的位置以获得完整的姿势。四元数只是描述物体方向的一种不同方式,另一种方式是,正如您已经提到的,使用欧拉角(偏航、俯仰、滚动)

对于您的
pose\u-goal
对象,您需要通过设置
pose\u-goal.position的
x
y
z
组件来指定所需/目标机器人姿势的位置(即机器人在三维空间中的位置)然后还可以使用四元数表示法
w
x
y
z
来指定所需/目标机器人姿势的方向,以设置
pose\u目标的组件。方向
(请注意,四元数的
x
y
z
部分与您的位置向量不一样,它们是不同的东西)。一旦您定义了
pose\u目标。position
pose\u目标。定向
之后,您就有了一个完整的姿势,可以发送到MoveIt!来计划和执行

我可以将(x、y、z、滚动、俯仰、偏航)转换为四元数吗?或者 这些描述了两种不同的东西

这里,
x,y,z
,是与方向无关的位置向量(因此与四元数无关),所以你的问题应该是,“我可以将欧拉角(横摇、俯仰、偏航)转换为四元数吗?”答案是,你可以将欧拉角转换成四元数,但这可能很棘手。如果你可以用四元数来表示方向(即,如果你已经有了这个信息),你应该使用它,因为四元数在数值上更稳健,而且不会出现奇异现象(例如,欧拉角可能导致万向节锁,在特定配置下,系统会失去一定的自由度)

如果您有权访问四元数,请使用它并忘记Euler角度,否则您可能希望尝试使用ROS的
tf
库使用以下方法将Euler角度转换为四元数:

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)
参见此处,
ai
aj
ak
分别为横摇、俯仰和偏航,
参数定义了应用角度的顺序(这非常重要)

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

有人能提供一个外行的术语来解释 用四元数(4D)旋转(3D)


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

太好了,谢谢!这有助于打破我对四元数的理解问题分为两部分:如何发送位置和如何发送旋转/方向。我现在对四元数或至少从欧拉角度转换感到满意,但我仍然不确定如何向机器人发送位置命令。我如何告诉机器人如何移动到空间中完全定义的位置和方向?您定义了此信息吗在你的
pose\u目标中。定位
对象。你还需要将方向指定为四元数,而不是欧拉角。一旦你设置了
pose\u目标的这些属性,并将其作为目标发送到MoveIt!然后MoveIt!将完成剩下的工作(找到姿势的反向运动学解,然后规划轨迹将UR5移动到那里)。此外,当你说“将其分解为两个问题”时,你不需要这样做。姿势(即,你的
pose\u目标
)定义了机器人末端效应器在空间中的位置和方向(它告诉位置和方向)。就是这样。你只需发送此姿势(这又是位置和方向的结合)给一个计划者,它会找到一个解决方案并执行它。现在你指出了它,它的工作原理非常简单。
pose\u-goal。position
有组件
x,y,z
pose\u-goal.o