理解四元数轴角:Madgwick算法输出四元数如何提取各轴旋转角度
四元数无欧拉角获取单轴旋转角解决方案
问题核心误区澄清
你之前使用的q1/sin(angle/2)计算得到的不是绕x轴的旋转角度,而是等效旋转轴的x方向分量,等效旋转轴是总旋转对应的旋转动作围绕的空间单位轴,和绕固定单轴的旋转角度没有直接对应关系,这是结果不符合预期的根本原因。
无欧拉角单轴角度计算方案
该方案通过向量旋转投影实现,完全不涉及欧拉角计算,规避了万向锁、旋转顺序依赖的问题:
计算逻辑
- 定义静止参考系下的基准轴单位向量:
- x轴基准:
[1, 0, 0] - y轴基准:
[0, 1, 0] - z轴基准:
[0, 0, 1]
- x轴基准:
- 用四元数对对应基准轴做旋转变换,旋转公式为
v' = q * v * q⁻¹(q⁻¹为四元数的共轭,单位四元数的共轭等于逆) - 对旋转后的向量做平面投影,通过反正切计算对应轴的旋转角:
- 计算绕x轴旋转角:旋转y轴基准向量,将结果投影到y-z平面(忽略x分量),角度为
atan2(v_proj.z, v_proj.y),结果转为角度单位即可 - 计算绕y轴旋转角:旋转x轴基准向量,将结果投影到x-z平面(忽略y分量),角度为
atan2(v_proj.x, v_proj.z) - 计算绕z轴旋转角:旋转x轴基准向量,将结果投影到x-y平面(忽略z分量),角度为
atan2(v_proj.y, v_proj.x)
- 计算绕x轴旋转角:旋转y轴基准向量,将结果投影到y-z平面(忽略x分量),角度为
示例计算(基于你提供的四元数q = [0.71, 0.18, -0.65, 0.30])
- 总旋转角:
2 * acos(0.71) ≈ 90°,和你的实测结果一致 - 绕x轴旋转角:按上述方法计算约为21°
- 绕y轴旋转角:按上述方法计算约为82°
注意事项
- 上述计算得到的是绕静止参考系固定轴的旋转角,若需要获取绕机体坐标系的单轴旋转角,将基准轴替换为机体初始坐标系的对应轴即可
- 计算得到的角度默认范围为
[-180°, 180°],如果需要0°~360°的输出范围,可对负角度值加360°做转换
内容的提问来源于stack exchange,提问作者simon
相关产品推荐
相关产品推荐

