mpu6050姿态解算与卡尔曼滤波(4)姿态解算

一、状态方程
状态变量选取为姿态四元数X=[q0,q1,q2,q3]TX=[q_0,q_1,q_2,q_3]^TX=[q0,q1,q2,q3]T。则根据四元数微分方程
[q˙0q˙1q˙2q˙3]=12[0−ωnbxb−ωnbyb−ωnbzbωnbxb0ωnbzb−ωnbybωnbyb−ωnbzb0ωnbxbωnbzbωnbyb−ωnbxb0][q0q1q2q3]\begin{bmatrix}\dot q_0\\\dot q_1\\\dot q_2\\\dot q_3\end{bmatrix}=\frac{1}{2} \begin{bmatrix} 0&-\omega_{nbx}^b&-\omega_{nby}^b&-\omega_{nbz}^b\\ \omega_{nbx}^b&0&\omega_{nbz}^b&-\omega_{nby}^b\\ \omega_{nby}^b&-\omega_{nbz}^b&0&\omega_{nbx}^b\\ \omega_{nbz}^b&\omega_{nby}^b&-\omega_{nbx}^b&0\\ \end{bmatrix}\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix}q˙0q˙1q˙2q˙3=210ωnbxbωnbybωnbzbωnbxb0ωnbzbωnbybωnbybωnbzb0ωnbxbωnbzbωnbybωnbxb0q0q1q2q3
取一阶近似
[q0q1q2q3]k=(I+Δt2[0−ωnbxb−ωnbyb−ωnbzbωnbxb0ωnbzb−ωnbybωnbyb−ωnbzb0ωnbxbωnbzbωnbyb−ωnbxb0]k−1)[q0q1q2q3]k−1\begin{bmatrix} q_0\\ q_1\\ q_2\\ q_3\end{bmatrix}_{k}= \left( I+\frac{\Delta t}{2} \begin{bmatrix} 0&-\omega_{nbx}^b&-\omega_{nby}^b&-\omega_{nbz}^b\\ \omega_{nbx}^b&0&\omega_{nbz}^b&-\omega_{nby}^b\\ \omega_{nby}^b&-\omega_{nbz}^b&0&\omega_{nbx}^b\\ \omega_{nbz}^b&\omega_{nby}^b&-\omega_{nbx}^b&0\\ \end{bmatrix}_{k-1} \right)\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix}_{k-1}q0q1q2q3k=I+2Δt0ωnbxbωnbybωnbzbωnbxb0ωnbzbωnbybωnbybωnbzb0ωnbxbωnbzbωnbybωnbxb0k1q0q1q2q3k1
所以状态转移矩阵为
Φk/k−1=I+Δt2[0−ωnbxb−ωnbyb−ωnbzbωnbxb0ωnbzb−ωnbybωnbyb−ωnbzb0ωnbxbωnbzbωnbyb−ωnbxb0]k−1\Phi_{k/k-1}=I+\frac{\Delta t}{2} \begin{bmatrix} 0&-\omega_{nbx}^b&-\omega_{nby}^b&-\omega_{nbz}^b\\ \omega_{nbx}^b&0&\omega_{nbz}^b&-\omega_{nby}^b\\ \omega_{nby}^b&-\omega_{nbz}^b&0&\omega_{nbx}^b\\ \omega_{nbz}^b&\omega_{nby}^b&-\omega_{nbx}^b&0\\ \end{bmatrix}_{k-1}Φk/k1=I+2Δt0ωnbxbωnbybωnbzbωnbxb0ωnbzbωnbybωnbybωnbzb0ωnbxbωnbzbωnbybωnbxb0k1
对于系统噪声Wk−1W_{k-1}Wk1可以简单考虑为系统噪声直接作用在状态XXX上,也即
[q0q1q2q3]k=(I+Δt2[0−ωnbxb−ωnbyb−ωnbzbωnbxb0ωnbzb−ωnbybωnbyb−ωnbzb0ωnbxbωnbzbωnbyb−ωnbxb0]k−1)[q0q1q2q3]k−1+Wk−1\begin{bmatrix} q_0\\ q_1\\ q_2\\ q_3\end{bmatrix}_{k}= \left( I+\frac{\Delta t}{2} \begin{bmatrix} 0&-\omega_{nbx}^b&-\omega_{nby}^b&-\omega_{nbz}^b\\ \omega_{nbx}^b&0&\omega_{nbz}^b&-\omega_{nby}^b\\ \omega_{nby}^b&-\omega_{nbz}^b&0&\omega_{nbx}^b\\ \omega_{nbz}^b&\omega_{nby}^b&-\omega_{nbx}^b&0\\ \end{bmatrix}_{k-1} \right)\begin{bmatrix}q_0\\q_1\\q_2\\q_3\end{bmatrix}_{k-1}+W_{k-1}q0q1q2q3k=I+2Δt0ωnbxbωnbybωnbzbωnbxb0ωnbzbωnbybωnbybωnbzb0ωnbxbωnbzbωnbybωnbxb0k1q0q1q2q3k1+Wk1
事实上角速度ωnbb\omega_{nb}^bωnbb的误差Δω\Delta\omegaΔω构成了系统噪声,有兴趣可以自行推导其噪声输入矩阵Γk−1\Gamma_{k-1}Γk1
二、测量方程
选取测量值为mpu6050测量得到的加速度Zk=aZ_k=aZk=a,在mpu6050自身无运动加速度的情况下其测量值
a=Cnb∗[0 0 g]Ta=C_n^b*\begin{bmatrix}0\ 0\ g \end{bmatrix}^Ta=Cnb[0 0 g]T
根据四元数与姿态矩阵的转换,得到
[axayaz]=g[2(q1q3−q0q2)2(q2q3+q0q1)q02−q12−q22+q32]\begin{bmatrix} a_x\\a_y\\a_z\end{bmatrix}=g\begin{bmatrix} 2(q_1q_3-q_0q_2)\\2(q_2q_3+q_0q_1)\\q_0^2-q_1^2-q_2^2+q_3^2\end{bmatrix}axayaz=g2(q1q3q0q2)2(q2q3+q0q1)q02q12q22+q32
线性化和离散化
[axayaz]k=g[2(q1q3−q0q2)2(q2q3+q0q1)q02−q12−q22+q32]k−1+g∗[−2q22q3−2q02q12q12q02q32q22q0−2q1−2q22q3](Xk−X^k−1)+Vk\begin{bmatrix} a_x\\a_y\\a_z\end{bmatrix}_{k}=g\begin{bmatrix} 2(q_1q_3-q_0q_2)\\2(q_2q_3+q_0q_1)\\q_0^2-q_1^2-q_2^2+q_3^2\end{bmatrix}_{k-1}+g*\begin{bmatrix} -2q_2&2q_3&-2q_0&2q_1\\2q_1&2q_0&2q_3&2q_2\\2q_0&-2q_1&-2q_2&2q_3\end{bmatrix}\left( X_k-\hat X_{k-1}\right)+V_kaxayazk=g2(q1q3q0q2)2(q2q3+q0q1)q02q12q22+q32k1+g2q22q12q02q32q02q12q02q32q22q12q22q3(XkX^k1)+Vk
到这里我们就获得了线性化的状态方程和测量方程了,按照博客(2)http://t.csdnimg.cn/EYpJ7里标准卡尔曼滤波的公式即可进行滤波,即可获得融合陀螺和加速度计的姿态四元数了。
三、XXXPPP的初始化
通常情况下,卡尔曼滤波器是收敛的,因此滤波器的初值XXXPPP可以设置的比较随意。但是对于本文设计的这个滤波器,测量值ZkZ_kZk只包含姿态的一部分信息,因此滤波器状态XXX中必定有发散的部分。简单假设当X≈[1q1q2q3]TX\approx\begin{bmatrix} 1&q_1&q_2&q_3\end{bmatrix}^TX[1q1q2q3]T时,q1q_1q1q2q_2q2即对应俯仰和滚转角,而q3q_3q3对应方位角,在滤波过程中q3q_3q3是发散的。尽管滤波器估计出的姿态中方位角是发散的,我们仍然可以取初始化时的方位角为0,这样滤波器估计出的方位角就是相对初始时的方位,在短时间内它仍是可信赖的信息。
对于XXX的初始化可以参考严恭敏老师的《捷联惯导算法与组合导航原理》7.5.4节。以下内容均摘抄自该部分。
记姿态阵CbnC_b^nCbn的三个行向量为C1C_1C1C2C_2C2C3C_3C3,即
Cbn=[C1C2C3]C_b^n=\begin{bmatrix} C_1\\C_2\\C_3\end{bmatrix}Cbn=C1C2C3
根据加速度测量值a=[axayaz]Ta=\begin{bmatrix} a_x&a_y&a_z\end{bmatrix}^Ta=[axayaz]T构造CbnC_b^nCbn的一种简便方法如下:
(1)构造C3=[C31C32C33]=[axayaz]/∣a∣C_3= \begin{bmatrix} C_{31}&C_{32}&C_{33}\end{bmatrix}= \begin{bmatrix} a_x&a_y&a_z\end{bmatrix}/|a|C3=[C31C32C33]=[axayaz]/∣a;
(2)如果∣C31∣>0.5\left| C_{31}\right|>0.5C31>0.5,则构造C2′=[C32−C310]C_2'=\begin{bmatrix} C_{32}&-C_{31}&0\end{bmatrix}C2=[C32C310],否则构造C2′=[0C33−C32]C_2'=\begin{bmatrix} 0&C_{33}&-C_{32}\end{bmatrix}C2=[0C33C32],归一化得到C2=C2′/∣C2′∣C_2=C_2'/\left| C_2'\right|C2=C2/C2
(3)构造C1=C2×C3C_1=C_2×C_3C1=C2×C3
这样就可以得到初始姿态矩阵CbnC_b^nCbn,然后可以得到初始姿态四元数QQQ,作为滤波器状态XXX的初值。
对于PPP阵,由于初始方位角被设定为0,它是我们极其确定的一个值,因此P44P_{44}P44的初值应当被设置为很小,一般的可以取<1E−7<1E-7<1E7P11P_{11}P11P22P_{22}P22P33P_{33}P33的初值可以设置为1E−21E-21E2,在滤波过程中会收敛。
四、QQQRRR的设置
对于卡尔曼滤波器,系统噪声QQQ和测量噪声RRR至关重要。
首先考虑RRR,由于测量量选取的就是加速度计测量的加速度,因此RRR就是加速度测量误差Δa\Delta aΔa的协方差。考虑三轴加速度计为互相独立的测量,因此RRR为对角矩阵。对于mpu6050这样的低精度imu,可以直接取静态情况下各轴加速度计测量值的3倍标准差的平方作为RRR的对角线元素。
对于QQQ阵,陀螺的测量误差构成了系统噪声。同样取静态情况下陀螺测量值的3倍标准差的平方作为陀螺测量的方差阵,再乘上滤波周期Δt\Delta tΔt的平方,即可作为QQQ的对角线元素。然后观察滤波器的运行情况调整QQQ。调整原则是如果想使滤波器更多的信赖陀螺测量则减小QQQ,如果想使滤波器更多的信赖加表测量则增大QQQ

