<style> /* basic design */ .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6, .reveal section, .reveal table, .reveal li, .reveal blockquote, .reveal th, .reveal td, .reveal p { font-family: 'Meiryo UI', 'Source Sans Pro', Helvetica, sans-serif, 'Helvetica Neue', 'Helvetica', 'Arial', 'Hiragino Sans', 'ヒラギノ角ゴシック', YuGothic, 'Yu Gothic'; text-align: left; text-transform:none; line-height: 1.6; letter-spacing: normal; text-shadow: none; word-wrap: break-word; color: #444; } .reveal h1, .reveal h2, .reveal h3, .reveal h4, .reveal h5, .reveal h6 {font-weight: bold;} .reveal h1, .reveal h2, .reveal h3 {color: #2980b9;} .reveal th {background: #DDD;} .reveal section img {background:none; border:none; box-shadow:none; max-width: 95%; max-height: 95%; } .reveal blockquote {width: 90%; padding: 0.5vw 3.0vw;} .reveal table {margin: 0.8vw auto;} .reveal code {line-height: 1.2;} .reveal p, .reveal li {padding: 0vw; margin: 0vw;} .reveal .box {margin: -0.5vw 1.5vw 2.0vw -1.5vw; padding: 0.5vw 1.5vw 0.5vw 1.5vw; background: #EEE; border-radius: 1.5vw;} /* table design */ .reveal table {background: #f5f5f5;} .reveal th {background: #444; color: #fff;} /* .reveal td {position: relative; transition: all 300ms;} */ .reveal td {position: relative;} /* .reveal tbody:hover td { color: transparent; text-shadow: 0 0 3px #aaa;} */ /* .reveal tbody:hover tr:hover td {color: #444; text-shadow: 0 1px 0 #fff;} */ /* blockquote design */ .reveal blockquote { width: 90%; padding: 0.5vw 0 0.5vw 6.0vw; font-style: italic; background: #f5f5f5; } .reveal blockquote:before{ position: absolute; top: 0.1vw; left: 1vw; content: "\f10d"; font-family: FontAwesome; color: #2980b9; font-size: 3.0vw; } /* font size */ .reveal h1 {font-size: 4.8vw;} .reveal h2 {font-size: 4.0vw;} .reveal h3 {font-size: 2.8vw;} .reveal h4 {font-size: 2.6vw;} .reveal h5 {font-size: 2.4vw;} .reveal h6 {font-size: 2.2vw;} .reveal section, .reveal li, .reveal blockquote, .reveal p {font-size: 2.2vw;} .reveal table, .reveal th, .reveal td {font-size: 1.7vw;} .reveal code {font-size: 1.6vw;} /* new color */ .red {color: #EE6557;} .blue {color: #16A6B6;} /* split slide */ #right {left: -18.33%; text-align: left; float: left; width: 50%; z-index: -10;} #left {left: 31.25%; text-align: left; float: left; width: 50%; z-index: -10;} </style> <style> /* specific design */ .reveal h2 { padding: 0 1.5vw; margin: 0.0vw 0 2.0vw -2.0vw; border-left: solid 1.2vw #2980b9; border-bottom: solid 0.8vw #d7d7d7; } </style> # Native Rust components for ROS2<br/>参加報告 ### in ROSCon 2022 ふりかえり会 <br/> 2022.11.21 岡本拓海 twitter: [@MrBearing2](https://twitter.com/MrBearing2) 資料URL https://hackmd.io/@MrBearing/SJPAMZG8s --- # TL;DR - この資料はNative Rust components for ROS2の参加報告です - 基本的に発表資料の和訳 - 多少のコメント #### 発表内容 - Rustでロボットプログラム書くの良いよ! - RustDDS + ros2-client でデモを作ったよ - FlexbotFrameworkというのを作ったよ --- # 元の発表資料リンク等 <br/> - :video_camera: [動画](https://vimeo.com/showcase/9954564/video/767140150) - [発表スライド pdf](http://download.ros.org/downloads/roscon/2022/Native%20Rust%20components%20for%20ROS2.pdf) -- pdfへの直接リンクなので注意 --- # 発表者について Juhana Helovuo さん - github:[jhelovuo](https://github.com/jhelovuo) - [Atostek](https://atostek.com/)のProduct Development /Chief Research Officer - フィンランドの会社 - RustDDSとros2-clientの開発元 - 遠隔医療や医療機器の管理システム等 <!-- ![](https://i.imgur.com/5NIh9rm.png)--> --- # Rustはなぜロボット向きの言語なのか - システムプログラミングに使える - C++のように低オーバッドでベアメタルなコードが書け、かつ高級言語(HaskelとかF#)の安全性が保障されてる - メモリ安全 - データ競合安全* - C++のプログラマにとっては学習が容易 - 代数的型システム - C/C++の悪い所(historical baggage)が無い - 未定義動作や処理系定義の動作 - 学習時の大量の落とし穴 <br/> <div style="font-size: 70%; color: black;"> * : スライドの下の方に"マジでコンパイラがデータ競合見つけてくれるぜ!!(でも、デッドロックはまだプログラマの責任だよ)"って小さく記述が。。 </div> ---- # Rustの特徴 - 所有権ベースのメモリーハンドリング - unsafe修飾子 - 危ない箇所をコード中で明示的に示せる e.g 生ポインタを扱う箇所等 - FFIを使ったり、低レベルのデータ構造を扱う場合などに必要になる - unsafeの適用箇所は非常に小さい範囲に留められる。 - LLVM上でコンパイラがビルドする - x86(-64),ARM,等のCPUアーキテクチャでもビルドできる --- # RustでのROS2クライアント一覧 | Name | Auther | Link | Notes | | -------- | -------- | -------- |-------- | | ros2-rust | 多数 | [ros2-rust](https://github.com/ros2-rust/ros2_rust) | 公式のrclのRustバインディング | | ros2-client / RustDDS | Atostek Oy / Juhana Helovuo and others |[RustDDS](https://github.com/jhelovuo/RustDDS) [ros2-client](https://github.com/jhelovuo/ros2-client) |  :arrow_left: **今回はコレの紹介**<br/> ネイティブRustのros2クライアントとDDSの実装 | | r2r | Martin Dahl and others | [r2r](https://github.com/sequenceplanner/r2r) | Rustのasyncブロック使えるようにしてました | | rclrust | Yuma Hiramatsu | [rclrust](https://github.com/rclrust/rclrust) | Rustのマクロ(!)でIDLとRustの型変換をやってる | | rus2 | Marshal SHI | [rus2](https://github.com/marshalshi/rus2) | 2020年の9月から開発止まってる | | rosrust | Adnan Ademovic and others | [rosrust](https://github.com/adnanademovic/rosrust) | ROS1用 (昔使ったけど結構ちゃんと動いた) ~~2020年の8月から止まってる~~ 今年の8月に更新あった | --- # Rust DDSとros2-clientの位置づけ <!-- ![](https://i.imgur.com/vroYzy3.png) --> <div align="center"> <img src="https://i.imgur.com/vroYzy3.png" height="700"> </div> ---- # Rust DDSについて - DDS APIとRTPSをネイティブRustでスクラッチ実装 - Apach 2.0ライセンスで公開中 - 特徴 - ピアを自動で発見 - ノンブロッキングI/O - 受信時はゼロコピー - 送信時はシングルコピー - Rustオブジェクトを直接シリアライズ/デシリアライズ可能 - 信頼性が高く、QoSはベストエフォート型 - [History QoS](https://www.omgwiki.org/ddsf/doku.php?id=ddsf:public:guidebook:06_append:glossary:h:history_qos) QoSポリシーの一つ - 大きなオブジェトの断片化が可能(?) ---- # Rust DDSのデモ eProsimaが出している[Shapes demo](https://www.eprosima.com/index.php/products-all/eprosima-shapes-demo)にRustDDSを使ってメッセージを送るデモ ![](https://i.imgur.com/10UsN15.png) [Qiitaで動作確認の記事](https://qiita.com/MrBearing/items/deb8077f79f6054edb2a)を書いたのでそちらをご参照ください。 <div style="font-size: 60%; color: black;"> スクリーンキャストで動画取ろうと頑張ったんですが、上手くいきませんでした。。。 </div> --- # ros2-client - やってる事は少ない 名前から名前の変換をして機能を隠しているだけ(?) - Rustで書かれたrclcpp , rclpy と同じようなレイヤーのソフトウェア - RustDDSの上で動作する - イベントループをまだ実装してないので、ノードは.poll()メソッドを使ってイベントループを自分で実装する必要がある ---- # ros2-clientを使ったコード例 [ros2-clientの/examples/listener/main.rs](https://github.com/jhelovuo/ros2-client/blob/58a732ea3b14d1e99de074e70a5acb55298deb70/examples/listener/main.rs#L42) ```rust=42 loop { // pollしたいリソースを渡す 第2引数はタイムアウト指定 metal I/O poll.poll(&mut events, None).unwrap(); //戻り値はResult 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()), } // match } // for } // loop ``` --- # FlexbotFrameworkについて1 - 2019年頃から開発しているロボットプログラミングのフレームワーク - まだオープンソースではない - "単一のソフトウェアそのものもノードと通信チャネルで構築したい” - 2020-2021年でROS2対応完了 ROS2の拡張機能としてみなせるレベル(自称) - Rustプログラミングをサポート - ソフトウェア全体が機械可読なデーターフロ仕様で記述される(Haskellらしい) - ボイラープレートコードは仕様書からの自動生成 - 蜜結合なノードがノード間の通信簡略化する(?) Closely coupled nodes can simplify inter-node communication - 数十~数百という細かい粒度でのデータフロープログラミングが可能 - 個々のノードは単純な構造にして再利用性を向上できる ---- # FlexbotFrameworkについて2 ![](https://i.imgur.com/L8Ff7gE.png) ---- # FlexbotFrameworkの実績について - Pulu Roboticsのロボットのコントロール(動画 17:48~) - 床面に設置したQRコードでのナビゲーション達成 - 三菱ロジスネクストのフォークリフトをROS2で操作(動画 19:00~) - フォークリフトのPLCとCAN経由で通信してフォークリフトを操作 --- # 会場であった質問 Q1 cargoからインストール可能? A1 できます。crates.ioからインストール可能です。 <br/> Q2 カスタムROSメッセージとのインタフェースはどうなってますか? A2 今の所は手動でRustのコードを書く必要があります。 部分的には対応するコードを自動的に吐くことができますが、万全ではありません。 --- # お願い - RustのBoF参加した方いましたら、BoFでのディスカッション内容とか補足してもらえると - 私は参加できなかった。。。 --- # お願い2 仕事探してます。 ROS/2が書きたいです!!! [![](https://i.imgur.com/CTXQs8O.png)](https://twitter.com/MrBearing2) 仕事やらしてもいいよって方は、@MrBearing2までDMください --- # 付録 - [RustDDSのデモのビルド&実行方法](https://qiita.com/MrBearing/items/deb8077f79f6054edb2a) --Qiita記事書きました --- # 参考資料 - https://github.com/jhelovuo/RustDDS - https://github.com/jhelovuo/ros2-client - - Shape demoの動かし方 - https://eprosima-shapes-demo.readthedocs.io/en/latest/ --- <br/><br/><br/><br/><br/> #### ご清聴ありがとうございました
{"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}]"}
    1137 views