AKTK-Lab

Back

clone源码:fork一个自己的仓库

git clone --recurse-submodules <your-fork-url>
sh

Linux / WSL2 环境配置#

Linux有自己的安装脚本,gcc-arm-none-eabi会有脚本无法安装的情况,自己拿包管理器装就行了,实际测试可以编译成功

sudo apt-get update
sudo apt-get install git
sudo apt-get install gitk git-gui
Tools/environment_install/install-prereqs-ubuntu.sh -y
~/.profile
sh

macOS#

在开始之前确认安装好 xcode 和 brew,python3

建立 python 虚拟环境#

试过了不能用conda,只能用python的venv,注意不要使用conda的python创建虚拟环境

cd ardupilot
conda deactivate
python3 -m venv ardupilot-venv # 建立名字为 ardupilot-venv 的虚拟环境
source ardupilot-venv/bin/activate # 启动虚拟环境
brew install gcc-arm-none-eabi genromfs
brew install gawk
python3 -m pip install empy pyserial
sh

安装mavproxy

sudo python3 -m pip install wxPython
sudo python3 -m pip install gnureadline
sudo python3 -m pip install billiard
sudo python3 -m pip install numpy pyparsing
sudo python3 -m pip install MAVProxy
python3 -m pip install pexpect
python3 -m pip install dronecan
sh

编译构建项目#

设置编译选项#

ardupilot使用waf编译,waf是一个基于 Python 的跨平台构建系统,主要用于自动编译和安装 C/C++ 等代码。waf不需要额外安装,已经包含在ardupilot项目的文件夹里了。

以编译运行在pixhawk4上的rover代码为例,pixhawk4的MCU是STM32F765,ardupilot运行在ChibiOS(一种RTOS)上

编译构建后产生build summary

./waf rover # 编译rover
Waf: Leaving directory `/home/akatsuki/ardupilot/build/Pixhawk4'

BUILD SUMMARY
Build directory: /home/akatsuki/ardupilot/build/Pixhawk4
Target         Text (B)  Data (B)  BSS (B)  Total Flash Used (B)  Free Flash (B)  External Flash Used (B)
---------------------------------------------------------------------------------------------------------
bin/ardurover   1425312      2776   126076               1428088          636292  Not Applicable
sh

接下来看一下编译之后都生成了什么

编译构建过程#

产生的 build/Pixhawk4 文件内容大致如下

其中 compile_commands.json 也在该目录下,在项目的 .vscode 目录中建立工作区配置 settings.json 加入这个目录,就能让clangd找到头文件

{
    "clangd.arguments": [
        "--compile-commands-dir=build/Pixhawk4"
    ]
}
json

编译时,modules/ChibiOS 里的内核、HAL 和 STM32 驱动会先编译成 obj 目录下的大量 .o 文件,然后与 Rover 模块、AP_GPSAP_HAL 等 ArduPilot 库一起链接生成 bin 目录下最终的 ardurover.hex 和 apj 固件

modules 除了ChibiOS还有DroneCAN(基于CAN的无人机开源通信协议)和lwIP(轻量级 TCP/IP 协议栈),ChibiOS 负责线程和驱动,DroneCAN 负责 CAN 设备通信,lwIP 负责 TCP/IP 网络协议栈

硬件描述文件 hwdef#

源码中 AP_HAL/AP_HAL_ChibiOS/Pixhawk4 的硬件描述文件 hwdef.dat 会编译成 build/Pixhawk4/hwdef.h,在代码中头文件也会引入刚才编译生成的 hwdef.h

该文件定义了晶振、内存区、描述外设信息的设备表、外设引脚设置等

在wsl2使用SITL进行模拟#

SITL(Software in the Loop)可以在不需要任何硬件的条件下模拟ardupilot,主要用于测试算法等。ardupilot通过TCP5763端口通过TCP5760端口直接和Mission Planner地面站进行通信,也可以使用MAVProxy协议进行通信,再通过UDP14550和其他地面站例如QGroundControl进行通信。

Example of using SITL by Vehicle提供了多种使用SITL模拟的案例。

./waf configure --board sitl
cd Rover
../Tools/autotest/sim_vehicle.py --map --console --no-wsl2-network # wsl配置镜像代理
sh

此时在构建完的目标在 build/sitl 中,这边使用QGroundControl做地面站,QGroundControl运行在宿主机中,ardupilot在wsl2内编译构建。

使用SITL运行仓库提供的 example#

https://ardupilot.org/dev/docs/using-sitl-for-ardupilot-testing.html#using-sitl-for-ardupilot-testing

查看仓库中可用的测试样例

./waf list | grep 'examples'

examples/AC_PID_test 
examples/AHRS_Test 
examples/AP_Common 
examples/AP_Compass_test 
examples/AP_Declination_test 
...
sh

构建example的过程参照下面部分

第一个ardupilot程序: example/Hello#

以构建 Tools/Hello/Hello.cpp 为例,该测试样例相当于ardupilot的hello world,主要功能是每隔1000ms(模拟器时间)打印一个 *,此外还有别的可以用于测试的程序例如 UART_test.cpp

运行#

设置编译选项后构建,然后运行

./waf configure --board=sitl
./waf build --target examples/Hello
./build/sitl/examples/Hello -M quad -C # 运行
sh

可以看到在终端中很快的打印出 * 字符,比1s快很多。因为 delay(1000) 表示延迟1000ms,但是等待的不是实际时间,是HAL的时间(Scheduler Time),在SITL中这个时间来自模拟器,如果模拟器速度是100x则现实中只需要等待10ms。该样例仅用于测试 setup()loop() 是否正常。

Reference#

Ardupilot part.1: 项目编译和构建
https://astro-pure.js.org/blog/apm-build
Author Akatsuki
Published at June 23, 2026