ros2_rustでスキャンデータと地図を扱ってみた
Tue Dec 31 20:51:59 JST 2024 (modified: Tue Dec 31 21:11:48 JST 2024)
views: 439, keywords:ROS 2, Rust
この前学会(SI2024)で発表したこれのコードをROS 2のパッケージにしようということで、ros2_rustについて調べて一昨日からいじってました。
ros2_rustについての日本語の情報は、すでに
- https://qiita.com/MrBearing/items/caf427b23d65d6c085d7
- https://qiita.com/koichi_baseball/items/4e4d5892781683a64398
がありました。んで、移植のためにはさらにLiDARのデータをサブスクライブして地図をパブリッシュしないといけないので、その先をやってみました。できました。
スキャンデータをサブスクライブする
ros2_rustについては上で紹介した記事を読むとよいので続きを書くと、まず、TurtleBot3 Burger(シミュレータのやつ)の吐くスキャンデータをサブスクライバで読んで、別のパブリッシャからパブリッシュすることに挑戦しました。できました。
コードはこうなりました。
で、チュートリアルのコードのどこをいじったかというと、次の3点だけです。main.rs
についてはVimの置換だけで済みました。
- main.rs
- パブリッシャで傍受するトピックを
scan
に変更 - トピックを受けるデータの型を
std_msgs::msg::String
からsensor_msgs::msg::LaserScan
に変更
- パブリッシャで傍受するトピックを
- Cargo.toml
- dependenciesに
sensor_msgs = "*"
を追加
- dependenciesに
「型を変えてコンパイルが通れば動く」というRustの良い面(コンパイルが通らないと辛い面もある)がモロに出ました。
地図のデータをパブリッシュする
こちらはコードを書かなければいけないので数時間かかったのですが、どっちかというとros2_rustと関係ないROS 2のごちゃごちゃのほうが大変でした。
変更点は
- main.rs
- いろんな型を
use
に追加(7〜12行目) - マップを送出するパブリッシャの追加(19、34、40行目)
- 地図の作成(49〜92行目。スクラッチから構造体を組み合わせて作りました)
- いろんな型を
- Cargo.toml
nav_msgs, builtin_interfaces, geometry_msgs
の追加
です。RVizでゴニョゴニョすると、こんな出力が得られます。
所感
main.rs
はパブリッシャ、サブスクライバをマルチスレッドで動かすために仰々しいプログラムになっていますが、基本、なにかサブスクライバからデータを取り込んでひとつのパブリッシャから加工したデータを出す処理は、ひとつのスレッドの中で完結するので、特にややこしいことはないかなと思いました。Rustのプログラムは不可解な挙動をしないので慣れてしまうと楽です。
ただ、バージョンはhumble(Ubuntu 22.04)までのようです。24.04のがないかリポジトリを探しに行ったら、ブランチがmainしかありませんでした。
ブランチがmainしかないの、お前、漢だな pic.twitter.com/oEZJFLO8w2
— 上田隆一 (@ryuichiueda) December 30, 2024
明日は一気にC++のコードをRustにしてパッケージを作ってしまいたいところです。
それではよいお年を〜