1. 程式人生 > >樹莓派上安裝完整的ROS indigo(2017/4/18 修正)

樹莓派上安裝完整的ROS indigo(2017/4/18 修正)

截至 2017/4/18  主要有兩個問題已解決

首先, 樹莓派編譯到179個包的時候 ,會出錯, 諮詢過github的作者,說liburdf headers  liburdf這個包更改了部分內容,將boost的內容替換成c++11,所以 要降到0.4.2或者0.4.0 這個版本

其次,如果RVIZ不能啟動的話,注意檢視urdfdom這個包是否安裝正常。//如果之前有安裝過ros,新增其他包的時候,注意安裝完之後,記得執行 sudo ldconfig 進行動態庫連結,博主一開始沒有做,一直提示無法啟動urdfdom_sensor.h 檔案共享報錯。

//附上常用的幾個debian指令  老鳥繞過

刪除原來已安裝的包   

dpkg -P  //檢視已安裝的包  dpkg -L apache2

附上鍊接  github兩個包連結:

https://github.com/ros/urdfdom_headers/releases/tag/0.4.2

https://github.com/ros/urdfdom/releases/tag/0.4.2

根據官網的的指導教程中的兩個相關的包 替換成這兩個包就可以編譯通過。

附上collada-dom的百度連結,這個包要下載很久,很浪費時間,博主下完之後,儲存了下來。

https://pan.baidu.com/s/1jI2wqCA

至此,ros的安裝的坑躺完了。

附上官網的 教程 連結和參考的一篇部落格的連結。

http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Indigo%20on%20Raspberry%20Pi

如果 有什麼問題 建議 參考 官網,有人說官網很容易出錯,但是其實我感覺,理解了官網的意思 應該沒什麼問題, 就是有些小細節, 底下 這篇文章 會指出。

 然後我自己 補充 一個地方。

以下的教程參考了超級cooper的部落格: 

就是關於collada 這個包的安裝, 執行安裝之後 會提示安裝成功,但是Resolve Dependencies時 

執行 

rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie
會出現collada fasiled  ,  關於 python那幾個 不用管他,但是這個選項我查了一下官網, 如下

Unavailable Dependencies

Following packages are not available for Raspbian:

Raspbian Wheezy: libconsole-bridge-devliburdfdom-headers-devliburdfdom-devliblz4-devcollada-dom-dev

Raspbian Jessie: collada-dom-dev

對於raspbian 這個包一開始就說是不能 用的,那為什麼  還提供 安裝 ?? 完全無法理解。外國人在想什麼?

1、準備材料

樹莓派3B,  ROS Indigo, 16G SD卡,Raspbian OS(博主裝的是jessie)

2、準備安裝

2.1新增ROS程式碼倉庫

Raspbian Jessie:
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu jessie main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
更新一下,否則很容易出錯
$ sudo apt-get update
$ sudo apt-get upgrade

2.2安裝相關依賴包

Raspbian Jessie:

$ 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

2.3初始化rosdep

$ sudo rosdep init
$ rosdep update

3、開始安裝

3.1建立catkin工作空間用於編譯ROS原始碼

$ mkdir ~/ros_catkin_ws
$ cd ~/ros_catkin_ws
接下來下載ROS原始碼,我們要安裝的是完整版(Desktop)
下載併產生package列表,耐心等待
$ rosinstall_generator desktop --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-desktop-wet.rosinstall
$ wstool init src indigo-desktop-wet.rosinstall
可以使用多執行緒下載來提高下載速度
$ wstool init src indigo-desktop-wet.rosinstall -j8
如果中途下載中斷,可以使用下面的命令恢復下載,如果不確定是否完全下載也可以用下面的命令來檢測
$ wstool update -t src

3.2解決依賴

3.2.1安裝軟體源沒有的依賴包

