ROS2とは何か - コンセプトと全体像 -

執筆者:井上 叡
監修者:稲葉 貴昭・高橋 浩和

※ 「ROS2」連載記事一覧はこちら


はじめに

本記事は、ROS2(ROS)について知らない方を対象とした、イントロダクション的な記事です。主にROS2のコンセプトについて簡単に紹介することをメインとし、ROS2の概要を大まかに把握して頂くことが目的です。

ROSとは?

「ROS2」は名前にOSと入っているものの、いわゆるオペレーティングシステムではありません。その実態は通信やシミュレーションなどの機能を含むロボット開発のためのフレームワークです。 公式のドキュメントではROS2について以下のように紹介されています。

The Robot Operating System (ROS) is a set of software libraries and tools for building robot applications. From drivers and state-of-the-art algorithms to powerful developer tools, ROS has the open source tools you need for your next robotics project.

The Robot Operating System (ROS)はロボットアプリケーションを開発するための、ソフトウェアライブラリとツール群である。 ROSはドライバーから最先端のアルゴリズム、そしてパワフルな開発ツールまで、あなたの次のロボティクスプロジェクトに必要なオープンソースのツールを全て提供する。(筆者訳)

ここで重要なのが、ROSはただの通信ミドルウェアやただのシミュレータではなく、「ドライバーから最先端のアルゴリズム、パワフルな開発ツールまで」を全て含んでいることです。これについて、公式ページでは以下のような図があります。

https://www.ros.org/blog/ecosystem/ より引用

この図は、ROSは下記4つの組み合わせで構成されていると示しています。

  • plumbing(通信)
    • マイクロサービスアーキテクチャをベースとした通信ライブラリ・IDLの提供
  • tools(ツール類)
    • ビルドシステムやパッケージ化の枠組み、シミュレータやデバッグツール、データ可視化ツールやロギング機能などの提供
  • capabilities(機能群)
    • 制御の抽象化や各種ロボットに関連するアルゴリズム、モータやセンサのドライバー類などの提供
  • community(コミュニティ)

ROS2のこれらの特徴はロボットのソフトウェア開発に適しています。ロボットを知能的に動かすためにはセンサー入力の処理、モーターの制御、行動決定などなど一度に様々なソフトウェアが同時に協調して動作している必要があります。これには、上の「plumbing」の特徴がピッタリです。また、ロボットに搭載された様々なセンサデータや内部でのソフトウェア同士の様々なやり取りデータなど、ロボットが動く際には大量のデータが飛び交いますが、これらをデバッグなどするのに適したツール(tools)がROS2には沢山あります。そして、ROS2のパッケージとして多種多様なものが提供されている自己位置推定などのロボットのアルゴリズム(capabilities)は、言うまでもなくロボット開発に大いに役立ちますし、開発者のコミュニティが大きいこと(community)は基本的にユーザーにはメリットしかありません。

ここまででROSがロボット開発に適しているという事は分かりました。しかし、冷静に考えてみると通信・ツール類・機能群の3つの特徴に関しては、既存の何らかのOSS等を使えば代替できるような気がします。 例えば、上で紹介した「plumbing(通信)」単体を見れば、そこで提供されている通信機能と似たような機能は、既存の通信ライブラリと何らかのIDLの組み合わせで代替できます。実際、ROSのpublish/subscribe、service(RPCのようなもの)、action(request/replyのようなもの)といった通信機能はZeroMQ + Protobuf等を使えば簡単に再現可能で、これだけだと際立って素晴らしいものには見えないかもしれません。また、他の2つに関しても同じように適切なOSSが見つかりそうです。

では、何故上記4つの特徴が組み合わさることが重要なのでしょうか?
ここで重要なのはコミュニティに参加する全員が、ROSが提供する同じ通信形式とIDLの形式を使い、マイクロサービスアーキテクチャで開発をすることです。これによって、今まで各開発者が独自形式で作っていてお互いに通信したり組み合わせたりするのが難しかったロボットソフトウェアたちが、一気にコミュニティ内で簡単に組み合わせたり、再利用できるようになりました。また、各ツール類やシミュレータ(tools)は当然それらの通信形式に対応しているため、数々のデバッガやシミュレータも再利用可能になり、各個人でデバッガやシミュレータを苦労して実装する必要もなくなりました。ロボット開発においてはデバッグは多くの人が苦労する事項ですので、可視化ツールやデバッグツールとして既にあるものが利用できるというのは大きな利点です。プログラムが疎結合で一貫した入出力形式になった事で、他人が作ったアルゴリズム(capabilities)を、自分のソフトウェアに取り入れることも簡単になりました。また、ユーザーはROSを利用することで同じビルドシステムとパッケージ化の枠組みを利用することになり、このことも再利用の容易さに繋がっています。

