资讯动态

ArduPilot飞控源码编译与SITL仿真入门指南

发布时间:2026/10/14 10:50:57 来源:尧图企业网站定制
简介本资源为ArduPilot开源飞控系统的预打包源码压缩包面向无人机、航模及地面机器人方向的开发者与研究者尤其适合在Ubuntu环境下进行飞控二次开发、仿真测试或算法验证的技术人员。由于官方Git仓库克隆常受网络限制导致下载缓慢该压缩包直接提供7月5日的最新源码解压即可使用省去漫长等待。资源包为7z格式整体约200.95MB上游未提供具体文件总数与类型明细解压后得到完整的ardupilot源码目录涵盖飞控核心代码、构建脚本及工具链配置。内容涉及源码获取、Git初始化、autotools编译流程、Gazebo与Mission Planner模拟器接入、Pixhawk硬件串口配置以及向官方仓库提交pull request的协作方式可帮助读者快速搭建可编译、可调试、可持续更新的开发环境。目前已有272人学习下载适合具备一定Linux与嵌入式基础的中高级开发者参考使用。1. 拿到 ardupilot.7z 之后一个飞控源码包到底该怎么用很多人第一次拿到ardupilot.7z这种命名第一反应是「这不就是个压缩包吗」解压完看到一堆.cpp、.h、wscript、.py就懵了。它其实是 ArduPilot 飞控固件的完整源码归档覆盖多旋翼、固定翼、车、船、潜艇等多类载具的固件代码以及配套的构建脚本、参数定义、地面站通信协议和仿真接口。你拿到的不是一份「能直接烧进飞控的固件」而是一整套需要自己编译、裁剪、配置的工程。它适合三类人想改飞控行为做二次开发的嵌入式工程师、想跑 SITL 仿真验证控制算法的研究者、以及需要给特定硬件定制固件的团队。这篇笔记就按「解压之后先干什么 → 怎么编译出固件 → 怎么在仿真里跑通 → 参数和日志怎么调 → 哪些坑会让人卡一整天」的顺序讲清楚让你拿到这个包不至于对着目录发呆。2. 解压之后先别急着编译目录结构与工具链选型2.1 先认清 ArduPilot 源码树的几个关键目录解压ardupilot.7z之后根目录下通常能看到这些核心目录先花十分钟认一遍比直接敲编译命令省事得多目录作用你什么时候会进去ArduCopter/多旋翼固件主代码改飞行模式、姿态控制ArduPlane/固定翼固件主代码改航线、TECS 逻辑APMrover2/或Rover/地面车固件改转向、速度控制libraries/公共库传感器驱动、EKF、通信协议加新传感器、改滤波Tools/构建、仿真、参数工具脚本跑 SITL、生成参数文档modules/子模块如 MAVLink、DroneCAN改通信协议libraries/是改动最频繁的地方因为传感器驱动、EKF、MAVLink 都在这里。Tools/autotest/下面有 SITL 启动脚本后面仿真会用到。注意modules/里很多是 git submodule如果你拿到的包没有把子模块打进去编译时会报缺文件这时候需要单独补。2.2 工具链怎么选Linux 原生、WSL 还是容器ArduPilot 官方构建脚本对 Linux 最友好Windows 下常见做法是 WSL2 或者直接用 Docker。我一般推荐 Ubuntu 20.04/22.04 原生或 WSL2因为Tools/environment_install/下的脚本就是给 apt 写的。如果你用 macOSHomebrew 也能装但某些交叉编译工具链版本容易对不上。先装基础依赖以 Ubuntu 为例# 更新源并安装编译基础工具 sudo apt-get update sudo apt-get install -y git python3 python3-pip python3-dev \ build-essential gcc-arm-none-eabi gdb-arm-none-eabi \ libtool automake autoconf libexpat1-dev # 进入源码根目录运行官方环境安装脚本 cd ardupilot Tools/environment_install/install-prereqs-ubuntu.sh -y # 让环境变量生效重新加载 shell 配置 . ~/.profile这段脚本会装gcc-arm-none-eabi交叉编译器、Python 依赖和waf构建工具。参数-y表示自动确认不加会逐条问你。装完后arm-none-eabi-gcc --version能输出版本号说明交叉编译链就位。如果这一步报pip相关错误多半是 Python 版本太新或太旧ArduPilot 对 Python 3.6~3.10 兼容较好3.12 有时会缺distutils需要额外装python3-setuptools。2.3 用 waf 配置并编译第一个固件ArduPilot 用waf而不是 Make配置和编译是两步# 配置多旋翼固件目标硬件为 Pixhawk 类fmuv3 ./waf configure --board fmuv3 # 开始编译多旋翼 ./waf copter # 如果只想编译固定翼 ./waf plane--board指定目标硬件常见值有fmuv3、fmuv5、CubeOrange、Pixhawk6X等。选错 board 会导致生成的固件引脚定义不对烧进去可能连不上地面站。./waf copter只编译多旋翼编译产物在build/fmuv3/bin/下文件名类似arducopter.apj。第一次编译大概 5~15 分钟取决于机器性能。如果报arm-none-eabi-gcc: not found说明交叉编译器没装好或 PATH 没生效回到 2.2 检查。提示编译前先./waf clean可以清掉旧产物避免因为头文件缓存导致的玄学链接错误。3. 不接硬件也能跑SITL 仿真环境搭起来3.1 SITL 是什么为什么值得先跑通SITLSoftware In The Loop把飞控固件编译成能在电脑上直接运行的进程配合仿真器模拟传感器和物理运动。你不用接飞控板就能在地面站里看到飞机动起来、改参数、看日志。对改代码的人来说SITL 是验证逻辑的第一道关比直接烧硬件安全得多。ArduPilot 自带Tools/autotest/sim_vehicle.py脚本一条命令就能拉起仿真。3.2 启动一个多旋翼 SITL 实例先确保你在源码根目录然后# 进入工具目录 cd Tools/autotest # 启动多旋翼 SITL指定机型为 quad并打开 MAVProxy 控制台 ./sim_vehicle.py -v ArduCopter -f quad --console --map-v ArduCopter指定载具类型-f quad指定机架--console打开 MAVProxy 命令行--map打开地图窗口。启动后你会看到 MAVProxy 里不断刷出姿态、GPS、电池信息。如果卡在Waiting for heartbeat通常是仿真进程没起来检查build/sitl/bin/arducopter是否存在不存在就先./waf copter编译 SITL 目标。3.3 用 MAVProxy 发指令验证仿真是否真的在跑仿真起来后在 MAVProxy 控制台里敲几条命令# 切换到 GUIDED 模式 mode guided # 解锁电机 arm throttle # 起飞到 10 米高度 takeoff 10如果飞机在地图上升起来说明 SITL 链路通了。mode guided切到引导模式arm throttle解锁takeoff 10起飞到 10 米。这几条命令能跑通后面改代码、调参数才有意义。如果arm报PreArm: Hardware safety switch那是仿真参数没配好检查SIM_开头的参数或者直接param set ARMING_CHECK 0临时关掉检查。注意SITL 里关掉 arming check 只是为了调试方便真机千万别这么干。4. 参数、日志与编译选项让固件按你的意图工作4.1 参数系统怎么读怎么写ArduPilot 的参数系统是固件行为的核心。每个参数有名字、类型、默认值和范围定义在libraries/AP_Param/和各个模块的Parameters.cpp里。改参数有三种方式地面站里改、MAVProxy 里param set、或者直接改源码里的默认值。前两种是运行时改掉电可能丢改源码默认值会编译进固件适合批量部署。# 在 MAVProxy 里查看某个参数 param show ARMING_CHECK # 设置参数并写入 param set ARMING_CHECK 0 param writeparam show看当前值param set改内存值param write写进存储。如果你在源码里改默认值比如把ARMING_CHECK默认改成 0需要找到对应Parameters.cpp里的AP_GROUPINFO行改最后一个参数然后重新编译。4.2 日志怎么开、怎么导、怎么看日志是排查问题的黑匣子。SITL 和真机都会往logs/目录写.BIN文件。SITL 下日志默认写在logs/下文件名带时间戳。用Tools/autotest/里的mavlogdump.py可以转成文本# 把二进制日志转成可读文本只输出 ATT 和 GPS 消息 python3 Tools/autotest/mavlogdump.py --types ATT,GPS logs/00000001.BIN--types过滤消息类型ATT是姿态GPS是定位。不看过滤直接 dump 会刷屏。如果你要看某个参数在飞行中的变化用--types PARM。日志分析是调参的后悔药飞机抖了、飘了先看日志里的ATT和RCOU比凭感觉拧参数靠谱。4.3 编译选项怎么裁剪固件体积飞控板 Flash 有限功能全开可能超。./waf configure时可以加--enable-*或--disable-*裁剪。比如你不需要 DroneCAN./waf configure --board fmuv3 --disable-dronecan ./waf copter裁剪前先看build/fmuv3/bin/arducopter.apj的大小超了再裁。常见可裁的还有--disable-benchmark、--disable-mission。但别乱裁裁掉--disable-mavlink地面站就连不上了。裁剪完一定要在 SITL 里跑一遍确认基本功能还在。5. 避坑与排查那些让人卡一整天的常见问题5.1 编译报错fatal error: AP_Common.h: No such file现象./waf copter时提示找不到头文件。原因modules/子模块没拉全或者libraries/目录不完整。解决检查modules/下是否有mavlink、DroneCAN等目录缺了就补如果是 git 仓库执行git submodule update --init --recursive。压缩包版本可能没带子模块需要单独获取。5.2 SITL 启动后地面站连不上现象sim_vehicle.py跑起来了但地面站或 MAVProxy 收不到心跳。原因端口被占用或者--out参数没配。解决默认 SITL 监听 14550 和 14551检查netstat -tulnp | grep 145。如果被占用用--outudp:127.0.0.1:14560换端口。另外确认防火墙没拦 UDP。5.3 烧进真机后无法解锁现象固件烧录成功但电机不转地面站报PreArm错误。原因加速度计、罗盘没校准或者安全开关没按。解决先做加速度计校准和罗盘校准再检查ARMING_CHECK具体报哪一项。常见的是Compass not healthy需要重新校准或检查接线。别急着关检查先看日志里PREARM消息。5.4 改完代码编译通过但行为没变现象改了libraries/里的逻辑编译烧录后飞机行为跟没改一样。原因改的文件没被当前载具编译进去或者改的是默认参数但没重新编译。解决确认改的文件在ArduCopter/wscript的源文件列表里如果是参数默认值确认改的是对应载具的Parameters.cpp并且执行了./waf clean后重新编译。5.5 日志文件巨大分析卡死现象一次飞行日志几百 MBmavlogdump.py跑半天。原因日志速率设太高或者记录了太多不必要消息。解决调LOG_BITMASK参数只记录需要的消息分析时用--types过滤。真机飞行前先想清楚要记什么别全开。6. 进阶用自定义代码验证一个控制逻辑前面都是跑通和排查这一章说一个具体技巧怎么在不碰真机的情况下验证你改的控制逻辑。假设你想改多旋翼的高度控制让爬升更柔和。步骤是先在ArduCopter/里找到高度控制相关代码改一个增益或滤波系数编译 SITL用 MAVProxy 发takeoff看日志里的ATT和PSC消息对比改前改后的爬升曲线。具体操作# 改完代码后重新编译 SITL 目标 ./waf configure --board sitl ./waf copter # 启动仿真指定日志输出 cd Tools/autotest ./sim_vehicle.py -v ArduCopter -f quad --console --map --outudp:127.0.0.1:14550 # 在 MAVProxy 里执行起飞并记录 mode guided arm throttle takeoff 20起飞后等飞机稳定悬停在 MAVProxy 里log download或者直接去logs/找最新.BIN。用mavlogdump.py --types PSC,ATT导出看高度变化曲线。如果你改的是PSC_ACCZ_P这类参数也可以不改代码直接param set后对比。改代码的好处是能验证默认值之外的逻辑比如加一个自定义滤波。验证时注意SITL 的物理模型和真机有差距仿真里柔和了真机不一定柔和但仿真里震荡了真机一定有问题。所以 SITL 适合筛掉明显错误的改动真机微调还得靠试飞。我一般会在 SITL 里跑三组默认参数、改后参数、极端参数看边界在哪。这样上真机心里有数。最后说个习惯每次改完代码先./waf clean再编译避免缓存导致的假通过每次烧真机前先在 SITL 里跑一遍解锁和起飞。这个习惯帮我省过好几次炸机。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