この記事は、ROSについてまとめてみる #5の続きです。
最後に、ROS1とROS2の違いについてまとめてみたいと思います。
ROS2は、ROS1のソースを引き継がず、一からフルスクラッチで制作されているので、互換性はほぼないです。
(ブリッジは用意されています。)
ROS1とROS2の違い
DDSの採用
一番大きな変更はこれです。
ROS1では、通信のライブラリはTCPベースの独自実装でしたが、ROS2ではUDPベースのDDSに置き換わりました。これにより、ROS masterの担当していた仕事はDDS自体が持つことになり、単一障害点でもあったros_coreは存在しなくなりました。
NASAのROS1を使ったリポジトリがDDSで実装されており、これが選定の要素になったとかならないとか。
サービス
ROS1ではサービスは同期で、非同期的な実装をするためにはactionを使う必要がありましたが、ROS2ではサービスのみで同期、非同期のどちらも実装できるようになりました。
パラメータ
ros_coreがなくなったため、パラメーターサーバーの役割は各ノードが受け持つようになりました。
また、パラメータに値が更新されると、コールバック関数が呼ばれるといったようなイベント駆動も標準で出来るようになりました。
QoS(Quality of Service)制御
ROS2では、通信の品質を4段階から変更できます。
- History
Keep last: N個分のサンプルを保存します。DepthオプションでNを制御します。
Keep All: リソース限界まですべてのサンプルを保存します。 - Depth
キューのサイズを指定します。(Historyオプションが Keep last の場合) - Reliability
Best effort: サンプルを配信しますが、欠損する可能性があります。
Reliable: サンプルの配信を保証します。(届くまでリトライされる) - Durability
Transient local: Publisherより後に立ち上がったSubscriberへ配信するため、最後に配信したサンプルを一つ保持する。
Volatile: サンプルは保持されない。
リアルタイム制御
ここでのリアルタイム性とは、処理の速さではなく、応答の最悪値が保証される(RTOS的な)意味でのリアルタイムです。ROS1でも、ros_controlはリアルタイムだったり、リアルタイムカーネルを導入したりなどで、そのようなことは可能でしたが、ROS2ではもっと汎用的にリアルタイムの設計が可能みたいです。
*すみません、ここに関しては、どうやって実現しているのかなど、正直ちょっとよくわかりません…
複数ロボットへの対応
ROS1は、基本的にロボットは一台で動作させることを想定してます。multimasterで複数のROS masterを動作させるなど、複数台同時に動かす方法はあるにはありましたが、基本的な設計思想としては、ロボットは一台です。ROS2ではROS masterがなくなったこともあり、複数ロボットへの対応を謳っています。
組み込みへの対応
ROS1はコアな機能がC++で実装されていましたが、ROS2はCで実装されています。これにより、より組み込み機器への導入がしやすくなっています。ROS1では、PC上でノードを立て、ノードと機器はシリアル通信するなどの方法が一般的でした。ROS2では、組み込み用のライブラリを使えば、機器内にノードを立てることもでき、そのままROSのネットワークに参加させることもできます。
システム構築のパターン化
ROS1では、基本的にソースコードの書き方は自由でした。
ROS2では、コンポーネント指向が導入され、ライブラリに沿った書き方を求められます。ユーザーはメインループを記述しません。
その代わり、ROS2側でノードのライフサイクルを管理してくれるなどの恩恵を受けることができます。
マルチプラットフォーム対応
ROS2では、Windowsはおろか組み込み機器までも含めたマルチプラットフォーム対応を掲げています。
ROS1でも言っていたような…
参考
プログラミングROS(O'Reilly Japan)
https://www.oreilly.co.jp/books/9784873118093/
ROS2ではじめよう 次世代ロボットプログラミング(技術評論社)
https://gihyo.jp/book/2019/978-4-297-10742-0