一天精通无人机:初级篇系列第 13 讲:飞控程序下载与编译

file

今天我们来一起了解开源无人机控制程序的下载,编译与安装。我们选用的开源无人机飞行控制程序为PX4,这是一款非常优秀的开源程序,支持多种类型的无人机、无人车和无人船。

需要说明的是:下载,编译,安装PX4飞控程序的整个过程均需要在Linux操作系统下完成,所以对于今后的所有的文章都会在Linux系统下来给大家讲解。希望大家对Linux操作系统有一些基础了解,并会一些简单的操作(请参见《一点一滴学Linux》)。另外对于Linux的发行版选择方面,作者选用的是Fedora操作系统,版本为28。而目前网上多数朋友用的都是Ubuntu操作系统通常是14.04或16.04或18.04,对于不同的Linux发行版其操作方式略有不同,请读者不要对操作过程死记硬背,而需要明白每一个步骤的功能,只有理解之后才能够活学活用。

一、开源飞控PX4下载

PX4的项目主页地址为:

http://px4.io/

我们可以在PX4的项目的主页中对其做简单的了解。PX4开源程序的下载地址为:

飞控固件:

https://github.com/PX4/Firmware

BootLoader:

https://github.com/PX4/Bootloader

这是一个采用git仓库管理开源代码的项目,下载飞控固件代码的命令:

git clone https://github.com/PX4/Firmware.git
git clone https://github.com/PX4/Bootloader.git

关于BootLoader的相关不是我们本节的内容,我们只关心Firmware的程序,也就是飞控固件程序。下载过程比较长,需要耐心等等,下载完成之后在本地目录中就会出现Firmware文件夹,我们需要进入此文件夹,并执行git子模块初始化:

git submodule update --init --recursive

我们可以使用ls命令来查看此目录下的文件列表:

├── cmake
│ ├── cmake_hexagon
│ ├── common
│ ├── configs
│ └── toolchains
├── Documentation
├── integrationtests
│ └── python_src
├── launch
├── mavlink
│ └── include
├── msg
│ ├── ros
│ ├── templates
│ └── tools
├── platforms
│ ├── nuttx
│ ├── posix
│ └── qurt
├── posix-configs
│ ├── bbblue
│ ├── bebop
│ ├── eagle
│ ├── excelsior
│ ├── ocpoc
│ ├── rpi
│ └── SITL
├── ROMFS
│ ├── px4fmu_common
│ ├── px4fmu_test
│ └── tap_common
├── src
│ ├── drivers
│ ├── examples
│ ├── include
│ ├── lib
│ ├── modules
│ ├── platforms
│ ├── systemcmds
│ └── templates
└── Tools

接下来我们来讲述在Linux搭建PX4的开发环境。

二、Fedora下开发环境

在Fedora下通常使用YUM来管理和安装RPM软件包(请参见《YUM使用》)。

1. Python环境:

PX4中使用了很多Python脚本程序来对飞控工程进行额外的处理,也就是一些处理代码的便携工具。因此我们需要安装Python开发环境:

sudo yum groupinstall “Development Tools”
sudo yum install python-setuptools python-numpy
sudo easy_install pyserial
sudo easy_install pexpect
sudo easy_install toml
sudo yum install openocd libftdi-devel libftdi-python python-argparse flex bison-devel ncurses-devel ncurses-libs autoconf texinfo libtool zlib-devel cmake

2. arm-gcc交叉编译器

下载GCC编译工具:

wget https://releases.linaro.org/components/toolchain/binaries/6.4-2018.05/arm-linux-gnueabihf/gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz

将下载后的压缩包解压:

tar -xvf gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz

解压后会在当前目录下生成一个gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabihf的文件夹,我们再修改/etc/profile文件的内容,将此文件夹加入环境变量中:

sudo vim /etc/profile

在最后加入

export PX4_CROSS_GCC=/data/apps/gcc-linaro-6.4.1-2018.05-x86_64_arm-linux-gnueabihf
export PATH=$PX4_CROSS_GCC/bin:$PATH

其中/data/apps/是刚刚下载gcc文件所在的目录,这里需要修改成实际的路径。然后

source /etc/profile

使环境变量生效,或者重启计算机也可以。当环境变量生效之后,我们可以执行下面命令来确认gcc是否生效:

arm-linux-gnueabihf-gcc --version

如果gcc安装成功则会有下面内容的输出:

arm-linux-gnueabihf-gcc (Linaro GCC 6.4-2018.05) 6.4.1 20180425 [linaro-6.4-2018.05 revision 7b15d0869c096fe39603ad63dc19ab7cf035eb70]
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

3. Ninja构建工具

由于PX4程序架构较大,编译过程比较慢,我们还可以使用Ninja来加快编译速度:

