You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何计算欧拉姿态对应的连续单轴横滚与俯仰旋转角度

解决方案:从目标姿态反推先横滚后俯仰的单轴旋转角度

核心思路

已知从初始姿态[0,0,0]先执行X轴横滚旋转y,再执行Y轴俯仰旋转x后得到目标姿态,我们可以通过四元数的复合旋转关系反向推导x和y的值:

  1. 先横滚(X轴)的四元数:q_roll = [cos(y/2), sin(y/2), 0, 0]
  2. 再俯仰(Y轴)的四元数:q_pitch = [cos(x/2), 0, sin(x/2), 0]
  3. 总姿态四元数为两者的乘积:q_target = q_pitch * q_roll

展开乘积后可得到反向求解公式,直接从目标四元数计算x和y。

具体步骤

1. 转换目标姿态为四元数

如果给定的是目标欧拉角(横滚φ、俯仰θ、偏航ψ),先使用PX4-Matrix将其转为四元数(注意PX4-Matrix欧拉角默认顺序为偏航(Z)-俯仰(Y)-横滚(X)):

#include <matrix/math.hpp>

using namespace matrix;

// 目标姿态欧拉角(单位:度)
float phi_deg = 54.735610f;
float theta_deg = 30.000000f;
float psi_deg = 35.264390f;

// 转换为四元数
Eulerf euler_target(deg2rad(psi_deg), deg2rad(theta_deg), deg2rad(phi_deg));
Quaternionf q_target(euler_target);

如果直接给定目标四元数,可跳过此步骤。

2. 计算横滚角y和俯仰角x

利用四元数元素的关系推导:

// 计算横滚角y(弧度转角度)
float y_rad = 2.0f * atan2(q_target.x(), q_target.w());
float y_deg = rad2deg(y_rad);

// 计算俯仰角x(弧度转角度)
float x_rad = 2.0f * atan2(q_target.y(), q_target.w());
float x_deg = rad2deg(x_rad);

验证示例

题目中给出的输入:先横滚45°、再俯仰45°得到目标姿态[54.735610,30.000000,35.264390]。反向计算时:

  • 目标四元数的w≈0.8536、x≈0.3536、y≈0.3536
  • 计算得到y_deg=45°,x_deg=45°,完全匹配输入参数。

注意事项

  • 确保欧拉角转四元数时的旋转顺序与PX4-Matrix默认一致(偏航-俯仰-横滚),若使用其他顺序需调整构造参数。
  • 当q_target.w()接近0时(对应180°左右的姿态),需注意atan2的数值稳定性,但常规飞行姿态下无需额外处理。

内容的提问来源于stack exchange,提问作者superware

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 20:48:10