ROS2でRustが使える"r2r"を試してみた
はじめに
こんにちは!大阪大学のRobohanというロボコンチームで活動しています「れぎっと」と申します!
私は主に制御班として活動しており、次回大会からROS2を使った自動制御に挑戦するので絶賛勉強中です!間違っている部分等あるかもしれませんが、そのときは優しく指摘してください〜私は最近、ロボコンとは別でプログラミング言語rustの勉強をしており、優秀なコンパイラ、安全性の高い所有権システム、traitなどに魅力を感じていました。 そこで、ROS2でrustバインディングがないか調べたところ、今回の"r2r"というものが良さげだったので使ってみました!
今回はその入門をまとめた記事となります!
私の環境
OS: Ubuntu20.04
CPU: AMD Ryzen7 7700X
GPU: nVIDIA RTX4070Ti
ROS2 Distribution: ROS2 Foxy
また、今回使うライブラリ"r2r"はこちらです
なぜROS2_rustではなくr2rなのか
公式のrclへのrustバインディングは実際、ROS2_rustというものがあります。
しかしながら
- サークルで使っているROS2-Foxyが使えそうになかったから。使えると書いてある記事もあったが、リポジトリを見てみると
humble
,iron
,rolling
しかファイルがなく、使い方がよくわからなかった。 - また、ROS2の要素の一つであるActionの機能がROS2_rustにはないらしい
という情報(ソースはこちら)が目に入ったので、いくつかライブラリはありましたがr2rを選びました。
とりあえず、使ってみる
最初はgithubのREADME.md
が非常にわかりやすかったです。
まず、普通のrustと同じように
cargo new r2r_example
として、クレートを作成します。
そして、/r2r_example/cargo.toml
を次のように編集します。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[dependencies]
r2r = "0.8.4"
futures = "0.3.30"
これでr2rのライブラリを入れられました。
futuresはrustの非同期ライブラリでpub-sub通信を使う際に使用しているので今のうちに入れておきます。
そして、一旦サンプルコードを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ができました。
Discussion