ROS 2 実践コース|#01 ROS 2 とは何か

この講座では、ROS 2(ロス・ツー)を使ってロボットを動かします。この回では、ROS 2 が何のためにあるのか、どんな部品でできているのかを説明します。後半では、練習用の亀のシミュレーター turtlesim を動かして、ROS 2 のプログラムどうしがつながる様子を実際に見ます。

前半は読むだけで大丈夫です。後半は端末を使います。端末をはじめて使う人は、先に #02 の「1. 端末を開く」〜「3. いまいる場所と中身を見る」と「10. 動いているプログラムを止める」を読んでおくと安心です。

1. ロボットのソフトは、なぜ分けて作るのか

第 3 週から使う四足歩行ロボット DOGZILLA S2 には、LiDAR(周りの距離を測るセンサー)、カメラ、姿勢のセンサー、12 個のモーターが載っています。これを動かすソフトには、センサーを読む、障害物をよける判断をする、脚を動かす、状態を画面に表示する、といった仕事がたくさんあります。

左:全部を 1 本のプログラムに書く場合。右:ROS 2 で仕事ごとのノードに分け、トピックでつなぐ場合
左:全部を 1 本のプログラムに書く場合。右:ROS 2 で仕事ごとのノードに分け、トピックでつなぐ場合

全部を 1 本のプログラムに書くと、最初は簡単に見えます。ところが、よける判断を少し直すだけでもプログラム全体を止めて作り直すことになり、センサーの読み取りで不具合が起きるとロボット全体が止まります。ほかの人が作ったセンサーの読み取り部分を持ってきて使うのも大変です。

ROS 2 では、仕事ごとに小さなプログラムを作ります。この 1 つ 1 つをノードと呼びます。ノードどうしは、/scan/cmd_vel のような名前の付いた通り道でデータをやりとりします。この通り道をトピックと呼びます。

こうしておくと、「よける判断」のノードだけを作り直したり、同じトピックを受け取る「表示」のノードをあとから足したりできます。送る側のノードは、誰が受け取るかを知らなくてかまいません。この性質は #03 で実際に確かめます。

2. ROS 2 が用意しているもの

ROS は Robot Operating System の略ですが、Windows や Linux のような OS ではありません。Linux の上で動く、ロボット用のソフトの集まりです。無料で公開されていて、世界中の大学や研究機関、企業が使い、部品を公開しています。

