【ROS2解説】#01 ROS2のきほん
どうもこんにちは、
ROS2に関して、色々理解が深まってきたので一旦整理する意味でもブログ記事にROS2についてまとめていきます。
第1回目は、「ROS2のきほん」についてです。
2025.2.27 動画解説もUPしました
※ロボット開発専用チャンネルを開設しました
目次
ROSとは
ROSは、Robot Operating Systemの略で、「
※なお、OSと付いてますが、macOSやWindowsなどのOSとは違います。
ROSには、ロボットを開発するために役立つ豊富な機能やツールがオープンソースで公開されており、世界中のロボット開発者たちが活用しています。
またソースやドキュメントは日々メンテナンスされ進化を続けているため、ROSというエコシステムが形成されています。
ロボットのコアな部分を1から開発するのは、膨大な時間と労力がかかります。ROSを利用すれば、ロボットの基盤となる部分を効率的に構築でき、より高度なロボットシステムを開発に注力することが可能です。
そのため、
ROSからROS2へ
ROSは2010年に登場してから年々進化し、現在はROSを大幅に改善したROS2というバージョンがリリースされています。
私がROSで開発した室内用自律走行ロボット INOBOは、ROS Melodicで開発しました。Melodicは、2023年5月に公式サポートが終了し、ROS最後のディストリビューション Noeticも2025年5月に公式サポートが終了します。
ということで、私は現在、ROS2 Jazzyで新たなロボットを開発中です。
皆さんもこれから新たにロボットを開発する際はROS2を採用するのが良いでしょう。
ROSとROS2の違い
ROSは元々研究用途として開発されていたこともあり、高性能なコンピューターや安定したネットワーク環境が必要でした。
そのため、製品化する場合にはいくつかの課題がありました。
これらの課題を解決するため、ROSの問題を改善したROS2のプロジェクトが開始されました。
ROS2の主な改善点は以下の通りです。
通信機能の改善(新しい通信プロトコルの採用)
新たな通信プロトコル DDS(Data Distribution Service)を採用したことで、通信の遅延やエラーが発生しにくく、信頼性が高くなりました。
リアルタイム性の向上
UDP通信をベースにしているため、メッセージ送信のリアルタイム制御が可能になりました。
複数ロボット接続
ROSでは単体ロボットのみの対応でしたが、ROS2では複数ロボットに対応しています。
計算資源
ROSでは高性能な計算機を想定していましたが、ROS2では組み込みプラットフォームにも対応しているため、より軽量なハードウェアでも動作可能です。
ROSの分散システム
ROSの肝となるのが、分散システムです。
ROSでは、ある機能をノードと呼ばれるプログラム単位に分けて実行します。
ノード間でデータをやり取りすることでシステム全体を動作させます。
これにより、あるプロセスが停止してもシステム全体に影響を与えにくい設計になっています。
なお、ROS (ROS1) では、「ROS master」と呼ばれる通信のコアとなるプログラムが存在し、ROS masterが各ノードやデータを管理していました。
そのため、ROS masterが停止してしまうと、全ての通信が途絶え、システムが稼働しないという問題がありました。
※ROS1の頃は、ROS masterが停止してしまうと、全システムが停止することもよくありました…
※ROS2と区別するため、ROSをあえてROS1と明記します。
一方、ROS2ではDDSという通信プロトコルで直接ノード間でデータをやり取りできるように改善されました。これにより、ROSマスターが不要となり、システムの信頼性と柔軟性が大幅に向上しています。
ROS2の通信方式
ROS2通信方式について解説します。
ROS2では、ノード間の通信を実現するために、以下のような通信方式が提供されています。
トピック通信
トピック通信 は、トピック (Topic) と呼ばれる通信チャネルを介して、
データを一方向に送信する通信方法です。
・送信側 (Publisher) は、受け手のことを意識せずにトピックへデータを送信します。
・受信側 (Subscriber) は、受信したいトピックをサブスクライブ(購読)してデータを受け取ります。
・一方向通信 で、送信側 (Publisher) は、受信側 (Subscriber) を意識する必要がありません。
・複数の受信側 が同じトピックをサブスクライブ可能です。
・リアルタイム性が高いため、センサーのデータやカメラの映像など、データを送り続けたい場合によく使用されます。
サービス通信
サービス通信は、クライアント (Client)とサーバー (Server)の間で行われる、リクエストとレスポンス の双方向通信です。
・クライアント (Client) が、サーバー (Server) に リクエスト を送信します。
・サーバー (Server) は、リクエストを受け取り、処理を行った後にレスポンスを返します。
・処理が完了するまで、クライアントは待機します。
・リクエストとレスポンスの1対1通信です。
・クライアントは、サーバーが応答するまで待機します。
・同期的な処理に向いています。
アクション通信
アクション通信は、トピック通信とサービス通信の両方の特徴を組み合わせた通信方法です。
処理に時間がかかる場合や、途中経過をフィードバックしたい場合に利用されます。
ナビゲーションのアクション通信を例にします。
・クライアント (Action Client) は、アクションサーバー (Action Server) に ゴール (目標) を送信します。
・アクションサーバーは、途中経過をフィードバック (Feedback Topic) でクライアントに通知します。
・最終的にゴールに到達したら、結果 (Result) をレスポンスとして返します。
・非同期通信で、途中経過をフィードバックできます。
・目標 (Goal) を送信し、進捗状況 (Feedback) を受け取り、結果 (Result)を取得する構造です。
・処理に時間がかかる場合や、途中経過を確認したい場合に適しています。
実際にトピック通信を試してみる
それでは、実際にROS2でトピック通信を動かしてみましょう。
今回はDocker環境でROS2を動かしてみます。
以下のコマンドを入力し、ROS2のDokcerコンテナを立ち上げましょう。(Dockerのインストール等の説明は省略します。)
docker run -p 6080:80 --shm-size=512m tiryoh/ros2-desktop-vnc:jazzy
dockerコンテナが立ち上がったら、ブラウザで
http://localhost:6080/にアクセスします。
これでUbuntu24.04 ROS2 Jazzyの環境にアクセスできました。
ros2のデモプログラムで、簡単なトピック通信を試してみます。
ターミナルを起動して受信側 (Subscriber) listenerノードを起動します。
ros2 run demo_nodes_cpp listener
新しくターミナルを起動して、送信側(Publisher) talkerノードを起動します。
ros2 run demo_nodes_cpp talker
実行後、以下画面のように、Hello World: xxが表示されます。
これは、talkerノードが通知したトピックのメッセージをlistnerノードで受信できていることを示しています。
以上、簡単なデモプログラムでトピック通信を動かしてみました。
最後に
今回はROS2のきほんということで、概要やROSとROS2の違い、通信方式について解説してみました。
次はROS2のプログラミングなど解説していこうと思います。
それでは!!
スポンサーリンク