|
PX4软件架构图是PX4官方开发者网站中的一张总体框架图,相信很多同学都看过,我们今天围绕这张图作一下简单的分析。
如果希望仔细研究PX4源码的同学应该仔细阅读这一张图,它包含了所有的核心模块,以及它们的关系。
整个PX4源码分为几个部分
- 消息总线 uORB
PX4软件架构的核心思想就是去耦合,所以消息中间件(uORB)处于整个框架图的中心位置。这样的设计是基本所有的大型软件系统的通用设计,比如ROS、ROS2。关于uORB详细分析,将在下一讲中详细描述。
- 基础服务
- 任务管理
这部分在这个框图中没有体现,作为系统的基础服务,其接口在 platforms/common/include/px4_platform_common中申明
任务接口 platforms/common/include/px4_platform_common/tasks.h
工作队列接口 platforms/common/include/px4_platform_common/px4_work_queue
- 日志系统
px4的日志系统框架不同于apm,用户使用非常简单,日志系统会记录uORB消息,用户无需手动定义需要记录数据的格式,只需要正常定义uORB消息即可,APM记录日志会稍微麻烦一些,需要手动编写不少代码。当然方便的同时也有一定的灵活性不足的问题。
用户需要添加的新消息可在这个文件中添加需要记录的topic即可src/modules/logger/logged_topics.cpp
- 参数系统
PX4可以在任意模块目录下定义参数,在编译时由src/lib/parameters/px_generate_params.py脚本生成一个全局的参数源文件,生成在build目录中build/xxx/src/lib/parameters,可以在这里找到飞控所有的参数
- 外部接口
- mavlink
飞控与地面站和机载计算机、外部设备的主要通信协议
- fast-rtps
一种实时可靠的分布式消息框架,应用于ROS2中作为消息中间件,在PX4中为高频消息传递提供了一个除了mavlink外的一个新的选择
PX4开发者文档中提供的描述 https://docs.px4.io/master/en/middleware/micrortps.html
- 设备驱动与框架
PX4的设备驱动大致可以分为:
- SPI/IIC设备
加速度计、陀螺仪、气压计、罗盘、RGB灯等
这两类设备类都会继承两个基类
I2CSPIDriver类
在platforms/common/include/px4_platform_common/i2c_spi_buses.h文件中申明该类
用于获取总线相关参数,如总线类型、地址、频率以及定义设备id等等
device::I2C/SPI类
对于nuttx系统,在src/lib/drivers/device/nuttx中定义这两个类
这两个类定义SPI与IIC的总线操作方法,如总线初始化、读写接口
- 串口设备
GPS、部分定高雷达等
- 其他设备
包括adc、pwmin、pwmout、io
- 导航系统
导航系统使用各种传感器数据经过状态估计算法获取姿态、位置等状态数据,是PX4的核心算法。
状态估计的核心算法库位于 src/lib/ecl
它的主要作者为Paul Riseborough,他同时也是APM的AP_NavEKF2/3的主要作者。
- 控制系统
- 任务系统
PX4的位置指令生成模块,包括
控制指令 src/modules/commander
任务模式的控制(定高、定点、航线、返航、降落等模式)src/modules/navigator
- 位置与姿态控制器
内回路控制器,根据Vechile类型的不同(多旋翼、固定翼、小车、船、飞艇等)执行不同的位置和姿态控制器
多旋翼位置控制器 src/modules/mc_pos_control
多旋翼姿态控制器 src/modules/mc_att_control
多旋翼角速率控制器 src/modules/mc_rate_control
固定翼L1位置控制器 src/modules/fw_pos_control_l1
固定翼姿态控制器 src/modules/fw_att_control
垂起姿态控制器 src/modules/vtol_att_control
小车位置控制器 src/modules/rover_pos_control
PX4的软件框架简单介绍到这里,大家对系统有一个基础的整体认识,然后可以根据自己的兴趣去仔细研究其中的一些模块。
这个博客转载自我个人的微信公众号,这里会不定期更新一些我整理的无人机相关知识和个人设计,欢迎添加关注。 |
|