wget https://github.com/martine/ninja/releases/download/v-1.8.2/ninja-linux.zipunzip ninja-linux.zip

修改/etc/profile加入环境变量

source /etc/profile

在最后加入

export NINJA_HOME=/data/apps/ninja-1.8.2
export PATH=$NINJA_HOME:$PATH

使环境变量生效,或者重启计算机也可以。当环境变量生效之后,我们可以执行下面命令来确认ninja是否生效:

ninja --version1.8.2

三、固件程序编译与烧写

PX4还支持其它很多编译选项,例如:

px4cannode-v1_default
px4esc-v1_default
px4fmu_firmware
px4fmu-v2_default
px4fmu-v2_lpe
px4fmu-v2_test
px4fmu-v3_default
px4fmu-v3_rtps
px4fmu-v4_default
px4fmu-v4pro_default
px4fmu-v4pro_rtps
px4fmu-v4_rtps
px4fmu-v5_default
px4fmu-v5_rtps
px4io-v2_default
px4_metadata
px4nucleoF767ZI-v1_default
px4-same70xplained-v1_default
px4-stm32f4discovery_default

由于我们采用的硬件平台Pixhawk是2.4.8,所以在固件编译选项中我们需要选择px4fmu-v3_default,执行下面编译命令:

make px4fmu-v3_default

编译内容如下:

-- PX4 VERSION: v1.8.0-907-g7f41ead23
-- CONFIG: nuttx_px4fmu-v3_default
-- Build Type: MinSizeRel
-- The ASM compiler identification is GNU
-- Found assembler: /data/apps/gcc-arm-none-eabi/bin/arm-none-eabi-gcc
-- Found PythonInterp: /usr/bin/python (found version "2.7.15") 
-- Found PY_jinja2: /usr/lib/python2.7/site-packages/jinja2  
-- C compiler: arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496]
-- C++ compiler: arm-none-eabi-g++ (GNU Tools for ARM Embedded Processors) 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496]
-- PX4 ECL: Very lightweight Estimation & Control Library v0.9.0-581-g34cd136
-- Building and including px4io-v2
-- Using C++11
-- Release build type: MinSizeRel
-- Adding UAVCAN STM32 platform driver
-- NuttX: px4fmu-v2 nsh cortex-m4
-- ROMFS: px4fmu_common
-- Configuring done
-- Generating done
-- Build files have been written to: /data/work/workspace/px4/Firmware/build/nuttx_px4fmu-v3_default
ninja: Entering directory `/data/work/workspace/px4/Firmware/build/nuttx_px4fmu-v3_default'
[1031/1031] Creating /data/work/workspace/px4/Firmware/build/nuttx_px4fmu-v3_default/px4fmu-v3_default.px4

我们可以看到,编译完成后会在build/nuttx_px4fmu-v3_default/目录下生成一个叫px4fmu-v3_default.px4的文件,这个文件就是我们需要烧写到Pixhawk中的固件程序。

接下来我们将Pixhaw使用USB线接入到计算机上,在/dev/目录下会有一个叫作ACM0的设备文件,即是Pixhawk飞控,如果没有这个文件,可能是当前用户没有此USB设备的读写权限,解决办法是将下面内容保存为10-px4.rules文件:

SUBSYSTEMS=="usb", KERNEL=="ttyACM0", ATTRS{idVendor}=="575a", ATTRS{idProduct}=="0041", GROUP="dialout", MODE="0666"

然后将这个10-px4.rules文件复制到/etc/udev/rules.d/目录下:

cp 10-px4.rules /etc/udev/rules.d/

之后重新插拔Pixhawk即可,如果/dev/ACM0仍然没有出现,则需要重启计算机。接下来删除ModemManager软件包,并为当前用户加入dialout组

sudo yum remove ModemManager
sudo usermod -aG dialout $USER

最后,执行固件烧写命令:

make px4fmu-v3_default upload

烧写过程如下:

Loaded firmware for 9,0, size: 154873 bytes, waiting for the bootloader...
If the board does not respond within 1-2 seconds, unplug and re-plug the USB connector.
Attempting reboot on /dev/ttyACM0 with baudrate=115200...
If the board does not respond, unplug and re-plug the USB connector.
Found board 9,0 bootloader rev 5 on /dev/ttyACM0
type: ==
idtype: ==
vid: ffffffff
pid: ffffffff
coa: ///////////////////////////////

sn: 003400273036511738363834
chip: 20016419
family: STM32F42x
revision: 3
flash 2080768

Erase     : [====================] 100.0%
Program : [====================] 100.0%
Verify      : [====================] 100.0%
Rebooting.

下期预告:《航前准备与校准》

file