これらの非常に強力な再利用可能性によって、ROSはロボット開発を加速させると共に広く利用されるようになりました。今では大学などでの研究から企業の製品開発、また個人で開発するホビーロボットなど、ロボットの殆どの分野でROSが利用されているのを見ることができます。 有名な例だと、ソニーのaiboでもROSが利用されているようです。(sonyの方がそれについて発表しています) 以下のサイトでは、ROSが搭載された数々のロボットが紹介されています。

robots.ros.org

ここまでの紹介では「ROS」と「ROS2」という2つの単語が登場しました。今回の連載で紹介していくのは、2という数字が入った「ROS2」です。ROS2にはその前身となった、2010年に最初のバージョンがリリースされたロボット向けソフトウェア「ROS」があります。「ROS2」が登場した現在では、こちらは「ROS1」と明確に区別されて呼ばれることもあります。このROS1の精神を継承し、良くない点などを改善して新たに実装されたのがROS2です。ROS1は長い間使われてきましたが、2025年5月に最後のバージョンがEOL(= End of Life)、つまりメンテナンスが終了するため、現在は徐々にROS2が主流となってきています。本記事では、「ROS」と「ROS2」に共通する事項等に言及する際は、2つを併せた呼称として「ROS」を使っています。それぞれのみが持つ特徴などは「ROS1」、「ROS2」という呼称を使います。

ROS2の特徴

ここからは、前章で紹介したROS2の4つの機能(通信、ツール、機能群、コミュニティ)について、もう少し詳しく紹介していきます。

ROS2のソフトウェア構造・通信機能

