🐸

ラズパイZeroW+Buildrootで動くmicro-ROSカメラを作った話

2021/12/13に公開

数日遅刻してますが、ボリューム多めにご用意したのでご勘弁を😆

こんにちは。のむむです。Zennでは初めての投稿になります。
ROSをテーマに、ロボットを作ったり、勉強会参加したり、同人誌で情報発信したりしています。

micro-ROSはイイゾ

ロボット制作が趣味の筆者ですが、中でも組込み寄りの機能に興味関心が強いです。
ROSの話題でも、最近のマイブームは組み込みを意識したマイコン向けのROS2実装であるmicro-ROSです。もっと流行ればいいなとちょいちょい布教に勤しんでおり、micro-ROSを動かしてみた記事の同人誌なども頒布しています。

micro-ROSのおすすめポイント

筆者がmicro-ROSをおすすめしているポイントを簡単に挙げておきましょう。

  • リソースが少ない環境でROS2を利用できる
    マイコンなどからROS2のリッチな開発環境を利用できるのはメリットが大きいです!
    筆者もマイクロマウスのデバッグにmicro-ROSを使用しています。
    ROS2ベースで電源のON/OFF順序に制約が少ないのはストレスが少なくとても気に入っています。
  • ROS2ソフトをバイナリ化できる
    micro-ROSで開発したアプリケーションは基本的にバイナリが出力されます。
    パッケージを他のデバイスへインストールするための手順が簡潔で、パソコン上で動くパッケージ群を移植するのと比較すると、デバイスの複製が圧倒的に楽な実装になっています。
  • ROS2のコア機能の多くに対応済
    ExecutorやLifecycle、可変長メッセージにも対応したので、機能面での不足感は少なくなってきました。
    rclcppへの対応に不満が残りますが、マイコン向けという点では仕方ない部分があるなと思っています。
  • リアルタイム性やリソースの管理
    マイコン上で動作するリアルタイムOS(FreeRTOSなど)の管理下でタスクとして動作するため、リアルタイム性が重要なノードの実装にはPC上のROS2よりも向いている可能性もあります。

これからを期待するポイント

こちらのページでmicro-ROSの実装機能を俯瞰することができます。
まだ発展途上の機能もありますが、継続的によくなっているので筆者は今後も期待できると考えています。
特に、Agentレスで通信できるようになると使い勝手が大きく変わってくると思うので、楽しみにしています。

RaspberryPiで動くROS2ノード

なぜかROSエンジニアはRaspberryPi上でのROS環境構築にチャレンジしがちですね🤔
(筆者も心当たりがN回あります)

  • ROS専用PCを購入するほどの予算が無い!
  • 安い・速い・小さいLinuxマシンをロボットに搭載したい!
  • microSDでサクっと環境まるごとバックアップが取れて便利!

などなど、理由はそれぞれかと思います。
一方で、環境構築してみたものの、結構めんどくさかったり、期待よりモッサリして使いづらかったり、うーん...🙄と思った経験がある方も少なくないかと思います。
そこでmicro-ROSですよ!

micro-ROS + RaspberryPi ZeroW

micro-ROSにはRaspberryPi環境の設定も用意されています。
普通に環境構築をすると非常に面倒ですが、micro-ROSでノードを作成すると、実行バイナリをひとつコピーするだけでRaspberryPi上からROS2のネットワークへ参加することができてしまいます。めちゃくちゃ楽です。

ところで筆者は手のひらサイズのロボットも好きなので、入手可能で最も小さいRaspberryPi ZeroWで動くと魅力的なんじゃないか??という欲が沸いてきます。micro-ROSのノードはマイコンでも実行できるので、ZeroWの性能でもずいぶん余裕があります。

ただし、Linuxの起動はZeroWにとって重たく、公式イメージなどではパッと起動してROS2とつながる小型マイコンのような理想には遠いです。

