午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

開源飛控初探(四)ArduPilot::Copter固件源碼分析

 netouch 2024-06-25 發(fā)布于北京

2022.5.7,基于v4.0.5的分析。官網(wǎng)文檔沒及時更新,本文對當前版本源碼的描述可能和官網(wǎng)不一樣。

1、無人機全棧分層結構圖

2、Flight Code固件部分

上圖中的Flight Code層,分為5個部分:

  1. 車機層。一份代碼通過編譯配置,可以支持Rover(小車/船)、Copter(直升機,包括多旋翼)、Plane(固定翼飛機)、Sub(潛水器)、AntennaTracker(追蹤天線,會自動跟隨無人機所在方向轉動的雷達)這些子項目。車機層是這幾種車機子項目的專屬代碼層。
  2. 通用組件庫。各種車機都依賴的基礎層,見源碼結構小節(jié)的libraries/。
  3. 硬件抽象層HAL。
  4. 工具。包括自動化測試等,見源碼結構一節(jié)的Tools/。
  5. 依賴的三方項目,以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://。方法:

  1. 打開.gitmodules和.git/config,把所有的git://改成https://。
  2. 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交互。

參考資料

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章