基于加速度计与磁力计的姿态解算方法(加计补偿偏航)

附上转载文章链接
加速度计实时输出机体坐标系下的三轴线加速度,磁力计实时输出机体坐标系下的三轴地磁强度,加速度计能解算出俯仰角与横滚角,由磁力计计算出航向角,两者相互配合可以解算三个姿态角信息。

1.计算roll和pitch
当多旋翼无人机在地理坐标系中静止时, 加速度计的量测输出为:
a n = [ 0 0 g ] T a_n = [0 \quad 0 \quad g]^T an=[00g]T
其中g 为重力加速度。

当多旋翼无人机处于任意姿态时,加速度计在机体坐标系中的测量输出为:
a b = [ a x a y a z ] T a_b=[a_x \quad a_y \quad a_z]^T ab=[axayaz]T

我们知道地理坐标系的速度可以通过旋转矩阵得到机体坐标系下的数据:
[ a x a y a z ] = C b n [ 0 0 g ] = [ c o s ψ c o s θ s i n ψ c o s θ − s i n θ c o s ψ s i n θ s i n γ − s i n ψ c o s γ s i n ψ s i n θ s i n γ + c o s ψ c o s γ c o s θ s i n γ c o s ψ s i n θ c o s γ + s i n ψ s i n γ s i n ψ s i n θ c o s γ − c o s ψ s i n γ c o s θ c o s γ ] [ 0 0 g ] = [ − g s i n θ g c o s θ s i n γ g c o s θ c o s γ ] \begin{bmatrix}a_x \\ a_y \\ a_z\end{bmatrix} = \textbf{C}_b^n \begin{bmatrix}0 \\ 0 \\ g\end{bmatrix} \\ =\begin{bmatrix} cosψcosθ & sinψcosθ & −sinθ \\ cosψsinθsinγ−sinψcosγ & sinψsinθsinγ+cosψcosγ & cosθsinγ \\ cosψsinθcosγ+sinψsinγ & sinψsinθcosγ−cosψsinγ & cosθcosγ \end{bmatrix} \begin{bmatrix}0 \\ 0 \\ g\end{bmatrix} \\ =\begin{bmatrix}−gsinθ \\ gcosθsinγ \\ gcosθcosγ\end{bmatrix} axayaz =Cbn 00g = cosψcosθcosψsinθsinγsinψcosγcosψsinθcosγ+sinψsinγsinψcosθsinψsinθsinγ+cosψcosγsinψsinθcosγcosψsinγsinθcosθsinγcosθcosγ 00g = gsinθgcosθsinγgcosθcosγ

所以:
θ = a r c s i n ( − a x g ) γ = a r c t a n ( a y a z ) θ=arcsin(-\frac{a_x}{g}) \\ γ=arctan(\frac{a_y}{a_z}) θ=arcsin(gax)γ=arctan(azay)
2.计算yaw
多旋翼无人机在地理坐标系( 导航坐标系) 下磁感应强度表示为:
m n = [ m x n m y n m z n ] T \textbf{m}_n=[m^n_x \quad m^n_y \quad m^n_z]^T mn=[mxnmynmzn]T
地磁场是一个矢量,对于一个固定的地点来说,这个矢量可以被分解为两个与当地水平面(即地理坐标系的xy平面)平行的分量和一个与当地水平面(即地理坐标系的xy平面)垂直的分量。

如果保持电子罗盘和当地的水平面平行,那么罗盘中磁力计的三个轴就和这三个分量对应起来,即罗盘水平状态下,测量的三个轴数据就是机体系下的地磁分量,因为此时罗盘所在的坐标系的x,y,z轴和机体系以及地理坐标系的指向是一致的。

对水平方向的两个分量来说,他们的矢量和总是指向磁北的,所以我们只需要水平的磁力分量即可算出传感器x轴与磁北的夹角:
ψ m = a r c t a n ( m y n m x n ) ψ_m=arctan(\frac{m_y^n}{ m^n_x}) ψm=arctan(mxnmyn)
如果我们认为磁北是0度,那我们就可以得到当前的偏航角。

但是我们不能保证当前的机体绝对水平,即机体系和地理坐标系的指向并不一致,所以我们需要把机体下的传感器数据转换到水平面(即地理坐标系下)。

怎么转换呢?当然是使用旋转矩阵啦。但是我们只需要旋转roll和pitch。

