Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法

欢迎交流~ 个人 Gitter 交流平台,点击直达:


更新于2017.3.13

FAQ

本文说明针对 PX4 Firmware 1.6.0

  • 问题 1: 找不到python jinja2模块
CMake Error at /usr/share/cmake-3.2/Modules/FindPackageHandleStandardArgs.cmake:138 (message):
  couldn't find python module jinja2:

  		

  for debian systems try: 		

  	sudo apt-get install python-jinja2 		

  or for all other OSs/debian: 		

  	pip install jinja2

   (missing:  PY_JINJA2) 
Call Stack (most recent call first):
  /usr/share/cmake-3.2/Modules/FindPackageHandleStandardArgs.cmake:374 (_FPHSA_FAILURE_MESSAGE)
  cmake/common/px4_base.cmake:1295 (find_package_handle_standard_args)
  CMakeLists.txt:276 (px4_find_python_module)


-- Configuring incomplete, errors occurred!

解决方案:缺什么安什么

Windows系统下:
pip install jinja2

Linux系统下:
sudo apt-get install python-jinja2

  • 问题 2: Windows下出现rsync error错误
The source and destination cannot both be remote
rsync error: syntax or usage error (code 1) at /usr/src/rsync/rsync-3.0.8/main.c(1148) [receiver=3.0.8]
make[3]: *** [nuttx_copy_px4fmu-v2.stamp] Error 1
make[2]: *** [CMakeFiles/nuttx_copy_px4fmu-v2.dir/all] Error 2
make[2]: *** Waiting for unfilished jobs....
The source and destination cannot both be remote
rsync error: syntax or usage error (code 1) at /usr/src/rsync/rsync-3.0.8/main.c(1148) [receiver=3.0.8]
make[3]: *** [src/modules/px4iofirmware/nuttx_copy_px4fmu-v2.stamp] Error 1
make[2]: *** [src/modules/px4iofirmware/nuttx_copy_px4fmu-v2.dir/all] Error 2
make[1]: *** [all] Error 2
make[1]: *** [px4fmu-v2_default] Error 2

解决方案:cmake nuttx rsync 仅使用相对路径进行复制

对Firmware/cmake/nuttx/px4_impl_nuttx.cmake文件进行更改,点击传送门

  • **问题 3:**内存溢出
collect2.exe:error:ld returned 1 exit status
make[3]: *** [src/firmware/nuttx/firmware_muttx] Error 1
make[2]: *** [src/firmware/nuttx/CMakeFiles/firmware_muttx.dir/all] Error 2
make[1]: *** [all] Error 2
make: *** [px4fmu-v2_default] Error 2

解决方案:移除不是必要的模块. 配置在这里. 为了移除一个模块, 可以直接注释掉它:
对于FMUv2(Pixhawk1)或者FMUv3(Pixhawk 2)硬件,找到Firmware/cmake/configs/nuttx_px4fmu-v2_default.cmake
修改为:

#drivers/trone

即可

  • 问题 4: gcc 版本
