2022.5.7,基于v4.0.5的分析。官網(wǎng)文檔沒及時更新,本文對當(dāng)前版本源碼的描述可能和官網(wǎng)不一樣。
1、無人機(jī)全棧分層結(jié)構(gòu)圖

2、Flight Code固件部分
上圖中的Flight Code層,分為5個部分:
車機(jī)層。一份代碼通過編譯配置,可以支持Rover(小車/船)、Copter(直升機(jī),包括多旋翼)、Plane(固定翼飛機(jī))、Sub(潛水器)、AntennaTracker(追蹤天線,會自動跟隨無人機(jī)所在方向轉(zhuǎn)動的雷達(dá))這些子項目。車機(jī)層是這幾種車機(jī)子項目的專屬代碼層。
通用組件庫。各種車機(jī)都依賴的基礎(chǔ)層,見源碼結(jié)構(gòu)小節(jié)的libraries/。
硬件抽象層HAL。
工具。包括自動化測試等,見源碼結(jié)構(gòu)一節(jié)的Tools/。
依賴的三方項目,以git submodule形式存在。見源碼結(jié)構(gòu)小節(jié)modules/。
車機(jī)層實際支持的vehicle類型:

3、ArduCopter架構(gòu)與頂層設(shè)計
ArduCopter就是ArduPilot:Copter子項目的簡稱。整體架構(gòu)圖:

