概要
こんにちはBEIKEです。
クリスマス?そんなものは知りません。
ボッチで開発作業たのしいなぁ🙃
ということで本編へ
ある時、micro-ROSとros2_controlについて全くわからねぇぇ。。。
いつ使うんだ?ってなりました。
そこで!
実際にロボット(Diff Bot)作って、micro-ROSとros2_control使ってみれば
なんとなく分かるんじゃね!?
と考えました。
その中で得た知見や進捗について共有できればと思い、記事を書いてみました!
当方、知識が浅いため、もしかしたら適当なことを書いてることがあるかもしれません。
コメントで指摘等いただけると大変助かります🙏
準備編?
micro-ROSってなんぞや???
以下のmicro-ROS公式サイトがあります。
https://micro.ros.org/
概要を読んでみると
Micro-ROS は、ノード、パブリッシュ/サブスクライブ、クライアント/サービス、ノード グラフ、ライフサイクルなどの
すべての主要なコア概念をマイクロコントローラー (MCU) にもたらします。
と書かれていました。
つまり、マイコン上でROS2の実装ができるってわけですね🙃(本当か?)
更に読んでみると
どうやら、micro-ROSにはAgentとClientというものが存在するそうです。
Agentさんは、何をしているかというと
通常のROS2ノードとmicro-ROSノードとの橋渡し(ブリッジ)を行っているそうです。
Clientさんは、マイコン上で動作しているmicro-ROSノードらしいです。
そして、ROS2ノードとmicro-ROS間は
UDP、TCPあるいはシリアルポートを使用した2通りの通信方法が可能です。
ここで疑問
マイコン側のメモリ(RAM)の使用とかって、どうなってるんだ?
Agent側で上手いことやってくれてるのかな?(PC側で負担)と思い調べてみました。
micro-ROSはデフォルトでeProsima Micro XRCE-DDSというミドルウェアを使用しているそうです。(参考元)
このミドルウェアについても同様に公式サイトがあります。
https://micro-xrce-dds.docs.eprosima.com/en/latest/
で、サイトに書かれている
eProsima Micro XRCE-DDSの主な機能を読むと
ライブラリは、 クライアント スタックの増加によるメモリ フットプリントのみであるため、動的および静的メモリ フリーです。 2kB未満のRAMで単純なパブリッシャー/サブスクライバーを管理できます。 さらに、 クライアント の概念に従って構築されて はプロファイル おり、バイナリ サイズを変更すると同時にライブラリに機能を追加またはライブラリから削除できます。
と書かれていました。
なので、マイコン側のRAMで負担してそうだなーとなりました。
以上、micro-ROSってなんぞや???
です。色々勘違いをしてそうですが、こんなもんだろ?という感じです。
ros2_controlってなんぞや???
そもそも、ROS(1)にもros_controlというのが存在していて
何がなんだか分からず使ったことがありませんでした。
これもros2_controlの公式サイトがあるので読んでみます。
https://control.ros.org/master/index.html
ros2_controlは、(ROS 2)を用いてロボットを(リアルタイムに)制御するためのフレームワークです。ROS (Robot Operating System) で使用されている ros_control パッケージを書き直したパッケージです.
また、ros_controlやros2_controlについては、多くの先人方が記事で説明をしてくださっています。
例えば、以下の記事が分かりやすかったです。
ros2_controlは、世の中にある制御理論をロボットに適用しやすくするものです。(※私の解釈です)
例えば、2輪走行ロボットで自動走行したい場合、アプリケーション(自動走行)とロボットとの間に差動2輪走行制御が必要です。
この走行制御はros2_control特有のものではなく、すでに世の中にある制御理論です。
アプリケーションやロボットのハードウェアをできるだけ意識せずに、制御理論を適用できる仕組みがros2_controlです。
なるほど。。。
Diff Botを作る??
Diff Botについて
ここからは、micro-ROSとros2_control実装のために
作製したDiff Botについて説明します。
まず、名前の由来ですが、
Diff BotはDifferential Robotの略です。
あとは、ros2_control_demosにあるDiff Botから来てます。
作成したロボットがこちら!
ロボットの作成に関しては、
同期の高見俊介さんがハードウェアと速度制御周り、
micro-ROS、ROS2周りを私が担当しました。
後ほど、説明がありますが、このロボット(Diff Bot)の
部品やコードはすべてパッケージとして公開しています。
Diff Botのハードウェア構成
ざっと、ハードウェア構成はこんな感じです。
micro-ROS Agent用、LiDAR(RPLiDAR S1)用にRaspberry Pi 4 DRAM 4GBを搭載してます。
micro-ROS Client用にNUCLEO-F446REを搭載してます。
NUCLEO-F446REについては、手元にあったものでmicro-ROSが動くボードということで採用しました。
Diff Botのソフトウェア構成
ソフトウェア構成についてはこんな感じです。(SLAMとナビゲーションをまとめました)
本当は、Raspberry Piのみでナビゲーションをしたかったのですが、
やってみた感じCPU処理負荷に耐えられず、処理落ちしてしまうことがありました。(調査不足)
そのため、PCのCPUリソースをお借りして、SLAMとNavigationを行いました。
Diff Botのパッケージについて
takagon-dynamics/diff_bot
- Diff Bot関連のパッケージをreposでまとめた
- micro-ROS Agent用のDocker fileがある
takagon-dynamics/diff_bot_control
- Diff Botの各リンクの公開
- /cmd_velからodomリンクの発行
takagon-dynamics/diff_bot_documentation
- Diff Bot用のドキュメント
- インストール、実行方法について記載(現在進んでない)
takagon-dynamics/diff_bot_firmware
takagon-dynamics/diff_bot_launch
- Slam-toolbox、Navigation2の立ち上げに必要なパラメータやlaunchファイルがある
takagon-dynamics/diff_bot_slam
- SLAM用のlaunchファイルがある
takagon-dynamics/diff_bot_navigation
- Navigation2用のlaunchファイルがある
takagon-dynamics/Diff_Bot_Hardware
- Diff Botを作製するために必要なものをまとめた
Diff Botを動かしてみる!!!
ということで、作製したパッケージを使ってDiff Botを動かします。
Diff BotでSLAM(slam_toolbox)!?
いい感じそうです!
あまり歪みのない綺麗なマップが出来ました!
Diff Botでナビゲーション(navigation2)!?
なんかうまくいってなさそうですね。
tf周りが怪しいです。
パラメータ調整については、ほとんど何もしてないです。
でも、なんか動いたのでヨシ!(ひどい)
まとめ
なんとか、micro-ROSとros2_controlを使って
ナビゲーションまでできました。
少しは勉強出来た気がします。
結局これ。。。
micro-ROS何もわかってない🥲 pic.twitter.com/VY7wprPPQR
— BEIKE (@BEIKE_RE) December 18, 2022
ここまで、読んでいただきありがとうございます🙏
余談
本当は倒立振子を作る予定でした。
IMUのデータ(imu_filter_madgwick後のデータ)をmicro-ROS経由で(Raspberry Pi 4から)受け取ると、レイテンシがあるのか、倒立の制御(NUCLEO-F446RE側)が間に合いませんでした。
そのため、今年はナビゲーションできるロボットをとりあえず作るかという感じになりました。
来年はmicro-ROS使って、Diff Botを倒立させたいです🔥