🚗

ルンバとラズパイとtailscaleで遠隔ラジコンを作る

2024/12/18に公開

Social Databank Advent Calendar 2024 の18日目です。
こんにちは!ラズパイ初心者です
今回はルンバを改造して社員のリモートワークを快適にしたかった話をします!

できたもの

ブラウザからボタンをぽちぽちすると動くよ〜
通話もできるよ〜

構成

材料

  • ルンバ 690シリーズ x 1
  • RaspberryPi 4B x 1個
  • 魚眼カメラ x 1
  • スピーカーフォン x 1
  • ジャンパーワイヤ x 3
  • モバイルバッテリー x 1
  • 三脚 x 1

詳解

詳解と書きましたがそんなに詳しく書かないです(長くなるので)

1.ラズパイ→ルンバ

実はルンバのバージョンによってはシリアルポートが付いてます
調歩同期式シリアル通信(UART)を用いて、ラズパイのシリアルPINルンバのシリアルPIN を繋いで操作できるようにします

1-1.ROS2の導入

繋いだだけでは操作できませんね
ルンバが理解できる形で命令をしてあげる必要があります
それを可能にするため、ROS2ルンバライブラリ をラズパイに導入します
(これをするためにOSをUbuntuにしてます)

お試しでルンバを動かすコマンド
ros2 topic pub /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1}, angular: {z: 0.3}}'

1-2.ros2-web-bridgeの導入

↑のコマンドをWEB上からどうやって叩く??ってなりますよね
websocketで送った内容をROS2のコマンドに変換してくれるツールがあります
「ROS WebTools Working Group」が出している ros2-web-bridge です
(よくみたら rosbridge_suite 推奨になってた...)

これをラズパイで起動して、Webからルンバを動かす準備が整いました!

2.PC→ラズパイ

インターネットからどうやってラズパイに接続するのか
そしてPCの操作画面をどうホスティングして何をラズパイに送るのか
その辺の話をします

2-1.tailscaleの導入

基本的に、インターネットからデバイスへのアクセスはできません
NATによって内部のIPアドレスを変換しているのでデバイスのIPアドレスがわからないためです
今回はSTUNサーバーを利用してNAT越えをすることでデバイスにアクセスします

それをいい感じにやってくれる便利なやつが tailscale 様です
STUNとシグナリングの役割を持ったサーバー(coordination serverと呼んでいる)を用意してくれています
ラズパイと操作画面表示PCのそれぞれでtailscaleを導入することで互いにアクセスできるようになります

2-2.Nextjsでホスティング

(ぶっちゃけラズパイでやる必要はない、ラズパイ重くなるしVercelとかに置きたい)

いい感じの画面とボタンを配置しましょう!
自分が扱いやすい言語とフレームワークで試してみる良いでしょう

ボタン押下時のAPIはros2-web-bridgeのwebsocketに直接繋げばいいです
(私はAPIの型補完をしたかったのでtRPCを利用してNextjsに送った後、Nextjsのサーバー処理でros2-web-bridgeへ繋ぎました)

2-3.WEB RTCでラズパイブラウザと操作画面ブラウザを繋ぐ

(構成に書き忘れましたが、WEB RTCを利用するためにwebsocketを使うnodejsがいます)

その場にいる人と話したり現場の映像を映したりするのは、ラズパイのブラウザとWebRTCで繋いで実現しています

ちなみに、WebRTCは個人情報(顔とか声とか)を扱うのでhttpsにする必要があります
tailscaleはその辺もサポートしてくれていて、IPではなく独自DNSでデバイスにアクセスできます

残念ポイント

自分の力量不足により残念な感じになったところを紹介します

ラズパイを動かす電力はルンバのバッテリーではなく別のモバイルバッテリー

どうやら必要以上の電力をルンバのバッテリーから取り出そうとしても、安全装置的なアレで電力が一定以上出力されないようになっているようです

シリアルポートからも微弱な電力を受け取れますが、ラズパイを動かすには心許ないです

結果、ルンバのバッテリーとは別にラズパイ用のモバイルバッテリーが必要になりました
すべて自動で充電されてくれないと運用するにはイマイチですね...

自動で充電ステーションに帰宅させる機能をつけたかった

未着手です
上記の通り、自動で充電されないならわざわざ自動帰宅機能を実装する必要もないなと...
どこかで記事を見かけたので実現はできるみたいです

起動するたびにセットアップしないといけない

これは私の力不足です
ラズパイを起動させるたびにROS2の起動とかNextjsのホスティングとかをやらないといけないです
起動したら自動でやるようにしようとしましたが、なんだかうまくいかず...

終わり

作ったものが物理的に動くのは楽しいですね!
私はWeb屋さんなので新鮮で良い経験ができました

これが業務に実用できるよう少しずつアップデートをしていきたいです

ソーシャルデータバンク テックブログ

Discussion