天天看點

Ardupilot源碼編譯(二)

最新參考:Ardupilot開發環境搭建(Ubuntu18.04,20190407)

  目前Ardupilot的master版本需要用waf編譯

waf 是一個幫助建構和編譯系統的架構,采用python語言編寫

Waf詳細用法看這本書:

https://waf.io/book/#_projects_and_commands

官方給的用Waf編譯Ardupilot的方法:

https://github.com/ArduPilot/ardupilot/blob/master/BUILD.md

克隆倉庫下來:git clone https://github.com/ArduPilot/ardupilot.git
    進入倉庫中:cd ardupilot
    更新響應的子產品:git submodule update --init --recursive
           
# 這步執行一次就行了,就是裝些必要的包
    運作腳本檔案:Tools/scripts/install-prereqs-ubuntu.sh -y
    使配置直接生效:. ~/.profile
           
進入相應的目錄:cd ArduCopter
    開始編譯四旋翼:make px4-v2
           

19/11/29日發現master版不支援make編譯了,下了Copter-3.5版用make編譯會出錯

使用Waf編譯Ardupilot

cd ardupilot
./waf configure --board CubeBlack   //選擇你飛控型号
./waf copter //執行編譯copter

./waf copter                            # All multirotor types
./waf heli                              # Helicopter types
./waf plane                             # Fixed wing airplanes including VTOL
./waf rover                             # Ground-based rovers and surface boats
./waf sub                               # ROV and other submarines
./waf antennatracker                    # Antenna trackers
           

CubeBlack是你要的闆型,使用

./waf configure --board px4-v2

指令時發現指令已經改了,要編譯

px4-v2

需要将他變成

Pixhawk1

才行

./waf configure --board Pixhawk1
./waf copter
           

執行上面兩條開始編譯

Ardupilot源碼編譯(二)

目前支援的飛控闆

./waf configure --board bebop --static # Bebop or Bebop2
./waf configure --board edge           # emlid edge
./waf configure --board fmuv3          # Pixhawk2/Cube using ChibiOS
./waf configure --board fmuv4          # Pixracer using ChibiOS
./waf configure --board navio2         # emlid navio2
./waf configure --board Pixhawk1       # Pixhawk1
./waf configure --board CubeBlack      # Pixhawk2(二代)
./waf configure --board Pixracer       # Pixracer
./waf configure --board skyviper-v2450 # SkyRocket's SkyViper GPS drone using ChibiOS
./waf configure --board sitl           # software-in-the-loop simulator
./waf configure --board sitl --debug   # software-in-the-loop simulator with debug symbols
           

上傳

./waf --targets bin/arducopter --upload
           

對于Linux主機闆,首先需要配置要上傳到的主機闆的IP。這是在配置階段完成的:

./waf configure --board < board > --rsync-dest < destination >
           

以下指令給出了一個具體的例子(電路闆和目标IP将根據使用的電路闆而改變):

./waf configure --board navio2 --rsync-dest [email protected]:/ 
./waf --target bin / arducopter --upload
           

清除編譯結果

指令

./waf clean

./waf distclean

可用于清除建構生成的對象。第一個保留configure資訊,僅清理目前闆的對象。第二個清理每個闆的所有内容,包括儲存的configure資訊。

通常不需要清潔建構并且不鼓勵。我們進行增量建構,将建構時間縮短了幾個數量級

用clean會保留編譯後的檔案夾,但裡面内容沒了,distclean直接将build檔案夾都清了

選擇上傳或清除編譯的固件

固件編譯後的結果在ardupilot/build檔案夾裡,當你編譯了很多固件要清除或上傳其中一個時要再用下面指令選擇一下

./waf configure --board 你要的闆型
           

列出可用闆卡

以下指令可以在ArduPilot上獲得支援的電路闆清單

./waf list_boards
           

進階用法

Waf編譯系統由指令組成。

例如,下面的指令(configure)用于使用此特定編譯使用的所有選項配置編譯。

#Configure the Linux board
./waf configure --board=linux
           

于是,為了編譯,釋出了“編譯”指令,是以

waf build

。這是預設指令,是以調用waf就足夠了:

# Build programs from bin group
./waf

# Waf also accepts '-j' option to parallelize the build.
./waf -j8
           

預設情況下,waf會嘗試将編譯自動并行化到所有處理器,是以通常不需要-j選項,除非您使用的是icecc(是以您需要更大的值)或者您不希望使用編譯對您的機器施加壓力。

