一、樹莓派3 Raspbian-jessie編譯安裝ROS Indigo

樹莓派準備好有一定時間了,這裏記錄下安裝ros的過程,我的是樹莓派3B 暗轉buster桌面顯示有點問題,最後直接推至jessie因爲最早之前做小研究用過故也沒有再嘗試strech,在安裝過程中遇到了一些問題,這裏做個記錄方便大家參考也方便以後自己回閱。東方赤龍博主的帖子裏git clone時並未定義版本,在當時可能可以編過,但是當前很多庫都有更新,本博客以方便參照官方教程,一方面參考各大神的博客最終總結。

請千萬注意,如果你要按照我的教程來安,一定要儘量不要忽略裏邊的任何一步,否則會有很多讓人頭痛的錯誤。

預祝安裝順利

基礎環境

樹莓派3B Raspbian- Jessie 128G sd卡(沒有必要這麼大的 16G已經滿足) ROS Indigo

安裝記錄

備註,之前已經配置過清華的pip源可以使用,樹莓派源也替換爲ustc 中科大的,如何替換可以自行搜索。

添加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

安裝相關依賴包

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

我在安裝 wstool時報錯——

Downloading/unpacking vcstools>=0.1.38 (from wstool)
 http://pypi.douban.com/simple/vcstools/ uses an insecure transport scheme (http). Consider using https if pypi.douban.com has it available
 Downloading vcstools-0.1.42.tar.gz (54kB): 54kB downloaded
 Running setup.py (path:/tmp/pip-build-z1y5lP/vcstools/setup.py) egg_info for package vcstools
 error in vcstools setup command: 'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.
 Complete output from command python setup.py egg_info:
 error in vcstools setup command: 'extras_require' must be a dictionary whose values are strings or lists of strings containing valid project/version requirement specifiers.

根據Error in moviepy setup command: extras_require must be a dictionary whose values are strings or li_Python_Sarah的博客-CSDN博客解決,方法如下:

更新setuptools:

sudo pip install --upgrade setuptools

重新安裝成功。

初始化rosdep

sudo rosdep init
rosdep update

這一步出錯的話可以看後邊error 處理方法:error 111 或 cannot download default sources list from.
在這裏插入圖片描述

開始安裝

創建catkin工作空間用於編譯ROS源碼

sudo mkdir ~/ros_catkin_ws
cd ~/ros_catkin_ws

接下來我們需要下載一些核心代碼包用於後續的編譯,我們會用到wstool(在2.2中有說明)使用wstool命令來選擇安裝你想使用的版本:

官方提供了兩個版本——

重要!!!先不要採用看後邊後決定

ROS-Comm: (recommended) ROS package, build, and communication libraries. No GUI tools.

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

Desktop: ROS, rqt, rviz, and robot-generic libraries

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

我在安裝時遇到了,Error: the following packages/stacks could not have their rosdep keys resolved to system depengdencies,在文章後可以找到,由於在這裏構建代碼倉庫時排除了roslisp --exclude roslisp所以自然是找不到roslisp,修改獲取如下:

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

我選用了desktop版的,如果不需要桌面仿真等一些功能,comm版應該就可以滿足需求。

在安裝時,可能會提示權限不足 **denied 類似字眼,可以先sudo su切換至管理員運行窗口。

如果中途斷線或下載失敗,可以使用如下命令繼續下載:

wstool update -t src

檢查依賴項

在構建catkin工作空間之前,你需要確定所有需要的依賴項都已正確安裝,我們用rosdep tool來(安裝或檢測?),如果有依賴項未正確安裝,他們必須通過手動來安裝。

不適用的依賴項

下邊這些依賴項對於raspbian來說並不適用:

Raspbian Wheezy: libconsole-bridge-dev, liburdfdom-headers-dev, liburdfdom-dev, liblz4-dev, collada-dom-dev

Raspbian Jessie: collada-dom-dev

下邊的這些包需根據所選擇的不同版本安裝:

Ros_Comm: libconsole-bridge-dev, liblz4-dev

Desktop: libconsole-bridge-dev, liblz4-dev, liburdfdom-headers-dev, liburdfdom-dev, collada-dom-dev

