1. 程式人生 > >從零開始的Ubuntu 16.04下PX4編譯環境的搭建

從零開始的Ubuntu 16.04下PX4編譯環境的搭建

      近來入手了一塊pixhawk,想進行一些基於已有程式碼的二次加工,於是到官網https://dev.px4.io/上看教程。官網上的教程是分為中文、英文以及韓文的版本。很多人肯定第一反應就是看中文的版本。但是這樣做弊端真的很大,原因如下:

  1.官網上的中文漢化較差,很多地方的翻譯不但意思不準確,甚至還在教程裡面的關鍵步驟上出現了遺漏

  2.中文版本似乎已經長時間沒有更新。裡面有的韌體庫已經過時,在這樣的韌體庫下編譯,報錯絕對是家常便飯。

筆者在這樣的教程指導下走了很多彎路。所以寫下這篇教程,給像我一樣第一次接觸PX4,Ubuntu,甚至程式設計的人一些幫助。

一、作業系統的選擇——windows還是Ubuntu

跟大多數人一樣,我之前從未接觸過linux,ubuntu更是一無所知。但是鑑於官網上對Ubuntu的強烈推薦與windows的強烈不支援。我還是建議大家裝一個Ubuntu。(版本最好是16.04)筆者曾經裝了Ubuntu 18.04,後來發現因為作業系統版本過新導致了一系列問題(主要是編譯環境的程式有的不被相容)。所以強烈推薦大家裝一個Ubuntu 16.04.

二、怎麼裝?

兩種方式1.虛擬機器(推薦)2.雙系統。

筆者採用的是虛擬機器的方式,原因很簡單,作為小白,第一次使用ubuntu這樣的系統的時候難免會有操作失誤的時候。這時候當你不知道如何還原的時候,只需要把虛擬機器解除安裝瞭然後重裝就好了。

教程如下:https://blog.csdn.net/gongxifacai_believe/article/details/52444938

有一個地方需要注意。預設的記憶體是1G,但是我在編譯的時候遇到了記憶體溢位的問題,所以比較推薦設定成2G(後面再改完全來得及)。

裝好了虛擬機器之後,建議安裝一個vmtools,安裝之後可以從windows介面下複製命令(ctrl+c),到ubuntu下面的終端(ctrl+alt+T)中貼上(ctrl+shift+v)使用。

教程如下https://blog.csdn.net/tjcwt2011/article/details/72638977

三、正題——px4編譯環境的搭建

在開始正題之前,我還是照例把要做的前戲說完。(很重要!)

px4編譯環境所需要的檔案大多數是從國外節點下載的,速度異常緩慢,經常還有找不到倉庫的現象。所以需要更換國內映象節點以加快下載速度。

教程如下

https://blog.csdn.net/Mordiary/article/details/80533627

然後終於可以開始搭建所需的編譯環境了。

1. 開啟某些許可權:
sudo usermod -a -G dialout $USER
登出之後再登入,這樣你就成為新的使用者了,這個操作只需要進行一次,之後你再需要重新下載韌體就不需要這一步了

2. 執行指令碼檔案:

官網最新提供了一個指令碼檔案,新建一個指令碼檔案ubuntu_sim_nuttx.sh,這個指令碼檔案不僅有PX4環境所需要的各種庫,並且也安裝了jMAVSim的各種依賴。複製以下內容到指令碼檔案中:

#!/bin/bash

## Bash script for setting up a PX4 development environment for Pixhawk/NuttX targets on Ubuntu LTS (16.04).
## It can be used for installing simulators and the NuttX toolchain.
##
## Installs:
## - Common dependencies and tools for all targets (including: Ninja build system, Qt Creator, pyulog)
## - FastRTPS and FastCDR
## - jMAVSim simulator
## - Gazebo8 simulator
## - NuttX toolchain (i.e. gcc compiler)
## - PX4/Firmware source (to ~/src/Firmware/)

# Ubuntu Config
sudo apt-get remove modemmanager -y


# Ninja build system
ninja_dir=$HOME/ninja
echo "Installing Ninja to: $ninja_dir."
if [ -d "$ninja_dir" ]
then
    echo " Ninja already installed."
else
    pushd .
    mkdir -p $ninja_dir
    cd $ninja_dir
    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=$ninja_dir:\$PATH"
    if grep -Fxq "$exportline" ~/.profile; then echo " Ninja already in path" ; else echo $exportline >> ~/.profile; fi
    . ~/.profile
    popd
fi


