从SITL仿真到首飞:ArduPilot飞控系统实战拆解
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
我第一次把ArduPilot飞控系统挂到SITL里,推油门后RC 3通道输出一直卡在1100。排查了四十分钟串口日志,才发现FRAME_TYPE默认设成了1(quadplane),单旋翼的油门逻辑走的完全是另一条路径。这篇文章按我实际走通的路径拆一下这套飞控。
ArduPilot在解决什么问题
ArduPilot是覆盖多旋翼、固定翼、潜艇、地面车辆和天线跟踪器的开源自动驾驶系统。架构核心是三层:HAL抽象不同MCU与外设差异,libraries/AP_HAL/与AP_*库负责传感器融合、电机管理和控制算法,ArduCopter/等车种目录只写自己的模式状态机与参数。相比同类方案,它的差异在于参数化定制能力强、适配的硬件板型范围很宽。
| 项目 | 内容 |
|---|---|
| 许可证 | GPLv3 |
| 起始年份 | 2010 |
| 主要维护方 | ArduPilot社区开发者团队(按车种与子系统分工) |
| 支持平台数 | 464个ChibiOS板型定义,另有SITL/Linux/ESP32 HAL |
| 核心通信协议 | MAVLink |
🧭 上手路径:ArduPilot SITL仿真 → 最小硬件 → 完整运行
阶段1:SITL仿真目标:让ArduCopter在模拟器里编译并跑起来。
git clone --recurse-submodules https://gitcode.com/GitHub_Trending/ar/ardupilot cd ardupilot ./waf copter通过标准:build/sitl/bin/下生成arducopter-sitl二进制即通过。
SITL能编译后就可以转向真实板卡交叉编译,代价只是换一个--board参数。
阶段2:最小硬件目标:给实际飞控板编译固件(以fmuv3 / Pixhawk 2为例)。
./waf configure --board fmuv3 ./waf copter通过标准:build/fmuv3/bin/下出现arducopter二进制,且接线按引脚图核对过即通过。
CM4Pilot引脚图,CAN、SPI与各串口功能标注清晰。
烧真实板卡前,建议先在模拟器里把GCS闭环走一遍,这样板子到了只换接线。
阶段3:完整运行目标:接上GCS,完成一次完整的武装、跑Mission、解除武装闭环。
./build/sitl/bin/arducopter-sitl mavproxy.py --master tcp:127.0.0.1:5760通过标准:mavproxy里status显示ARMED和GPS 3D fix,且Mission完整跑完未触发failsafe即通过。
🛰️ 能力拆解:飞控系统按功能而非平台
导航与状态估计:libraries/AP_NavEKF3/用EKF融合IMU、气压计与GPS,主定位源退化时按AHRS_GPS_USE类参数切换到外部AHRS或里程计。IMU驱动层在libraries/AP_InertialSensor/,姿态解算入口在libraries/AP_AHRS/。
自主任务与路径规划:libraries/AP_Mission/管理航点队列与任务状态机,RTL/SmartRTL和Rally点拆在libraries/AP_SmartRTL/与libraries/AP_Rally/。各车种模式入口在mode_*.cpp,例如ArduCopter/mode_auto.cpp。
安全与Failsafe:libraries/AP_AdvancedFailsafe/集中处理RC丢失、低电量、罗经失效的触发与恢复逻辑;地理围栏在libraries/AC_Fence/;解锁前检查在libraries/AP_Arming/。
扩展接口:Lua脚本在libraries/AP_Scripting/独立线程执行;CAN外接传感器经libraries/AP_CANManager/接入;与地面站的MAVLink收发集中在libraries/GCS_MAVLink/。
ArduCopter多旋翼仿真载具,对应ArduCopter/目录。
🔧 高频排障:5个现象 → 原因 → 一句话修法
- 现象:上电后GCS里GPS始终"0星"。根因:串口协议映射不对。修法:把GPS1所在串口的协议掩码改成正确值,改完断电重启一次。
- 现象:解锁后姿态持续震荡,PID调试里rate输出顶满限幅。根因:rate环增益过高。修法:先把
ATC_R_RATE_P降30%观察趋势,再动I项。 - 现象:ESC武装后无响应,电机完全不转。根因:输出功能映射错误。修法:重设
SERVOx_FUNC到正确电机号,确认输出落在SERVOx_MIN/SERVOx_MAX区间内。 - 现象:从Loiter切到RTL,飞机突然掉头90度。根因:home航向未锁定。修法:等EKF锁定home航向后再切换,日志里确认GPS_HOME的HDG字段非零。
- 现象:电压读数比电源实测低约0.5V。根因:电压缩放参数错误。修法:用万用表复测分压点,修正
VOLTAGE_SCALING_1。
资源入口
官方
- 项目入口与维护者列表:README.md
- 构建系统、板型列表与车辆类型:BUILD.md
- 社区支持频道在README的"User Support"一节有完整索引
参与门槛先在自己的分支上把问题用SITL复现,贴出日志和复现脚本,不需要先改代码。参数默认值、文档类的小改动可以直接提PR。提PR前在本地跑通./waf编译和相关的Tools/autotest/用例,能省掉大部分往返。
建议本周先把SITL里跑通一个5航点的Mission,确认日志里从ARM到首个航点的时间在10秒以内。板子到了再按CM4Pilot引脚图接好GPS和电机,先刷fmuv3固件做台架测试,别急着上天空。
【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考