【问题标题】:Controlling orientation using a quaternion使用四元数控制方向
【发布时间】:2014-04-27 21:00:15
【问题描述】:

为了控制机械臂,我有一个具有 6 个维度(x、y、z 位置以及滚动、俯仰、偏航旋转)的控制器。我使用位置 (x, y, z) 和四元数 (x, y, z, w) 来表示机器人夹具的所需位置和方向。

我正在使用一些人们可能不熟悉的库(即来自 ROS 的 geometry_msgs),所以这是我在伪代码中所做的:

while(true):
  new_position = last_position + (joy.x, joy.y, joy.z)
  new_quaternion = last_quaternion * quaternionFromRPY(joy.roll, joy.pitch, joy.yaw)

  // (Compute inverse kinematics using position and orientation, then send to robot arm)

  last_position = new_position
  last_quaternion = new_quaternion

  delay(dt)

我可以很好地设置姿势位置部分的 x、y 和 z。从技术上讲,我也可以很好地设置四元数,但我的问题是控制四元数非常不直观,因为旋转不是可交换的。即,如果我绕 x 轴旋转 180 度,则绕 z 轴的旋转控制会反转。

如果有意义的话,有什么方法可以让我从某种“全局参考框架”控制旋转?我希望这样,如果我将操纵杆绕 z 顺时针旋转,姿势将相应旋转,而不是“有时顺时针旋转,有时逆时针旋转”。

【问题讨论】:

  • 高度建议您使用 ROS 的 transform 库。它让你做你想做的事变得更加容易,包括将四元数转换为任意帧中的标准齐次变换矩阵。
  • 您是否尝试从输入交换当前旋转和旋转的乘法顺序?

标签: linear-algebra quaternions ros inverse-kinematics


【解决方案1】:

这不就像交换四元数积中的因子顺序一样简单吗?

单位四元数q 将局部坐标中的向量v 转换为全局坐标中的旋转向量q*v*q'。修改后的四元数 a*q*ba, b 也是单位四元数)将 v 转换为

a*(q*(b*v*b')*q')*a', 

b 部分可以解释为局部坐标的旋转,a 部分可以解释为全局坐标的旋转。

所以要仅在全局坐标中应用旋转,请设置 b=1,即,将其排除在外,并将所需的旋转放入 a 因子中。

【讨论】:

    猜你喜欢
    • 2019-11-08
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 1970-01-01
    相关资源
    最近更新 更多