ロボットを開発する際に利用されるのがROS(Robot Operating System)です。OSとはいってもWindowsやmacOSのようなものではなく、ロボット開発を行うためのツールセットと言った方が分かりやすいかも知れません。通常のOSは処理集中型で、すべてのタスクがOSに集中しますが、ROSの場合は分散型になっています。モノを掴む、歩行すると言った動作を考えても、様々なセンサーやサーボなどが同時に動いて実現されます。それらの細かな制御を一つのOSだけで行うのは困難であり、ROSのように各センサーや各タスクごとに処理を分散、委譲して行われるのが効率的になります。

今回、そんな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をお使いください。

Documentation – ROS Wiki


0 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *