TL;DR
この資料はNative Rust components for ROS2の参加報告です
発表内容
Rustでロボットプログラム書くの良いよ!
RustDDS + ros2-client でデモを作ったよ
FlexbotFrameworkというのを作ったよ
発表者について
Juhana Helovuo さん
github: jhelovuo
Atostek のProduct Development /Chief Research Officer
フィンランドの会社
RustDDSとros2-clientの開発元
遠隔医療や医療機器の管理システム等
Rustはなぜロボット向きの言語なのか
* : スライドの下の方に"マジでコンパイラがデータ競合見つけてくれるぜ!!(でも、デッドロックはまだプログラマの責任だよ)"って小さく記述が。。
Rustの特徴
所有権ベースのメモリーハンドリング
unsafe修飾子
危ない箇所をコード中で明示的に示せる e.g 生ポインタを扱う箇所等
FFIを使ったり、低レベルのデータ構造を扱う場合などに必要になる
unsafeの適用箇所は非常に小さい範囲に留められる。
LLVM上でコンパイラがビルドする
x86(-64),ARM,等のCPUアーキテクチャでもビルドできる
RustでのROS2クライアント一覧
Name
Auther
Link
Notes
ros2-rust
多数
ros2-rust
公式のrclのRustバインディング
ros2-client / RustDDS
Atostek Oy / Juhana Helovuo and others
RustDDS ros2-client
今回はコレの紹介 ネイティブRustのros2クライアントとDDSの実装
r2r
Martin Dahl and others
r2r
Rustのasyncブロック使えるようにしてました
rclrust
Yuma Hiramatsu
rclrust
Rustのマクロ(!)でIDLとRustの型変換をやってる
rus2
Marshal SHI
rus2
2020年の9月から開発止まってる
rosrust
Adnan Ademovic and others
rosrust
ROS1用 (昔使ったけど結構ちゃんと動いた) 2020年の8月から止まってる 今年の8月に更新あった
Rust DDSとros2-clientの位置づけ
Rust DDSについて
DDS APIとRTPSをネイティブRustでスクラッチ実装
Apach 2.0ライセンスで公開中
特徴
ピアを自動で発見
ノンブロッキングI/O
受信時はゼロコピー
Rustオブジェクトを直接シリアライズ/デシリアライズ可能
信頼性が高く、QoSはベストエフォート型
History QoS QoSポリシーの一つ
大きなオブジェトの断片化が可能(?)
Rust DDSのデモ
eProsimaが出している Shapes demo にRustDDSを使ってメッセージを送るデモ
Qiitaで動作確認の記事 を書いたのでそちらをご参照ください。
スクリーンキャストで動画取ろうと頑張ったんですが、上手くいきませんでした。。。
ros2-client
やってる事は少ない 名前から名前の変換をして機能を隠しているだけ(?)
Rustで書かれたrclcpp , rclpy と同じようなレイヤーのソフトウェア
RustDDSの上で動作する
イベントループをまだ実装してないので、ノードは.poll()メソッドを使ってイベントループを自分で実装する必要がある
ros2-clientを使ったコード例
ros2-clientの/examples/listener/main.rs
loop {
poll.poll (&mut events, None ).unwrap ();
for event in events.iter () {
match event.token () {
Token (1 ) => match chatter_subscription.take () {
Ok (Some ((message, _messafe_info))) => {
let l = message.len ();
println! ("message len={} : {:?}" , l, &message[..min (l,50 )]); |
}
Ok (None ) => println! ("No message?!" ),
Err (e) => {
println! (">>> error with response handling, e: {:?}" , e)
}
},
_ => println! (">>> Unknown poll token {:?}" , event.token ()),
}
}
}
FlexbotFrameworkについて1
2019年頃から開発しているロボットプログラミングのフレームワーク
まだオープンソースではない
"単一のソフトウェアそのものもノードと通信チャネルで構築したい”
2020-2021年でROS2対応完了 ROS2の拡張機能としてみなせるレベル(自称)
Rustプログラミングをサポート
ソフトウェア全体が機械可読なデーターフロ仕様で記述される(Haskellらしい)
ボイラープレートコードは仕様書からの自動生成
蜜結合なノードがノード間の通信簡略化する(?) Closely coupled nodes can simplify inter-node communication
数十~数百という細かい粒度でのデータフロープログラミングが可能
個々のノードは単純な構造にして再利用性を向上できる
FlexbotFrameworkについて2
FlexbotFrameworkの実績について
Pulu Roboticsのロボットのコントロール(動画 17:48~)
三菱ロジスネクストのフォークリフトをROS2で操作(動画 19:00~)
フォークリフトのPLCとCAN経由で通信してフォークリフトを操作
会場であった質問
Q1 cargoからインストール可能?
A1 できます。crates.ioからインストール可能です。
Q2 カスタムROSメッセージとのインタフェースはどうなってますか?
A2 今の所は手動でRustのコードを書く必要があります。
部分的には対応するコードを自動的に吐くことができますが、万全ではありません。
お願い
RustのBoF参加した方いましたら、BoFでのディスカッション内容とか補足してもらえると
お願い2
仕事探してます。
ROS/2が書きたいです!!!
仕事やらしてもいいよって方は、@MrBearing2までDMください
Resume presentation
Native Rust components for ROS2 参加報告 in ROSCon 2022 ふりかえり会 2022.11.21 岡本拓海 twitter: @MrBearing2 資料URL https://hackmd.io/@MrBearing/SJPAMZG8s
{"metaMigratedAt":"2023-06-17T14:35:24.602Z","metaMigratedFrom":"YAML","title":"Native Rust components for ROS 2 in ROSCon 2022","breaks":true,"slideOptions":"{\"theme\":\"white\",\"slideNumber\":\"c/t\",\"center\":false,\"transition\":\"none\",\"keyboard\":true,\"width\":\"93%\",\"height\":\"100%\"}","contributors":"[{\"id\":\"610cfd52-ad2b-46e8-81e2-a79a85a7f06f\",\"add\":10566,\"del\":4801}]"}