如何从源码编译SITL

从源码编译SITL(Windows)

知识共享许可协议本作品采用知识共享署名-相同方式共享 3.0 未本地化版本许可协议进行许可。

SITL简介和适用情况

SITL = Software in the loop,是著名无人机开源社区ArduPilot打造的开源软件模拟器。用户可以在不依托任何硬件的情况下,对固定翼(Plane)、旋翼机(Copter)和车辆(Rover)进行模拟。除了进行路径规划测试、参数设置测试、控制代码调试以外,SITL还可模拟风力、地形等外部环境,安装模拟光流、激光雷达等传感器,与其他设备通过串口、网络通信等等。

在通常情况下,如果你成功安装了python和pip,不论你身处何种平台,都可以使用pip install dronekit-sitl命令安装SITL。

但是,有时我们会遇到不得不从源码生成SITL的情况,例如需要使用更新版本、或者是还在测试阶段的固件(本文写成时,SITL支持到ArduCopter3.3,而我需要使用3.4版本以上的固件)。如果你有类似的需要,本文将向你介绍如何从源代码编译SITL。

概述

测试环境

  • Windows10 14393-64bit
  • Python 2.7-32bit

步骤

下载安装MAVProxy

MAVProxy是一款基于命令行、全功能、轻量级的地面站。它很适合开发者使用。当然,你也可以使用其他地面站如Mission Planner,但是,我还是建议你安装MAVProxy,因为它真的很好用。

  1. 下载最新Windows版本的MAVProxy(链接在此)
  2. 运行.exe,建议采用默认设置安装,以避免不必要的麻烦

下载安装Cygwin

Cygwin提供了在Windows平台上运行的类UNIX环境。在一开始,SITL是在Linux平台开发的,但有了Cygwin,就能够在Windows上编译运行了。

  1. 下载、运行Cygwin 32-bit installer(64位版本没有测试过)
  2. 以默认设置安装,直到看到“Select Packages”对话框。左上角的“Search”框可以进行搜索。找到Package后,点击左边的“Skip”,当Skip变为版本号后,即为选中。
  3. 选中以下Package
名称 类别 名称 介绍(名称和介绍与窗口中最右边内容对应)
autoconf Devel autoconf: Wrapper scripts for autoconf commands
automake Devel automake: Wrapper scripts for automake and aclocal
ccache Devel ccache: A C compiler cache for improving recompilation
g++ Devel gcc-g++ GNU Compiler Collection (C++)
git Devel git: Distributed version control system
libtool Devel libtool: Generic library support script
make Devel make: The GNU version of the ‘make’ utility
gawk Interpreters gawk: GNU awk, a pattern scanning and processing language
libexpat Libs libexpat-devel: Expat XML parser library (development files)
libxml2-devel Libs libxml2-devel: Gnome XML library (development)
libxslt-devel Libs libxslt-devel: XML template library (development files)
python-devel Python python-devel: Python2 language interpreter (python3 does not work yet)
procps System procps-ng: System and process monitoring utilities (required for pkill)

选择完毕后一路OK,等待Package下载完成即可。

在Cygwin中设置PATH

  1. 打开Cygwin Termianl窗口。
    该步骤会在Cygwin的home目录下初始化文件。如果你使用了默认设置,那么目录应该为 C:\cygwin\home\你的用户名\

  2. 前往C:\cygwin\home\你的用户名\ ,用文本编辑器打开.bashrc

  3. .bashrc末尾加上
    export PATH=$PATH:$HOME/ardupilot/Tools/autotest

PATH会在你下一次启动Cygwin的时候自动加载。

安装Python包

已经在Windows版本的Python上安装了这些包?不要跳过此步骤!Cygwin相当于是一个虚拟环境,需要对这些包重新安装。
详见python的官方文档说明

打开Cygwin Terminal,运行

python -m ensurepip --user
python -m pip install --user future
python -m pip install --user lxml
python -m pip install --user uavcan

下载编译Ardupilot源码

在Cygwin Terminal中,进行以下操作

git clone git://github.com/ArduPilot/ardupilot.git
cd ardupilot
git submodule update --init --recursive

第三步的意义在于,ArduPilot项目内使用submodule方式包含了许多其他的开源项目。进行该操作可以下载所需的其他项目的源代码。该操作需要时间较长,请耐心等待。

一般而言,到这一步时,你正处在ArduPilot仓库的master分支。此时,版本通常是不稳定的测试版本;如果需要使用稳定的发布版本,需要切换分支。ArduPilot使用分支管理不同发布版本,在官方的GitHub页面可以查看分支。此处以Copter-3.5为例。

git fetch origin Copter-3.5: Copter-3.5
git checkout Copter-3.5

在终端(Terminal)中,切换到所需的目录,执行make操作。(此处以多旋翼ArduCopter为例。其他机型与此同理。但是,固定翼需要多做一步步骤。见http://ardupilot.org/dev/docs/sitl-native-on-windows.html#jsbsim-plane-only)

cd ~/ardupilot/ArduCopter
make sitl -j4

上述命令对4核的CPU最为适用。-j4中的4可以替换为你的电脑的CPU核心数,以获得最高性能。编译所需时间较长,需要耐心等待。

(可选)FlightGear 3D View

FlightGear 3D View能够提供可视化的3D模拟。见 http://ardupilot.org/dev/docs/sitl-native-on-windows.html#flightgear-3d-view-optional

此处略。

运行SITL和MAVProxy

此处使用MAVProxy作为地面站,对飞行器进行实时监控。同时,MAVProxy可以作为数据中介,将数据转发到其他地面站如Mission Planner,以及与用户编写的程序如Dronekit进行通信。

可以以如下方式运行SITL和MAVProxy(跟之前一样,-j后面的数字最好是你计算机CPU的核心数):

cd ~/ardupilot/ArduCopter
sim_vehicle.py -j4 --map --console

以上做法会自动启动MAVProxy。如果你只想启动SITL,使用命令

./ArduCopter.elf --home -35,149,584,270 --model quad

启动SITL后,可以通过tcp:127.0.0.1:5760连接到SITL。

错误参考

  1. 因为不想占用太多C盘空间,我在进行git clone git://github.com/ArduPilot/ardupilot.git的时候,cd到了D盘的一个位置。但是,这会导致某些配置的错误(具体哪些配置有误未知),使得无法编译。

  2. 因为已经在Windows的Python 2.7中事先pip install了相关package,因此我在安装时,跳过了上文中的安装Python包的步骤。事实证明,这是必要的,因此我在文中作了特别提示。

参考文档

ArduPilot官方文档,ArduPilot文档中step by step的指南,实际上做的很好。本文是基于该指南翻译并撰写的。

Ensurepip,Ensurepip操作说明

版本信息

1.0 20170521 initial commit

1.1 20170603 add license

1.2 20170702 add notes on switching between versions

你可能感兴趣的:(如何从源码编译SITL)