![fail](https://img-blog.csdn.net/20170111094613912?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxRU52WTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

解决方案:gcc 4.8.4 已经过时了,目前支持的是 4.9.4还有 5.4.3版本。

![Date](https://img-blog.csdn.net/20170111093413714?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxRU52WTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

正文

各个论坛以及QQ群中经常有人反应不知道怎么编译Pixhawk原生固件PX4,笔者也为这个问题苦恼了很久,最近一时兴起,想尝试下官网的写一个应用程序,但是原生代码都编译不过这可怎么能行,于是东查西试,解决了在Windows操作系统以及Ubuntu操作系统上编译PX4固件的问题。

Windows 7 64bit

软件安装


首先,需要安装一些软件,CMake、32位的Java jdk以及PX4 Toolchain Installer。
CMake的话笔者使用的是CMake-3.3.2-win32-x86版本。
关于CMake的安装有一点需要注意,在第三步Install Options安装选项中,需要将CMake加入到系统路径中:
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第1张图片
Java sdk:
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第2张图片
Eclipse 需要 Java,用命令 java -version 来查看 Java 是否配置 成功。
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第3张图片

接下来进行PX4固件相关的配置,安装PX4 Toolchain Installer,默认安装在C盘根目录下,笔者不服,非要安装在D盘,安装的时候一路下一步就行。

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第4张图片

安装完以后在开始菜单会出现一套工具链包括,PX4Console、PX4Ecplise.
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第5张图片

代码编译


打开PX4console,下载PX4固件,输入指令:

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

切换到Firmware文件夹,输入指令:

cd Firmware

之后输入指令:

git submodule update --init --recursive

(根据网速耗时有差异,耐心等待)

关键一步

在开始最后的编译之前,有一个步骤必不可少,将arm-none-eabi-gcc 4.7.4换成4.9.4或5.4.3,下载4.9.4版本的压缩文件,5.4.3版本。

![gcc](https://img-blog.csdn.net/20170117091646778?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxRU52WTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

解压后将这四个文件夹复制并替换到PX4Toolchain安装目录下的toolchain文件夹下,这里笔者替换到的文件夹为D:\px4\toolchain。

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第6张图片

随后启动PX4 Console控制台进行编译,先进入Firmware文件夹,输入指令:

cd Firmware

进行编译

make px4fmu-v2_default

(漫长的等待,可能需要半个小时)

编译成功的界面如下:

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第7张图片

如果在没有进行arm-none-eabi-gcc 4.7.4替换的情况下直接进行固件编译,则会出现如下所示的错误:

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第8张图片

为时不晚,依然来得及将下载好的4.9.4版arm-none-eabi-gcc解压并替换掉Toolchain文件夹下的相应文件。

之后重启PX4Console控制台,首先还是先进入到Firmware文件夹下:

cd Firmware

输入指令:

make clean

清除上一次的编译,然后重新编译,输入指令:

make px4fmu-v2_default

(又是漫长的等待,但是等待都是值得的)
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第9张图片

固件烧录

将飞控板通过USB连接电脑,输入以下指令即可完成固件的烧录:

make px4fmu-v2_default upload

烧录成功的界面如下图:
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第10张图片

配置Eclipse


现在控制台已经编译成功了,接下来就是进行Eclipse的配置了

  • 打开PX4Eclipse。

第一次启动时,选择好workplace,并勾选Use this as the default and……。由于笔者以D盘作为工作目录,因此这里依然保持将workplace放置在D盘。

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第11张图片

  • 建立工程

File -> New -> Makefile Project with Existing Code。
然后点击Browse……到D:\px4\Firmware,并选择Cross GCC,点击Finish。
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第12张图片

然后进入Workbench:

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第13张图片

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第14张图片

  • 创建编译目标

可以在右边板块中Make Target( 或者菜单 Window -> Show View -> Make Target 也可以打开),选中根文件夹(Firmware),可以创建新的 make Target(绿色圆形按钮)。 如创建目标 px4fmu-v2_default
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第15张图片

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第16张图片

px4fmu-v2_default创建好如下:

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第17张图片

同理创建目标:all,archives,clean,distclean,px4io-v2_default, px4fmu-v2_default upload

  • 各 make target 说明
    • clean – 删除编译的固件相关文件,不会清除archives
    • px4fmu-v2_default—FMU 固件
    • px4fmu-v2_default upload – 烧录固件到飞控板

**提示:**与make有关的指令可以用Firmware/Makefile文件中查看

  • 路径配置
    必须配置好Eclipse软件的路径才能进行编译,这一步至关重要
    打开eclipse软件,打开目录栏的Project -> Priorities
    Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第18张图片
    有点意思的是,你得先打开左边Firmware中的随便一个文件,否则Priorities这一项会是灰色的,无法进行操作。
    打开相应栏,更改CWD、PWD的路径:
    开始的路径(如果装在默认路径则为C:\px4)
    然后你的CWD路径为 C:\px4\Firmware
    这里将路径改为 /D/px4/Firmware
    差别不大,还望仔细,笔者当时在这个问题上可是纠结了特别久,无限的报错,not contain Cmakelists.txt。也是得到高人相助,开始人指出来笔者还根本看不出,然后仔细的发现原来是:“\”、“/”“这样的问题。
    然后再将PWD的路径也做相应的更改。

  • 编译固件
    点击上述Target中的px4fmu-v2_default,即可进行编译。此操作与在Console控制台中输入make有同样的效果。

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第19张图片

  • 烧录固件
    固件的烧录可以直接使用QGC地面站进行。也可以在PX4 Console或者PX4 Eclipse中进行,编译成功后在PX4 Eclipse界面右侧点击Target中的px4fmu-v2_default upload即可进行固件的烧录。这样就可以将自己的算法加入到原生固件中了。

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第20张图片

至此,在Windows环境下编译Pixhawk原生固件PX4的操作已经完成。



Ubuntu 14.04 LTS

笔者同时也进行了Ubuntu上的环境搭建。跟随大流,笔者安装了Ubutnu 14.04 LTS虚拟机,64位操作系统。

在Ubuntu上搭建环境相对简单许多,按照PX4中文维基官网的教程即可。

工具链安装


  • 权限设置

把用户添加到用户组 “dialout”(如果这步没做,会导致很多用户权限问题):

sudo usermod -a -G dialout $USER

然后注销后,重新登录,因为重新登录后所做的改变才会有效

  • 安装CMake
sudo add-apt-repository ppa:george-edison55/cmake-3.x -y
sudo apt-get update
# 必备软件(python、git、qt)
sudo apt-get install python-argparse git-core wget zip \
    python-empy qtcreator cmake build-essential genromfs -y
# 仿真工具
sudo add-apt-repository ppa:openjdk-r/ppa
sudo apt-get update
sudo apt-get install openjdk-8-jre
sudo apt-get install ant protobuf-compiler libeigen3-dev libopencv-dev openjdk-8-jdk openjdk-8-jre clang-3.5 lldb-3.5 -y
  • 卸载模式管理器

Ubuntu配备了一系列代理管理,这会严重干扰任何机器人相关的串口(或usb串口),卸载掉它也不会有什么影响。

sudo apt-get remove modemmanager
  • 更新包列表和安装下面的依赖包
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded -y
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
sudo apt-get update
sudo apt-get install python-serial openocd \
    flex bison libncurses5-dev autoconf texinfo build-essential \
    libftdi-dev libtool zlib1g-dev \
    python-empy gcc-arm-none-eabi -y

代码编译


根据PX4中文维基官网教程。

  • 安装Git
sudo apt-get install git-all
  • 下载代码
mkdir -p ~/src
cd ~/src
git clone https://github.com/PX4/Firmware.git
  • 初始化
    先进入Firmware文件夹,进而进行初始化、更新子模块操作,耐心的等待……
cd Firmware
git submodule update --init --recursive
  • 编译
    在上一步的操作结束之后,即可进行编译:
make px4fmu-v2_default

注意到“make”是一个字符命令编译工具,“px4fmu-v2”是硬件版本,“default”是默认配置,所有的PX4编译目标遵循这个规则。

与Windows环境中相同,这里也可能因为gcc-arm-none-eabi版本不对,需要进行版本升级到4.9.4,方法如下:

  • 下载gcc-arm-none-eabi 4.9.4,对于的文件夹命名为arm-none-eabi-4_9-2014q3
wget https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update/+download/gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2
  • 去旧迎新
pushd .
# => 卸载新版的gcc-arm-none-eabi
sudo apt-get remove gcc-arm-none-eabi
# => 安装下载好的gcc-arm-none-eabi
tar -jxf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2
sudo mv gcc-arm-none-eabi-4_9-2015q3 /opt
exportline="export PATH=/opt/gcc-arm-none-eabi-4_9-2015q3/bin:\$PATH"
if grep -Fxq "$exportline" ~/.profile; then echo nothing to do ; else echo $exportline >> ~/.profile; fi
# => 使路径生效
. ~/.profile
popd

对于GCC5.4.3版本的下载:

wget https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q2-update/+download/gcc-arm-none-eabi-5_4-2016q2-20160622-linux.tar.bz2

其余操作不再赘述

PX4 中文维基 同步更新。


笔者装的是Ubuntu 64位系统,而上述arm-none-eabi是直接下载的编译好的32位,还需要安装一个东西

sudo apt-get install lsb-core

可以检查arm-none-eabi 4.9是否安装成功,输入以下指令:

arm-none-eabi-gcc --version

如果出现如下信息,交叉编译环境搭建就没有什么问题了

~$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (GNU Tools for ARM Embedded Processors) 4.9.3 20150529 (release) [ARM/embedded-4_9-branch revision 227977]
Copyright (C) 2014 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.

  • 编译
cd ~/src/Firmware
make px4fmu-v2_default

进入Firmware所在的文件夹,make成功后,显示如下:
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第21张图片

Ninja

Ninja比Make更快,并且PX4的CMake生成器可以支持它。不幸的是,Ubuntu目前只支持一个非常过时的版本。

这里博主下载二进制文件并添加到系统路径来安装最新版本的Ninja:

mkdir -p $HOME/ninja
cd $HOME/ninja
wget https://github.com/martine/ninja/releases/download/v1.6.0/ninja-linux.zip
unzip ninja-linux.zip
rm ninja-linux.zip
exportline="export PATH=$HOME/ninja:\$PATH"
if grep -Fxq "$exportline" ~/.profile; then echo nothing to do ; else echo $exportline >> ~/.profile; fi
. ~/.profile

按上面的方法配置好ninja之后,以后每次一make都会调用它,这样编译速度会更快。

如果不想使用ninja的话,可以将其从’~/.profile’中注释掉。

#export PATH=/home/fantasy/ninja:$PATH

Qt Creator


Qt Creator是官方唯一支持的IDE,在Ubuntu上针对PX4固件使用,便于看代码的同时也可以进行编译烧录。

  • 安装Qt
sudo apt-get install qtcreator

Qt Creator的常见功能如下:
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第22张图片

在打开Qt之前,应该创建project文件:

cd ~/src/Firmware
mkdir ../Firmware-build
cd ../Firmware-build
cmake ../Firmware -G "CodeBlocks - Unix Makefiles"
#可以发现Firmware-build目录生成了一些文件

提个醒: 按照官网上面最后一行的命令,当前使用Qt编译得到的将是build px4 ,因为默认的编译指令是make posix_sitl_default,这不是大家所期待的结果。

解决方案:对于,Pixhawk硬件,将最后一行改成
cmake ../Firmware -G "CodeBlocks - Unix Makefiles" -DCONFIG=nuttx_px4fmu-v2_default

其他例如使用FMUv4的用户请根据需求进行替换。

  • 打开Qt
    Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第23张图片
    Ubuntu用户只要导入主文件夹里的CMakeLists.txt文件就可以了,打开Qt,通过File -> Open File or Project -> 选择CMakeLists.txt (默认位置在Firmware文件夹根目录下)
    Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第24张图片

  • 项目配置
    选择src/Firmware-build作为构建目录
    Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第25张图片
    运行设置
    Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第26张图片

  • 编译
    Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第27张图片

  • 上传

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第28张图片

笔者刚开始的时候发现Qt中默认显示的固件不全,很多文件都没有显示,如下图所示
Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第29张图片

进行下面的操作就哦可了

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第30张图片

Windows / Ubuntu操作系统下Pixhawk原生固件PX4的编译方法_第31张图片

Eclipse on Ubuntu

![ecl](https://img-blog.csdn.net/20170228131211295?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxRU52WTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

在Windows下习惯了使用Eclipse的用户也可以直接在Ubuntu下使用Eclipse进行开发,与Qt一样,这也是一款跨平台的IDE。
就是Java配置有点复杂,用起来却是非常方便的,除了不用更改环境设置,其他的都与Windows下无异,此处不在赘述。

一个很棒的特点就是Ubuntu下的Eclipse可以直接加中文注释,这是别的编译器没有的,我尝试了用Sublime看代码,定义跳转不太给力,Qt打开工程很慢。

目前为止最好的方法还是虚拟机,Windows改一行代码编译上传可能需要五分钟,非常费劲,但是Ubuntu可以说是极速。但是Windows下有很多好用的工具便于调试,Source Insight看代码也是很给力。虚拟机完美

至此,在Windows已经Ubuntu下的环境搭建已经全部搭建成功。

现在是2016.7.26 19:37 为了确保方法的有效性,笔者已经在都装有Ubuntu虚拟机的笔记本和台式机上用上述方法完成了两种系统下环境搭建、代码编译的复现,亲测有效。

Tips

下载特定版本的固件

PX4Firmware有非常多的发行版,可以从这里看到。

![release](https://img-blog.csdn.net/20170319015205379?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxRU52WTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

也可以在这里进行选择:

![tag](https://img-blog.csdn.net/20170319015339786?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb3FxRU52WTEy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

其实下载链接都是https://github.com/PX4/Firmware.git。

~$:cd ~/src/Firmware
# 查看标签(版本)
~$:git tag
...
v1.4.0rc1
v1.4.0rc2
v1.4.0rc3
v1.4.0rc4
v1.4.1rc1
v1.4.1rc2
...
# 新建一个工作分区并切换到目标版本
git checkout -b branch_name tag_name

这样就可以使用你想要的任意版本固件进行开发了。(因为可能有的版本确实不太稳定)

Makefile

# Don't be afraid of this makefile, it is just passing
# arguments to cmake to allow us to keep the wiki pages etc.
# that describe how to build the px4 firmware
# the same even when using cmake instead of make.

Makefile只是将参数传递给cmake。所有与make相关的指令都可以在这里找到,也可以自定义编译指令,比如

#  explicity set default build target
fantasy: px4fmu-v2_default

于是博主编译固件变成下面这个样子:

~$:~/src/Firmware $ make fantasy
PX4 CONFIG: px4fmu-v2_default
ninja: no work to do.

做这些只为让遇到相同问题的人少走弯路,专注核心问题,这也是笔者开展PX4中文维基汉化项目的初衷。
还望志同道合的你们多多支持!~

Just Enjoy It .

                                          By Fantasy

你可能感兴趣的:(Ubuntu,Windows,Pixhawk,PX4,编译,dev-px4-io,Pix学习笔记)