ROS 2 Rustクライアント実装状況 2024/12/09 現在

## 本記事の目的

この文書は2024年12月時点で複数開発されているRustクライアントの実装状況を記録するためのものです。

2022年に@OTLさんが[この記事](https://qiita.com/OTL/items/4112b400cacb653e2d9f)でROS 2におけるRustのクライアントの実装状況について報告していました。

流石に2年もたつと状況変わっています。今年はJazzyもリリースされたので、(@OTLさんに断りなくですが)再調査するのは意義があると思い筆を執った次第です。

ちゃんと探したつもりではありますが、すべて探しきれてなかったら申し訳ありません。

## ROS2 Rustクライアント一覧

Rustクライアントは[Atostek ROSCon 2022: Native Rust](http://download.ros.org/downloads/roscon/2022/Native%20Rust%20components%20for%20ROS2.pdf)から引用・翻案・追記する形で一覧を作成しました。その他はGithubで「ros2」「rust」を検索し、クライアントの実装を行っていると認められるものを一覧にくわえました。


  | 名称 | 作者 | Github | 概要 |
  |:---:|:---|:---|:---|
  | ros2-rust  | Multiple contributors  | [link](https://github.com/ros2-rust/ros2_rust)  | Rust-WGの公式repo　<br/> a |
  | ros2-client / RustDDS  | Atostek Oy /<br/> Juhana Helovuo | [link](https://github.com/jhelovuo/ros2-client) <br/> [link2](https://github.com/jhelovuo/RustDDS) | DDSとそのROSクライアントをRustで作成 |
  | r2r  | Martin Dahl and others  | [link](https://github.com/sequenceplanner/r2r)  | rclへのバインド. async functions使ってるのが特徴 |
  | safe_drive :new:  | ytakano and others | [link](https://github.com/tier4/safe_drive) | 形式手法で仕様定義して実装された Rust バインディング |


※1 [rus2](https://github.com/marshalshi/rus2)は4年前から開発止まってるので今回も除外
※2 [roslibrust](https://github.com/RosLibRust/roslibrust)はrosbridgeで動作が前提なので除外
※3 [Yuma Hiramatsuさんのrclrust](https://github.com/rclrust/rclrust)がリストにありましたが、すでにPublic archiveになっていたので除外

## ROS2クライアントでサポートして欲しい機能

[@OTLさんの記事](https://qiita.com/OTL/items/4112b400cacb653e2d9f)では、基本的な機能としてPub/Sub , Service , Action, Parameterの四つのサポートを確認していました。

今回は個人的に対応して欲しい機能として、Message generatinが実装されている事も確認します。
機能としてマストでありませんが、実装されていると、定義済みのmsgファイルとRustのコードを突合し続けるような作業から解放されます。

- Pub/Sub
- Service 
- Action 
- Parameter
- Messege generation

以上5点を調査していきます。

QoSチューニングの実装に関しては程度の差はあれ、すべて実装していました。

## ROS2 Rustクライントの実装状況

実装状況を以下の表にまとめます。

| 名称                       | Pub <br/> / Sub   | Srv                | Param              | Action             | Msg Gen            |
|:-------------------------:|:------------------:|:------------------:|:------------------:|:------------------:|:------------------:|
| ros2-rust                 | :white_check_mark: | :white_check_mark: | :white_check_mark: |                    |                    |
| ros2-client<br/>/ RustDDS | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :question: |
| r2r                       | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |
|  safe_drive               | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: | :white_check_mark: |


Rust-WGが開発しているros2-rustがいまだにActionに対応していないですね。
ほかのクライアントに関しては基本機能が実装できているので、実用することはできそうです。

Messege generation : .msgなどを読み込んで,Rustの型を生成する機能があるかを確認しました。名称やアプローチは各プロジェクトごとに少しずつ違います。

## 対応バージョン

今回はEOLを迎えていないLTSに限って(Ironは11月でEOL)調査しました。
実際に対応しているか調べるのは時間がかかるので、今はREADMEの記述を信じることにします。


| 名称                       |  Humble            | Jazzy              | 
|:-------------------------:|:------------------:|:------------------:|
| ros2-rust                 | :white_check_mark: | :white_check_mark: |
| ros2-client<br/>/ RustDDS | :white_check_mark: | :white_check_mark: | 
| r2r               　      | :white_check_mark: | :white_check_mark: | 
| safe_drive                | :white_check_mark: | :white_check_mark: | 

基本的にすべてのプロジェクトでHumble、Jazzyの対応はできているようです。

## 今回の結論

ros2-client, r2r, safe_drive 共に最低限使えるレベルに達してる。

ros2-rustに関しては、慎重な開発が行われてる模様。

## 終わりに

以上が、2024/12/14現在でのROS2 Rustクライアントの開発状況の紹介です。
調査したプロジェクトで基本的な機能の開発はほとんどできている様です。

今後、コンポーネントノードなどもRustで記述できると個人的には万々歳ですが、今後も折を見て状況追っていこうと思います。

今回の件も、もう少し時間が許せば、実装方式などの比較など、もう少し突っ込んだ調査してみてもいいかと思っています。

## 参考文献

https://discourse.ros.org/tag/wg-rust

https://discourse.ros.org/t/current-state-of-rust-client-libraries-which-one-to-use-ros2-client-rus2-ros2-rust-rclrust-rosrust-or-r2r/39119?u=mrbearing

https://qiita.com/OTL/items/4112b400cacb653e2d9f





----

## 各クライアントについての所感

流石に、このままだと内容薄い気がしたので、以下にざっとリポジトリを眺めたうえでの所管を記述していきます。(あまり正しくないかも、あくまで所感です。)

### ros2-rust

WG Rustによって開発が進められているクライアントです。基礎的な機能は実装されていますが、未だにActionが実装されていません。
[このPR(#410)](https://github.com/ros2-rust/ros2_rust/pull/410)でWIPですが、過去のPRでいくつかActionの実装を試みているようです。

このWGの最終的な目標は、rclpyやrclcppのようなクライアントライブラリとしてrclrustをROSのリリースに取り込ませることなので、現在はより良い実装を模索中ということなのだと思います。

しかしながら、cargo-ament-buildなど、ROSのビルドとシームレスに接続できるビルド環境がサポートされているので、自分のプロジェクトで使ってみる場合の親和性は高そうです。

### ros2-client / RustDDS

ROSCon2022で発表されていた、DDS自体をRustで独自に実装する試みです。
DDSの仕様を完全にはフォローしていないため、専用のクライアントライブラリでのみ動作確認されています。
2022年の時にはActionが実装されていませんでしたが、既に実装されており,実用で使えそうなレベルです。
ロギングやROS time等もサポートされています。

開発元の Atostek Oyこれを実プロジェクトで使っているらしいです(2022年の発表時点)

### r2r

2022年時点でActionまでの機能をほぼ実装していたのがこのプロジェクトでした。

お手軽にRustでROS 2と通信させたい場合には適用しやすいかもしれません。
基本的にcargoでのビルドを想定されていますが、リポジトリ下にある[このスクリプト](https://github.com/sequenceplanner/r2r/blob/master/r2r_cargo.cmake)でcargoをCMakeと連携させてビルドすることができます。

### safe_drive

個人的には一番興味深いプロジェクトです。
「形式手法で設計され、モデルチェッカにより仕様がテスト済み」という点が特徴。エグゼキューターのデッドロックやスタベーションが発生しないとのこと。
基本機能は十分サポートされていますし、ロギングなども実装済みです。

詳しい使い方などは[公式ドキュメントへ](https://tier4.github.io/safe_drive/pubsub.html)へ