所以令旋转矩阵,yaw为0,即yaw不旋转。根据旋转顺序ZYX可得:
C b n ′ = [ c o s θ s i n θ s i n γ s i n θ c o s γ 0 c o s γ − s i n γ − s i n θ c o s θ s i n γ c o s θ c o s γ ] \textbf{C}^{n'}_{b}=\begin{bmatrix}cosθ & sinθsinγ & sinθcosγ \\ 0 & cosγ & −sinγ \\ −sinθ & cosθsinγ & cosθcosγ\end{bmatrix} Cbn= cosθ0sinθsinθsinγcosγcosθsinγsinθcosγsinγcosθcosγ
磁力计的输出是在机体坐标系下的磁感应强度,表示为:
m b = [ m x b m y b m z b ] T \textbf{m}_b=[m^b_x \quad m^b_y \quad m^b_z]^T mb=[mxbmybmzb]T
可知 m n m_n mn m b m_b mb关系式为:
m n = C b n ′ m b \textbf{m}_n=\textbf{C}^{n′}_b \textbf{m}_b mn=Cbnmb
带入已知条件可以得:
[ m x n m y n m z n ] = C b n ′ [ m x b m y b m z b ] = [ c o s θ s i n θ s i n γ s i n θ c o s γ 0 c o s γ − s i n γ − s i n θ c o s θ s i n γ c o s θ c o s γ ] [ m x b m y b m z b ] = [ m x b ∗ c o s θ + m y b ∗ s i n θ ∗ s i n γ + m z b ∗ s i n θ ∗ c o s γ m y b ∗ c o s γ − m z b ∗ s i n γ − m x b ∗ s i n θ − m y b ∗ s i n γ ∗ c o s θ + m z b ∗ c o s θ ∗ c o s γ ] = [ m x b ∗ c o s ( p i t c h ) + m y b ∗ s i n ( p i t c h ) ∗ s i n ( r o l l ) + m z b ∗ s i n ( p i t c h ) ∗ c o s ( r o l l ) m y b ∗ c o s ( r o l l ) − m z b ∗ s i n ( r o l l ) m x b ∗ s i n ( p i t c h ) − m y b ∗ s i n ( r o l l ) ∗ c o s ( p i t c h ) + m z b ∗ c o s ( p i t c h ) ∗ c o s ( r o l l ) ] \begin{bmatrix}m^n_x \\ m^n_y \\ m^n_z\end{bmatrix}=\textbf{C}^{n′}_b \begin{bmatrix}m^b_x \\ m^b_y \\ m^b_z\end{bmatrix}\\ =\begin{bmatrix}cosθ & sinθsinγ & sinθcosγ \\ 0 & cosγ & −sinγ \\−sinθ & cosθsinγ & cosθcosγ\end{bmatrix} \begin{bmatrix} m^b_x \\ m^b_y \\ m^b_z \end{bmatrix} \\ =\begin{bmatrix}m^b_x∗cosθ+m^b_y∗sinθ∗sinγ+m^b_z∗sinθ∗cosγ \\ m^b_y∗cosγ−m^b_z∗sinγ \\ −m^b_x∗sinθ−m^b_y∗sinγ∗cosθ+m^b_z∗cosθ∗cosγ \end{bmatrix} \\ =\begin{bmatrix}m^b_x∗cos(pitch)+m^b_y∗sin(pitch)∗sin(roll)+m^b_z∗sin(pitch)∗cos(roll) \\ m^b_y∗cos(roll)−m^b_z∗sin(roll) \\ m^b_x∗sin(pitch)−m^b_y∗sin(roll)∗cos(pitch)+m^b_z∗cos(pitch)∗cos(roll) \end{bmatrix} mxnmynmzn =Cbn mxbmybmzb = cosθ0sinθsinθsinγcosγcosθsinγsinθcosγsinγcosθcosγ mxbmybmzb = mxbcosθ+mybsinθsinγ+mzbsinθcosγmybcosγmzbsinγmxbsinθmybsinγcosθ+mzbcosθcosγ = mxbcos(pitch)+mybsin(pitch)sin(roll)+mzbsin(pitch)cos(roll)mybcos(roll)mzbsin(roll)mxbsin(pitch)mybsin(roll)cos(pitch)+mzbcos(pitch)cos(roll)

通过这个旋转,我们就把机体坐标系的数据,变成了地理坐标系下的数据,也就是机体水平的情况下,磁力计测量的数据值。

注意z轴的正负(原始数据是z轴朝上为正)
m x n = m x b c o s θ + m y b s i n θ s i n γ + m z b s i n θ c o s γ m^n_x=m^b_xcosθ+m^b_ysinθsinγ+m^b_zsinθcosγ mxn=mxbcosθ+mybsinθsinγ+mzbsinθcosγ
m y n = m y b c o s γ − m z b s i n γ m^n_y=m^b_ycosγ−m^b_zsinγ myn=mybcosγmzbsinγ

用同样的方法求得x轴与磁北的夹角:
ψ m = a r c t a n ( m y n m x n ) ψ_m=arctan(\frac{m^n_y}{m^n_x}) ψm=arctan(mxnmyn)
磁力计所解算的航向角是机体坐标x轴相对于磁北而言的,而真北与磁北之间存在一个磁偏角 Δ ψ Δψ Δψ

所以机体坐标纵轴相对于真北的航向角为:
ψ = ψ m + Δ ψ ψ=ψ_m+Δψ ψ=ψm+Δψ

这里有几个隐藏添加条件要注意:

1.我们使用的是zyx顺序旋转。

2.传感器x轴,对齐机体x轴;传感器y轴,对齐机体y轴时yaw为0度。

3.加计和陀螺仪的坐标系是完全重合的。

提问:计算出来的夹角是正还是负?

和机体坐标系有关,如果z轴朝下,那么机体的旋转正方向为顺时针,那么得到的偏航角就是负的。

### 动态姿态补偿法的实现原理 动态姿态补偿法的核心在于对外部干扰内部误差进行实时估计并加以补偿,从而提高系统的稳定性精度。通常分为外环动态反演内环扩展状态观测器(ESO)两部分[^1]。 #### 外环动态反演 外环的主要功能是对姿态控制系统进行线性化耦,并生成名义控制输入 $\tau_{\text{nom}}$。这一过程通过对系统模型的动力学特性分析得出,目的是使控制器能够适应复杂的非线性环境。 #### 内环 ESO 内环采用扩展状态观测器 (Extended State Observer, ESO),用于实时估计总的外部扰动 $\hat{d}$ 并生成补偿控制量 $\tau_{\text{comp}}$。该补偿量被引入到控制律中作为前馈项,有效抵消外界干扰的影响。 以下是 MATLAB 中的一个简单示例代码,展示如何通过 ODE45 方法模拟卫星姿态控制中的动态补偿: ```matlab function dydt = satellite_dynamics(t, y) % 卫星姿态动力学方程定义 J = diag([2, 3, 4]); % 惯量矩阵 w = y(4:6); % 当前角速度 tau_nom = [0; 0; sin(t)]; % 名义控制力矩 d_hat = [cos(t); 0; 0]; % 扰动估计 % 补偿后的实际控制力矩 tau_comp = tau_nom - d_hat; dw_dt = inv(J) * (cross(w', J*w)' + tau_comp); % 输出导数形式的状态变量 dydt = [w'; dw_dt]; end % 初始化条件 y0 = [0; 0; 0; 0; 0; 0]; % 初始角度角速度均为零 tspan = [0, 10]; % 使用 ode45 进行动力学仿真 [t, y] = ode45(@satellite_dynamics, tspan, y0); % 绘制结果 figure; plot(t, y(:,1), 'r-', t, y(:,2), 'g--', t, y(:,3), 'b-.'); xlabel('Time (s)'); ylabel('Angular Position (rad)'); legend('Angle X', 'Angle Y', 'Angle Z'); title('Satellite Attitude Dynamics with Compensation'); ``` 上述代码展示了如何将姿态动力学方程转换为适合 `ode45` 的形式[^2],并通过加入补偿控制量来改善系统的抗干扰性能。 --- ### 基于单位四元数的姿态插补法 对于更加精确的姿态调整需求,可以考虑基于单位四元数的方法来进行轨迹规划。这种方法不仅避免了欧拉角带来的奇异点问题,还具有更高的数值稳定性[^3]。 以下是一个简单的四元数插值函数实现: ```matlab function q_interp = quaternion_slerp(q_start, q_end, t) % SLERP 插值函数 cos_theta = dot(q_start, q_end); if cos_theta < 0 q_end = -q_end; cos_theta = -cos_theta; end theta = acos(cos_theta); omega = asin(sin(theta)) / theta; q_interp = sin((1-t)*theta)/sin(theta).*q_start + ... sin(t*theta)/sin(theta).*q_end; end ``` 此函数实现了球面线性插值(SLERP),适用于平滑过渡两个不同姿态之间的变化。 --- ### 参考书籍资源推荐 《机器人学、机器视觉控制:MATLAB 法基础》是一本非常全面的参考资料,涵盖了从基础知识到高级应用的内容[^4]。其中特别强调了如何结合视觉信息完成复杂任务,例如路径跟踪或目标抓取等场景下的姿态补偿策略。 另外,在全向移动平台领域也有类似的思路应用于决地形不平整引起的机身晃动问题[^5]。这些技术同样可用于空中无人机或其他类型的自主导航设备上。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值