🦾

ROS2でRustが使える"r2r"を試してみた

2024/04/05に公開

はじめに

こんにちは!大阪大学のRobohanというロボコンチームで活動しています「れぎっと」と申します!
https://github.com/RobohanOU
私は主に制御班として活動しており、次回大会からROS2を使った自動制御に挑戦するので絶賛勉強中です!間違っている部分等あるかもしれませんが、そのときは優しく指摘してください〜

私は最近、ロボコンとは別でプログラミング言語rustの勉強をしており、優秀なコンパイラ、安全性の高い所有権システム、traitなどに魅力を感じていました。 そこで、ROS2でrustバインディングがないか調べたところ、今回の"r2r"というものが良さげだったので使ってみました!
今回はその入門をまとめた記事となります!

私の環境

OS: Ubuntu20.04
CPU: AMD Ryzen7 7700X
GPU: nVIDIA RTX4070Ti
ROS2 Distribution: ROS2 Foxy

また、今回使うライブラリ"r2r"はこちらです
https://github.com/sequenceplanner/r2r
https://docs.rs/r2r/latest/r2r/

なぜROS2_rustではなくr2rなのか

公式のrclへのrustバインディングは実際、ROS2_rustというものがあります。
しかしながら

  • サークルで使っているROS2-Foxyが使えそうになかったから。使えると書いてある記事もあったが、リポジトリを見てみるとhumble,iron,rollingしかファイルがなく、使い方がよくわからなかった。
  • また、ROS2の要素の一つであるActionの機能がROS2_rustにはないらしい

という情報(ソースはこちら)が目に入ったので、いくつかライブラリはありましたがr2rを選びました。

とりあえず、使ってみる

最初はgithubREADME.mdが非常にわかりやすかったです。
まず、普通のrustと同じように

cargo new r2r_example

として、クレートを作成します。
そして、/r2r_example/cargo.tomlを次のように編集します。

r2r_example/cargo.toml
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

[dependencies]
r2r = "0.8.4"
futures = "0.3.30"

これでr2rのライブラリを入れられました。
futuresはrustの非同期ライブラリでpub-sub通信を使う際に使用しているので今のうちに入れておきます。
https://docs.rs/futures/latest/futures/

そして、一旦サンプルコードをmain.rsに書きましょう。
ここにある、subscriberのサンプルコードを/r2r_example/src/main.rsにコピペします。

エディタを出て、r2r_example/内で実行します。

cargo run

エラーが出なければ、別のターミナルで

ros2 topic pub /topic std_msgs/msg/String "data: 'Hello, world'"

を実行してください。
すると、rustで実行した側のターミナルでは2回に一回、Hello, worldと表示されるはずです!

以上でサンプルコードによって、r2rをつかったsubscriberができました。

自分でpub-subのコードを書いてみる

記事は途中です。すぐに更新しますのでお待ちください!

Discussion