環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 22.04 |
ROS2 | Humble |
概要
ROS1を使っていた方向けにROS1とROS2との相違についてまとめます。
両者は全く別ともいわれますが、最大の違いはCoreのライブラリで、周辺ツールは同じライブラリを使っている等、共通資産をつかっている部分も多いです。
相違点をまとめてみます。
ROSライブラリ本体
- ros masterの有無
- ROS1ではROS Masterが必ず最初に起動して、他のROSノードは起動時にROS Masterに通信をして、他のROSノードとの接続を行います。
- ROS2ではmaster的なものはなくROSノード同士はDDSのアルゴリズムで互いを発見します。DDSでの発見をしやすくするための物としてros2 daemonがありますが、これは起動が必須のものではないです。またROS1では一度ROS Masterが落ちると、例えばrostopic echoのコマンドも次に接続する時には再起動しないといけませでしたが、ROS2ではそのような制約はないです(地味にデバックで便利)。
- パラメーター
- ROS1ではROS Masterがパラメーターサーバーの役割を持っていて、ROSノードはそこにアクセスしていました。
- ROS2ではROS Masterが廃止されたために、パラメーターの仕組みが大きく変わっています。個別のノード毎にパラメーターサーバーを持ちつ設計に変わっています。これに伴いlaunchでのパラメーターの指定などの仕様も変更になっています。
- ネットワーク越しの別ホスト(=マシン)との接続
- ROS1ではROS_MASTER_URIを設定すると、そのマシンのROSノードと接続することが出来ます。
- ROS2ではDDSが別ホストのROSノードも自動的に発見されるので、同一ホスト・別ホストを意識する必要がありません。逆にROS_DOMAIN_IDという環境変数を設定することで、別ホストと混ざらないようにできます。
- msgの型
- ROS2ではmsgの定義ファイルには互換性がありますが、c++でインクルードする時のファイル名のルールや型名のルールが変わっています。
- ROSTime
- ROS1ではROS時刻はROS::Time、実時刻はROS::WallTimeと別れています。
- ROS2ではrclcpp::Timeの1つの型で、オプションとしてRCL_ROS_TIME, RCL_SYSTEM_TIME,RCL_STEADY_TIMEの3つから選べます。違うオプションのTime同士の演算を行うとexceptionが起きます。
- seviceの非同期call
- ROS1のcppライブラリではserviceのclient側でのcallでは同期処理(responseが返ってくるまでブロック)のAPIしかありませんでした。
- ROS2のrclcppでは非同期APIもあります。これによってROS Srviceの使い勝手が大幅に上がりました。
- use_sim_time
- ROS1では1つのパラメーターを変えればシミュレーション時間への切り替えが出来ました。
- ROS2ではパラメーターの仕組みが変わったことで、すべてのROSノードのuse_sim_timeを書き換える必要があります。launchでは特別な記述が必要になります。
ビルド
- install
- ROS1ではdevelディレクトリが作成されて、
source devel/setup.bash
によりdevelのファイル/srcのファイルで実行をすることが出来ました。installディレクトリの作成は必須ではありませんでした。 - ROS2ではinstallディレクトリの作成が必須です。
source install/setup.bash
をするしかないです。これにともないCMakeListでlaunchファイルやパラメーターファイルなどもすべてinstallディレクトリへのコピーの記述を書く必要があります。
- ROS1ではdevelディレクトリが作成されて、
ROS周辺機能
- launchシステム
- action_lib
主なパッケージ
- 個別パッケージの対応
- navigation stack
- slam系
- gmapping
- rviz plugin
コメント
逆に言うとこれ以外に大きな違いはないです。食わず嫌いをせずにROS2に乗り換えてみませんか?