# Common Dependencies
echo "Installing common dependencies"
sudo add-apt-repository ppa:george-edison55/cmake-3.x -y
sudo apt-get update
sudo apt-get install python-argparse git-core wget zip python-empy qtcreator cmake build-essential genromfs -y
# required python packages
sudo apt-get install python-dev -y
sudo apt-get install python-pip
sudo -H pip install pandas jinja2
pip install pyserial
# optional python tools
pip install pyulog


# Install FastRTPS 1.5.0 and FastCDR-1.0.7
fastrtps_dir=$HOME/eProsima_FastRTPS-1.5.0-Linux
echo "Installing FastRTPS to: $fastrtps_dir"
if [ -d "$fastrtps_dir" ]
then
    echo " FastRTPS already installed."
else
    pushd .
    cd ~
    wget http://www.eprosima.com/index.php/component/ars/repository/eprosima-fast-rtps/eprosima-fast-rtps-1-5-0/eprosima_fastrtps-1-5-0-linux-tar-gz
    mv eprosima_fastrtps-1-5-0-linux-tar-gz eprosima_fastrtps-1-5-0-linux.tar.gz
    tar -xzf eprosima_fastrtps-1-5-0-linux.tar.gz eProsima_FastRTPS-1.5.0-Linux/
    tar -xzf eprosima_fastrtps-1-5-0-linux.tar.gz requiredcomponents
    tar -xzf requiredcomponents/eProsima_FastCDR-1.0.7-Linux.tar.gz
    cd eProsima_FastCDR-1.0.7-Linux; ./configure --libdir=/usr/lib; make; sudo make install
    cd ..
    cd eProsima_FastRTPS-1.5.0-Linux; ./configure --libdir=/usr/lib; make; sudo make install
    popd
fi


# jMAVSim simulator
sudo apt-get install ant openjdk-8-jdk openjdk-8-jre -y

# Gazebo simulator
sudo apt-get install protobuf-compiler libeigen3-dev libopencv-dev -y
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable `lsb_release -cs` main" > /etc/apt/sources.list.d/gazebo-stable.list'
## Setup keys
wget http://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
## Update the debian database:
sudo apt-get update
## Install Gazebo8
sudo apt-get install gazebo8 -y
## For developers (who work on top of Gazebo) one extra package
sudo apt-get install libgazebo8-dev


# NuttX
sudo apt-get install python-serial openocd \
    flex bison libncurses5-dev autoconf texinfo \
    libftdi-dev libtool zlib1g-dev -y

# Clean up old GCC
sudo apt-get remove gcc-arm-none-eabi gdb-arm-none-eabi binutils-arm-none-eabi gcc-arm-embedded
sudo add-apt-repository --remove ppa:team-gcc-arm-embedded/ppa



# Install GCC 5.4
gcc_dir=$HOME/gcc-arm-none-eabi-5_4-2016q2
echo "Installing GCC to: $gcc_dir"
if [ -d "$gcc_dir" ]
then
    echo " GCC already installed."
else
    pushd .
    cd ~    
    wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/5_4-2016q2/gccarmnoneeabi542016q220160622linuxtar.bz2
    tar -jxf gccarmnoneeabi542016q220160622linuxtar.bz2
    exportline="export PATH=$HOME/gcc-arm-none-eabi-5_4-2016q2/bin:\$PATH"
    if grep -Fxq "$exportline" ~/.profile; then echo " GCC path already set." ; else echo $exportline >> ~/.profile; fi
    . ~/.profile
    popd

    # Install 32 bit support libraries (ignore if fails)
    sudo dpkg --add-architecture i386
    sudo apt-get update
    sudo apt-get install libc6:i386 libgcc1:i386 libstdc++5:i386 libstdc++6:i386
    sudo apt-get install gcc-5.4-base:i386
fi



# Clone PX4/Firmware
clone_dir=~/src
echo "Cloning PX4 to: $clone_dir."
if [ -d "$clone_dir" ]
then
    echo " Firmware already cloned."
else
    mkdir -p $clone_dir
    cd $clone_dir
    git clone https://github.com/PX4/Firmware.git
    cd Firmware
fi
cd $clone_dir/Firmware


#Reboot the computer (required before building)
echo RESTART YOUR COMPUTER to complete installation of PX4 development toolchain

隨後執行一下命令:source ubuntu_sim_nuttx.sh,這樣就安裝了各種依賴。之後還需要開啟Firmware資料夾,submodule一下(這一步不進行後面會因為少幾個模組而編譯不過):

cd ~src/Firmware/
git submodule init
git submodule update --init --recursive

然後可以編譯韌體

cd Firmware
make px4fmu-v2_default

沒出現error即為編譯成功。