经常观看许多使用姿态传感器玩出各种花样的6D动态展示的视频。为了实现自己的姿态传感器动态展示,借此机会使用Multi-sensor KIT开发板,该板载有QMA8658A-EVB和OLED-EVB。
1. example-algo-visualizer
首先介绍的是TDK/InvenSenseInc的example-algo-visualizer.exe上位机软件,这个软件是不开源的,因为本职工作开发产品的过程中用到了INV的传感器,所以可以从官方提供的源码中解析出来和example-algo-visualizer.exe上位机软件通信的数据格式。可以将QMA8658A的姿态数据按照同样的数据格式发送到example-algo-visualizer.exe上位机。
example-algo-visualizer.exe 上位机有特点:
① 可显加速度计、陀螺仪、磁力计各轴零偏值。
② 可以显示加速度计、陀螺仪、磁力计(选择使用9轴)的各轴数据曲线图。
③ 可动态显示姿态传感器的 6D 动画
④ 自定义字符发送给 Multi-sensor KIT 作为控制命令
2. OLED
在OLED上绘制一个旋转立方体,立方体有6个面,一个面由两个三角形组成,共计需要12个三角形,每个三角形又有3个顶点,故绘制立方体需要36个点,而实际上立方体只有8个顶点,这8个顶点有序组合成6个矩形面,如下图所示:
在程序中,quad(a,b,c,d)表示一个矩形面,该矩形面由两个三角形构成,分别为(v1,v0,v3)和(v1, v3,v2),按照这种顶点索引顺序绘制三角形,最终构成整个立方体。将姿态传感器的姿态角与一个矩形面关联起来是一个难点,因为需要涉及到欧拉角转四元数的问题。
欧拉定理指出,刚体绕固定点的位移也可以被看作是绕该点的若干次有限转动的合成。在欧拉转动中,通过将载体坐标系转动三次,可以得到导航坐标系。在三次转动中,每次的旋转轴都是被转动坐标系的某一坐标轴。由于旋转涉及到坐标系和旋转顺序,因此在此不进行详细描述。如需了解更多信息,请参阅我的其他博文 《MEMS 惯性传感器 06 - 再说坐标系定义(导航坐标系与载体坐标系)》。
这里直接给出欧拉角旋转结果公式:
- 导航坐标系[东北天坐标系]
- 载体坐标系[右前上]
- 欧拉角旋转顺序 3-1-2:偏航(Z 轴) - 俯仰(X 轴) - 横滚(Y 轴)
/**
* @brief : rotate function:Rotate points in solid space in the order z, y, x axes.
* @param :
* @retva :
* @details :导航坐标系[东北天坐标系]
*/
void rotate(float* obj, float x, float y, float z)
{
float rz[3][3] = {0};
float ry[3][3] = {0};
float rx[3][3] = {0};
x = (float)(x *1.0f * 3.1415926f);
y = (float)(y *1.0f * 3.1415926f);
z = (float)(z *1.0f * 3.1415926f);
//赋值rz
rz[0][0] = cos(z); rz[0][1] = -sin(z); rz[0][2] = 0;
rz[1][0] = sin(z); rz[1][1] = cos(z); rz[1][2] = 0;
rz[2][0] = 0; rz[2][1] = 0; rz[2][2] = 1;
//赋值ry
ry[0][0] = 1; ry[0][1] =0; ry[0][2] = 0;
ry[1][0] = 0; ry[1][1] = cos(y); ry[1][2] = -sin(y);
ry[2][0] = 0; ry[2][1] = sin(y); ry[2][2] = cos(y);
///赋值rx
rx[0][0] = cos(x); rx[0][1] = 0; rx[0][2] = sin(x);
rx[1][0] = 0; rx[1][1] = 1; rx[1][2] = 0;
rx[2][0] = -sin(x);rx[2][1] = 0; rx[2][2] = cos(x);
matconv(matconv(matconv(obj,rz), ry), rx);
}
3. 效果展示
QMI8658-6D_可视化