Linux系统下搭建PX4/Pixhawk原生固件编译环境

  • 简介

PX4固件是Pixhawk飞行控制器的官方固件,Pixhawk官网也给出了Linux/windows下搭建开发环境的方法。由于种种原因,搭建开发环境时总会遇到各种各样的bug,致使PX4固件编译失败。虽然官方给出了一键搭建开发环境的shell脚本,但是我不建议大家使用脚本搭建编译环境。自己搭建,遇到问题、解决问题,还能够顺便学习一下Linux系统。

这里先给出官方的教程。

http://dev.px4.io/zh/setup/dev_env_linux.html

  • Linux系统下搭建编译环境

官网上说的一句话,我非常的赞同,“永远不要使用sudo来修复权限问题,否则会带来更多的权限问题,需要重装系统来解决”。当你不理解这句话的含义时,记住它即可,它是官方给出的警告;博主经过无数次血泪教训、重装系统,才发现sudo su就是许多问题根源。如果想体验一下权限带来的种种bug,可以尝试使用sudo su为每一句代码开启root权限……

权限问题可以这样理解,假设在root权限下下载了PX4源码,那这个源码相当于windows系统中的系统文件,必须要管理员(root)才有权动用这个文件。当某些程序/软件需要访问源码,进行编译时,此程序/软件没有root权限,就无法访问到代码,致使编译出现问题,所以“永远不要使用sudo来修复权限问题,否则会带来更多的权限问题,需要重装系统来解决”。

那么现在就开始搭建编译环境。

  • 权限设置

不做这一步会产生很多上述的权限问题,如果用sudo去修复,那就……可以重装系统了。

# 把用户添加到用户组 “dialout”
sudo usermod -a -G dialout $USER

之后需要注销、重新登陆使用户组生效。

  • 安装必备编译软件Cmake、QT、Python等

# 添加源
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
# 安装仿真软件和需要的库文件,注意体验下面两句的区别(一句代码后有 -y ,一句没有)
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

添加源操作一般成功后会跳出一个“OK”,update成功后会有个“done”。

  • 卸载modemmanager模式管理器

sudo apt-get remove modemmanager

Ubuntu配备了一系列代理管理,这会严重干扰相关的串口(或usb串口),最明显的表现就是硬件连接到PC机后,无法读出硬件,无法烧录上传固件。

  • 更新、安装相关的库文件

# 添加源 添加第一个源时可能会出现Failed,不过没关系,继续添加第二个
# gcc-arm-none-eabi源添加Failed的问题后面会解决
sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded -y
sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
# 检查更新,由于上面那个Failed,检查更新时,部分链接也可能访问不到
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
  • 安装正确版本的gcc-arm-none-eabi

还记的上面出现的那个Failed吗?实际我们安装的gcc-arm-none-eabi版本不支持源码,所以需要安装正确的版本。输入一下代码可以查看gcc-arm-none-eabi版本信息。

arm-none-eabi-gcc --version

我们需要的是GCC4.9.4或GCC5.4.3,如果看到如下的信息那就代表gcc-arm-none-eabi版本安装正确,直接跳到代码编译步骤即可,否则就按下述步骤重新安装gcc-arm-none-eabi。

  • 下载GCC4.9.4或5.4.3

GCC4.9.4

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

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
  • 安装GCC

这里以GCC4.9.4为例,5.4.3的步骤类似。

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
  • 编译源码

  • 源码下载

首先需要安装一个库文件

sudo apt-get install lsb-core

有些学习链接会安装一个叫git-all的软件,这里不建议大家安装。Ubuntu16.04安装git-all会莫名的出现包管理器崩溃的ERROR,然后用网上找到的解决方法,重启后会白屏,我在这重装了3、4次系统还是没有解决这个问题。所以不建议安装git-all,这样也能下载源码,只不过速度有些慢。

下载源码

# 创建src文件夹
mkdir -p ~/src
# 进入文件夹
cd ~/src
# 克隆源码
git clone https://github.com/PX4/Firmware.git

如果下载速度很慢、非常慢、慢到龟速,可以Ctrl+X然后Ctrl+Z强制终止。之后进入src文件夹文件夹,把文件夹中已clone的代码删除,然后回到终端,进入src文件夹重新clone。

如果出现下面error错误,没关系,再次输入git clone https://github.com/PX4/Firmware.git,继续clone即可。这个错误是因为,clone时网速过慢导致的。按照上面的步骤,删除重新clone也可以。

之后需要进入Firmware文件夹,进行初始化、更新子模块操作,耐心的等待……

cd Firmware
git submodule update --init --recursive

初始化时可能会遇到同样的问题,更新模块的速度过慢,两种解决办法:

1.把src文件夹中所有东西动删除,重新下载源码然后初始化

2.Ctrl+X然后Ctrl+Z,进入正在clone的文件夹中,把文件夹删除,然后重新git submodule update --init --recursive。

