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
sudo apt install dirmngr
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

スワップ領域を拡大(デスクトップ版のみ)

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に関する試行錯誤が出来そうです。

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

0 件のコメント :

コメントを投稿