本項では、ROS2のソフトウェア構造と通信機能(plumbing)について紹介していきます。 ROS2はマイクロサービスアーキテクチャのような構造になっています。 マイクロサービスアーキテクチャは、以下のような特徴を持つソフトウェア構造です。(https://cacm.acm.org/blogcacm/utilizing-microservice-architectures-in-scalable-web-applications/ より)

  • 単一責任の原則
    • 各マイクロサービスは1つの機能を持つ
  • 疎結合と高凝集
    • 各サービスはそれぞれ疎結合である必要がある
  • 自治
    • 各サービスは自律的で、それぞれが独自のプロセスで実行されて軽量なメカニズムで通信する

ROS2では、マイクロサービスアーキテクチャにおけるサービスを「ノード(Node)」と呼びます。ノードはROS2でのプログラミングの最小単位で、1つのノードが単一の機能を持っていることが理想です。また、それぞれのノードは基本的には独自のプロセスで実行されます。*1ノード同士の通信にはDDS(Data Distribution Service)が利用されています。DDSは単一障害点を持たない分散システムの出版・購読型ミドルウェアです。ROS2ではDDSは抽象化され、ユーザーは直接利用することはありません。以下の画像のような構造で、通信機能を抽象化しています。

https://doi.org/10.1126/scirobotics.abm6074 より引用

上記画像から分かるようにユーザが実際に利用するのは各言語にバインドされたAPIです。

次に、実際にユーザが利用する通信APIについて紹介していきます。 ユーザが利用するROS2の通信機能としては以下の3種類があります。

  • Publish/Subscribe通信(出版購読型通信)
  • Service
  • Action

ユーザは上記の3つの通信機能を利用して、「メッセージ」を介してノード同士を通信させます。このメッセージはROS2の専用のIDLを利用して定義されます。ROS2のビルドシステムはこのIDLからROS2がサポートする各言語がネイティブで扱える型として定義したその言語のファイルを生成します。各言語バインドでは、この生成されたファイルを読み込んで利用します。

Publish/Subscribe通信(出版購読型通信)

Publish/Subscribe通信は、文字通り出版購読型の通信モデルに基づいた通信方法です。ノード同士は、ユニークな名前を持つ「トピック(Topic)」を通じて、Publishするノードが送信したメッセージをSubscribeするノードが受け取ります。1つのトピックに対して複数のノードがPub/Subすることや、1つのノードが複数のトピックに対してPub/Subすることも可能です。この通信方式はROSで最も基本となる通信方法で、モータに対して角度指令を送ったり、カメラから取得した画像を他ノードが利用できるように配信したり様々なことに利用できます。しかし、Pub/Subではメッセージロスが発生する可能性があります。加えて、Publishしたノードはメッセージが本当に相手に届いたのかは分かりません。そのため、例えば相手から返事が欲しい場合などは不便です。そのような場合にはこの後紹介する他の通信手法を利用します。

https://docs.ros.org/en/jazzy/_images/Topic-MultiplePublisherandMultipleSubscriber.gif https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/ Understanding-ROS2-Topics/Understanding-ROS2-Topics.html より引用

Service

ROS2におけるServiceを利用した通信は、一言で表すとRPCのようなものです。この通信方法では、通信するノード同士は「クライアント」と「サーバー」に分かれます。クライアントは何らかのメッセージをリクエストとして送ります。サーバーはそのリクエストのメッセージを受け取り、レスポンスとしてメッセージを返します。Pub/Subでの通信では送信したメッセージロスが発生する可能性がありましたが、こちらは基本的にはリクエスト・レスポンス共に相手に確実に届くようになっています。この通信方法は、相手から返事が欲しい場合や、要求に応じて確実に実行して欲しい処理などに利用します。

https://docs.ros.org/en/jazzy/_images/Service-SingleServiceClient.gif https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Services/Understanding-ROS2-Services.html より引用

Action

ActionはServiceと似ている通信方式で、こちらも通信する2つのノードは「サーバー」と「クライアント」に分かれます。Actionでは、クライアントはサーバーに対して「Goal」を送信して、サーバーからは「Result」を受け取ります。この通信がServiceと違う点は、相手に「Goal」を送信して相手から「Result」が送られてくるのを待っている間に、サーバーに対して「今行っているActionのキャンセルなどを要求」と「サーバーからの処理の実行状況の通知の受信」の2つが行えることです。「Goal」と「Result」はServiceにおけるリクエストとレスポンスと同じ役割を果たします。Actionは、サーバーに対して比較的長い時間が掛かる処理を行わせることを想定しています。(さながら非同期I/Oのようです)そのため、クライアント側は相手の処理を待っている間にその処理がもう必要無くなった場合はサーバーの処理をキャンセルすることができます。また、サーバー側は処理を行っている間に、現在の実行状況をクライアントに対してフィードバックできます。

この通信方式は例えばロボットアームに対して指定の物体を持ち上げる処理をさせたい、といったような状況で利用できます。サーバー側のノードは受け取った指令に従ってロボットアームを動かします。処理の途中で、ロボットアームの腕が物体にたどり着く前に物体が移動したことを検知した場合などは、クライアント側は一旦行動をキャンセルして新しい目標位置を指定するなどが可能です。逆に、サーバー側は今アームが物体に近づいている、今物体を把持した、要求された処理が全て終了した、など現在の状況をクライアントに伝えることができ、状況に応じて柔軟な処理が可能になります。

https://docs.ros.org/en/jazzy/_images/Action-SingleActionClient.gif https://docs.ros.org/en/jazzy/Tutorials/Beginner-CLI-Tools/Understanding-ROS2-Actions/Understanding-ROS2-Actions.html より引用

ROS2のツール

ROS2のビルドシステムから可視化ツール、データのロギングツールなどロボットの開発に役立つ様々なツールを提供します。本章ではその中の代表的なものをいくつか紹介します。

メタビルドシステム colcon

ROS2に含まれるツールの中で非常に重要なものとして、colconというメタビルドシステムがあります。ROS2を採用したソフトウェアでは基本的にこれを利用してパッケージをビルドします。これは、CMakeを基礎としたメタビルドシステムで、ビルドするプロジェクト同士の依存関係などを上手く解決しながらビルドすることが出来るシステムです。これを利用することで各プロジェクトをパッケージとして上手く切り分けることが可能になり、再利用可能性の向上に寄与しています。ROS2のメッセージ定義ファイルの扱い方などはその良い例です。一般的にIDLを採用したソフトウェアでは、その定義ファイルをどこで管理するかやどうやってビルドの依存関係内に取り込むかという事が問題になる事がしばしばあります。ROS2ではcolconを使ってメッセージ定義を1つのパッケージとして扱うなどして、上手く依存関係を解決しています。

Gazebo

Gazeboはロボット向けのシミュレータです。GazeboはROS2のために設計されたものではありませんが、ROS2はGazeboと連携するための多数のツールを提供しており、ROS2標準のシミュレータとなっています。Gazeboでは、ロボット自体は勿論、周囲の環境などもシミュレーション可能なため、デバッグにもアルゴリズムの開発などにも利用可能です。また、Gazeboでロボットの構造を定義するために利用できるURDFやSDFといったロボット構造のファイル形式は、ROS2でロボット構造を扱うための標準的な方法になっています。

https://docs.ros.org/en/humble/Tutorials/Advanced/Simulators/Gazebo/Gazebo.html より

Rviz2

Rviz2はROS2向けの可視化ツール(Visualizer)です。こちらもGazeboと同じようにロボットの3Dモデルなどを表示しますが、ロボットの物理的な挙動や環境のシミュレーションではなく、ロボットと関連データの可視化に焦点を当てたツールです。センサデータの可視化や、何らかのアルゴリズム(自己位置推定など)によって生成されたデータの可視化などによく利用されます。

例えば、以下の画像のようなロボットが取得したセンサデータ(点群データ)の可視化などは典型的な利用例です。

https://docs.ros.org/en/humble/Tutorials/Advanced/Simulators/Gazebo/Gazebo.html より引用

こちらはロボットの動きと、ロボットが作成したマップを同時に表示しています。

https://www.robotandchisel.com/2020/08/10/rviz2-on-mac/ より引用

こちらはロボットアームの関節の座標系や目標姿勢などを表示している例です。

https://moveit.picknik.ai/main/doc/tutorials/quickstart_in_rviz/quickstart_in_rviz_tutorial.html より引用

RQtツール

RQtツールは、プラグインの形で様々なツールとインターフェースを実装可能なGUIフレームワークです。これは、RQtという名前からなんとなく伝わってくるように、Qtベースのフレームワークです。ROS2はRQtで構築されたGUIツールを多数提供しており、ROS2に関連する様々なデータを可視化したり操作したりすることができます。ROS2の通信に関連する多数の可視化や操作機能が実装されており、ROS2の通信トポロジーを確認したり通信のデバッグに役立ちます。

下画像のように、トピック、サービス、アクションやロギングなど、様々なものに対するGUIが実装されています。これらのツールを使うと、任意のトピックに対してメッセージを送信したり、サービスやアクションをGUIで呼び出したりすることが可能です。

以下に、rqtツールの一部を紹介します。

  • Node Graph (rqt_graph)
    • 動いているノードや、それら同士の関係をグラフとして表示します。通信のトポロジーを確認できます。
      • 簡単なパブリッシャとサブスクライバを動かしている様子
  • Topic Monitor
    • 現在流れているトピックの名前と、そこでやり取りされているメッセージの型を表示します。
      • Node Graphで可視化したノード同士のやり取りしているトピックの可視化の様子
  • Bag
    • 今流れているメッセージをロギングすることができます。これは、rosbagという形式で保存されます。このrosbagは様々なツールで再生や可視化が可能です。
      • Node Graphで可視化したノード同士がやり取りしているメッセージを記録している様子
  • 上記のツールはまとめてタブ表示する事もできます。自分でプラグインとして実装したツールも同じようにタブ表示可能です。
      • 3つのツールをまとめて表示している様子

通信関連の機能のツールを主に紹介しましたが、プロットも可能です。また、データのプロットに関してはRQt意外にも優秀なツールがいくつかあります。

PlotJuggler

PlotJugglerは言わずと知れたデータのプロットツールです。ROS2のメッセージとして流れているデータをリアルタイムでプロットすることが可能で、フィルターなども掛けられます。複数種類のデータを時間を同期しながら表示できるため、デバッグに非常に役立ちます。rosbagのデータを再生しながらプロットすることもできます。ROS2以外のデータ形式(protobufなど)や通信形式(MQTTなど)プロットにも対応しています。

https://github.com/facontidavide/PlotJuggler より

FoxGlove

foxgloveもPlotjugglerと同じでROS2のメッセージのプロットができるツールですが、こちらはかなりリッチな表示が可能です。3Dモデルの表示や点群データの表示など、どちらかというとrviz2に近いツールです。

https://foxglove.dev/product/visualization より引用

ROS2の機能群

ROS2ではロボットを動作させたりするのに有益な様々なアルゴリズムなどを提供しています。中でも特にmoveit2とnav2は有名で、前者はロボットアーム等の多関節ロボット、後者は自律移動ロボットに非常に相性が良いパッケージです。あまり難しいことでなければ、それらのパッケージを利用するだけでやりたい事が達成できることもあります。非常に多くのパッケージがありますが、今回はその一部を紹介します。

ros2_control

ros2_controlは、ロボットを動かすのに欠かせない、「制御」を抽象化するための仕組みです。この機能は、モータの位置制御、軌道追従制御、PID制御、2輪ロボットの差動2輪の走行制御など、そのロボットにおいて最も下層となる制御を統一的な方法でアクセス可能にするために利用されます。また、モータだけでなくセンサやGPIOへのアクセスも抽象化することが可能です。モータ、センサなどのハードウェアを直接触って命令を出す部分の実装やPID制御など具体的な制御の実装はこのros2_controlの中に隠蔽され、他のROS2ノード等はros2_controlを介してそれらに命令を出したり、センサ値を受け取ることになります。

ハードウェアへの命令の実装は、ユーザが自ら実装可能なのは勿論、既にパッケージとして利用可能なものがあればそれを利用する事ができます。例えば、有名なコマンドサーボであるdynamixel等はros2_control向け実装が存在します。このようなものを利用すればサーボモータを購入して、これらのパッケージを導入するだけですぐにモータを動かせる状態になります。これは、センサ等に関しても同様です。

また、ハードウェアの操作が実装されていれば、ros2_controlに実装されている制御器を利用できる*2ので、場合によってはモータを購入してすぐに力制御まで簡単に出来たりもします。 ros2_controlに実装されている制御器は以下のページに記載されています。

control.ros.org

この後紹介する、nav2とmoveit2はros2_controlに対応しています。ロボットによっては、搭載されているハードウェアのros2_controlが全て配布されているものなどがあります。このようなロボットにnav2やmoveit2を利用すれば、すぐに物体のマニピュレーションやロボットのナビゲーションをするシステムを構築できます。

nav2はロボットのナビゲーション全般を行うためのパッケージです。個人、研究から企業のプロダクトまで、自律移動ロボットのナビゲーションにかなり広範に利用されています。認識、計画、制御、ローカリゼーション、視覚化などが提供されていて、ユーザはこのパッケージを利用して信頼性の高い自律移動システムを構築できます。4脚ロボットからドローン、台車ロボットまで様々な構造の自律移動ロボットに適用可能で、センサデータなどから経路計画、障害物回避、モーターの速度制御や地図作成など様々なタスクを実行できます。

nav2を使ってGazebo内でロボットをナビゲーションしている様子。右のrviz2の画面ではnav2で作成した地図が可視化されている。

https://intel.github.io/robot_devkit_doc/pages/navigation.html より引用

moveit2

moveit2は以下のような事ができます。

  • モーションプランニング
  • マニピュレーション
  • 逆運動学
  • 衝突判定
  • 制御

moveit2は他のROS2ツールとの連携も優れており、特にrviz2を使うと目標姿勢の表示や障害物を考慮したプランニングの可視化などを行うことができます。下図や、rviz2の項目の最後に掲載した図はrvizとの連携をしている様子です。

https://moveit.ai/ より引用

コミュニティ

ROS2はオンライン上にも、オフラインにも沢山のコミュニティがあります。オンラインのもので代表的なのは、ROS Index(各ユーザが作ったパッケージのインデックスサイト)統一的なwikiROS Discourse(ROS関連のイベントやリリースの告知サイト)などがあります。

ROSのオフラインイベントで最も有名なものは、ROSConです。

roscon.ros.org

これは、毎年1回世界のどこかで開催される最大のイベントです。2025年は、10月27~29日にシンガポールで開催されます。このイベントはパネルディスカッション、LT、様々なワークショップ等が開催され、誰でも参加可能で世界中から参加者が集まります。ROSConは日本ローカル版としてROSCon Jpというイベントも開催されています。

roscon.jp

また、ROSCon Jp以外の日本のオフラインのROSの大きなコミュニティとして、ROS Japan Users Group(rosjp)があり、沢山のメンバーがいます。こちらは定期的にオフラインやオンラインでイベントを開催しており、LT大会や勉強会などが行われている他、slackなどオンラインのコミュニティもあります。

おわりに

本記事ではROS2の重要な4つのコンセプトについて紹介してきました。これらを知っていれば、ROS2がロボットのソフトウェアとしてどのように利用されるか、それなりに想像できるかと思います。ROS2に初めて触れる方の助けになりましたら幸いです。

参考文献

*1:通信の効率化のため、複数のノードが1つのプロセスで実行されることはあります

*2:モータに搭載されているセンサによって適用できる制御則は制限されるので、全てとは限りません。