编译飞控代码¶
NextPilot 沿用 RT-Thread 所采用的 Scons + Kconfig 进行项目的配置和构建。在编译之前,请按照 “搭建开发环境” 准备好工具链,包括git、gcc、python、qemu等。
克隆代码¶
先将 nextpilot-flight-control
(github | gitee) 代码克隆到本地。
git clone https://github.com/nextpilot/nextpilot-flight-control.git
配置项目¶
注意:该功能仅限开发者
C/C++语言项目的裁剪配置本质上通过条件编译和宏的展开来实现的,nextpilot 借助 Kconfig 工具更方便的实现了这一功能。
# 命令行界面,根据bsp/.config配置目标
scons --menuconfig
# 命令行界面,配置default目标
scons defaut --menuconfig
# 图形用户界面,配置mavlink目标
scons mavlink --guiconfig
通常,开发过程中存在多个config文件,如在qemu/config的文件下存在以下config文件:
- alloc.config
- default.config
- mavlink.config
如果您希望配置某一个指定的目标(target),则在运行scons
时候加上target
的名称,比如您希望根据config/mavlink.config
文件进行配置,则运行:
# 以下两种方式等效,没有先后顺序
scons mavlink --menuconfig
scons --menuconfig mavlink
其实在您指定config文件的时候,scons会自动执行以下操作:
- 将qemu/config/xxxx.config文件覆盖到qemu/.config
- 根据qemu/config/xxxx.config文件生成新的rtconfig.h
生成工程¶
nextpilot 支持使用scons --target=xxxx
生成 Keil、Vscode、CMake工程。
# 使用当前的rtconfig.h生成MDK5工程
scons --target=mdk5
# 使用default目标生成MDK5工程
scons default --target=mdk5
# 根据mavlink目标生成MDK5工程
scons mavlink --target=mdk5
# 生成vscode工程
scons alloc --target=vsc
编译项目¶
注意:由于 nextpilot 支持多硬件(bsp)匹配,每个bsp相当于一个独立的工程,因此必须在
bsp
目录下执行scons
,不能在nextpilot-flight-control
根目录下直接执行scons
。
# 切换到bsp目录,比如sitl/qemu(虚拟飞行仿真)
cd nextpilot-flight-control/bsps/sitl/qemu
# 显示帮助信息
scons -h
# 清空项目编译,注意小写c
scons -c
# 8线程编译项目,编译结果放在build文件夹
scons -j8
# 编译指定目标(target)
scons default -j8
scons mavlink -j10
Note
每个bsp
都可能包含多个目标(target)
,比如default
、fw
、mc
等,target
配置保存在config/xxxx.config
文件夹,一个xxxx.config
就是一个target
,xxxx.config
本质是一个kconfig
配置保存文件。
在运行scons
的时候,如果指定了target
,那么会先根据config/target.config
生成rtconfig.h
文件,如果没有指定target
则使用当前的rtconfig.h
文件。
飞行仿真¶
nextpilot 飞控内部集成一套六自由度模型(SDOFS)用来生成控制所需的传感器数据,并驱动控制算法、组合导航、通信链路等模块,编译后的固件运行在 qemu 硬件模拟器上,从而实现 虚拟飞行仿真
功能。虚拟飞行仿真使用同一套飞控代码,因此跟 跟真实飞行的逻辑、算法、功能是完全一样 的,可以通过UDP连接地面站,并支持使用VScode进行 单步断点调试,极大了方便了开发、测试、培训等。更加详细参见飞行仿真章节。
# 切换sitl/qemu目录
cd nextpilot-flight-control/bsps/sitl/qemu
# 编译工程
scons default -j8
# 在qemu模拟器中运行nextpilot
qemu.bat
启动 qenum 模拟器之后,我们可以:
- 终端输出飞控打印信息,可以输入命令和飞控进行交互
- 连接地面进行飞行、航线等正常操作,跟真实飞行无异
- 飞行结束之后7zip解压sd.bin,提取飞行日志进行分析
> qemu.bat
WARNING: Image format was not specified for 'sd.bin' and probing guessed raw.
Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
Specify the 'raw' format explicitly to remove the restrictions.
dsound: Could not initialize DirectSoundCapture
dsound: Reason: No sound driver is available for use, or the given GUID is not a valid DirectSound device ID
lwIP-2.0.3 initialized!
=================================================================
_ __ __ ____ _ __ __
/ | / /___ _ __ / /_ / __ \ (_)/ /____ / /_
/ |/ // _ \ | |/_// __// /_/ // // // __ \ / __/
/ /| // __/_> < / /_ / ____// // // /_/ // /_
/_/ |_/ \___//_/|_| \__//_/ /_//_/ \____/ \__/
Copyright All Reserved (C) 2015-2023 NextPilot Development Team
=================================================================
HW ARCH: SITL-QEMU-A9
HW MCU: ARM Cortex-A9(devid 0 revid 0)
HW UID: 000
FW VER: v3.10_begin_test-5-gb52f116a-dirty(zhanfuyu)
FW HASH: b52f116a0bd7cf042b4c9f3103196605352cc23b
OS VER: RT-Thread V4.1.1(255)
OS HASH: aab2428d4177a02cd3b0fd020e47a88de379a6ab
Toolchain: GNU GCC 10.3.1 20210824 (release)
Build URI: zhanfuyu@192.168.1.10(DESKTOP-JTKLBS9)
Build TIME: Apr 8 2023 14:35:42
--------------------------------------------------------------
[40] W/param: can't find param IMU_GYRO_RATEMAX
[40] W/param: can't find param IMU_INTEG_RATE
[46] I/sal.skt: Socket Abstraction Layer initialize success.
[46] I/utest: utest is initialize success.
[46] I/utest: total utest testcase num: (95)
[73] I/SDIO: SD card capacity 524288 KB.