背景
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.03desktop_full版インストール時に遭遇したrosgraphに関する問題の対応方法を追加しました。
2019.04.19
libtinyxmlとopencvのバージョン確認コマンドを、インストールする前でも確認できるapt-cacheに変更しました。
利用するOpenCVのバージョンを3.4.1から3.4.6に更新しました。
2020.11.13
Raspberry Pi向けのUbuntuをインストールして、それにROSを入れる方が楽なことを注意として冒頭に追加しました。
素晴らしい情報ありがとうございます!
返信削除現在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'
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.
class_loaderのビルドで失敗しているようですが、原因はよく分かりません。
削除コマンドラインで「hitsory」を実行すると、直近で実行したコマンドが出てくるので、ここに至るまでに行ったコマンドを共有していただけると、何か分かるかもしれません。
質問失礼いたします。
返信削除ビルドを実行したところ【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.
それはconsole_bridgeが無い旨のエラーなので、「raspberry pi console_bridge」などで検索すると出てくるページで紹介されているように、console_bridgeをインストールするとどうでしょう?
削除