2022.5.7,基于v4.0.5的分析。官網(wǎng)文檔沒及時更新,本文對當前版本源碼的描述可能和官網(wǎng)不一樣。
1、無人機全棧分層結構圖
2、Flight Code固件部分
上圖中的Flight Code層,分為5個部分:
- 車機層。一份代碼通過編譯配置,可以支持Rover(小車/船)、Copter(直升機,包括多旋翼)、Plane(固定翼飛機)、Sub(潛水器)、AntennaTracker(追蹤天線,會自動跟隨無人機所在方向轉動的雷達)這些子項目。車機層是這幾種車機子項目的專屬代碼層。
- 通用組件庫。各種車機都依賴的基礎層,見源碼結構小節(jié)的libraries/。
- 硬件抽象層HAL。
- 工具。包括自動化測試等,見源碼結構一節(jié)的Tools/。
- 依賴的三方項目,以git submodule形式存在。見源碼結構小節(jié)modules/。
車機層實際支持的vehicle類型:
3、ArduCopter架構與頂層設計
ArduCopter就是ArduPilot:Copter子項目的簡稱。整體架構圖:
理解了頂層設計思路就行了:
- 每種板子都有自己的BootLoader bin文件,不需要再編譯的,直接打包進最終bin。它是HAL硬件抽象層的實現(xiàn)。
- main函數(shù)是往HAL實現(xiàn)層注冊一個callback函數(shù),然后HAL::run()把控制權交給了BootLoader層。硬件初始化完畢會調(diào)用callback函數(shù),其中一個是setup(),讓車機層接著初始化。
- 每種車機子項目都有自己的主類,都繼承AP_Vehicle父類,它是HAL層回調(diào)函數(shù)的實體,例如Copter子項目有個Copter類。Copter::setup()會發(fā)起很多個計劃任務,不同任務做不同的事,觸發(fā)頻率也不一樣(1~400Hz都有)。這些任務有三大類:
- 讀取不同傳感器的數(shù)據(jù),處理后保存計算結果。這些結果能表示車機的當前狀態(tài)。
- 執(zhí)行地面站的各種命令,命令最終會轉化為車機的目標狀態(tài)
- 根據(jù)當前狀態(tài)和目標狀態(tài)的差距,計算應該如何通過調(diào)整不同電機的功率輸出(螺旋槳轉速)以達到目標狀態(tài),并把計算結果轉換為電路控制信號。
- 飛行模式抽象為一個基類Mode,每種具體的飛行模式是一個子類。不同的子類,計算車機目標狀態(tài)的結果會不一樣。即設計模式中的策略模式。Copter類有成員變量記錄當前的Mode。
- Mission(航線規(guī)劃)item都可以用一種Mode來表示,item參數(shù)影響的是計算目標狀態(tài)的結果。
用偽代碼來描述核心流程:
<code class="language-plaintext hljs">while True:
receiveMavLinkControlMessage()
changeTarget()
readSensorValue()
convertValueToStandardUnit()
saveInMemory()
computeWayToTarget()
computeAttitudeForMoving()
computeMotorRate()
computeElectricCurrentValue()
passValueToMotor()</code>
4、源碼目錄文件結構和用途
- AntennaTracker/。追蹤天線子項目的專屬代碼
- APMrover2/。rover子項目的專屬代碼
- ArduCopter/。直升機子項目的專屬代碼(多旋翼也是直升機,可以垂直起降的都算)
- ArduPlane/。固定翼飛機子項目的專屬代碼(需要助跑的就不是直升機了)
- ArduSub/。潛水器子項目的專屬代碼
- benchmarks/AP_gbenchmark.h。只有兩個inline函數(shù),結合Google Benchmark使用的。
- docs/。使用doxygen(文檔生成工具)來生成文檔的腳本和配置。
- libraries/。有116個子目錄。重要的模塊包括:
- AC_AttitudeControl/。ArduCopter的姿態(tài)、位置控制函數(shù)庫
- AC_PID/。比例-積分-微分控制
- AP_AHRS/。姿態(tài)估算,使用DCM或EKF算法
- AP_Camera/。攝像頭控制
- AP_InertialNav/。慣性導航處理,混合計算加速計的輸入,包括GPS和氣壓計數(shù)據(jù)
- AP_InertialSensor/。讀取陀螺儀、加速計數(shù)據(jù),校準和轉換成標準單位,供其它模塊使用
- AP_Math/。各種數(shù)學函數(shù),包括向量操作。
- AP_Mission/。存儲和讀取eeprom上的mission命令
- AP_Motors/。電機混合計算
- AP_OpticalFlow/。光流傳感器
- AP_RangeFinder/。聲吶和遠距離傳感器
- AR_WPNav/。waypoint navigation,航點導航
- RC_Channel/。轉換APM_RC到內(nèi)部單元的電平輸入輸出,例如角度
- mk/check_modules.sh。檢查子倉庫有沒有clone和checkout成功
- modules/。子目錄都是git submodule倉庫,是ArduPilot保存的副本
- ChibiOS/。一個實時操作系統(tǒng),官網(wǎng)ChibiOS free embedded RTOS - ChibiOS Homepage。ArduPilot基于它來開發(fā)。以前用的是NuttX系統(tǒng)。
- gbenchmark/。google的性能測試工具。
- gtest/。google的C++測試框架
- libcanard/。一個uavcan/can協(xié)議的c語言實現(xiàn)
- mavlink/。通信協(xié)議,見下一章
- uavcan/。無人機控制器域網(wǎng)。
- waf/。編譯工具
- tests/。應用gtest的代碼
- Tools/。有26個子目錄,用途包括:BootLoader、外設管理、waf編譯、自動化測試、代碼風格檢查、調(diào)試、環(huán)境依賴安裝、日志分析、mavproxy等
- BUILD.md。描述了編譯各個子項目的命令和參數(shù)
- README.md。主要是參考資料的網(wǎng)址和維護者的名單。
5、源碼編譯
環(huán)境為WSL - Ubuntu 20.04.4 LTS。
需要先安裝python2,并確保python --version和pip --version都顯示2.x版本。
<code class="language-plaintext hljs"># 先clone主倉庫
git clone https://github.com/ArduPilot/ardupilot.git</code>
主倉庫的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子倉庫
<code class="language-plaintext hljs">git submodule update --init --recursive</code>
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
使用自帶腳本安裝依賴:
<code class="language-plaintext hljs">pip install matplotlib scipy empy serial opencv-python==4.2.0.32
./Tools/environment_install/install-prereqs-ubuntu.sh -y
# 過程需要sudo權限,輸入密碼</code>
ArduPilot使用waf編譯工具來組織編譯過程。waf的作用類似于Android系統(tǒng)的編譯工具ninja。
./waf list_boards命令可以列出支持的板子,現(xiàn)在支持的有:
<code class="language-plaintext hljs">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</code>
這里選Pixhawk4。
<code class="language-plaintext hljs"># 先配置板子
./waf configure --board Pixhawk4
# 編譯copter子項目
./waf -j8 --targets bin/arducopter</code>
編譯過程中,編譯ChibiOS有103個步驟,ArduPilot本身有648個步驟,處理4個XML包含226種消息MAVLink。最終得到一個bin文件,要燒錄到飛控板子上。
6、仿真
源碼里有工具使得在PC機上運行固件,本機可通過tcp 5760端口連接并用MAVLink交互。
參考資料
|