pix的定高、列举源程序中各个文件夹、进程间通信(uORB)

整理一点资料

做定高控制时,不可避免的就要涉及到如何解算出高度信息,那高度信息又是如何获取的?参考pixhawk源码。这里只介绍只有气压计和加速度计的情况。

概述:

首先要明白,所需的高度信息是地理坐标系下的相对高度,整个算法的核心思想是由地理坐标系下的加速度通过积分,来获得速度、位置信息,而这个数据的精确程度是由机体测量的加速度通过减去偏差,再转换到地理坐标系求得的。这里气压计的作用就是计算一个校正系数来对加速度偏移量进行校正。

算法代码详解:

1. 变量初始化。

float z_est[2] = { 0.0f, 0.0f }; // z轴的高度、速度

float acc[] = { 0.0f, 0.0f, 0.0f }; //地理坐标系(NED)的加速度数据

float acc_bias[] = { 0.0f, 0.0f, 0.0f }; //机体坐标系下的加速度偏移量

float corr_baro = 0.0f; // 气压计校正系数

2. 计算气压计高度的零点偏移,主要是取200个数据求平均。

baro_offset += sensor.baro_alt_meter;

baro_offset /= (float) baro_init_cnt;

3. 将传感器获取的机体加速度数据转换到地理坐标系下。

加速度数据要先去除偏移量;

sensor.accelerometer_m_s2[0] -=acc_bias[0];

sensor.accelerometer_m_s2[1] -=acc_bias[1];

sensor.accelerometer_m_s2[2] -=acc_bias[2];

然后转换坐标系;

acc[i] += PX4_R(att.R, i, j) *sensor.accelerometer_m_s2[j];

地理坐标系下的z轴加速度是有重力加速度的,因此补偿上去。

acc[2] += CONSTANTS_ONE_G;

4. 计算气压计的校正系数

corr_baro = baro_offset - sensor.baro_alt_meter- z_est[0];

5. 加速度偏移向量校正

accel_bias_corr[2] -= corr_baro *params.w_z_baro * params.w_z_baro;

6. 将偏移向量转换到机体坐标系

c += PX4_R(att.R, j, i) *accel_bias_corr[j];

acc_bias[i] += c * params.w_acc_bias * dt;

7. 加速度推算高度

inertial_filter_predict(dt, z_est, acc[2]);

8. 气压计校正系数进行校正

inertial_filter_correct(corr_baro, dt,z_est, 0, params.w_z_baro);


//////////////////////////////////华丽丽的分割线//////////////////////////////////////


源程序文件说明:列举源程序中各个文件夹、各个C、CPP文件;

src/lib/geo/geo.c该文件定义的;(geo:geodesic,测地学的);相关的函数;src/lib/launchdetection;src/modules/commonder文件;commonder.cpp为主要程序.

不是所有模块都是默认使能的,一些模块是冗余的,比如当姿态控制(attitude control)活动时,位置控制(position control)是不活动的。浅灰色的框表示作为主模块(main blocks)接口的关键外设。图中许多模块被作为单独的任务(tasks)来完成的,不同任务间通过“inter process communication”来通信。

源程序文件说明

本章列举源程序中各个文件夹、各个C、CPP文件以及头文件的作用。

src/lib/geo/geo.c该文件定义的所有与地球坐标系相关的函数(geo:geodesic,测地学的)。提供了与经纬度、地图坐标、坐标系翻转等相关的函数。

src/lib/launchdetection中包含了自动降落相关的程序。

src/modules/commonder文件夹包含了所有的与地面站相关的命令:

commonder.cpp为主要程序,同时该文件夹中还包含了加速度计校准、空速计校准、磁罗盘校准、遥控器校准等程序。

src/modules/uORB中包含了与uORB相关的程序。

src/modules/px4iofirmware中包含了STM32F103那个单片机的源程序,

