PX4代码编译

  • 介绍

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去修复,那就……可以重装系统了。


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

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

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


 
 
  1. # 添加源
  2. sudo add-apt-repository ppa:george-edison55/cmake -3.x -y
  3. # 更新软件
  4. sudo apt- get update
  5. # 安装python、git、qt
  6. sudo apt- get install python-argparse git-core wget zip \
  7. python-empy qtcreator cmake build-essential genromfs -y
  8. # 添加源
  9. sudo add-apt-repository ppa:openjdk-r/ppa
  10. # 更新
  11. sudo apt- get update
  12. # 安装仿真软件和需要的库文件,注意体验下面两句的区别(一句代码后有 -y ,一句没有)
  13. sudo apt- get install openjdk -8-jre
  14. 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机后,无法读出硬件,无法烧录上传固件。

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


 
 
  1. # 添加源 添加第一个源时可能会出现Failed,不过没关系,继续添加第二个
  2. # gcc-arm-none-eabi源添加Failed的问题后面会解决
  3. sudo add-apt-repository ppa:terry.guo/gcc-arm-embedded -y
  4. sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa
  5. # 检查更新,由于上面那个Failed,检查更新时,部分链接也可能访问不到
  6. sudo apt- get update
  7. # 不管那么多了,先把能安装的软件/库文件安装上,后面编译时缺什么再补装什么
  8. sudo apt- get install python-serial openocd \
  9. flex bison libncurses5-dev autoconf texinfo build-essential \
  10. libftdi-dev libtool zlib1g-dev \
  11. 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的步骤类似。


 
 
  1. pushd .
  2. # 卸载新版的gcc-arm-none-eabi
  3. sudo apt-get remove gcc-arm-none-eabi
  4. # 安装下载好的gcc-arm-none-eabi
  5. # 解压
  6. tar -jxf gcc-arm-none-eabi-4_9-2015q3-20150921-linux.tar.bz2
  7. # 移动
  8. sudo mv gcc-arm-none-eabi-4_9-2015q3 /opt
  9. exportline= "export PATH=/opt/gcc-arm-none-eabi-4_9-2015q3/bin:\$PATH"
  10. if grep -Fxq "$exportline" ~/.profile; then echo nothing to do ; else echo $exportline >> ~/.profile; fi
  11. # 使路径生效
  12. . ~/.profile
  13. popd
  • 编译源码

  • 源码下载

首先需要安装一个库文件

sudo apt-get install lsb-core
 
 

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

下载源码


 
 
  1. # 创建src文件夹
  2. mkdir -p ~/src
  3. # 进入文件夹
  4. cd ~/src
  5. # 克隆源码
  6. 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文件夹,进行初始化、更新子模块操作,耐心的等待……


 
 
  1. cd Firmware
  2. 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。

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

  • 源码编译

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


 
 
  1. # make是操作字符 px4fmu是固件名称 -v2是版本号 _default是默认配置
  2. # 实际 make之后是一个文件名称,需要编译的模块都在其中
  3. # 可以输入 make p 然后按Tab键,会跳出一连串p开头的文件
  4. 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进行编译。直接贴上大神的代码。


 
 
  1. mkdir -p $HOME/ninja
  2. cd $HOME/ninja
  3. wget https://github.com/martine/ninja/releases/download/v1.6.0/ninja-linux.zip
  4. unzip ninja-linux.zip
  5. rm ninja-linux.zip
  6. exportline= "export PATH=$HOME/ninja:\$PATH"
  7. if grep -Fxq "$exportline" ~/.profile; then echo nothing to do ; else echo $exportline >> ~/.profile; fi
  8. . ~/.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文件:


 
 
  1. cd ~/src/Firmware
  2. mkdir ../Firmware-build
  3. cd ../Firmware-build
  4. 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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值