例如,如上图,假设Clone Tools/jMAVSim的速度很慢(几B/s),就Ctrl+X然后Ctrl+Z,进入Firmware/Tools,把jMAVSim文件夹删除,然后重新git submodule update --init --recursive。

同理,初始化失败时只需要重新输入初始化命令即可。

  • 源码编译

到了源码编译这一步,里成功就不远了。源码编译的过程可能会非常坎坷,会遇到很多问题需要注意。

在src/Firmware目录下输入下面指令,make编译固件。

# make是操作字符 px4fmu是固件名称 -v2是版本号 _default是默认配置
# 实际make之后是一个文件名称,需要编译的模块都在其中
# 可以输入make p 然后按Tab键,会跳出一连串p开头的文件
make px4fmu-v2_default

然后,大概会遇到下面这个问题:

自己需要准确的定位到错误的原因。例如,这个错误实际是少安装了python的一个module造成的。如果下面没给出解决方案,直接谷歌,把红框中的那一句话贴上去,一般都能找到解决方案(会教你如何安装jinja2),不过现在下面给出了解决方案,我们直接安装即可。

sudo apt-get install python-jinja2

安装完毕之后,直接再次输入make px4fmu-v2_default,再次编译。

又会跳出几个Error,再次定位Error。

从最开始进行查找,会发现实际出现Error的原因是“Required python packages not installed”(查找错误原因的能力必须要掌握)。然后可以尝试一下系统给出的建议的解决方案。

sudo pip install numpy toml

然后系统会出现 “sudo: pip:command not found ”,这时就需要谷歌/百度大法了。把错误贴到搜索引擎里,根据搜索的结果去解决(实际是没有安装python的pip,假装不知道,谷歌查一查)。然后会找到帖子教我们安装pip,这里我们选择安装python2的pip。

sudo apt-get install python-pip

安装完毕之后再次用pip安装numpy toml。

sudo pip install numpy toml

继续重新输入指令make……编译固件(按↑键可以调出历史输入的指令),然后在100%时出现了一个Error。

我已经把错误原因给贴出来了,建议自己把原因百度一下,尝试去查找解决方案。

出现这个问题的原因是因为,px4的默认配置中添加的模块太多,编译出来的固件大小超出了默认的Flash大小,有两个方法可以解决。

1.注释掉不需要的模块(不怎么建议使用,后续会知道如何注释);

2.修改默认的Flash大小。

按照图片进入nuttx-configs文件夹,nuttx-configs里面存放的所有的固件的配置。

我们需要修改的是px4fmu-v2的配置,所以需要找到并进入px4fmu-v2这个文件夹。

然后进入scripts文件夹,找到ld.script,里面存放这px4fmu-v2的默认配置。

按照图片所示,把默认的LENGTH修改成2032k,保存,重新make编译固件。

最终显示这个界面就OK了。

  • 编译工具与IDE

  • Ninja

上面我们进行编译时,清一色的输入make、make、make。实际我们是用make进行编译的,make的编译速度并不快,这里根据大神的建议,采用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都会调用它,这样编译速度会更快。

可以把src/Firmware/build文件夹中的所有文件删除(make px4fmu-v2_default之后会在build中生成两个文件夹,将其删除之后才能再次make,否则会显示no work to do不进行编译),然后在src/Firmware目录下再次make,此时系统会自动调用Ninja,是不是快了很多……

  • QT

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

下面安装QT。

sudo apt-get install qtcreator

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

cd ~/src/Firmware
mkdir ../Firmware-build
cd ../Firmware-build
cmake ../Firmware -G "CodeBlocks - Unix Makefiles" -DCONFIG=nuttx_px4fmu-v2_default

在搜索栏搜索并打开QT。

 

选择Open Project,进入Firmware目录,选择CMakeLists.txt,open。

点击Projects选项,Build下不需要改动。

Run选项下,点击ADD,添加Custom Exectable。

在红框中的两行分别输入make upload,然后点击绿色按钮,QT就开始编译源码固件了。

点击build的那个黑色方框,就能看到编译的进程(注意,QT编译完成之后会自动上传固件,这里没有连接硬件,会卡在100%,没法上传,看到100% uploadpx4,直接点击红色按钮结束上传就可以)

至此,源码的编译环境就基本配置完成了,可以随心所欲的看源码了。

  • 结束语

PX4源码是个很大的工程文件,下一篇我会对源码进行稍微的讲解,这一篇就到这里吧。

本文部分内容来自于官网和FantasyJXF大神的教学帖,下面附上这两个链接。

https://blog.csdn.net/oqqENvY12/article/details/52035127#t6

https://dev.px4.io/zh/setup/dev_env_linux.html

猜你喜欢

转载自blog.csdn.net/pix_csdn/article/details/81913610