我們可以創建一個新的文件夾來存放這些待編譯的包:

$ 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

這裏添加了新的源,但是我看了下更新過程依舊有運行ustc的鏡像,但是http://mirrordirector.raspbian.org的源也有查找到更新,這樣應該可以節約一些時間。

libconsole-bridge-dev:

下邊這安裝方法始終提示debhelper版本問題,執行第3行提示版本需>=11.0。解決方法見後:

$ 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

在安裝console-bridge時提示debhelper版本不滿足需求,單獨更新一下。

在這裏插入圖片描述

$ cd ~/ros_catkin_ws/external_src
$ sudo apt-get install libboost-system-dev libboost-thread-dev
$ git clone https://github.com/ros/console_bridge.git
$ cd console_bridge
$ git reset --hard c227ae0
# 註釋 0.4.0 版本

這裏需要對文件做一些處理,編輯./include/console_bridge/console.h

在如下圖所示的前邊添加,非常重要,否則後邊一定會編譯不過去,因爲也沒時間細找那個版本依舊用的如下定義。

#define CONSOLE_BRIDGE_logError logError 
#define CONSOLE_BRIDGE_logWarn logWarn 
#define CONSOLE_BRIDGE_logInform logInform 
#define CONSOLE_BRIDGE_logDebug logDebug 

在這裏插入圖片描述

$ cmake .
$ sudo checkinstall make install

在執行 sudo checkinstall make install時,需注意提示如下時,第二個選項時修改第二條名稱從 console-bridge 改爲 libconsole-bridge-dev。圖如下:

在這裏插入圖片描述

liblz4-dev:

$ cd ~/ros_catkin_ws/external_src
$ wget http://archive.raspbian.org/raspbian/pool/main/l/lz4/liblz4-1_0.0~r122-2_armhf.deb
$ wget http://archive.raspbian.org/raspbian/pool/main/l/lz4/liblz4-dev_0.0~r122-2_armhf.deb
$ sudo dpkg -i liblz4-1_0.0~r122-2_armhf.deb liblz4-dev_0.0~r122-2_armhf.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 76da8dc
# 註釋 0.4.2 版本
$ cmake .
$ sudo checkinstall make install

在執行 sudo checkinstall make install時,需注意提示如下時,第二個選項時修改第二條名稱從**urdfdom-headers** 改爲 liburdfdom-headers-dev

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
$ git reset --hard be20424
# 註釋 0.4.2 版本
$ cmake .
$ sudo checkinstall make install

在執行 sudo checkinstall make install時,需注意提示如下時,第二個選項時修改第二條名稱從**urdfdom** 改爲 liburdfdom-dev

assimp:

方法1:下載很慢,建議從gitee下載3.3.1版本非常快,cmake步驟相同。

$ cd ~/ros_catkin_ws/external_src
$ git clone https://github.com/assimp/assimp.git
$ cd assimp
$ git reset --hard a8673d4
# 註釋 3.3.1 版本
$ cmake . -DCMAKE_BUILD_TYPE=Release -DASSIMP_BUILD_TESTS=False
$ sudo checkinstall make install

方法2:下載完成後解壓失敗

$ cd ~/ros_catkin_ws/external_src
$ wget https://github.com/assimp/assimp/archive/v3.3.1.zip
$ unzip v3.3.1.zip
$ rm v3.3.1.zip
$ cd ~/ros_catkin_ws/external_src/assimp-3.3.1
$ cmake . -DCMAKE_BUILD_TYPE=Release -DASSIMP_BUILD_TESTS=False
$ sudo checkinstall make install

在執行 sudo checkinstall make install時,需注意提示如下時,第二個選項時修改第二條名稱從 assimp改爲libassimp-dev

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

在執行 sudo checkinstall make install時,需注意提示如下時,第二個選項時修改第二條名稱從**collada-dom** 改爲 collada-dom-dev

使用rosdep解決依賴問題

其餘的依賴項應該通過運行rosdep來解決:

Raspbian Wheezy:

$ cd ~/ros_catkin_ws
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:wheezy

Raspbian Jessie: 這個是我所用到的

$ cd ~/ros_catkin_ws
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie

