版权声明:本文为博主原创文章,未经博主允许不得转载。
第六章 PX4-Sensors解析
这一章节并不难,也很容易理解,但是这一章节有几个函数需要我们去理解一下,所以这里我们这里写一章来说明一下。Sensors是所有传感器进行数据组合,就是拿到传感器的原始数据进行组合在一个结构体中方便订阅使用。
Sensors的启动时在rc.sensors的脚本文件中,在启动所有传感器之后最后一步启动了sensors,这里的启动同样是没有参数,所以我们直接找到sensors.cpp查看入口函数就行了。
这里直接又是newsensors,这里没什么好讲的,跟前面说的一样就是进行初始化。接着就是start函数,
然后创建任务函数
进入task_main函数。首先对传感器初始化在这个函数没有找到那些定义
所以我们找到的是else的sensors_init
这里面就有对加速度计、陀螺仪、电子罗盘、气压计进行初始化,这里我们只分析其中的一个,其他的照猫画虎一样的分析方法。这里我们只分析加速度计吧。进入到accel_init函数。首先是获取句柄
至于这个获取设备的路径,这个在传感器的初始化就看看有过注册的,这个自己去找。然后就是ioctl函数,这个函数也是重载函数,主要使用来配置用的。
这里是对采样速率的设置。第一个参数是命令,第二个参数是值。
这个值我们追踪一下,在drv_accel.h文件中,这些驱动文件都是给他们分配一个基地址
,
这个路径下都有相应的h文件,adc,baro,大家可以去看看都会给他们分配一个不一样的基地址。这里我们就要回到相应的传感器了比如我们传感器是mpu6000,在这里面我们能找到函数
在这里面就有switch case语句都是进行相应的操作,
看到没,设置采样速率。这里你们可能会问这里有3个参数,而另外一个只有2个参数那么这里就要找到设备的nuttx驱动了,
找到这个目录下cmake文件查看编译的是哪个cpp文件,我们用的是nuttx系统编译的就是
文件了这个不难理解也没必要去深入了解,其实只要知道怎么使用就行了。
找到没,看到这里大家应该知道这个工作机制是怎么处理了的吧!
初始化完成后就定义了原始数据的结构体,这里的sensor_conmbined_s结构体大家还记得吧,是从msg文件生成的h文件中有这样的结构体的,自己去查。
开始订阅了,nuttx的这些个函数在前面介绍过,不懂的话就去研读一下。
这里开始订阅数据了,用的是poll机制,这个机制不懂的话就去度一下,不难。看一下accel_poll函数,这里复制订阅的数据,这些数据都是传感器发布的,如果有疑问就去看看那些传感器是如何获取数据和发布的
。这里面就有对这些数据进行矩阵运算、积分、数据是否可靠然后进行赋值给raw,这里面没什么好说的。接下来就是进入到while中不断去订阅数据进行赋值后发布
。
Sensors这一章节相对来说比较容易,这里面主要是将传感器数据和遥控信息进行一个汇总,方便位置和姿态去使用,到这里那些传感器数据就比较可靠了,一次大家如果有跟好的算法就可以在这个函数中进行处理或者在传感器获取数据就处理,PX4的数据处理主要还是在传感器那端。如果大家有更好的算法也可以分享一下,大家可以共同研究然后共享出来。
http://blog.csdn.net/qq_18112493/article/details/70193856