跳转至

编译飞控代码

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),比如defaultfwmc等,target配置保存在config/xxxx.config文件夹,一个xxxx.config就是一个targetxxxx.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.