ROS 2 は、通信のしくみ・調べる道具・そのまま使える部品の 3 つでできています
ROS 2 は、通信のしくみ・調べる道具・そのまま使える部品の 3 つでできています
  • 通信のしくみ:ノードどうしのデータのやりとり。トピックのほかに、サービスとアクションがあります(#05)
  • 調べる道具:いま何が動いていて、どうつながっているかを調べるコマンドや画面。この講座では毎回使います
  • そのまま使える部品:センサーのドライバ、地図づくり(SLAM)、自律移動(Nav2)など。自分で一から書かなくても使えます

この講座で特に大事にしているのは 2 つめの「調べる道具」です。AI にコードを書かせることが当たり前になった今、書かれたプログラムが本当に設計どおりにつながり、設計どおりの速さでデータを出しているかを、自分の手で確かめる力が必要になるからです。

3. この講座で使う言葉

いま全部を覚える必要はありません。授業で出てきたときに、ここに戻って確かめてください。

言葉意味くわしく扱う回
ノード1 つの仕事をするプログラム。/talker のように名前を持つ#03
トピックノードどうしがデータを流す、名前の付いた通り道#03
パブリッシャ/サブスクライバトピックにデータを送る側/受け取る側#03・#04
メッセージ型トピックに流すデータの形。送る側と受ける側で同じ型でないとつながらない#03
サービス・アクショントピック以外のやりとりの形。1 回聞いて答える/時間のかかる仕事を頼む#05
パッケージノードや設定ファイルをまとめた単位。turtlesim もパッケージの 1 つ#04
ワークスペース自分のパッケージを置いてビルドするフォルダ。この講座では ~/ros2_ws#04
launch複数のノードを、設定をつけてまとめて起動するしくみ#06
ディストリビューションROS 2 の版の名前。この講座では Humble を使うこの回

4. ROS 1 と ROS 2

ROS には、2007 年ごろから使われてきた ROS 1 と、その弱点を直すために作り直された ROS 2 があります。ROS 1 の最後の版(Noetic)は 2025 年 5 月にサポートが終わっていて、これから始めるなら ROS 2 です。

左:ROS 1 は roscore が仲介する。右:ROS 2 はノードどうしが直接見つけ合う
左:ROS 1 は roscore が仲介する。右:ROS 2 はノードどうしが直接見つけ合う

大きな違いは、つながる相手の見つけ方です。ROS 1 では roscore(マスター)という中心のプログラムを先に起動し、各ノードは roscore に問い合わせて相手を探しました。ROS 2 には中心のプログラムがありません。DDS という通信の規格を使い、同じネットワークにいるノードどうしが、トピックの名前と型を手がかりに直接見つけ合います。

この「見つけ合う範囲」を分けるのが ROS_DOMAIN_ID という番号です。同じ教室で全員がロボットを動かすときに大事になるので、#03 で実験します。

Web や AI で調べるときの注意

インターネットの解説には、ROS 1 のものがまだたくさん残っています。AI に聞いたときも、ROS 1 の書き方が混ざった答えが返ってくることがあります。次のコマンドが出てきたら ROS 1 の情報です。

ROS 1 の書き方ROS 2 での書き方
roscore(いらない)
rosrun パッケージ ノードros2 run パッケージ 実行ファイル
roslaunchros2 launch
rostopic listros2 topic list
catkin_makecolcon build
import rospyimport rclpy

AI に質問するときは、「ROS 2 Humble で」と最初に付けると、ROS 1 の答えが混ざりにくくなります。

5. Humble という版

ROS 2 は、決まった時期に新しい版(ディストリビューション)が出ます。版にはアルファベット順に亀の名前が付いていて、この講座で使うのは Humble Hawksbill(ハンブル)です。

公開サポート終了対応する Ubuntu
Humble Hawksbill(この講座)2022 年 5 月2027 年 5 月22.04
Jazzy Jalisco2024 年 5 月2029 年 5 月24.04

Humble を選んでいるのは、DOGZILLA S2 に入っている ROS 2 が Humble だからです。版がそろっていないと、メッセージ型の中身が違ってつながらないことがあります。講義用の環境で、版を確かめてみます。

lsb_release -ds
echo $ROS_DISTRO $RMW_IMPLEMENTATION
Ubuntu 22.04 の上で、ROS 2 Humble が動いています。rmw_cyclonedds_cpp は、使っている DDS の種類(Cyclone DDS)です
Ubuntu 22.04 の上で、ROS 2 Humble が動いています。rmw_cyclonedds_cpp は、使っている DDS の種類(Cyclone DDS)です

6. この講座の環境

ROS 2 は Linux の上で動きます。この講座では、Windows の PC に Docker Desktop を入れ、その中で Ubuntu と ROS 2 が入った環境(コンテナ)を動かします。コンテナのデスクトップは、ブラウザで開いて操作します。準備の手順は #00 にあります。

自分の PC の中で動く講義用の環境と、第 3 週からつなぐロボット
自分の PC の中で動く講義用の環境と、第 3 週からつなぐロボット

全員が同じ中身の環境を使うので、「自分の PC だけ動かない」ということが起きにくくなっています。自分で作ったファイルはホームフォルダ(/home/ubuntu)に置けば、環境を止めても消えません。

第 3 週からは、PC とロボットを Wi-Fi でつなぎます。PC で動かすノードとロボットで動くノードが、トピックでつながります。つなぎ方と、ロボットを安全に止めるしくみは第 3 週で説明します。

7. やってみる:turtlesim で亀を動かす

ここからは端末を使います。start.bat でデスクトップを開き、Terminator で端末を 2 つ開いてください。

亀の画面と、キーボードで操作するノードを起動する

# 端末 1:亀の画面を出すノード
ros2 run turtlesim turtlesim_node
# 端末 2:キーボードで亀を操作するノード
ros2 run turtlesim turtle_teleop_key

端末 2 をクリックして選んでから、矢印キーを押します。↑↓ で前後に進み、←→ で向きが変わります。

左上が turtlesim の画面。端末 2(teleop)で矢印キーを押すと、亀が線を引きながら動きます
左上が turtlesim の画面。端末 2(teleop)で矢印キーを押すと、亀が線を引きながら動きます

亀が動かないときは、端末 2 が選ばれていません。端末 2 の中をクリックしてから、もう一度矢印キーを押してください。

いま動いているのは、turtlesim_nodeturtle_teleop_key の 2 つのノードです。キーを押すと teleop のノードが「この速さで動け」というデータをトピックに送り、turtlesim のノードがそれを受け取って亀を動かしています。

つながりを図で見る

2 つのノードを動かしたまま、3 つめの端末を開いて rqt_graph を起動します。

rqt_graph
楕円がノード、四角がトピックです。/teleop_turtle から /turtle1/cmd_vel を通って /turtlesim に矢印が向いています
楕円がノード、四角がトピックです。/teleop_turtle から /turtle1/cmd_vel を通って /turtlesim に矢印が向いています

いちばん下の /teleop_turtle/turtle1/cmd_vel/turtlesim が、いま亀を動かしているつながりです。上の rotate_absolute と書かれた四角は、亀の向きを指定した角度に変えるアクションで使うトピックです。これは #05 で扱います。

図が出ないときは、左上のメニューを「Nodes/Topics (active)」にして、その左の更新ボタンを押してください。

トピックに流れているデータを見る

turtlesim のノードは、亀の位置を /turtle1/pose というトピックに流し続けています。中身を表示してみます。

ros2 topic echo /turtle1/pose
x・y が位置、theta が向き(ラジアン)です。亀が止まっているあいだは同じ値が並び、teleop で動かすと数字が変わります
xy が位置、theta が向き(ラジアン)です。亀が止まっているあいだは同じ値が並び、teleop で動かすと数字が変わります

ラジアンは、角度の表し方の 1 つです。度ではなく、一周を 6.28(2π)として数えます。90 度が約 1.57、180 度が約 3.14 です。ROS 2 では、角度も回る速さも度ではなくラジアンで表します。

表示は止めるまで続きます。見終わったら Ctrl+C で止めてください。

データの形(メッセージ型)を見る

/turtle1/cmd_vel に流れているデータの形は geometry_msgs/msg/Twist です。中身を表示してみます。

ros2 interface show geometry_msgs/msg/Twist
Twist は、並進の速さ(linear)と回転の速さ(angular)を、それぞれ x・y・z の 3 つの数で持っています
Twist は、並進の速さ(linear)と回転の速さ(angular)を、それぞれ x・y・z の 3 つの数で持っています

亀やロボットのように床の上を動くものでは、linear.x(前に進む速さ)と angular.z(その場で回る速さ)を主に使います。DOGZILLA S2 も、/cmd_vel というトピックで同じ Twist 型を受け取って歩きます。つまり、turtlesim で作った「亀を動かすノード」は、トピックの名前をつなぎ替えるだけでロボットにも速度を送れる、ということです(実際にロボットにつなぐのは、安全のしくみを学んだあとの第 3 週です)。

試し終わったら、すべての端末で Ctrl+C を押してノードを止め、rqt_graph の窓も閉じます。

8. ros2 コマンドの全体像

ROS 2 を調べるコマンドは、ほとんどが ros2 で始まります。何ができるかは --help で一覧できます。

ros2 --help
Commands: の下に、ros2 のあとに付けられる言葉が並んでいます
Commands: の下に、ros2 のあとに付けられる言葉が並んでいます

この講座でよく使うものを挙げます。どれも、後ろに -h を付けると、さらに細かい使い方が出ます(例:ros2 topic -h)。

コマンドできること初めて使う回
ros2 runパッケージの中のノードを 1 つ起動する#01
ros2 node動いているノードの一覧や、そのノードのつながりを見る#03
ros2 topicトピックの一覧・中身・流れる速さ(Hz)を見る。試しに送ることもできる#01・#03
ros2 interfaceメッセージ型の中身を見る#01
ros2 pkg入っているパッケージを調べる。自分のパッケージを作る#04
ros2 serviceros2 actionサービスやアクションを呼ぶ#05
ros2 paramノードの設定値(パラメータ)を見る・変える#06
ros2 launchlaunch ファイルで複数のノードをまとめて起動する#06
ros2 bagトピックのデータを記録し、あとで再生する第 4 週(予定)
ros2 doctor環境に問題がないかを調べる困ったとき

講義用の環境には、あらかじめたくさんのパッケージが入っています。数えてみます。

ros2 pkg list | wc -l
ros2 pkg list | grep -e turtlesim -e rviz2 -e nav2_bringup -e sakigake

|(パイプ)は、左のコマンドが出した文字を、そのまま右のコマンドに渡す記号です。wc -l は渡された行数を数えるので、1 行目は「パッケージがいくつあるか」を数えています。2 行目の grep は、渡された行のうち、書いた言葉を含む行だけを取り出します。

351 個のパッケージが入っています。2 行目では、この講座で使うパッケージが入っていることを確かめています
351 個のパッケージが入っています。2 行目では、この講座で使うパッケージが入っていることを確かめています

|(パイプ)と grep の意味は #02 で説明します。sakigake_samples は、この講座のために用意したサンプルのパッケージです。

まとめ

  • ROS 2 は OS ではなく、Linux の上で動くロボット用のソフトの集まり
  • ロボットのソフトをノードに分け、トピックでつないで組み立てる。送る側は受け取る側を知らない
  • ROS 2 は DDS を使い、中心のプログラムなしでノードどうしが見つけ合う
  • この講座は ROS 2 Humble。ROS 1 の情報(rosruncatkin_make など)に注意する
  • rqt_graphros2 topic echoros2 interface show で、つながりとデータを自分の目で確かめられる

始める前にやっておくこと

#00 で「ROS 2 のノードとトピックとは何か」を AI に聞いて、答えを保存してもらいました。この回を読んだうえで、その答えを見直してください。

  1. ROS 1 のコマンド(rosrunroscore など)が混ざっていないか
  2. 「マスターに登録する」のような、ROS 1 の説明になっていないか
  3. この回の turtlesim の例(teleop → /turtle1/cmd_vel → turtlesim)に当てはめて説明できるか

気づいたことを、AI の答えの横にメモしておいてください。1 回目の授業(#03)の最後に、実験の結果と見比べます。

次の #02 では、この回で使った端末の操作を、基本から練習します。

トップへ戻る