1. 程式人生 > >無人機專案外篇-在NanopiM1跟T3的debian8上移植ROS

無人機專案外篇-在NanopiM1跟T3的debian8上移植ROS

首先因為最近在做無人機專案,學以致用就想的在實際的專案中應用,

肯定得在實際的板子上進行移植,在移植過程中遇到非常多的問題,

也參考過官方的說明以及一大堆的帖子,總結一下經驗

一、安裝前準備

1.1.新增ROS源

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -

1.2先更新一下,可以將缺少的包安裝好,避免後面的問題,實際上只要添加了源都應該先apt-get update一次

$ sudo apt-get update
$ sudo apt-get upgrade
1.3.安裝-ROS作業系統安裝時所需要的工具
$ sudo apt-get install python-pip python-setuptools python-yaml python-distribute python-docutils python-dateutil python-six
$ sudo pip install rosdep rosinstall_generator wstool rosinstall
1.4.初始化rosdep
$ sudo rosdep init
$ rosdep update

二、開始安裝

這邊主要因為按照老師的indigo版本安裝,而該版本官方的說明並不支援版本代號微 jessie 的debian 8,

所以我們只能採取原始碼編譯的方式安裝

2.1因為我們實際上是採原始碼編譯的方式安裝,所以先建立一個工作目錄

$ mkdir ~/ros_catkin_ws
$ cd ~/ros_catkin_ws

2.2下載ros原始碼,我們安裝indigo 桌面完整版

$ rosinstall_generator desktop --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-desktop-wet.rosinstall
$ wstool init src indigo-desktop-wet.rosinstall

如果下載中斷,就不可以在用wstool init 命令了,可以用以下命令繼續

$ wstool update -t src

三、解決依賴問題

此部份是本帖最最重要的部份,我經過了很多天的反覆的編譯過程,

發現了很多問題都是因為缺少包,因此這個部分一定要認認真真的跟著做,

否則會非常浪費時間

3.1先安裝下面幾個依賴

$ apt-get install liblz4-dev
$ apt-get install libconsole-bridge-dev
$ apt-get install liburdfdom-headers-dev
$ apt-get install liburdfdom-dev

3.2還有一個collada-dom-dev因為更新源裡沒有需要自己編譯安裝

$ mkdir -p ~/ros_catkin_ws/ext_pkg
$ cd ~/ros_catkin_ws/ext_pkg

$ sudo apt-get install checkinstall cmake$ sudo apt-get install libboost-filesystem-dev libxml2-dev

$ wget http://downloads.sourceforge.net/project/collada-dom/Collada%20DOM/Collada%20DOM%202.4/collada-dom-2.4.0.tgz
$ tar -xzf collada-dom-2.4.0.tgz
$ cd collada-dom-2.4.0
$ cmake .
$ sudo checkinstall make install
check-install 工具是一個安裝管理工具,他會列出安裝的選項,
請注意當有問你Y或N的問題時請一律回答N,然後胎會列出一堆選項,

請選擇[2]修改安裝包的名稱,把名稱從collada-dom改成collada-dom-dev

3.3解決rosdep的依賴

$ cd ~/ros_catkin_ws
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie
3.4 ROS的原始碼中,有幾個地方在ARM上編譯會出錯

3.4.1修改 ~/ros_catkin_ws/src/collada_urdf/collada_urdf/src/collada_urdf.cpp 檔案

找到 最後一個 #include 的下一行(如果最後的#include下一行是#endif就放到#endif後面)加上

#ifdef __arm__  
#include <strings.h>
bool Assimp::IOSystem::ComparePaths(const char *p1, const char *p2) const  
{  
return !::strcasecmp(p1,p2);  
}
#endif
3.4.2修改 ~/ros_catkin_ws/src/rviz/src/rviz/mesh_loader.cpp

找到 最後一個 #include 的下一行(如果最後的#include下一行是#endif就放到#endif後面)加上

#ifdef __arm__  
#include <strings.h>
bool Assimp::IOSystem::ComparePaths(const char *p1, const char *p2) const  
{  
return !::strcasecmp(p1,p2);  
}
#endif

四、修改交換空間

因為編譯的時候會消耗大量的記憶體,尤其多執行緒編譯的時候,記憶體耗盡自動就會結束程序

經過測試如果使用4執行緒,至少得給予2G的交換空間,

$ mkdir -p /opt/temp
$ dd if=/dev/zero of=/opt/temp/swap bs=1024 count=2048000
這邊的count=2048000 代表2G大家可以看自己的SD卡大小自行調整
$ mkswap /opt/temp/swap
$ swapon /opt/temp/swap
請注意這邊是建立一個檔案 /opt/temp/swap並且初始化該檔案之後,
使用swapon命令啟用交換空間,可以使用swapoff 命令解除安裝,
上述方法為一次性有效,下次重啟並不會自動掛載swap分割槽,
如果用不到的話可以直接刪除swap檔案節省空間


五、編譯安裝

因為M1跟T3內核數不同,並且過大的程序數會導致資源耗盡,因此強烈建議 M1 (四核)使用 -j2 而T3(八核)使用-j4

$ cd ~/ros_catkin_ws
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo -j2

編譯總共約需3~4小時,請耐心等候

....

....

...

最後編譯完成就可以愉快的使用ROS作業系統了~~~~