天天看点

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地面站安装调试

继续阅读