今回、そんなROSをRaspberry Pi 3 B+にインストールする方法を紹介します。
利用したバージョンなど
ROSはベースになるディストリビューションのバージョンなどに左右されます。ネット上にある情報を鵜呑みにして、そのまま実行してもうまくいかないかも知れません。今回は以下のような組み合わせで行っています。
- Raspberry Pi 3 B+
- Ubuntu Mate 18.04
- ROS Melodic Morenia
特に注意して欲しいのがUbuntu Mate 18.04で利用できるROSはMelodic Moreniaということです。ネット上にはapt-get install ros-kinetic-desktop-full
のようになっている記事が多いですが、これはUbuntu 16.04用になります。
ROSのインストール
Ubuntu Mateのインストールについては省略します。Download | Ubuntu MATEにてRaspberry Pi用のイメージがダウンロードできますので、それをダウンロード&解凍します。そしてEtcherなどを使ってマイクロSDカードに焼き込めば良いでしょう。
リポジトリの設定
Ubuntu Mateのインストールと初期設定、そしてWiFiや有線LANに繋がったら、まずはリポジトリの設定を行います。
sudo add-apt-repository universe sudo add-apt-repository multiverse sudo add-apt-repository restricted
さらにROS用のリポジトリを追加します。
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://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
追加したら、リポジトリをアップデート&ライブラリのバージョンアップをします。
sudo apt-get -y update sudo apt-get -y upgrade
ROSのインストール
続いてROSをインストールします。これは時間がかかるので注意してください。途中でダイアログが出ることがあります。
sudo apt install ros-melodic-desktop-full
初期設定
インストールが終わったら初期設定を行います。
sudo rosdep init rosdep update
設定が終わると /opt/ros/melodic/
というディレクトリができているはずです。その中にある setup.bash を環境設定として読み込みます。
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
反映します。
source ~/.bashrc
ライブラリのインストール
ROSを利用するためのPythonライブラリをインストールします。
sudo apt-get -y install python-rosinstall
これも時間がかかるのでしばらくお待ちください。
ワークスペースの作成
開発を行っていくためのワークスペース設定を行います。catkinというのはROS公式のビルドシステムです。 catkin_ws
という名前がよく使われるようです。
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make
ここまで終わったら、環境設定を追加して反映します。
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc
動作確認
インストールが無事終わっていると、roscore
コマンドを実行します。
roscore
これはROSのMaster、Parameter Server、rosout ログ用の nodeを立ち上げます(ja/roscore – ROS Wiki)。実行した際に、以下のようにログが流れればOKです。
... logging to /home/user/.ros/log/a14ae41e-a9c2-11e9-9821-b827eb1e289f/roslaunch-nakatsugawa-desktop2-9963.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://user-desktop2:39749/ ros_comm version 1.14.3 SUMMARY ======== PARAMETERS * /rosdistro: melodic * /rosversion: 1.14.3 NODES auto-starting new master process[master]: started with pid [9975] ROS_MASTER_URI=http://user-desktop2:11311/ setting /run_id to a14ae41e-a9c2-11e9-9821-b827eb1e289f process[rosout-1]: started with pid [9986] started core service [/rosout]
PubSubを試す
ROSの基礎技術でもあるのがPubSubです。個々の処理が独立しているので、その際にデータのやり取りに使われるのがPubSubになります。ROS講座03 Pub & Sub 通信 – Qiitaを参考にしました。
ベースの作成
cd ~/catkin_ws/src mkdir ros_lecture cd ~/catkin_ws/src/ros_lecture catkin_create_pkg basic_lecture std_msgs rospy roscpp cd ~/catkin_ws/src/ros_lecture/basic_lecture/src
Publisher
利用する言語はCになります。まずPublisher側のコードを basic_simple_talker.cpp
として作成します。ROSを初期化し、メッセージを定義しています。そしてPublishを chatter
というチャンネルに対して繰り返し行っています。
#include <ros/ros.h> #include <std_msgs/String.h> int main(int argc, char **argv){ ros::init(argc, argv, "basic_simple_talker"); ros::NodeHandle n; ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 10); ros::Rate loop_rate(10); while (ros::ok()){ std_msgs::String msg; msg.data = "hello world!"; ROS_INFO("publish: %s", msg.data.c_str()); chatter_pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } return 0; }
Subscriber
次に発信された情報を受け取るのがSubscriberです。 basic_simple_listener.cpp
として作成します。 chatter
というチャンネルを受信設定しています。受信すると chatterCallback
が呼び出されています。
#include <ros/ros.h> #include <std_msgs/String.h> void chatterCallback(const std_msgs::String& msg){ ROS_INFO("subscribe: %s", msg.data.c_str()); } int main(int argc, char **argv){ ros::init(argc, argv, "basic_simple_listener"); ros::NodeHandle n; ros::Subscriber sub = n.subscribe("chatter", 10, chatterCallback); ros::spin(); return 0; }
コンパイルする
ではこのプロジェクトをコンパイルします。まず ~/catkin_ws/src
にある CMakeLists.txt
に以下の内容を追加します。
add_executable(basic_simple_talker src/basic_simple_talker.cpp) add_executable(basic_simple_listener src/basic_simple_listener.cpp) target_link_libraries(basic_simple_talker ${catkin_LIBRARIES}) target_link_libraries(basic_simple_listener ${catkin_LIBRARIES})
そして ~/catkin_ws
にてビルドコマンドを実行します。
catkin_make
実行する
実行はまず roscore
を立ち上げます。すでに立ち上がっている場合はそのままで大丈夫です。
roscore
次にPublisherを実行します。実行するディレクトリは ~/catkin_ws
です。
rosrun basic_lecture basic_simple_talker
最後にSubscriberを実行します。実行するディレクトリは同じく ~/catkin_ws
です。
rosrun basic_lecture basic_simple_listener
これでSubscriber側にメッセージが流れてくれば正しく動いています。
[ INFO] [1563507407.288067553]: subscribe: hello world! [ INFO] [1563507407.388051538]: subscribe: hello world! [ INFO] [1563507407.488059118]: subscribe: hello world!
まとめ
ROSに対応したモジュールやセンサーは多数あります。それらを使うことでロボットで使われるような細かな制御が実現できるでしょう。ロボットアームや移動するものなど、ロボティクス分野での開発を行う際にはぜひROSをお使いください。
]]>