
ArduPilot 开源飞控系统完整指南一套代码如何飞多旋翼、固定翼还能潜到水底【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilotArduPilot 是一套免费的开源无人机自动驾驶系统为多旋翼、固定翼、地面车辆和水下机器人提供完整的飞行控制能力也是目前全球装机量最大的飞控开源项目之一。它把实时控制、传感器融合、故障安全全部写进同一个代码库。下面从工程师视角讲清楚它是怎么分层的、数据是怎么流转的、换板子要做什么、出了问题怎么兜底以及你如何动手验证它。为什么一套代码能飞多旋翼、固定翼还能潜到水底先看一个问题多旋翼要吊住自己固定翼要一直往前飞水下机器人则几乎没有升力。控制逻辑完全不同为什么 ArduPilot 能用同一套代码支撑全部答案在分层。最底层是硬件抽象层HAL它把 UART、SPI、I2C、GPIO、PWM 这些和芯片强绑定的东西包装成统一接口上层代码完全感知不到底下是 STM32F4 还是 H7。中间层是一堆可复用的功能库姿态解算、卡尔曼滤波、电机驱动、日志、参数系统这些对五种载具都通用。最上层才是载具专属逻辑ArduCopter/、ArduPlane/、Rover/、ArduSub/、AntennaTracker/ 五个目录各管各的。想看懂全貌建议直接读 libraries/AP_HAL/ 里的接口定义。图中是 ArduPilot 仿真环境里的固定翼平台它和多旋翼共享同一套姿态解算与导航滤波器只是控制律不同。沿着一个控制循环走传感器读数如何变成电机输出假设多旋翼悬停中的一圈循环。IMU 以 800Hz 输出角速度和加速度GPS 每 10Hz 报位置气压计报高度。这些原始数据先经过低通滤波再喂给 EKF扩展卡尔曼滤波见 libraries/AP_NavEKF3/它把噪声大、各说各话的传感器读数融合成一组干净的位置、速度和姿态估计。接着控制层接手姿态控制器AC_AttitudeControl_Multi.cpp算出目标加速度位置环算出目标姿态PID 环把角度误差换算成各电机的油门差。最后电机模块把这些量映射成 PWM 输出。整条链路被 libraries/AP_Scheduler/ 按固定频率驱动任务表直接写在 ArduCopter/Copter.cpp 的 scheduler_tasks 里——谁先跑、多久跑一次一目了然。这张 CM4Pilot 双板飞控的引脚图展示了数据流的两端传感器从 UART/SPI 进入电机 PWM 从右侧输出。如何给新飞控板做适配拿到一块新板子你的工作基本集中在硬件定义hwdef上在 libraries/AP_HAL_ChibiOS/hwdef/ 下建一个目录声明这颗芯片上每个引脚的用途——哪个 UART 接 GPS、哪个 SPI 接 IMU、哪几路 PWM 给电机、电池电压从哪个 ADC 读。传感器本身往往不用写驱动主流 GPS、罗盘、气压计、电调都有现成驱动缺的只是接线表。CAN 总线上挂电调或 ESC 遥测时只需在定义里描述 CAN 通道和 ID 表协议解析由 libraries/AP_DroneCAN/ 等现成库完成。也就是说适配新板子的核心交付物是引脚映射加少量配置而不是重写控制逻辑。AEDROX H7 的完整引脚图适配新板子时你要做的就是给出这样一张引脚到外设的对应关系。系统出问题时它自己会做什么安全问题被拆成三道防线。第一道是解锁预检libraries/AP_Arming/ 通用检查加上各载具的专属项ArduCopter/AP_Arming_Copter.cppIMU 过热、罗盘失准、GPS 没锁定任何一条不过电机根本不会解锁。第二道是运行时兜底调度器给每个任务设了时长预算姿态环如果超时占用过多 CPU会被记为过载甚至降频保证姿态环永远跑得完。第三道是故障安全RC 遥控丢失、电池低压、GPS 信号消失failsafe 逻辑会自动切到 RTL 或降落而不是失控乱飞。对飞手来说这三层意味着最坏情况也是可预期的。图中是 ArduPilot 仿真使用的 RC 链路遥测信号一旦中断故障安全机制会接管并执行自动返航或降落。潜到水底水下控制有什么不同多旋翼靠持续推力对抗重力ArduSub 的潜航器却有接近中性的浮力停住和飘走之间只有一厘米深度之差。所以水下平台的深度环比空中更保守Althold 模式的 control_depthArduSub/mode_althold.cpp基于气压/压力估计缓慢逼近目标深度且限定了垂直速率上限。另外两个水下特有的点一是表面与底部探测surface_bottom_detector.cpp让载具知道头顶是水、脚下是底接近水面时自动收油避免冲出二是推进器响应慢、阻力大姿态环的带宽明显比空中低。这些差异被隔离在 ArduSub/ 目录里不污染空中平台的代码。ArduSub 水下机器人在仿真中执行深度保持其控制律针对水的阻力和浮力做了专门调参。上机前如何验证改动仿真与自动化测试ArduPilot 的测试主战场是 SITLlibraries/SITL/ 内置了多旋翼、固定翼、平衡车甚至真实物理模型配合 AP_HAL_SITL 让整架虚拟飞机在 PC 上跑真实的控制代码不用碰硬件。本地一条命令就能起测运行 Tools/autotest/sim_vehicle.py它会把载具拉起来按 Tools/autotest/ArduCopter_Tests/ 里的脚本执行起飞、航点、失控降落等场景并断言结果。仓库的 CI 流程则在每次提交后对每个载具各跑一遍 SITL 回归测试再叠加单元测试与代码风格检查。多旋翼 SITL 仿真是 CI 回归测试的主力场景每次代码提交都会在这个虚拟环境里自动起降验证。动手路径五步开始 先通读 libraries/AP_HAL/ 的接口文件理解上层凭什么看不见硬件 打开 ArduCopter/Copter.cpp 的 scheduler_tasks对照 libraries/AP_Scheduler/ 看懂任务优先级 用 Tools/autotest/sim_vehicle.py 在本地跑一遍多旋翼 SITL 场景改一个参数观察行为️ 参考 libraries/AP_HAL_ChibiOS/hwdef/ 里任意一块板子试着读懂一份硬件定义 读 ArduSub/mode_althold.cpp 的深度环体会同一框架如何适配完全不同的物理环境【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考