Python 对ROS/MoveIt中四元数的实际理解
tl;dr:如何使用ROS MoveIt向6自由度机器人手臂发送“移动到(x、y、z、滚动、俯仰、偏航)”命令? 我正在尝试使用Python移动组界面,用ROS和MoveIt控制通用机器人UR5 6自由度机械臂。我缺少基本的“如何将机器人末端执行器发送到此点”控制。我把“末端效应器”解释为机器人末端的“手”。直观地说,我希望使用以下方法移动末端效应器: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
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)的外行术语吗
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