本記事の目的
ROS2のRustクライアントはいくつか存在する。
2022/12/09時点でのそれぞれのクライアントの実装状況について記述しておく。今後の発展に期待。
ROS2 Rustクライアント
@MrBearing さんに教えて貰いましたが、ROSCON2022@京都にて以下のような発表があったようです。
勝手に引用させてもらうと以下のような感じです。
名称 | 作者 | URL | 概要 |
---|---|---|---|
ros2-rust | Multiple contributors | https://github.com/ros2-rust/ros2_rust | Official Rust binding to rcl |
ros2-client/RustDDS | Atostek Oy / Juhana Helovuo and others | https://github.com/jhelovuo/ros2-client | Native Rust implementation of ROS2 client library - and DDS! |
r2r | Martin Dahl and others | https://github.com/sequenceplanner/r2r | Binding to rcl. Rust API uses async functions. |
rclrust | Yuma Hiramatsu | https://github.com/rclrust/rclrust | Uses Rust macros(!) to translate IDL to Rust types. |
資料だと一番下にrosrustが乗っていますが、rosrustはROS1なので関係ないです。
rus2は流石に作りかけすぎるので省かせてもらいました。
ということでいっぱいありそうですね。
ROS2クライアントに必要なもの
ところでみなさんROS2クライアントを実装したことありますでしょうか?私はありません。
しかしROS1だけは経験があります。
ROS1クライアントについて
ROS1では以下3つをサポートすれば大体OKでした。
- Pub/Sub
- Service
- Parameter
他に必要なのはactionlibとかtfとかなんですが、それらはこの仕組みを使って実装出来るので、そこはオプショナルというか、誰か他の人が作ってくれてもいいし、最悪Pub/Sub使えば無理やりactionを使うことは可能でした。
ROS2クライアントについて
一方でROS2では上記3つに加え、
- Action
もサポートする必要があります。それはROS1ではactionはPub/Subの仕組みを使ってactionlibという外部ライブラリで実現されていたのですが、ROS2ではROS2本体の機能として取り込まれたからです。
またROS2で新たに導入されたQoSの設定もROS2では必須と言っていいレベルです。それは設定によっては全く通信出来ない接続関係もある(うまく行かない、とかではなく、仕様として接続出来ない。))ためです。
ということで
ROS2クライントに求められるのは
- Pub/Sub
- Service
- Parameter
- Action
上記4つになります。(多分他にもあると思いますので詳しい方、コメント等で教えて下さい!LifeTimeとか?QoSが必須なのは理解していますが、全ライブラリ実装しているので今回は省略。)
特にROS(2)の最大の売りであるnavigation2の指令値はaction形式になっており、actionを使えないクライントライブラリはnavigationを使えない事になってしまうため、actionの実装があるかどうかは本格的にROS2をその言語で使えるかどうかを分ける非常に重要な観点となります。
ROS2 Rustクライントの実装状況
そこで各クライアントの上記4つの機能の実装状況を確認してみましょう。
名称 | Pub/Sub | Service | Parameter | Action |
---|---|---|---|---|
ros2-rust | ✔ | ✔ | ✔ | |
ros2-client/RustDDS | ✔ | ✔ | ✔ | |
r2r | ✔ | ✔ | ✔ | ✔ |
rclrust | ✔ | ✔ | ✔ |
実際のソースコードを見た結果、私の認識では上記の状態です。
これではちゃんとROS2クライントとして完成しているのはr2rだけ、ということになります。
ということで弊社で開発しているOpenRRでもr2rを採用しています。他にも理由はあるのですが。
対応バージョン
また、ROS(2)は頻繁にバージョンアップしますので、どのバージョンに対応しているかが重要です。これは人によって古いほうがいい、新しいほうがいいとかあると思いますが、個人的にはFoxy以前のROS2は実用レベルにないと思うので、Foxy, Humbleの2つをサポートしているかどうかが重要かと思います。それぞれLTSバージョンですし。
これは実際に対応しているか調べるのが難しいのでREADMEの記述を信じることにします。
名称 | Foxy | Humble |
---|---|---|
ros2-rust | ✔ | ✔ |
ros2-client/RustDDS | (Galactic) | |
r2r | ✔ | ✔ |
rclrust | ✔ | (Rolling) |
こちらも正式にFoxy, Humble対応しているのはr2rのみという結果になりました。(rclrustはRollingに対応しているのでHumbleも動きそうですが記述なし)
(編集2022/12/12 @wep21 さん情報ありがとうございます。:ros2-rustはリリースノートにHumbleの記述があるので多分動くかと。)
今回の結論
現時点ではr2rしか使えるものはない。
終わりに
ということで2022/12/09現在でのROS2 Rustクライアントの開発状況を紹介しました。
今後の開発に期待ですし、Rustでのロボット開発がもっと盛り上がって欲しいので出来る範囲で私も貢献していきたいところです。