在前面的分享 PX4-1-开源飞控项目 中,我们简单分享了一些比较知名的开源飞控项目,对ArduPilot也做了简单的介绍。
ArduPilot与PX4是目前最为成熟完善的开源飞控项目,两个项目的系统架构差异比较大,很多同学也会问我应该学习哪一个比较好。
在PX4系列分享中,我们已经更新了19篇文章,对PX4的
-
系统架构
-
消息机制(uORB)
-
任务调度
-
设备驱动
-
日志系统
-
仿真系统
-
混控
-
ROS/ROS2接口
等方面都做了简单的介绍,大家对PX4应该有一些系统性的认识。
我们没有对ArduPilot做系统性的介绍,这里我们先简单介绍一下ArduPilot开源项目的基本信息。
ArduPilot也叫ArduPilotMega(APM),最早是基于Arduino运行在ATMEGA2560这一款8位AVR单片机上,目前的ArduPilot的代码架构也非常类似于Arduino的架构。
很多同学对这个板子应该都还有印象,最早接触它还是在大学时期,一晃已经过去将近10年。
ArduPilot项目起源于2007年,在2011年发布APM2时其系统架构已经有了目前的系统架构的雏形。
后面比较有重大意义的时间节点有:
2012年PX4项目发布,并发布了第一代PX4FMU,ArduPilot设计AP_HAL支持更多的飞控硬件
2013年ArduPilot将PX4项目作为中间件,实现对Pixhawk硬件的支持。
从这开始ArduPilot与PX4项目就有着紧密的关系,这时候ArduPilot的代码结构是这样的:
├── ArduCopter
├── ArduPlane
├── libraries
│ ├── AC_AttitudeControl
│ ├── AC_PID
│ ├── ...
│ ├── AP_HAL
│ ├── AP_HAL_Empty
│ ├── AP_HAL_Linux
│ ├── AP_HAL_PX4
│ ├── AP_HAL_SITL
├── modules
│ ├── PX4Firmware
│ ├── PX4NuttX
│ └── uavcan
2014年 DroneCode开源飞控基金会成立,PX4与ArduPilot都是其中的开源项目。
2016年ArduPilot与DroneCode因为理念的不同分道扬镳,ArduPilot脱离DroneCode基金会,这件事情当时引起了广泛讨论,ArduPilot与DroneCode的是非关系这里就不再讨论。
2018年ArduPilot引入ChibiOS作为ArduPilot的RTOS,移除了PX4Firmware、PX4NuttX,至此ArduPilot与PX4项目脱离关系。
到这里ArduPilot与PX4回到独立开发的阶段,最近几年都发展迅速,迭代非常快。
现在大家对ArduPilot项目的发展应该有一定的认识,我们对ArduPilot于PX4做一些简单的对比,下表是github上截至2022年11月19号的一些统计数据:
PX4 | ArduPilot | |
---|---|---|
commits(master分支) | 41538 | 55588 |
forks | 12.1k | 13.5k |
starred | 6k | 7.8k |
contributors | 556 | 661 |
从统计数据上看,ArduPilot在代码提交数量、项目forks、starred以及代码贡献者数量上都要多于PX4。
当然这些数据不能说明ArduPilot就优于PX4,ArduPilot项目发起比PX4更早,积累了更多的代码和功能。
在源码框架上的一些不同:
-
使用的RTOS不同:APM目前使用ChibiOS,而PX4使用Nuttx,当然它们都支持linux系统
-
消息机制不同:PX4使用uORB的微消息代理机制进行任务间的数据传递和消息同步等,任务间耦合校低;APM的模块封装在libraries中的各个类模块中,在应用层(ArduCopter、ArduPlane、Rover等)通过实例化具体的类来完成具体的功能,比如传感器、EKF、位置控制、motor等模块,模块间的数据传递通过类的输入输出接口完成。
-
任务框架不同:PX4的每个任务均运行在独立的task和工作队列中,而APM的应用层自己实现了一个调度器(AP_Scheduler)
-
代码框架的复杂程度上PX4会比APM复杂一些,模块的封装程度更高,在task、uorb、传感器的驱动封装上更为复杂一些,当然如果仅仅使用的话只要参考demo也能非常快的入门。
以下两图是ArduPilot与PX4的代码框架图
ArduPilot:
PX4:
初看两者的架构图可能对其理解不多。在后续的分享中我会新增ArduPilot这一主题,详细聊聊ArduPilot各个部分的系统架构,欢迎大家关注。
讲到这里还是没有回答我们选者ArduPilot还是PX4学习更为合适,可能如果大家对ArduPilot和PX4都有一定的了解,可能能选择更满足自己需求的项目,这里我先分享一下我自己的体会:
ArduPilot的开发时间更久,积累的代码和功能更多,用户群体也会更多一些,使用体验上整体会略好一些,代码结构更加简单清晰,上手会容易一些,更适合航模或者飞控爱好者。
PX4起源于苏黎世联邦理工学院,发展比ArduPilot稍微晚一些,系统设计去耦合,框架类似于ROS/ROS2,且在对ROS与ROS2的支持上更充分一些,更适合高校研究开发。
以上是我个人的理解,可能有不准确的地方,欢迎私信我交流讨论。