這部分很重要,編譯報錯的原因大多數都是在這裡,很多人在編譯的過程中報錯卡在"collada_parser"這裡,這是因為"collada_parser"的依賴包"liburdfdom-headers-dev"在最近的幾個版本都用使用C++11的std替換掉了boost元件,而"collada_parer"原始碼裡面用的依舊是boost元件,所以我們不能直接安裝最新版本(2.4)的"liburdfdom-headers-dev",這裡我們要安裝的是1.0.0版本,但是1.0.0版本又缺少一個頭檔案utils.h,具體解決方法在下面。 由於libconsole-bridge-devliblz4-devliburdfdom-headers-devliburdfdom-devcollada-dom-dev這5個依賴包不在Raspbian的軟體源裡面,不能直接通過apt-get安裝,需要下載原始碼手動編譯安裝
建立一個新目錄來存放這5個依賴包
$ mkdir ~/ros_catkin_ws/external_src
$ sudo apt-get install checkinstall cmake
$ sudo sh -c 'echo "deb-src http://mirrordirector.raspbian.org/raspbian/ testing main contrib non-free rpi" >> /etc/apt/sources.list'
$ sudo apt-get update
注意:update這一步不能省,確保全部更新完成,即使網路不好也要執行,博主在這一步因為update太慢直接跳過但是後面報錯了。 libconsole-bridge-dev:
$ cd ~/ros_catkin_ws/external_src
$ sudo apt-get build-dep console-bridge
$ apt-get source -b console-bridge
$ sudo dpkg -i libconsole-bridge0.2*.deb libconsole-bridge-dev_*.deb
如果看到關於'-std=c++11' 的錯誤,按照下面的步驟將gcc版本升級到gcc 4.7+
sudo apt-get install g++-4.7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 60 --slave /usr/bin/g++ g++ /usr/bin/g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 40 --slave /usr/bin/g++ g++ /usr/bin/g++-4.7
sudo update-alternatives --config gcc
liblz4-dev
$ cd ~/ros_catkin_ws/external_src
$ apt-get source -b lz4
$ sudo dpkg -i liblz4-*.deb
liburdfdom-headers-dev: 
$ cd ~/ros_catkin_ws/external_src
$ git clone https://github.com/ros/urdfdom_headers.git
$ cd urdfdom_headers
$ git reset --hard 9aed725
$ cmake .
$ sudo checkinstall make install
前面分析了編譯過程可能出現"collada_parser"報錯的原因,這裡的'9aed725'就是將"liburdfdom-headers-dev"的安裝版本變成我們需要的1.0.0版本。 check-install開始會讓你輸入包的描述,可以直接按回車跳過。當checkinstall詢問是否改變安裝選項時,選擇[2],將名字從"urdfdom-headers" 改為 "liburdfdom-headers-dev",其餘有[y]或[n]的問題都輸入'n'按回車, 否則會編譯出錯 注:因為rosdep不認這幾個package預設安裝的名字,所以需要我們在安裝的時候修改package名 安裝完成後我們可以用下面的命令來檢視已安裝的包
$ dpkg -l
執行上面命令在列表中沒有看到我們安裝的"liburdfdom-headers-dev"包,或者package名沒有修改成功,執行下面命令重新安裝(為確保這裡的每個依賴包都正確安裝,建議每安裝一個包之後都用這個方法檢查一遍)
$ sudo checkinstall make install
安裝"liburdfdom-headers-dev"後我們還要下載新增一個檔案(utils.h)到/usr/local/include/urdf_model目錄下,否則編譯報錯
$ cd /usr/local/include/urdf_model
$ sudo wget https://raw.githubusercontent.com/ros/urdfdom_headers/master/urdf_model/include/urdf_model/utils.h
liburdfdom-dev
$ cd ~/ros_catkin_ws/external_src
$ sudo apt-get install libboost-test-dev libtinyxml-dev
$ git clone https://github.com/ros/urdfdom.git
$ cd urdfdom
$ cmake .
$ sudo checkinstall make install
check-install開始會讓你輸入包的描述,可以直接按回車跳過。當checkinstall詢問是否改變安裝選項時,選擇[2],將名字從 "urdfdom"改為"liburdfdom-dev" ,其餘有[y]或[n]的問題都輸入'n'按回車, 否則會編譯出錯
collada-dom-dev:
$ cd ~/ros_catkin_ws/external_src
$ 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開始會讓你輸入包的描述,可以直接按回車跳過。當checkinstall詢問是否改變安裝選項時,選擇[2],將名字從 "collada-dom"改為 "collada-dom-dev" ,其餘有[y]或[n]的問題都輸入'n'按回車, 否則會編譯出錯

3.2.2解決rosdep的依賴

Raspbian Jessie:
$ cd ~/ros_catkin_ws
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie
這個命令會尋找所有src目錄的package並遞迴安裝依賴,要安裝的依賴包有點多,耐心等待吧。 注意: Rosdep可能會提示python-rosdep, python-catkin-pkg, python-rospkg, 和 python-rosdistro 安裝失敗,可以忽略這些錯誤,因為他們已經由pip安裝好了。

3.3編譯catkin工作空間

3.3.1在開始編譯之前,先打兩個補丁。

$ nano ~/ros_catkin_ws/src/robot_model/collada_urdf/src/collada_urdf.cpp

修改 ~/ros_catkin_ws/src/robot_model/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
$ nano ~/ros_catkin_ws/src/rviz/src/rviz/mesh_loader.cpp
修改~/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

3.3.2修改交換空間大小

樹莓派在編譯的時候會消耗很多CPU和記憶體資源,可能會出現宕機和編譯器內部錯誤,為了防止這種情況發生,需修改系統交換空間大小。
$ sudo nano /etc/dphys-swapfile
找到CONF_SWAPSIZE=100,修改為 CONF_SWAPSIZE=1024
修改完後重啟樹莓派才能生效
$ sudo reboot

3.3.3正式編譯和安裝

$ cd ~/ros_catkin_ws
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo
執行上面命令預設使用4個核心來編譯,會使得CPU的使用率長時間為100%,容易宕機,所以我們可以加上-j2引數設定樹莓派使用2個核心編譯。
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo -j2
接下來要做的事情就是睡一覺或者幹別的事情,沒有好幾個小時是不能編譯好的。 ... ... ... 不出什麼意外等待幾個小時後我們的ROS就編譯安裝完成了,下面我們設定一下ROS的環境變數。
$ source /opt/ros/indigo/setup.bash
設定ROS環境變數在每次啟動shell時自動新增到bash會話
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
到這裡我們的ROS完整版就已經成功安裝好了,不妨執行roscore試一下
$ roscore
成功執行roscore就證明我們安裝成功了,接下來就可以按照官網教程愉快地學習了,距離做出自己的ROS移動平臺又近了一步。 注意事項:上面libconsole-bridge-devliblz4-devliburdfdom-headers-devliburdfdom-devcollada-dom-dev這幾個package一定要按照順序正確安裝,尤其要注意名字有沒有修改正確,如果安裝錯誤必須得按照依賴關係解除安裝並重新安裝。在update和安裝依賴包的時候可能會因為網路問題中斷,所以一定仔細看終端輸出的資訊,提示失敗就重新執行命令。 //////////////////最後補充一下,原部落格 未寫的東西。
$ source /opt/ros/indigo/setup.bash
這樣以後你執行ros環境的時候,就會幫你新增ros環境。