2018年6月8日金曜日

ROS(melodic)をRaspberry Pi + Raspbian(stretch)にインストールする方法


背景

ROSとは、ロボットの制御プログラム作成ために便利な機能を提供してくれるプログラムです。
Raspberry Piとは、数千円から購入できるコンピューターです。
Raspberry PiにROSをインストールするにあたり手間取るところがあったので、インストール手順を残しつつ、手間取ったところを共有します。

注意: UbuntuにROSを入れる方がビルド不要で楽です

この記事ではRaspbian (Raspberry Pi OS)へのROSのインストール方法を紹介していますが、Raspberry Pi向けのUbuntuを利用してROSのインストール手順に従う方がビルドせずに済んで楽なので、OSに制限が無いのであればそちらをお勧めします。

RaspbianでROSを使う必要があったり、ROSのビルドに興味がある方は、本記事の内容が参考になると思います。

使ったもの

Raspberry Pi + Raspbian Stretch(2018.04リリース版)



下記の組み合わせでビルドできることを確認しました。
ros_conn: Raspberry Pi Zero + Raspbian Lite
ROSのデスクトップ版: Raspberry Pi3 + Raspbian デスクトップ版

ヒートシンク



ヒートシンク無しでRaspberry Pi3に負荷の大きい処理をさせると、熱暴走するためか、無反応になることが多いです。
ヒートシンクをつけるとそうなることが減るので、Raspberry Pi3を使う場合はCPUへのヒートシンクの設置をお勧めします。

参考資料

Kineticのros_comm版をRaspbianにインストールする手順を共有してくれているブログ記事です。
とても参考になりました。
INSTALL ROS AND OPENCV IN RASPBERRY PI(RASPBIAN STRETCH)

ROS本家のドキュメントです。
Installing from source

OpenCV3インストールの参考にしました。
Python2.7とOpenCVのインストール

ROSのリポジトリをRaspbianに紐付け

ROSに関するプログラムを取得するために、RaspbianのaptにROSのリポジトリを登録します。
dirmgerというプログラムがRaspbian Stretchにはインストールされていないようなので、それをインストールしてから紐付けを行います。
sudo apt update
sudo apt upgrade -y
sudo apt install dirmngr -y
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt update

関連プログラムをインストール

ソースコードの配置やビルドに必要な関連プログラムをインストールします。
sudo apt install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall python-empy build-essential cmake

ワークスペースを作成

rosdepの初期化とROSのワークスペースとして使うディレクトリを作成します。
sudo rosdep init
rosdep update
mkdir ~/ros_catkin_ws

ソースコードを配置

ビルドするROSのソースコードを取得します。

ros_comm(CI版)の場合

cd ~/ros_catkin_ws/
rosinstall_generator ros_comm --rosdistro melodic --deps --wet-only --tar > melodic-ros-comm-wet.rosinstall
wstool init -j2 src_isolated melodic-ros-comm-wet.rosinstall

desktop版の場合

cd ~/ros_catkin_ws/
rosinstall_generator desktop --rosdistro melodic --deps --tar > melodic-desktop.rosinstall
wstool init -j2 src_isolated melodic-desktop.rosinstall

desktop_full版の場合

cd ~/ros_catkin_ws/
rosinstall_generator desktop_full --rosdistro melodic --deps --tar > melodic-desktop_full.rosinstall
wstool init -j2 src_isolated melodic-desktop_full.rosinstall

依存プログラムをインストール

配置したソースコードに記述されている情報を参照して、依存するプログラムをインストールします。
cd ~/ros_catkin_ws/
rosdep install --from-paths src_isolated --ignore-src --rosdistro melodic -y

問題のある依存プログラムを更新

desktop_full版のコードをrosinstall_generatorとwstoolで配置し、rosdep installを実行すると下記のようなエラーがでてrosdep installが止まりました。
(コードが更新されて、rosgraphに関するエラーが出ないようなら、この手順は行わずに飛ばしてください。)
executing command [sudo -H apt-get install -y ros-melodic-rosgraph]
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package ros-melodic-rosgraph
ERROR: the following rosdeps failed to install
  apt: command [sudo -H apt-get install -y ros-melodic-rosgraph] failed

rosgraphで検索してみると、rosgraphはros_commに含まれるパッケージであることが分かりました。

rosgraph
ros_comm

ros_commディレクトリの中身を確認してみると、rosgraphを含んでいないros_commが配置されているのが分かりました。
これが原因のようです。


