tags:
- 飞控
fmt开发环境搭建
fmt是国产开源飞控,特点是支持基于模型设计(基于simulink仿真),源码结构目录较清晰,项目体积较小。
此项目操作系统选择的是国产实时操作系统rt-thread,也是开源项目。(虽然非硬实时操作系统,但是只要调度不阻塞应该是问题不大);
项目的编译脚本是scons实现的,这个不太熟悉,它是基于python的,作用与cmake类似。可以先不考虑深入了解,现阶段支持编译就行。
fmt项目文档地址
按照文档提示下载代码。
# 项目编译
# 1. 进入项目目标目录 /target/xxx/下
# 2. 执行编译脚本
scons -j16 # 线程数可自选,一般是4线程编译# 3. 编译中如果出现错误,可尝试清理编译项目后重新编译
scons -c # 清理scons项目编译中间件
本人编译过程中遇到下列问题
我是在macos系统上搭的。
-
编译失败,未找到相应编译器。
这个项目的开发提示过建议通过统一的编译工具链进行开发。
编译器: arm-none-eabi- toolchain: 版本:7-2018-q2-update
.
gnu编译工具链下载地址 -
适配了编译工具链以后仍然失败,看起来虽然环境安装了,但是工程不识别,记得配置完环境变量后
source
一下。
软件在环仿真
下载安装qgc
qgc装好了,但是尝试运行qemu半在环仿真时出错了,看起来时运行qemu仿真的软件正常运行,但是无法正确连接qgc,而且/sys
路径也找不到的问题。
/sys
路径找不到的问题找到了,是在创建qemu环境时使用了初始化命令mkfs.vfat sd.bin
,不过macos并非天然支持这条命令。。。
1. 文件存在但格式化失败:
- sd.bin 文件已创建(64MB)
- 但由于 mkfs.vfat 不存在,文件系统格式化失败
- 导致是一个空的、未格式化的镜像文件
这解释了启动错误:
- FMT-Firmware 尝试挂载 SD 卡
- 发现没有有效的文件系统
- 无法创建 /sys 目录和日志文件
- 导致路径变量损坏:pQ```/boot_log.txt
解决方法有两个
- 修改启动脚本中初始化sd.bin部分为
newfs_msdos sd.bin
- 安装gnu工具
brew install dosfstools # 提供 mkfs.vfat 命令
我选择方法二解决了,现在可以正确访问boot_log
了。
另一个问题是qgc和qemu始终无法建立连接。
# 我的本地qemu版本
➜ qemu-vexpress-a9 git:(dev) ✗ qemu-system-arm -version
QEMU emulator version 10.0.2
Copyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers# 已安装qgc版本估计是比较新的,我从官网安装链接进去下载的,没查版本。
期间尝试抓包分析udp数据内容,发现数据包应该是没问题的,复合MAVLINK协议的数据帧。端口号也没有问题,默认的14550
。
这里卡了很久,不过最终还是被我找到问题。。
- QGroundControl (PID 8897) 正在监听 *:14550 (IPv4, 所有接口)
- QEMU (PID 13779) 正在发送到 [::1]:14550 (IPv6, localhost)
存在IP版本不匹配问题。 - QGC监听IPv4的14550端口
- QEMU发送到IPv6的14550端口
有点无语,遂修改项目自带启动脚本内容,从下面
qemu-system-arm -M vexpress-a9 -kernel build/fmt_qemu-vexpress-a9.bin -display none -sd sd.bin -serial stdio -serial udp:localhost:14550 -serial udp:localhost:14551
改成这样,重点是强调ip地址. udp:127.0.0.1
qemu-system-arm -M vexpress-a9 -kernel build/fmt_qemu-vexpress-a9.bin -display none -sd sd.bin -serial stdio -serial udp:127.0.0.1:14550 -serial udp:127.0.0.1:14551
然后就连上了,也是有点无语-。-
后面会尝试跟他们团队咨询下,这可能算是一个比较隐蔽的问题。
➜ qemu-vexpress-a9 git:(dev) ✗ ./qemu.sh 启动QEMU模拟器...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.[I/SDIO] SD card capacity 65536 KB.TOML: No config file finded: /sys/sysconfig.tomlDefault configuration loaded._____ __ / __(_)_____ _ ___ ___ _ ___ ___ / /_/ _// / __/ ' \/ _ `/ ' \/ -_) _ \/ __/
/_/ /_/_/ /_/_/_/\_,_/_/_/_/\__/_//_/\__/
Firmware.....................FMT FW v1.1.0Kernel....................RT-Thread v4.0.3RAM................................8192 KBTarget....................QEMU vexpress-a9Vehicle........................MulticopterAirframe.................................1INS Model....................CF INS v1.0.0FMS Model....................MC FMS v1.0.0Control Model.........MC Controller v1.0.0Plant Model.............Multicopter v1.0.0Task Initialize:offboard..............................OKmavobc................................OKmavgcs................................OKlogger................................OKstatus................................OKvehicle...............................OK[1045] I/StatusTask: SIH Simulation[2044] W/MAVGCS: unhandled mavlink command:512[2083] W/MAVGCS: unhandled mavlink command:521[4410] W/MAVGCS: unhandled mavlink command:512[4806] W/MAVGCS: unhandled mavlink command:512[5200] W/MAVGCS: unhandled mavlink command:512