理解了頂層設(shè)計思路就行了:
每種板子都有自己的BootLoader bin文件,不需要再編譯的,直接打包進(jìn)最終bin。它是HAL硬件抽象層的實現(xiàn)。
main函數(shù)是往HAL實現(xiàn)層注冊一個callback函數(shù),然后HAL::run()把控制權(quán)交給了BootLoader層。硬件初始化完畢會調(diào)用callback函數(shù),其中一個是setup(),讓車機(jī)層接著初始化。
每種車機(jī)子項目都有自己的主類,都繼承AP_Vehicle父類,它是HAL層回調(diào)函數(shù)的實體,例如Copter子項目有個Copter類。Copter::setup()會發(fā)起很多個計劃任務(wù),不同任務(wù)做不同的事,觸發(fā)頻率也不一樣(1~400Hz都有)。這些任務(wù)有三大類:
讀取不同傳感器的數(shù)據(jù),處理后保存計算結(jié)果。這些結(jié)果能表示車機(jī)的當(dāng)前狀態(tài)。
執(zhí)行地面站的各種命令,命令最終會轉(zhuǎn)化為車機(jī)的目標(biāo)狀態(tài)
根據(jù)當(dāng)前狀態(tài)和目標(biāo)狀態(tài)的差距,計算應(yīng)該如何通過調(diào)整不同電機(jī)的功率輸出(螺旋槳轉(zhuǎn)速)以達(dá)到目標(biāo)狀態(tài),并把計算結(jié)果轉(zhuǎn)換為電路控制信號。
飛行模式抽象為一個基類Mode,每種具體的飛行模式是一個子類。不同的子類,計算車機(jī)目標(biāo)狀態(tài)的結(jié)果會不一樣。即設(shè)計模式中的策略模式。Copter類有成員變量記錄當(dāng)前的Mode。
Mission(航線規(guī)劃)item都可以用一種Mode來表示,item參數(shù)影響的是計算目標(biāo)狀態(tài)的結(jié)果。
用偽代碼來描述核心流程:
while True:
receiveMavLinkControlMessage()
changeTarget()
readSensorValue()
convertValueToStandardUnit()
saveInMemory()
computeWayToTarget()
computeAttitudeForMoving()
computeMotorRate()
computeElectricCurrentValue()
passValueToMotor()
4、源碼目錄文件結(jié)構(gòu)和用途
AntennaTracker/。追蹤天線子項目的專屬代碼
APMrover2/。rover子項目的專屬代碼
ArduCopter/。直升機(jī)子項目的專屬代碼(多旋翼也是直升機(jī),可以垂直起降的都算)
ArduPlane/。固定翼飛機(jī)子項目的專屬代碼(需要助跑的就不是直升機(jī)了)
ArduSub/。潛水器子項目的專屬代碼
benchmarks/AP_gbenchmark.h。只有兩個inline函數(shù),結(jié)合Google Benchmark使用的。
docs/。使用doxygen(文檔生成工具)來生成文檔的腳本和配置。
libraries/。有116個子目錄。重要的模塊包括:
AC_AttitudeControl/。ArduCopter的姿態(tài)、位置控制函數(shù)庫
AC_PID/。比例-積分-微分控制
AP_AHRS/。姿態(tài)估算,使用DCM或EKF算法
AP_Camera/。攝像頭控制
AP_InertialNav/。慣性導(dǎo)航處理,混合計算加速計的輸入,包括GPS和氣壓計數(shù)據(jù)
AP_InertialSensor/。讀取陀螺儀、加速計數(shù)據(jù),校準(zhǔn)和轉(zhuǎn)換成標(biāo)準(zhǔn)單位,供其它模塊使用
AP_Math/。各種數(shù)學(xué)函數(shù),包括向量操作。
AP_Mission/。存儲和讀取eeprom上的mission命令
AP_Motors/。電機(jī)混合計算
AP_OpticalFlow/。光流傳感器
AP_RangeFinder/。聲吶和遠(yuǎn)距離傳感器
AR_WPNav/。waypoint navigation,航點導(dǎo)航
RC_Channel/。轉(zhuǎn)換APM_RC到內(nèi)部單元的電平輸入輸出,例如角度
mk/check_modules.sh。檢查子倉庫有沒有clone和checkout成功
modules/。子目錄都是git submodule倉庫,是ArduPilot保存的副本
ChibiOS/。一個實時操作系統(tǒng),官網(wǎng)http://www.chibios.org/。ArduPilot基于它來開發(fā)。以前用的是NuttX系統(tǒng)。
gbenchmark/。google的性能測試工具。
gtest/。google的C++測試框架
libcanard/。一個uavcan/can協(xié)議的c語言實現(xiàn)
mavlink/。通信協(xié)議,見下一章
uavcan/。無人機(jī)控制器域網(wǎng)。
waf/。編譯工具
tests/。應(yīng)用gtest的代碼
Tools/。有26個子目錄,用途包括:BootLoader、外設(shè)管理、waf編譯、自動化測試、代碼風(fēng)格檢查、調(diào)試、環(huán)境依賴安裝、日志分析、mavproxy等
BUILD.md。描述了編譯各個子項目的命令和參數(shù)
README.md。主要是參考資料的網(wǎng)址和維護(hù)者的名單。
5、源碼編譯
環(huán)境為WSL - Ubuntu 20.04.4 LTS。
需要先安裝python2,并確保python --version和pip --version都顯示2.x版本。
# 先clone主倉庫
git clone https://github.com/ArduPilot/ardupilot.git
主倉庫的submodule地址寫了git://協(xié)議,在國內(nèi)是訪問不了,需要手動修改為https://。方法:
打開.gitmodules和.git/config,把所有的git://改成https://。
MAVLink還有一個submodule,pymavlink。所以要打開modules/mavlink/.gitmodules和.git/modules/modules/mavlink/config,把所有的git://改成https://。
修改完后再clone子倉庫
git submodule update --init --recursive
ArduPilot帶有一個腳本來安裝環(huán)境依賴項,但是基于Ubuntu18的,在Ubuntu20需要修改腳本,因為Ubuntu20廢棄了python2的包,無法用apt安裝,可以改用pip安裝。文本編輯器打開Tools/environment_install/install-prereqs-ubuntu.sh,可全局搜索刪除這些包名python-pip python-matplotlib python-scipy python-empy python-serial python-opencv
使用自帶腳本安裝依賴:
pip install matplotlib scipy empy serial opencv-python==4.2.0.32
./Tools/environment_install/install-prereqs-ubuntu.sh -y
# 過程需要sudo權(quán)限,輸入密碼
ArduPilot使用waf編譯工具來組織編譯過程。waf的作用類似于Android系統(tǒng)的編譯工具ninja。
./waf list_boards命令可以列出支持的板子,現(xiàn)在支持的有:
aero airbotf4 bbbmini bebop bhat blue crazyflie2 CUAV-Nora CUAV-X7 CUAV_GPS CUAVv5 CUAVv5Nano CubeBlack CubeBlack+ CubeGreen-solo CubeOrange CubePurple CubeSolo CubeYellow dark disco DrotekP3Pro Durandal edge erleboard erlebrain2 f103-ADSB f103-GPS f103-HWESC f103-periph f103-RangeFinder f103-Trigger f303-GPS f303-HWESC f303-M10025 f303-M10070 f303-periph f303-Universal F35Lightning F4BY fmuv2 fmuv3 fmuv4 fmuv4-beta fmuv5 iomcu KakuteF4 KakuteF7 KakuteF7Mini linux luminousbee4 MatekF405 MatekF405-STD MatekF405-Wing MatekF765-Wing MatekH743 mindpx-v2 mini-pix mRoControlZeroF7 mRoNexus mRoPixracerPro mRoX21 mRoX21-777 navio navio2 NucleoH743 ocpoc_zynq omnibusf4 omnibusf4pro omnibusf4v6 OMNIBUSF7V2 OmnibusNanoV6 PH4-mini Pix32v5 Pixhawk1 Pixhawk1-1M Pixhawk4 Pixracer pocket pxf pxfmini R9Pilot revo-mini rst_zynq sitl SITL_arm_linux_gnueabihf SITL_static SITL_x86_64_linux_gnu skyviper-f412-rev1 skyviper-journey skyviper-v2450 sparky2 speedybeef4 SuccexF4 TBS-Colibri-F7 VRBrain-v51 VRBrain-v52 VRBrain-v54 VRCore-v10 VRUBrain-v51 ZubaxGNSS zynq
這里選Pixhawk4。
# 先配置板子
./waf configure --board Pixhawk4
# 編譯copter子項目
./waf -j8 --targets bin/arducopter
編譯過程中,編譯ChibiOS有103個步驟,ArduPilot本身有648個步驟,處理4個XML包含226種消息MAVLink。最終得到一個bin文件,要燒錄到飛控板子上。
6、仿真
源碼里有工具使得在PC機(jī)上運行固件,本機(jī)可通過tcp 5760端口連接并用MAVLink交互。
參考資料
ArduPilot源碼官方介紹
Code Overview (Copter)文章來源:http://www.zghlxwxcb.cn/news/detail-471050.html
Clone a repository文章來源地址http://www.zghlxwxcb.cn/news/detail-471050.html
到了這里,關(guān)于開源飛控初探(四)ArduPilot::Copter固件源碼分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!