最新版のros_commはrosgraphを含んでいるため、下記のようなコマンドでros_commを最新版のros_commに置き換えると、risgraphに関するエラーが出なくなり、rosdep installを終えられました。
cd ~/ros_catkin_ws/src_isolated/
rm -r ros_comm
git clone https://github.com/ros/ros_comm.git

似たようなエラーが出た際は、同じような対応でコードを新しいものに置き換えればエラーを回避できるかもしれません。

スワップ領域を拡大(desktop版ビルド時のみ)

ROSのデスクトップ版のビルドは、Raspberry Piのメモリと初期に割り当てられているスワップ領域では不十分らしく、スワップ領域を広げていないとよく分からないエラーが出てビルドが失敗することがあります。

スワップ領域の設定値を大きくします。
sudo vi /etc/dphys-swapfile

下記のように変更します。
/etc/dphys–swapfile
CONF_SWAPSIZE=2048

設定値を大きくしたら、スワップ領域に関するプログラムを再起動します。
sudo /etc/init.d/dphys-swapfile restart

最新版のtinyxml2をインストール

記事を書いている時点でのRaspbian (Stretch 2018.04リリース)が依存しているtinyxmlというプログラムに不具合があり、このままビルドするとroslaunchなどが動かないROSが作成されます。

具体的には、roslaunchで作成済みのパッケージを読み込もうとしても、下記のようなエラーが発生します。
roslaunch terminate called after throwing an instance of 'rospack::Exception'
  what():  error parsing manifest of package class_loader at /home/pi/ros_catkin_ws/src/class_loader/package.xml

rosのissueフォーラムによると、これはtinyxml2のv4の不具合らしく、v3やv5では発生しないようです。
tinyxml2のバージョンは、下記のコマンドで確認できます。
apt-cache show libtinyxml2-dev | grep Version

これで確認できるバージョンが4系以外であれば、tinyxml2のソースコードからのビルととインストールは不要だと思います。
自分の確認したRaspbian上のtinyxml2は4.0.0-1でした。

不具合が発生するv4が入っていたので、下記のようなコマンドで最新版のtinyxml2をインストールします。
mkdir ~/gitprojects
cd ~/gitprojects
git clone https://github.com/leethomason/tinyxml2.git
cd tinyxml2
mkdir build
cd build
cmake ..
make
sudo make install
cd /usr/lib/arm-linux-gnueabihf/
sudo rm libtinyxml2.so
sudo ln -s /usr/local/lib/libtinyxml2.so libtinyxml2.so

OpenCV3をインストール(デスクトップ版ビルド時のみ)

ROSのデスクトップ版のビルド時には、python2でOpenCVの3系が呼び出せるようにしておく必要があります。
OpenCVの2系だとエラーになります。
Raspbianの「apt install python-opencv」コマンドでインストールできるOpenCVは2系なので、3系をソースコードからビルドしてインストールします。

下記のコマンドで確認できるpython-opencvのバージョンが3系になったら、この手順は不要になると思います。
apt-cache show python-opencv | grep Version

下記のようなコマンドでOpenCV3.4.6をインストールします。
sudo apt install -y libavcodec-dev libavformat-dev libswscale-dev libv4l-dev libgtk2.0-dev libatlas-base-dev gfortran python-numpy
mkdir ~/gitprojects
cd ~/gitprojects
git clone https://github.com/opencv/opencv.git -b 3.4.6 --depth 1 opencv_source
cd opencv_source
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j2
sudo make install

ビルド

下記のコマンドでROSをビルドします。
「-j1」をコマンドを付けて、1プロセスでビルドさせています。
(Raspberry Pi3なら「-j2」でもある程度は動きますが、swap領域を使うような大きな処理は並列化させない方が早く終りますし、エラーになりにくいと個人的に思います。)
cd ~/ros_catkin_ws
./src_isolated/catkin/bin/catkin_make_isolated -j1 --install --source src_isolated -DCMAKE_BUILD_TYPE=Release

失敗しても再実行したらビルドできたりするので、同じエラーで落ちないのであれば、根気よく繰り返すと良いと思います。

ROSを読み込み

ビルドできたら下記のコマンドでROSが実行できる状態になります。
source ~/ros_catkin_ws/devel_isolated/setup.bash

下記のように.bashrcに読み込みコマンドを追加すれば、Raspberry Piへログイン時にROSを読み込んでくれます。
echo "source ~/ros_catkin_ws/devel_isolated/setup.bash" >> ~/.bashrc

ROS coreを実行

ROSを読み込んだ後に下記のコマンドを実行するとroscoreが動きます。
roscore