它编译后的结果将作为ROM存储在FMU(STM32F427)单片机的固件中,位于程序文件系统的etc/extras/px4io-v2_default.bin中。

 src/modules/dataman中包含了与数据管理相关的函数。

 src/systemcmds/param包含了与系统参数相关的程序,这些参数包含机架类型、各种PID以及各种设置等参数。

 src/ROMFS/px4fmu_common/init.d包含了系统其中的各种脚本,其中最下面的“rcS”为主脚本,系统流程启动以它为准,同时它内部还会不断调用其他子脚本(如rc.sensors脚本,对应各种传感器,其调用命令为:

sh/etc/init.d/rc.sensors)。通读“rcS”脚本文件,即可明白PX4的启动和运行流程

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\华丽丽的分割线\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

进程间通信(uORB

uORB是Pixhawk系统中非常重要且关键的一个模块,它肩负了整个系统的数据传输任务,所有的传感器数据、GPS、PPM信号等都要从芯片获取后通过uORB进行传输到各个模块进行计算处理。

uORB的架构简述:uORB全称为micro object request broker (uORB),即“微对象请求代理器”,实际上uORB是一套跨进程的IPC通讯模块。在Pixhawk中,所有的功能被独立以进程模块为单位进行实现并工作。而进程间的数据交互就由为重要,必须要能够符合实时、有序的特点。

Pixhawk使用NuttX实时ARM系统,而uORB对于NuttX而言,它仅仅是一个普通的文件设备对象,这个设备支持Open、Close、Read、Write、Ioctl以及Poll机制。通过这些接口的实现,uORB提供了一套“点对多”的跨进程广播通讯机制,“点”指的是通讯消息的“源”,“多”指的是一个源可以有多个用户来接收、处理。而“源”与“用户”的关系在于,源不需要去考虑用户是否可以收到某条被广播的消息或什么时候收到这条消息。它只需要单纯的把要广播的数据推送到uORB的消息“总线”上。对于用户而言,源推送了多少次的消息也不重要,重要的是取回最新的这条消息。

uORB实际上是多个进程打开同一个设备文件,进程间通过此文件节点进行数据交互和共享。

uORB的系统实现:

uORB的实现位于固件源码的src/modules/uORB/uORB.cpp文件,它通过重载CDev基类来组织一个uORB的设备实例。并且完成Read/Write等功能的重载。

uORB的入口点是uorb_main函数,在这里它检查uORB的启动参数来完成对应的功能,uORB支持start/test/status这3条启动参数,在Pixhawk的rcS启动脚本中,使用start参数来进行初始化,其他2个参数分别用来进行uORB功能的自检和列出uORB的当前状态。

在rcS中使用start参数启动uORB后,uORB会创建并初始化它的设备实例,其中的实现大部分都在CDev基类完成。这个过程类似于Linux设备驱动中的Probe函数,或者Windows 内核的DriverEntry,通过init调用完成设备的创建,节点注册以及派遣例程的设置等。

进程(process)/程序(application)间通信(如将传感器信息从传感器app传送到姿态滤波app)是PX4程序结构的核心部分。进程(process,在此处被称作nodes)通过被命名的总线(buses,在此处被称作topic)交换信息。在PX4中,一个topic只包含一种信息类型,比如,vehicle_attitude 这个topic将一个包含姿态结构体(roll、pitch、yaw)的信息传送出去。Nodes可以在bus/topic上publish(发布)一个信息(即发送数据),也可以向一个bus/topic subscribe(订阅)信息(即接收数据)。它们(Nodes)并不知道它们在跟谁通信。一个topic可以面向多个publishers(发布者)和多个subscribers(订阅者)。这种方式可以避免死锁问题,在机器人中很常见。为达到有效率,在bus/topic中,永远只有一个信息被传送,没有保持队列之说(即新来的信息会覆盖之前的信息,不存在有一串信息排队的情况)。

这个发布/订阅 (publisher / subscriber)机制是通过微对象请求代理(micro

objectrequest broker,简称uORB)来实现的。

系统已存的topics通过Doxygen工具自动生成了文档,其链接为:

下面是关于publisher / subscriber的一个简单的例子,这个publisher(发布者)advertises(通告)一个名叫random_integer的topic,在这个topic中更新入随机数。subscriber(订阅者)检查并打印出更新值。

pix的定高、列举源程序中各个文件夹、进程间通信(uORB)

pix的定高、列举源程序中各个文件夹、进程间通信(uORB)

。。。

未完待续...