Program groups:程式組

程式組用于表示一類程式。它們可用于編譯某個類的所有程式,而無需指定每個程式。兩個組可能重疊,除非兩個組都是主要組。換句話說,程式可以屬于多個組,但隻能屬于一個主組。

有一個特殊的組,稱為“all”,包括所有程式。

Main groups:主組

主要組形成所有程式的分區。除了邏輯上分離程式外,它們還定義了它們的編譯位置。

主組是:

  • bin:主要的二進制檔案,即ardupilot的主要産品 – the vehicles and Antenna Tracker(車輛和天線跟蹤器)
  • tools
  • examples:顯示某些庫如何使用或簡單測試其操作的程式
  • benchmarks:在配置期間需要

    --enable-benchmarkmarks

  • tests:基本上是單元測試,以確定更改不會破壞系統的邏輯

    所有的編譯檔案都放在

    build/<board>/

    下面,

    <board>

    表示在你配置時所選擇的闆子或者平台。每個主程式組都有一個檔案夾,其名稱直接位于

    build/<board>/

    下。

    是以,程式将儲存在

    build/<board>/<main_group>/

    中,其中

    <main_group>

    是程式所屬的主要組。比如:對于一個linux編譯,arduplane屬于主要組“bin”,将被存儲在

    build/linux/bin/arduplane

    .

Main product groups:主要産品組

這些是ardupilot的主要産品組。它們包含所代表産品的程式。目前隻有“copter”組有多個程式 - 每種幀類型一個。

主要産品組是:

  • antennatracker
  • copter
  • plane
  • rover

Building a program group:編譯一個程式組

Ardupilot為waf添加了一個名叫

--program-group

的選項,它接收你想要它編譯的組作為參數。對于一個編譯指令,如果你沒有傳遞任何

--targets

--program-group

,這個

bin

組會被預設選擇。這個選項

--program-group

可以被傳遞多次。

# Group bin is the default one
./waf

# Build all vehicles and Antenna Tracker
./waf --program-group bin

# Build all benchmarks and tests
./waf --program-group benchmarks --program-group tests
           

Shortcut for program group:程式組的快捷方式

為了更少的輸入字元,你可以使用組的名字作為指令給waf。舉例:

# Build all vehicles and Antenna Tracker
./waf bin

# Build all examples
./waf examples

# Build arducopter binaries
./waf copter
           

Building a specific program:編譯一個特定的程式

為了編譯一個特定的程式,你隻需要将它相對于

build/<board>/

的路徑傳遞給

--targets

.舉例:

# Build arducopter for quad frame
./waf --targets bin/arducopter

# Build vectors unit test
./waf --targets tests/test_vectors
           

Checking:檢查

check

指令編譯所有程式,然後執行相關的測試。在該上下文中,相關測試是來自“測試”組的程式,該程式使以下陳述之一成立:

  • 這是自上次清理或克隆項目以來第一次編譯測試
  • 該程式必須重新編譯(例如,由于代碼或依賴項的修改)
  • 上一次檢查中的測試程式失敗了

也就是說,隻有必要的時候才運作測試。如果你希望waf運作所有的測試,你可以使用

--alltests

或快捷指令

check-all

任一選項。

舉例:

# Build everything and run relevant tests
./waf check

# Build everything and run all tests
./waf check --alltests

# Build everything and run all tests
./waf check-all

           

Debugging:調試

可以通過選項

--debug

傳遞給

configure

指令。這将設定編譯器标志以在二進制檔案中存儲調試資訊,以便您可以将它們與

gdb

一起使用。

使用SITL時,該選項可能會派上用場。

Build-system warppers:建構系統包裝器

根樹上的

waf

二進制檔案實際上是真實

waf

的包裝器,它儲存在自己的子子產品中。

可以通過

./modules/waf/waf-light

直接調用後者,或者如果你喜歡在

./waf

上鍵入

waf

,則使用别名。

alias waf="<ardupilot-directory>/modules/waf/waf-light"
           

還有一個名為

Makefile.waf

make

包裝器。

您可以使用

make -f Makefile.waf

幫助擷取有關如何使用它的說明。

Command line help:指令行幫助

您可以使用

waf --help

檢視有關waf内置的指令和選項的資訊,以及對ardupilot添加的指令和選項的一些快速幫助。

參考:

Ardupilot waf編譯過程分析

Ardupilot源碼編譯–Ubuntu

PixHawk飛控和Mission Planner地面站安裝調試

繼續閱讀