RaspbianでROSが動きました。


まとめ

ROSをRaspbianにインストールできました。
Raspberry Piを使ってROSに関する試行錯誤が出来そうです。

この情報が役に立てば嬉しいです。

更新履歴

2019.02.03
desktop_full版インストール時に遭遇したrosgraphに関する問題の対応方法を追加しました。
2019.04.19
libtinyxmlとopencvのバージョン確認コマンドを、インストールする前でも確認できるapt-cacheに変更しました。
利用するOpenCVのバージョンを3.4.1から3.4.6に更新しました。
2020.11.13
Raspberry Pi向けのUbuntuをインストールして、それにROSを入れる方が楽なことを注意として冒頭に追加しました。

6 件のコメント :

みうあ さんのコメント...

素晴らしい情報ありがとうございます!
現在ROSをraspberrypi3にインストールしようとしているものですが、ビルドすると毎回class_loaderのところでエラーが発生してしまいます。どうしたら良いでしょうか?
CMake Error at /home/pi/ros_catkin_ws/install_isolated/share/cmake_modules/cmake/Modules/FindPoco.cmake:186 (MESSAGE):
Poco was not found. Set the Poco_INCLUDE_DIR cmake cache entry to the
top-level directory containing the poco include directories. E.g
/usr/local/include/ or c:\poco\include\poco-1.3.2
Call Stack (most recent call first):
CMakeLists.txt:23 (find_package)


-- Configuring incomplete, errors occurred!
See also "/home/pi/ros_catkin_ws/build_isolated/class_loader/CMakeFiles/CMakeOutput.log".
See also "/home/pi/ros_catkin_ws/build_isolated/class_loader/CMakeFiles/CMakeError.log".
<== Failed to process package 'class_loader':
Command '['/home/pi/ros_catkin_ws/install_isolated/env.sh', 'cmake', '/home/pi/ros_catkin_ws/src_isolated/class_loader', '-DCATKIN_DEVEL_PREFIX=/home/pi/ros_catkin_ws/devel_isolated/class_loader', '-DCMAKE_INSTALL_PREFIX=/home/pi/ros_catkin_ws/install_isolated', '-DCMAKE_BUILD_TYPE=Release', '-G', 'Unix Makefiles']' returned non-zero exit status 1

Reproduce this error by running:
==> cd /home/pi/ros_catkin_ws/build_isolated/class_loader && /home/pi/ros_catkin_ws/install_isolated/env.sh cmake /home/pi/ros_catkin_ws/src_isolated/class_loader -DCATKIN_DEVEL_PREFIX=/home/pi/ros_catkin_ws/devel_isolated/class_loader -DCMAKE_INSTALL_PREFIX=/home/pi/ros_catkin_ws/install_isolated -DCMAKE_BUILD_TYPE=Release -G 'Unix Makefiles'

Asuki Kono さんのコメント...

Pocoというのが無いことで発生しているエラーのようです。
「Poco was not found. Set the Poco_INCLUDE_DIR cmake cache」をキーワードとして検索して出てきた cmake error, poco was not found, Raspberry Pi, ROS Indigo によると、下記のコマンドpocoをインストールしたらビルドできるようになるらしいですよ。

sudo apt install libpoco-dev

いかがでしょう?

まりも さんのコメント...

ありがとうございます。記事を参考にしてROSの導入に挑戦していますが、ビルドのところで以下のようなエラーが出てしまいます。解決方法についてご教示いただけると幸いです。。

==> Processing catkin package: 'class_loader'
==> Building with env: '/home/pi/ros_catkin_ws/install_isolated/env.sh'
Makefile exists, skipping explicit cmake invocation...
==> make cmake_check_build_system in '/home/pi/ros_catkin_ws/build_isolated/class_loader'
==> make -j1 in '/home/pi/ros_catkin_ws/build_isolated/class_loader'
[ 20%] Building CXX object CMakeFiles/class_loader.dir/src/class_loader.cpp.o
c++: error: unrecognized command line option ‘-Wpedantic’
c++: error: unrecognized command line option ‘-std=gnu++14’
CMakeFiles/class_loader.dir/build.make:62: ターゲット 'CMakeFiles/class_loader.dir/src/class_loader.cpp.o' のレシピで失敗しました
make[2]: *** [CMakeFiles/class_loader.dir/src/class_loader.cpp.o] エラー 1
CMakeFiles/Makefile2:259: ターゲット 'CMakeFiles/class_loader.dir/all' のレシピで失敗しました
make[1]: *** [CMakeFiles/class_loader.dir/all] エラー 2
Makefile:138: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 2
<== Failed to process package 'class_loader':
Command '['/home/pi/ros_catkin_ws/install_isolated/env.sh', 'make', '-j1']' returned non-zero exit status 2

