代码分析:如何获得九轴姿态数据?
时间:10-02
整理:3721RD
点击:
六轴加速度计和三轴陀螺仪所组成的九轴姿态传感器是无人机中必备重要器件。本微信号之前已经对加速度计和陀螺仪的物理工作原理探讨过无数次了,在这里也不再絮叨了。目前很多开发板上也会安装这种传感器,从而获得开发板实时姿态,可用于无人机和体感游戏等应用的开发,本文以Genuino101中RawImuDataSerial的例子进行分析,从代码角度来和大家探讨一下姿态参数的获得。
1.Genuino101中使用的是USB虚拟串口,所以先进行串口初始化,设置波特率。什么是USB虚拟串口呢,字面上好像很难的样子,可能很多新手都不知道,但是不用担心,USB虚拟串口就是把USB当作串口的串口来使用,在Nano,Mega板上都有USB转TTL的芯片,连接到电脑后,电脑就识别出了端口号。但是101上并未使用USB转TTL的芯片,101有USB接口,而USB可以作为几种使用类型,像HID鼠标键盘,大容量存储,摄像头等,其中有一种类型叫虚拟串口,使用的方法跟普通的串口是一样的。虚拟串口属于USB CDC,也叫VCP。2.while (!Serial); 这里是判断串口是否完成,为什么这样使用呢?看看参考资料。
意思就是判断USB CDC串口是否已经打开了,如果已经打开,刚返回true,否则是false3.开始进行IMU的初始化,这里的IMU包含在Intel Curie模块里面。输出Initializing IMU device...初始化的函数是: CurieImu.initialize();看看里面做了什么
可以看到,首先是SPI的初始化,SPI连接的是型号为BMI160的六轴加速度计和陀螺仪传感器。具体是如何通过寄存器的读取加速度值的我们先不去研究,CurieImuClass里面已经做好了这些操作,我们只要知道使用,CurieImuClass就能得到六轴的原始数据就行了。那为什么要打开看看里面做了什么呢,其实我也就是好奇,想看看。4.这里字面上的意思是测试CurieImu是否连接成功,我们打开CurieImu.testConnection()看看里面是啥。
其实就是通过SPI读取BMI160寄存器到的DeviceID,如果读到了,说明连接成功。
这里是读取寄存器里偏移量的值。这几个是已经默认在寄存器里了。5.这里是进行陀螺仪校准,校准函数是 CurieImu.autoCalibrateGyroOffset();有点奇怪,为什么陀螺仪有三个轴,但是只用了一个校准呢?我们打开这个函数看一下。
看了一下注释,这个函数就是对3个轴进行校准。那就不管它了,具体那几个寄存器是什么也不用去理会。
6.这里对加速度计进行校准。用了三个校准函数,XY是0,Z的参数是1,为什么呢。是不是因为Z轴自身就收到重力呢?保留疑问。
7.校准好了之后,再读取一次偏移量。
8.这里字面上的意思是使能偏移量校准,也就是说,上面只是求出偏移量的值,而这里要进行使能。
9.接下来的便是loop()循环了。getMotion6()函数直接读取六个轴的值到变量。
10.接下来便是打印数据到串口了。
11.把程序烧写的板子上,打开串口,便能看到数据啦。
12.这里做一点小改动。把打印到串口的数据改成如下:
选择tools->Serial Plotter
Oh my god,好强大的功能,实时画六轴波形图啊。
最后小编向大家提一个问题,你们对于无人机的应用而言,多大的姿态数据刷新率最为合适?特别推荐互相鄙视的“模电”和“数电”约了一架,结果发现……
VCC、 VDD、VEE、VSS 电压理解
涨姿势!高手带你全面了解嵌入式C语言可靠性设计
1.Genuino101中使用的是USB虚拟串口,所以先进行串口初始化,设置波特率。什么是USB虚拟串口呢,字面上好像很难的样子,可能很多新手都不知道,但是不用担心,USB虚拟串口就是把USB当作串口的串口来使用,在Nano,Mega板上都有USB转TTL的芯片,连接到电脑后,电脑就识别出了端口号。但是101上并未使用USB转TTL的芯片,101有USB接口,而USB可以作为几种使用类型,像HID鼠标键盘,大容量存储,摄像头等,其中有一种类型叫虚拟串口,使用的方法跟普通的串口是一样的。虚拟串口属于USB CDC,也叫VCP。2.while (!Serial); 这里是判断串口是否完成,为什么这样使用呢?看看参考资料。
意思就是判断USB CDC串口是否已经打开了,如果已经打开,刚返回true,否则是false3.开始进行IMU的初始化,这里的IMU包含在Intel Curie模块里面。输出Initializing IMU device...初始化的函数是: CurieImu.initialize();看看里面做了什么
可以看到,首先是SPI的初始化,SPI连接的是型号为BMI160的六轴加速度计和陀螺仪传感器。具体是如何通过寄存器的读取加速度值的我们先不去研究,CurieImuClass里面已经做好了这些操作,我们只要知道使用,CurieImuClass就能得到六轴的原始数据就行了。那为什么要打开看看里面做了什么呢,其实我也就是好奇,想看看。4.这里字面上的意思是测试CurieImu是否连接成功,我们打开CurieImu.testConnection()看看里面是啥。
其实就是通过SPI读取BMI160寄存器到的DeviceID,如果读到了,说明连接成功。
这里是读取寄存器里偏移量的值。这几个是已经默认在寄存器里了。5.这里是进行陀螺仪校准,校准函数是 CurieImu.autoCalibrateGyroOffset();有点奇怪,为什么陀螺仪有三个轴,但是只用了一个校准呢?我们打开这个函数看一下。
看了一下注释,这个函数就是对3个轴进行校准。那就不管它了,具体那几个寄存器是什么也不用去理会。
6.这里对加速度计进行校准。用了三个校准函数,XY是0,Z的参数是1,为什么呢。是不是因为Z轴自身就收到重力呢?保留疑问。
7.校准好了之后,再读取一次偏移量。
8.这里字面上的意思是使能偏移量校准,也就是说,上面只是求出偏移量的值,而这里要进行使能。
9.接下来的便是loop()循环了。getMotion6()函数直接读取六个轴的值到变量。
10.接下来便是打印数据到串口了。
11.把程序烧写的板子上,打开串口,便能看到数据啦。
12.这里做一点小改动。把打印到串口的数据改成如下:
选择tools->Serial Plotter
Oh my god,好强大的功能,实时画六轴波形图啊。
最后小编向大家提一个问题,你们对于无人机的应用而言,多大的姿态数据刷新率最为合适?特别推荐互相鄙视的“模电”和“数电”约了一架,结果发现……
VCC、 VDD、VEE、VSS 电压理解
涨姿势!高手带你全面了解嵌入式C语言可靠性设计