- CORTEX-M4处理器,512kb的flash
- 两路I2C,一路给两个mpu,一路给OLED实时显示当前角度
- 使用FreeRTOS进行任务调度,创建读取传感器数据任务,处理数据任务,屏幕显示任务
- 读取传感器任务定时从mpu读取四元数数据并将其送入队列(即后文到的缓冲区)
- 处理传感器数据任务每当队列满时会被唤醒将数据进行滤波处理
- 屏幕显示任务定时刷新屏幕,启用dma进行i2c总线数据的发送降低cpu的负担
-
mpu9250可以输出设备的三个方向上的加速度、角速度以及三个方向上的 磁场强度,有这些数据就可以对物体进行姿态的计算。但在处理这些数据 之前还需要进行滤波以减小干扰。通过加速度计可以得到在静止状态下 的Roll角(即本系统中用到的开合角度),Roll角的范围是$[-\pi, +\pi]$ ,$Roll=\displaystyle\arctan{(\frac{a_x}{\sqrt{a_y^2+a_x^2}})}$,
-
而陀螺仪能够提供角速度,对其积分可得到角度变化量,但由于陀螺仪的数据会随时间积累误差,我们将陀螺仪数据与加速度计和磁力计数据进行融合。一般使用卡尔曼滤波和互补滤波两种方法融合传感器数据,减少单一传感器的噪声和误差。
- 卡尔曼滤波是一种最优估计算法,适用于处理和融合多种传感器数据。balabala。
- 加速度计测量地球的重力加速度,根据重力加速度在三个轴方向的分量我们可以推算出当前物体的姿态,可以修正pitch轴和roll轴的角度误差,不论yaw轴怎么旋转,重力加速度在三个轴上的分量不会发生改变;而磁力计基于霍尔效应,在没有外界强磁环境的影响下能够得到地磁场的强度和方向,可以来修正航向角yaw,在本系统中使用roll角从而避免了外界强磁环境的影响。我们设计一个互补滤波器,balabala
-
四元数,使用dmp库直接输出的四元数来计算roll角,$Roll=atan2{}$balabala。利用一阶龙格库塔公式进行积分求解四元数$\begin{bmatrix} q_0\q_1\q_2\q_3 \end{bmatrix}_{t+\Delta t}=\begin{bmatrix} q_0\q_1\q_2\q_3 \end{bmatrix}_t+\displaystyle\frac{1}{2}\cdot\Delta t\cdot\begin{bmatrix} -\omega_x\cdot q_1-\omega_y\cdot q_2-\omega_z\cdot q_3 \ \omega_x\cdot q_0-\omega_y\cdot q_3+\omega_z\cdot q_2\\omega_x\cdot q_3+\omega_y\cdot q_0-\omega_x\cdot q_1\-\omega_x\cdot q_2+\omega_y\cdot q_1+\omega_z\cdot q_0 \end{bmatrix}_t$,其中$\omega_x,\omega_y,\omega_z$分别是对应三个轴的角速度,再通过四元数推roll角balabala
-
在分别得到两个翻滚角后,基于两个角度的符号和大小计算屏幕的开合角度。令一边的角度值为$\alpha$,另一边为$\beta$,roll角顺时针旋转为正
符号 角度计算 + + $180-\alpha+\beta$ + - $180-\alpha+\beta$ - + $180-\alpha-\beta$ - - 不存在 -
在得到当前的角度数据后,先将其放置在缓冲区,缓冲区大小预先设置好,进行均值滤波处理以避免误差。实验发现缓冲区大小设置为4能较好地完成任务。
- 移植了u8g2库,能够完成基本的绘图,支持多种字体,dma发送数据,速度更快,能快速响应角度的变化,同时完成了简单的图形化显示当前折叠程度.