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

2024-05-15 14:32:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

其他一些信息:

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

问题

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

Tags: coordinate机器人positionrosrollorientationpitchangle
1条回答
网友
1楼 · 发布于 2024-05-15 14:32:53

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?

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

在使用pose_goal对象的情况下,需要通过设置xyz组件(即机器人在三维空间中的位置)来指定所需/目标机器人姿势的位置,然后还需要使用四元数表示法wx来指定所需/目标机器人姿势的方向y和{}设置{}的组件(注意{}、{}和{}四元数的部分与位置向量不同,它们是不同的东西)。一旦定义了{}和{}您就完成了,您就有了一个完整的姿势,可以发送给MoveIt!来计划和执行

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

这里,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)

请参见^{},其中aiajak分别为横摇、俯仰和偏航,axes参数定义了应用角度的顺序(这非常重要)

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

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

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

相关问题 更多 >