apm二次开发经历分享
APM二次开发经历分享
截止到2025/3/3,差不多已经和飞控系统apm、px4打交道一年多了,一直以来都是以使用为主。但是由于国内apm社区不完善,一路上踩了不少坑。有很多飞控的高级特性也没有机会探索,飞控方面的水平停滞不前。所以这段时间开始,我计划结合deepseek,进行apm的二次开发工作,从源码的层面深入了解apm。同时我也计划起草一个飞控地面站计划——“PulseWing”,虽然短期来看pulseWing无法追赶missionplanner、QGroundControl等,但是我希望开发出可控性高,可编辑性强,ui界面美观的地面站软件,也就是说结合目前发行地面站的优点开发。(编辑于2025/3/3)
第〇章,项目结构
1.顶层目录结构
ardupilot/
├── ArduCopter/ # 多旋翼无人机固件
├── ArduPlane/ # 固定翼无人机固件
├── Rover/ # 无人车/船固件
├── Sub/ # 水下机器人固件
├── libraries/ # 核心库(跨平台、跨载具)
├── Tools/ # 开发工具与脚本
├── modules/ # 高级功能模块(可选)
├── wscript # Waf编译系统配置
└── ...
2.关键目录详解
(1) 载具固件目录(如 ArduPlane
)
- 功能:每个载具的独立入口,包含模式切换、主循环、载具特定逻辑。
- 核心文件:
system.cpp
:主程序入口(setup()
和loop()
)。mode_*.cpp
:飞行模式实现(如mode_auto.cpp
自动模式)。control_*.cpp
:控制算法(如control_tecs.cpp
固定翼能量控制)。quadplane/
:垂直起降混合模式(VTOL)。
(2)核心库目录(libraries/)
libraries/
├── AP_HAL/ # 硬件抽象层(HAL)
├── AP_Math/ # 数学库(坐标转换、滤波算法)
├── AP_Param/ # 参数管理系统
├── AP_NavEKF3/ # 扩展卡尔曼滤波(导航核心)
├── AP_Scheduler/ # 实时任务调度器
├── AP_Mission/ # 任务规划与执行
├── AP_GPS/ # GPS驱动与数据处理
├── AP_Baro/ # 气压计驱动
├── AP_Compass/ # 磁力计驱动
├── AP_OpticalFlow/ # 光流传感器支持
└── ...
(3) 硬件抽象层(AP_HAL/)
-
功能:统一硬件接口,支持多种飞控平台(如Pixhawk、Linux)。
-
子目录:
AP_HAL_PX4/
:Pixhawk系列飞控驱动。AP_HAL_Linux/
:Linux平台(如Raspberry Pi)驱动。AP_HAL_ChibiOS/
:ChibiOS实时操作系统支持。
(4) 工具目录(Tools/
)
Tools/
├── autotest/ # 自动化测试框架
├── Bootloader/ # 飞控引导程序
├── Hardware/ # 硬件定义文件(如Pixhawk引脚映射)
├── LogAnalyzer/ # 飞行日志分析工具
├── scripts/ # 实用脚本(如SITL仿真)
└── ...
3.代码分层架构
- 应用层(载具固件目录):
- 实现具体载具的行为(如固定翼的自动降落逻辑)。
- 功能层(核心库):
- 提供通用算法和传感器驱动(如导航滤波、PID控制)。
- 硬件抽象层(AP_HAL):
- 屏蔽硬件差异,提供统一API(如串口通信、PWM输出)。
4. 编译系统(Waf)
- 配置文件:
wscript
定义编译规则。 - 编译命令:
./waf configure --board px4-v2 # 选择硬件平台 ./waf copter # 编译多旋翼固件
- 输出文件:固件位于
build/{board}/bin/
(如arducopter.px4
)。
5. 参数系统
-
定义位置:在库或载具代码中通过宏定义参数:
cpp复制
// 在 AP_Param 中定义 AP_GROUPINFO("MAX_SPEED", 1, Plane, max_speed, 30),
-
存储方式:参数保存在飞控的EEPROM或Flash中,可通过地面站(如Mission Planner)调整。
6. 扩展开发入口
(1) 添加新传感器
- 在
libraries/AP_*
中创建驱动(如AP_CustomSensor
)。 - 在载具代码中初始化传感器并读取数据。
(2) 新增飞行模式
- 在载具目录(如
ArduPlane/
)创建mode_my_mode.cpp
。 - 继承
Mode
基类,实现init()
和run()
方法。 - 注册到载具主类并更新模式切换逻辑。
(3) 修改控制算法
- 目标文件:
libraries/AP_Control
或载具的control_*.cpp
。 - 示例:调整PID参数或修改TECS(Total Energy Control System)逻辑。
7. 仿真与测试
-
SITL仿真:
sim_vehicle.py -v ArduPlane --console --map
-
Gazebo集成:
- 场景文件位于
Tools/autotest/models/
。 - 支持固定翼、多旋翼等复杂环境仿真。
- 场景文件位于
第一章,环境搭建
1.硬件环境及操作系统
Hardware Model:ThinkPad s3-490
Memory: 8GB
Processor: Intel Core i5-8265U CPU @ 1.60GHz x 8
Disk Capacity: 512.1G
OS Name: Ubuntu 22.04.5 LTS
OS Type: 64-bit
2.开发环境配置
-
安装依赖:
-
Ubuntu系统(推荐):
sudo apt-get install git cmake build-essential python3-dev python3-pip
-
安装必要的Python库:
pip3 install future pymavlink pyserial
-
-
克隆代码:
git clone https://github.com/ArduPilot/ardupilot.git cd ardupilot git submodule update --init --recursive
-
配置工具链:
-
使用ArduPilot官方脚本自动配置环境:
./Tools/environment_install/install-prereqs-ubuntu.sh -y
-
(这里欠一张图)
3.编译测试
我使用的飞控是 YJUAV A6SE
,所以参照官方文档,我进行了编译操作:
设置飞控型号:
./waf configure --board YJUAV_A6SE_H743
编译(固定翼):
./waf plane
(这里欠一张图)
删除编译生成文件:
./waf clean
apm二次开发经历分享
http://ddxd.xyz//archives/apmer-ci-kai-fa-jing-li-fen-xiang