2018年6月8日金曜日

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


背景

ROSとは、ロボットの制御プログラム作成ために便利な機能を提供してくれるプログラムです。
Raspberry Piとは、数千円から購入できるコンピューターです。
Raspberry Piに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のバージョンは、下記のコマンドで確認できます。
dpkg -s 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系になったら、この手順は不要になると思います。
dpkg -s python-opencv | grep Version

下記のようなコマンドでOpenCV3.4.1をインストールします。
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.1 --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に関する問題の対応方法を追加しました。

2 件のコメント :

  1. 素晴らしい情報ありがとうございます!
    現在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'

    返信削除
    返信
    1. 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

      いかがでしょう?

      削除