【发布时间】:2020-08-29 09:38:15
【问题描述】:
设置是提供四元数和欧拉角的测量设备。测量装置安装在一个圆盘上,该圆盘本身安装在一个臂上。手臂可以上下旋转,同时固定在一端,大约 240 度,因为它坐在一个吊舱上。圆盘可顺时针和逆时针旋转,双向无限旋转。
左边是侧视图,右边是顶视图。我想测量的可能旋转被绘制为箭头。
目标显示两个值,一个用于手臂角度,另一个用于圆盘旋转角度,均介于 -180 和 180 之间度数。
测量设备数据的旋转顺序是ZYX(roll, pitch, yaw),四元数是WXYZ。 X 向东为正,Y 向北,Z 向顶部。测量装置本身的旋转顺序不固定(手臂和圆盘运动可以混合)。
我知道欧拉角是相对于物体的,因此当物体旋转时会发生变化。此外,我了解轮换顺序很重要。我读到反转旋转顺序(到 XYZ)会给我外在旋转(= 用于基于世界的不变轴而不是对象的内在轴获得对象的相同末端方向的旋转),但我有不知道是否/如何使用它来解决我的问题。
我没有找到任何 python 函数来实现我的目标,并且不了解走这条路所需的数学。我是否忽略了解决该问题的简单方法?如果没有,你会怎么处理?
EDIT1:找到了计算臂角的解决方案:
- 定义基向量 (0,0,1),即中性位置的 z 轴(表示手臂与地球平行)
- 通过将设备的四元数定义的旋转应用于基向量来获取当前 z 轴
- 使用 arccos(numpy.clip(dot(rotatedVectorZ, baseVectorZ), -1.0, 1.0)) 计算原始 z 轴与旋转后的 z 轴之间的角度,该角度等于 arm 角度。
计算出的角度永远不会是负数,因此每个值都有两个可能的位置,但这对我的情况来说已经足够了。
对于计算旋转角度,我的想法是通过将z设置为0,然后对向量进行归一化,将x向量投影到x-y平面,然后计算(1,0 ,0) 轴和投影矢量,但这不起作用,因为在接近 90 度的臂角有一些偏移。
现在我正在考虑旋转设备的 x,y,z 坐标(我通过将四元数定义的旋转应用于每个向量 (1,0,0)、(0,1,0) 和(0,0,1)) 在球体中以 z 轴对齐的方式,这将使我能够计算原始 x 轴 (1,0,0) 和旋转轴之间的差异,但我不是确定这是否按预期工作。
编辑 2:找到一种确定磁盘旋转角度的工作方法在 0 到 180 度之间:
- 定义基向量 (1,0,0),即中性位置的 x 轴(表示圆盘不旋转)
- 通过将设备四元数定义的旋转应用于基向量来获取当前 x 轴
- 通过计算垂直于原始 z 轴(即 0,0,1)和当前 z 轴(等于 0,0,1)和应用设备的当前四元数值)
- 标准化该轴向量并计算将当前 z 轴旋转到原始 z 轴 (0,0,1) 的四元数
- 使用该四元数来旋转当前的 x 轴(参见步骤 2)。这会模拟手臂移动到与地球平行的位置。
- 计算新 x 轴与基础 x 轴 (1,0,0) 之间的角度
现在我们有了圆盘在 180 度空间中的旋转角度。
编辑 3: 找到了 最终解决方案,以获取 0 到 360 度之间的旋转角度。我们可以使用 arctan2(determinant, dot(current_x-vector, base_x-axis)),而不是使用点积的 arccos,因为现在两个向量都在同一个平面上(z 为 0)。
【问题讨论】:
-
您能否发布一些来自您设备的四元数和欧拉角输出示例?
-
这里是设备返回的一些四元数值@JamesTursa:
[0.7934709, 0.006922651, 0.016842736, 0.60833573] [-0.24577184, 0.015660709, -0.0057019624, 0.96918446] [-0.23589617, -0.24023984, 0.22534007, 0.9142537] [-0.92398167, 0.22448266, 0.24135745, -0.19393821] [-0.71125966, 0.45272928, 0.5107461, -0.16817938] [-0.31564975, 0.68132704, -0.023805361, -0.659994]
标签: python math quaternions robotics euler-angles