About
こういうことをしたので,やったことをメモしておく.
デモURL
部内Wikiに投稿した内容のほぼまんまである.大目に見てください
なにがしたいのか
思想として,
- ROS側に指令値を送信できること
- ROS側の状態をreactiveに可視化できること
- iPadの特性をできるだけ活かしたUI設計にすること
- UIのフロント部分を簡潔かつ簡単に記述できること
の4点があった.ROSを組み込む場合におけるGUIの開発では,
- Linuxネイティブ1
- GTK3
- マルチプラットフォーム(PC)
- Qt
- Pythonを用いた様々(tkinter, simpleGUI, niceGUI, etc)
- マルチプラットフォーム(PC, モバイル)
- Web(Electron含む)
- Unity
- モバイルプラットフォーム2
- Kotlin (Android)
- Java (Android)
- Swift (iOS)
- Objective-C (iOS) 3
が定石であろう.今回はiPadで操作できるという条件があったのと,メンテナンス性及び学習コストの観点からWebを選択した.
Pros & Cons
Webの何がいいか
- 開発がしやすい
- ベースがHTMLなのでデザイン系はほんとうにどうにでもなる
- フレームワークと合わせることでバックエンドのことは気にしなくてもよくなる
- 「GUIの開発あるある」の面倒事が一切ない
- 謎のGUIエディタでゴニョゴニョするとか
- イベント駆動めんどくせーとか
- ビルドおっもとか
- そういうのがゼロ
- ホットリロードがラク
- 後述
- 驚異のマルチプラットフォーム性
- ブラウザさえあればどんなデバイスでも動く
- 罠はあるが
- Google Pixel Watchでもうごきましたよ()
- ブラウザさえあればどんなデバイスでも動く
- テンションが上がる
- 思ったUIを思ったとおりにつくれる(小並感)
- 笑った?でも大事よこういうの
- 思ったUIを思ったとおりにつくれる(小並感)
何がだめか
- ROS側の起動などがやや面倒くさい
- ROSbridge Serverなどを起動しなければならない
- 接続に失敗した場合サーバの再起動など煩雑な手間が必要となる
- 接続の信頼性がネイティブUIよりも低い
- ネイティブでUIを構築した場合にはない処理が行われたときの信頼性が大幅に劣る
- ブラウザ上でのリロード
- 回線が切断されてからの再接続
- ネイティブでUIを構築した場合にはない処理が行われたときの信頼性が大幅に劣る
- 簡単な処理ならPythonで組んだほうがラク
- という説もある.俺はTkinter特有の書き方があまり得意ではないので人によると思う
使用技術の選定
というワケで,賛否両論はあると思うがGUIをWebで構築することに踏み切った.今回使用した技術が以下の通り.
ROS関連
Web関連
やりたいことは以下のような感じである.
ROS側
Robot Web Tools様が偉大なる仕事をしてくださっているおかげで我々がすることはrosbridge_serverを起動することだけである.したがって
|
|
以上である.
Web側の実装
ここから実装していくわけだが,備忘録兼チュートリアル記事ということなので簡単に「topicをpubするボタン」と「subした値をreactiveに表示する部分」の2つに絞って書き方の雛形的なものをここに残しておく.
依存関係のインストール
まずは依存環境をインストールする.以下のスクリプトで最速で最新安定版のnodejsをインストールできる.
|
|
viteでプロジェクトをつくる.ROSと深く関連付けて管理する場合は適当にROSのパッケージを作成しその中などでやるといいと思う.
|
|
とすると色々聞かれるので,プロジェクト名を入力し,その後Reactを選択:
|
|
TypeScriptを選択:
|
|
するとよい.
|
|
で依存関係がインストールされる.
その後はUIフレームワークのmuiをインストールするために
|
|
とする.
|
|
して表示されたlocal IPをブラウザで開き,正常に画面が表示されることを確認できたらApp.tsx
の内容を
|
|
ここまで減らしてよい.
前提知識
Reactの諸々はここでは省く.よさげな日本語のチュートリアルを見つけたので各自参照されたい.
ROSオブジェクトの生成
上の方で
|
|
としてros
インスタンスを生成しておく.
TopicのPub
基本的には
|
|
としてTopicをインスタンス化する.例えば
|
|
といった形である.これを
|
|
とすると押すとPubするボタンの完成である.簡単でしょ?
TopicのSub
ROSのsubという仕組みとReactのreactive componentの相性は最高である.以下のように書くと
|
|
指定したtopicをsubすると表示に反映されるようになる.
Exercise
topicをpubするボタンとそのtopicをsubするボタンをつくり,pubしたtopicの内容が反映されることを確認せよ.pubする内容をフォームなどを用いてreactiveに変化させるとなおよい.
解答例
おまけ - iOS Safari向けのもろもろ
画面全体のスクロール禁止
どこから持ってきたか忘れてしまったが,ScrollLock.tsx
を作成して
|
|
とし,任意の箇所で
|
|
を挿入するとその場所でのスクロールが禁止される.
フルスクリーンPWA化4
src/index.html
の<head></head>
内に
|
|
としてやるとiPadのSafariで「ホーム画面に追加」したときの動作をアプリのようにすることができる.
ここからは?
- muiには様々なコンポーネントがあるため様々なWeb的表現を駆使したUIをROSにつなぐことが可能である.
- Robot Web Toolsは他にも様々なWeb用ROSライブラリを提供しているため,UI上に3Dモデルを表示することなども可能である.
- 安定性は保証できないが…
いかがでしたか?
(略)
参考文献
- rosbridge_suiteとReactでROS 2 Webアプリを作る
本記事は↑すばらしいこの記事↑の下位互換なのではないかという説がある