この講座では、ROS 2(ロス・ツー)を使ってロボットを動かします。この回では、ROS 2 が何のためにあるのか、どんな部品でできているのかを説明します。後半では、練習用の亀のシミュレーター turtlesim を動かして、ROS 2 のプログラムどうしがつながる様子を実際に見ます。
前半は読むだけで大丈夫です。後半は端末を使います。端末をはじめて使う人は、先に #02 の「1. 端末を開く」〜「3. いまいる場所と中身を見る」と「10. 動いているプログラムを止める」を読んでおくと安心です。
1. ロボットのソフトは、なぜ分けて作るのか
第 3 週から使う四足歩行ロボット DOGZILLA S2 には、LiDAR(周りの距離を測るセンサー)、カメラ、姿勢のセンサー、12 個のモーターが載っています。これを動かすソフトには、センサーを読む、障害物をよける判断をする、脚を動かす、状態を画面に表示する、といった仕事がたくさんあります。
全部を 1 本のプログラムに書くと、最初は簡単に見えます。ところが、よける判断を少し直すだけでもプログラム全体を止めて作り直すことになり、センサーの読み取りで不具合が起きるとロボット全体が止まります。ほかの人が作ったセンサーの読み取り部分を持ってきて使うのも大変です。
ROS 2 では、仕事ごとに小さなプログラムを作ります。この 1 つ 1 つをノードと呼びます。ノードどうしは、/scan や /cmd_vel のような名前の付いた通り道でデータをやりとりします。この通り道をトピックと呼びます。
こうしておくと、「よける判断」のノードだけを作り直したり、同じトピックを受け取る「表示」のノードをあとから足したりできます。送る側のノードは、誰が受け取るかを知らなくてかまいません。この性質は #03 で実際に確かめます。
2. ROS 2 が用意しているもの
ROS は Robot Operating System の略ですが、Windows や Linux のような OS ではありません。Linux の上で動く、ロボット用のソフトの集まりです。無料で公開されていて、世界中の大学や研究機関、企業が使い、部品を公開しています。
- 通信のしくみ:ノードどうしのデータのやりとり。トピックのほかに、サービスとアクションがあります(#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(マスター)という中心のプログラムを先に起動し、各ノードは 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 パッケージ 実行ファイル |
roslaunch | ros2 launch |
rostopic list | ros2 topic list |
catkin_make | colcon build |
import rospy | import rclpy |
AI に質問するときは、「ROS 2 Humble で」と最初に付けると、ROS 1 の答えが混ざりにくくなります。
5. Humble という版
ROS 2 は、決まった時期に新しい版(ディストリビューション)が出ます。版にはアルファベット順に亀の名前が付いていて、この講座で使うのは Humble Hawksbill(ハンブル)です。
| 版 | 公開 | サポート終了 | 対応する Ubuntu |
|---|---|---|---|
| Humble Hawksbill(この講座) | 2022 年 5 月 | 2027 年 5 月 | 22.04 |
| Jazzy Jalisco | 2024 年 5 月 | 2029 年 5 月 | 24.04 |
Humble を選んでいるのは、DOGZILLA S2 に入っている ROS 2 が Humble だからです。版がそろっていないと、メッセージ型の中身が違ってつながらないことがあります。講義用の環境で、版を確かめてみます。
lsb_release -ds
echo $ROS_DISTRO $RMW_IMPLEMENTATION
6. この講座の環境
ROS 2 は Linux の上で動きます。この講座では、Windows の PC に Docker Desktop を入れ、その中で Ubuntu と ROS 2 が入った環境(コンテナ)を動かします。コンテナのデスクトップは、ブラウザで開いて操作します。準備の手順は #00 にあります。
全員が同じ中身の環境を使うので、「自分の 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 をクリックして選んでから、矢印キーを押します。↑↓ で前後に進み、←→ で向きが変わります。
亀が動かないときは、端末 2 が選ばれていません。端末 2 の中をクリックしてから、もう一度矢印キーを押してください。
いま動いているのは、turtlesim_node と turtle_teleop_key の 2 つのノードです。キーを押すと teleop のノードが「この速さで動け」というデータをトピックに送り、turtlesim のノードがそれを受け取って亀を動かしています。
つながりを図で見る
2 つのノードを動かしたまま、3 つめの端末を開いて rqt_graph を起動します。
rqt_graph
いちばん下の /teleop_turtle → /turtle1/cmd_vel → /turtlesim が、いま亀を動かしているつながりです。上の rotate_absolute と書かれた四角は、亀の向きを指定した角度に変えるアクションで使うトピックです。これは #05 で扱います。
図が出ないときは、左上のメニューを「Nodes/Topics (active)」にして、その左の更新ボタンを押してください。
トピックに流れているデータを見る
turtlesim のノードは、亀の位置を /turtle1/pose というトピックに流し続けています。中身を表示してみます。
ros2 topic echo /turtle1/pose
ラジアンは、角度の表し方の 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
亀やロボットのように床の上を動くものでは、linear.x(前に進む速さ)と angular.z(その場で回る速さ)を主に使います。DOGZILLA S2 も、/cmd_vel というトピックで同じ Twist 型を受け取って歩きます。つまり、turtlesim で作った「亀を動かすノード」は、トピックの名前をつなぎ替えるだけでロボットにも速度を送れる、ということです(実際にロボットにつなぐのは、安全のしくみを学んだあとの第 3 週です)。
試し終わったら、すべての端末で Ctrl+C を押してノードを止め、rqt_graph の窓も閉じます。
8. ros2 コマンドの全体像
ROS 2 を調べるコマンドは、ほとんどが ros2 で始まります。何ができるかは --help で一覧できます。
ros2 --help
この講座でよく使うものを挙げます。どれも、後ろに -h を付けると、さらに細かい使い方が出ます(例:ros2 topic -h)。
| コマンド | できること | 初めて使う回 |
|---|---|---|
ros2 run | パッケージの中のノードを 1 つ起動する | #01 |
ros2 node | 動いているノードの一覧や、そのノードのつながりを見る | #03 |
ros2 topic | トピックの一覧・中身・流れる速さ(Hz)を見る。試しに送ることもできる | #01・#03 |
ros2 interface | メッセージ型の中身を見る | #01 |
ros2 pkg | 入っているパッケージを調べる。自分のパッケージを作る | #04 |
ros2 service・ros2 action | サービスやアクションを呼ぶ | #05 |
ros2 param | ノードの設定値(パラメータ)を見る・変える | #06 |
ros2 launch | launch ファイルで複数のノードをまとめて起動する | #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 は、渡された行のうち、書いた言葉を含む行だけを取り出します。
|(パイプ)と grep の意味は #02 で説明します。sakigake_samples は、この講座のために用意したサンプルのパッケージです。
まとめ
- ROS 2 は OS ではなく、Linux の上で動くロボット用のソフトの集まり
- ロボットのソフトをノードに分け、トピックでつないで組み立てる。送る側は受け取る側を知らない
- ROS 2 は DDS を使い、中心のプログラムなしでノードどうしが見つけ合う
- この講座は ROS 2 Humble。ROS 1 の情報(
rosrun・catkin_makeなど)に注意する rqt_graph・ros2 topic echo・ros2 interface showで、つながりとデータを自分の目で確かめられる
始める前にやっておくこと
#00 で「ROS 2 のノードとトピックとは何か」を AI に聞いて、答えを保存してもらいました。この回を読んだうえで、その答えを見直してください。
- ROS 1 のコマンド(
rosrun・roscoreなど)が混ざっていないか - 「マスターに登録する」のような、ROS 1 の説明になっていないか
- この回の turtlesim の例(teleop →
/turtle1/cmd_vel→ turtlesim)に当てはめて説明できるか
気づいたことを、AI の答えの横にメモしておいてください。1 回目の授業(#03)の最後に、実験の結果と見比べます。
次の #02 では、この回で使った端末の操作を、基本から練習します。