Reproduce this error by running:
==> cd /home/pi/ros_catkin_ws/build_isolated/class_loader && /home/pi/ros_catkin_ws/install_isolated/env.sh make -j1

Command failed, exiting.

Asuki Kono さんのコメント...

class_loaderのビルドで失敗しているようですが、原因はよく分かりません。
コマンドラインで「hitsory」を実行すると、直近で実行したコマンドが出てくるので、ここに至るまでに行ったコマンドを共有していただけると、何か分かるかもしれません。

zqrl0 さんのコメント...

質問失礼いたします。
ビルドを実行したところ【console_bridge】でエラーが発生しているようです。
解決方法についてご教示いただけると幸いです。


==> Processing catkin package: 'class_loader'
==> Building with env: '/home/pi/ros_catkin_ws/install_isolated/env.sh'
==> cmake /home/pi/ros_catkin_ws/src_isolated/class_loader -DCATKIN_DEVEL_PREFIX=/home/pi/ros_catkin_ws/devel_isolated/class_loader -DCMAKE_INSTALL_PREFIX=/home/pi/ros_catkin_ws/install_isolated -DCMAKE_BUILD_TYPE=Release -G Unix Makefiles in '/home/pi/ros_catkin_ws/build_isolated/class_loader'
-- Using CATKIN_DEVEL_PREFIX: /home/pi/ros_catkin_ws/devel_isolated/class_loader
-- Using CMAKE_PREFIX_PATH: /home/pi/ros_catkin_ws/install_isolated
-- This workspace overlays: /home/pi/ros_catkin_ws/install_isolated
-- Using PYTHON_EXECUTABLE: /usr/bin/python
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/pi/ros_catkin_ws/build_isolated/class_loader/test_results
-- gtest not found, C++ tests can not be built. Please install the gtest headers globally in your system to enable gtests
-- nosetests not found, Python tests can not be run (try installing package 'python-nose')
-- catkin 0.7.29
-- BUILD_SHARED_LIBS is on
CMake Error at CMakeLists.txt:19 (find_package):
By not providing "Findconsole_bridge.cmake" in CMAKE_MODULE_PATH this
project has asked CMake to find a package configuration file provided by
"console_bridge", but CMake did not find one.

Could not find a package configuration file provided by "console_bridge"
with any of the following names:

console_bridgeConfig.cmake
console_bridge-config.cmake

Add the installation prefix of "console_bridge" to CMAKE_PREFIX_PATH or set
"console_bridge_DIR" to a directory containing one of the above files. If
"console_bridge" provides a separate development package or SDK, be sure it
has been installed.


-- Configuring incomplete, errors occurred!
See also "/home/pi/ros_catkin_ws/build_isolated/class_loader/CMakeFiles/CMakeOutput.log".
See also "/home/pi/ros_catkin_ws/build_isolated/class_loader/CMakeFiles/CMakeError.log".
<== Failed to process package 'class_loader':
Command '['/home/pi/ros_catkin_ws/install_isolated/env.sh', 'cmake', '/home/pi/ros_catkin_ws/src_isolated/class_loader', '-DCATKIN_DEVEL_PREFIX=/home/pi/ros_catkin_ws/devel_isolated/class_loader', '-DCMAKE_INSTALL_PREFIX=/home/pi/ros_catkin_ws/install_isolated', '-DCMAKE_BUILD_TYPE=Release', '-G', 'Unix Makefiles']' returned non-zero exit status 1

Reproduce this error by running:
==> cd /home/pi/ros_catkin_ws/build_isolated/class_loader && /home/pi/ros_catkin_ws/install_isolated/env.sh cmake /home/pi/ros_catkin_ws/src_isolated/class_loader -DCATKIN_DEVEL_PREFIX=/home/pi/ros_catkin_ws/devel_isolated/class_loader -DCMAKE_INSTALL_PREFIX=/home/pi/ros_catkin_ws/install_isolated -DCMAKE_BUILD_TYPE=Release -G 'Unix Makefiles'

Command failed, exiting.



Asuki Kono さんのコメント...

それはconsole_bridgeが無い旨のエラーなので、「raspberry pi console_bridge」などで検索すると出てくるページで紹介されているように、console_bridgeをインストールするとどうでしょう?