軽量Linuxイメージ構築ツールBuildroot

というわけで、Buildrootの登場です!😎
ざっくり説明すると、Buildrootは次のようなビルドツールです。

  • 組込み向けにカスタマイズした軽量Linuxをクロスコンパイルできる
  • 設定に従いBusyboxやlibcなどもろもろをビルドしてくれる
  • 本当に必要最小限な機能だけ自分で選んで入れられるので超軽量にできる

ちょっとしきいは高いですが、使いこなせればとても良いものです。
ライセンスはGPL2 or any later versionなので要確認。

BuilrootはRaspberryPiシリーズに一通り対応しているため、RaspberryPiZeroW用のイメージを作成してノードを起動すればよさそうですね!😲

Buildroot環境でmicro-ROSクライアントを動かすための勘所

micro-ROSクライアントはバイナリファイルに固められるのでインストール的なことが不要です。この点でBuildrootと相性抜群なのですが、気を付けるポイントがあります。

  • Cライブラリの互換性に注意
    Buildrootは軽量化他の理由でuClibcが基本設定になっていますが、ROS2のバイナリと一部互換性がありません。Glibcを使用するよう設定変更が必要です。
  • RaspberryPiのWi-Fiやカメラを利用するのにも設定変更が必要
  • とにかく設定が多いので迷子になる

RaspberryPi ZeroW用イメージの構築

Buildrootは使いこなせると色々と夢が広がるんですが、やや玄人向けのツールなので布教のハードルが高くなってしまいますね。
そこで、筆者がRaspberryPi ZeroW上でmicro-ROSクライアントを動作させるためにカスタマイズしたイメージを作成するためのDocker環境構築ファイルを公開しました
使い方はREADME.mdを参照ということで割愛します。

余談ですが、SDカードへのイメージ書き込みツールはRaspberry Pi Imagerが最近のお気に入りです。
イメージ書き込みツール

micro-ROSで作るカメラノード

micro-ROSのRaspberryPi向けサンプルには、あまり良い作例がまだ無いので、この記事のために新たに次の機能を持つノードを作成しました。

  • RaspberryPi ZeroWにつながれた純正カメラ(v2.1)の画像をAgentへ転送
    • 解像度
      640x480
    • フォーマット
      Jpeg
    • メッセージ型
      sensor_msgs/CompressedImage
    • データサイズ
      100kB弱/メッセージぐらい
    • 通信方法
      Wi-Fi 2.4G, UDP, DDS

RaspberryPi ZeroWとカメラ

カメラノードのコードは別の機会に紹介するとして、micro-ROSで作成したcamera_publisherという実行ファイルを起動時に自動で呼び出し、ホストでカメラ画像を表示できるまでの時間を録画しました。

https://youtu.be/BElpg8ZyPaA

Wi-Fi接続やAgentとの接続時の挙動によって数秒前後しますが、電源投入からおおよそ20秒あればホスト側でカメラトピックが確認できるという結果になりました。上記の仕様では3~5FPS程度の速度で通信できています。
ラズパイの画面では14秒程度で起動が終わっているので、ちょっと重めの処理もできてストレージ、メモリが広大なLinuxマイコンとしては実用的な起動時間になったかなと思います🥰
通信などを諦めればもう少し短くなりそうですが、あまり意味がないですね。
速さに関しては、RaspberryPi Zero2Wが日本でも入手できるようになるのを楽しみに待ちたいと思います。

まとめ

micro-ROSの活用例を示してみましたが、いかがでしたか?
「micro-ROS、面白そうやん!」
と思って頂けていたら嬉しいです。

micro-ROSの良いところを生かした、もっとロボットらしいシステムの作例にも挑戦したいところですが、昨今の電子部品の入手性の悪さから、なかなか身動きが取りづらいですね。

まだ引き続きmicro-ROS推しで情報発信しようと考えていますので、よろしくお願いします。
それではまた

Discussion