如何计算欧拉姿态对应的连续单轴横滚与俯仰旋转角度
解决方案:从目标姿态反推先横滚后俯仰的单轴旋转角度
核心思路
已知从初始姿态[0,0,0]先执行X轴横滚旋转y,再执行Y轴俯仰旋转x后得到目标姿态,我们可以通过四元数的复合旋转关系反向推导x和y的值:
- 先横滚(X轴)的四元数:
q_roll = [cos(y/2), sin(y/2), 0, 0] - 再俯仰(Y轴)的四元数:
q_pitch = [cos(x/2), 0, sin(x/2), 0] - 总姿态四元数为两者的乘积:
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
相关产品推荐
相关产品推荐