<think>嗯,用户连续两次询问关于“AXAY”的含义,但两次的上下文完全不同。第一次提问时,我根据技术领域的常见含义给出了线性代数、联邦学习和通信系统的释,但用户实际需要的却是MPU6050传感器的数据定义——这说明用户可能是嵌入式开发新手,混淆了专业术语的多义性。现在用户补充提供了三个关键引用资料,明确指向MPU6050传感器的寄存器读取函数。这组引用非常具体:引用[1]展示函数调用方式,引用[2]揭露底层字节操作,引用[3]提到开源库的使用。用户的核心需求其实是理六轴运动传感器的原始数据含义,而非数学或机器学习中的向量概念。值得注意的是,用户提供的代码片段显示这些变量都是int16_t类型(16位有符号整数),这和MPU6050数据手册完全吻合。需要特别强调三个关键点:第一,加速度计数据本质是力分量测量值,需结合量程计实际g值;第二,陀螺仪数据是角速度的离散化表示;第三,原始数据必须经过标定和滤波才可用。这些要点在开源项目(如I2Cdev库)的文档里有详细说明。用户可能正在调试姿态法,所以生成的相关问题特意包含原始数据处理和融合计。如果用户后续追问卡尔曼滤波四元数转换,就需要补充传感器噪声模型和旋转矩阵的知识了。</think> 在MPU6050六轴运动传感器中,**AX、AY、AZ、GX、GY、GZ** 分别表示以下物理量的原始数据: ### 一、核心定义 1. **加速度计数据(单位:LSB)** - **`AX`**:X轴加速度原始值 对应传感器坐标系中X方向的线性加速度分量 *示例:$A_X = \text{(MPU6050\_ACCEL\_XOUT\_H寄存器高8位 << 8) | MPU6050\_ACCEL\_XOUT\_L寄存器低8位}$[^2]* - **`AY`**:Y轴加速度原始值 对应传感器Y方向的线性加速度分量 - **`AZ`**:Z轴加速度原始值 对应传感器Z方向的线性加速度分量(包含重力加速度) 2. **陀螺仪数据(单位:LSB)** - **`GX`**:X轴角速度原始值 绕传感器X轴旋转的角速度分量 - **`GY`**:Y轴角速度原始值 绕Y轴旋转的角速度分量 - **`GZ`**:Z轴角速度原始值 绕Z轴旋转的角速度分量(偏航角速度) ### 二、数据特性 | 数据类型 | 测量范围 | 原始值转换公式 | 物理意义 | |----------|------------------|---------------------------|-------------------| | AX/AY/AZ | ±2g/±4g/±8g/±16g | $a = \frac{\text{原始值}}{\text{灵敏度}} \times g$ | 三维线性加速度 | | GX/GY/GZ | ±250°/s ~ ±2000°/s | $\omega = \frac{\text{原始值}}{\text{灵敏度}}$ | 三维角速度 | > 注: > - 灵敏度由传感器量程配置决定(如±2g时灵敏度为16384 LSB/g) > - `g` 表示重力加速度常数(9.8 m/s²) ### 三、工作流程 1. **数据读取** 通过I²C总线顺序读取各轴高/低字节寄存器: ```c // 读取X轴加速度示例 DataH = ReadReg(MPU6050_ACCEL_XOUT_H); // 高字节[^2] DataL = ReadReg(MPU6050_ACCEL_XOUT_L); // 低字节 AX = (DataH << 8) | DataL; // 合成16位数据[^1] ``` 2. **数据处理** ```mermaid graph LR A[原始数据AX/GX] --> B[量程校准] B --> C[转换为物理量] C --> D[滤波降噪] D --> E[姿态] ``` ### 四、典型应用 - **姿态检测**:通过加速度计计俯仰角(pitch)和横滚角(roll) $$\theta_{\text{pitch}} = \arctan\left(\frac{A_X}{\sqrt{A_Y^2 + A_Z^2}}\right)$$ - **运动追踪**:结合陀螺仪数据融合计三维姿态(常使用卡尔曼滤波) ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值