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