這步將檢查src目錄中的所有包,並找到它們的所有依賴項,然後它將遞歸地安裝依賴項。

構建catkin工作區

一旦下載完包並解決了依賴關係,就可以構建catkin包了。

調用catkin_make_isolated:

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

Note: This will install ROS in the equivalent file location to Ubuntu in /opt/ros/indigo however you can modify this as you wish.

如果編譯過程中出現錯誤如下 “internal compiler error”,可能是由於內存用盡造成的。對此,一個快速的解決方法是 add swap space添加到Pi並重新編譯。如果錯誤仍然存在,請嘗試使用-j2選項而不是默認的-j4選項生成:

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

經過不知道多少錯誤,終於編過了這一步!
在這裏插入圖片描述
現在ROS已經安裝完成,請記住刷新安裝:

$ source /opt/ros/indigo/setup.bash

或者(可選)在~/.bashrc中輸入setup.bash,這樣每次啓動新shell時,ROS環境變量都會自動添加到bash會話中:

$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc

rosdep Error處理

借鑑——ROS- 解決 rosdep update 出現的錯誤

現象

報錯,基本如下111錯誤,顯示連接被拒絕

reading in sources list data from /etc/ros/rosdep/sources.list.d
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml]:
<urlopen error [Errno 111] Connection refused> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/osx-homebrew.yaml)
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml]:
<urlopen error [Errno 111] Connection refused> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/base.yaml)
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml]:
<urlopen error [Errno 111] Connection refused> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/python.yaml)
ERROR: unable to process source [https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml]:
<urlopen error [Errno 111] Connection refused> (https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/ruby.yaml)
Hit https://raw.githubusercontent.com/ros/rosdistro/master/releases/fuerte.yaml
Query rosdistro index https://raw.githubusercontent.com/ros/rosdistro/master/index-v4.yaml
Add distro “ardent”
ERROR: error loading sources list:
<urlopen error <urlopen error [Errno 111] Connection refused> (https://raw.githubusercontent.com/ros/rosdistro/master/ardent/distribution.yaml)>

方法1 重新安裝rosdep

sudo apt-get update
sudo apt-get install python-rosdep
sudo rm /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init
rosdep update

我使用方法1即連接 raw.githubusercontent.com成功,若未成功可試方法2。

方法2 修改/etc/hosts

sudo vim /etc/hosts
#添加如下行:
151.101.84.133  raw.githubusercontent.com
#保存後執行:
sudo rosdep update

若還不成功,可以重啓再試一下。(networking restart也可以,但是如果是vnc的話會斷網,重啓還是比較方便的)

E: Unable to correct problems, you have held broken packages.

在這裏插入圖片描述

E: Unable to correct problems, you have held broken packages

sudo -H aptitude install libgl1-mesa-dev
# 選擇n
# 選擇Y
# 選擇Y
# 三步選擇,這個安裝流程完成後重新運行rosdep解決依賴問題就只有一個libopencv-dev安裝失敗了,同樣的方法解決。

Error: the following packages/stacks could not have their rosdep keys resolved to system depengdencies

rosdep檢查安裝依賴時報如下錯誤,

ros_core: cannot locate rosdep definition for [roslisp]
ros_comm: cannot locate rosdep definition for [roslisp]

刪除--exclude roslisp後解決該問題。

在這裏插入圖片描述

error logError was not declared in this scope

方法1:

該問題可以通過重新安裝libconsole-bridge-dev——前文不適用依賴項中的方法解決該問題。

方法2:很繁瑣,之後會出很多類似問題,建議採用方法1。

我檢查了所有包含的頭文件,並沒有聲明logError這個函數,並且當前cpp也沒有這個函數的實現,可能

是由於下載代碼導致的遺留問題。
在這裏插入圖片描述

具體問題代碼如下:

這段應該是輸出錯誤的具體信息,由於log函數的問題錯誤信息無法導出,所以屏蔽了這個函數,在這個cpp中總共用了兩次均做屏蔽,造成影響是如果這裏之後出錯會沒有詳細錯誤信息輸出,對應用應該沒有大的影響。

在這裏插入圖片描述

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章