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についての日本語の情報は、すでに

がありました。んで、移植のためにはさらに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 = "*"を追加

 「型を変えてコンパイルが通れば動く」という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しかありませんでした。

 明日は一気にC++のコードをRustにしてパッケージを作ってしまいたいところです。

 それではよいお年を〜

ノート   このエントリーをはてなブックマークに追加 
 

prev:自作シェルの進捗 next:2024年はこんなの書いた

やり散らかし一覧

記事いろいろ