皆さんこんにちは、グレキチです。
ゴールデンウィークが過ぎて、もう日中は半袖でも過ごせるほど、暑い日も出てくるようになりました。暖かい季節だと体がよく動くので、ついつい色んな所に出かけたくなります。(えっ、お爺さんみたい!?😅)
とは言えやはり、寒いより暑い方が、私は好きですね〜。
さて今回も、前回に引き続き、差動駆動ロボットの製作過程に関する話です。
※前回ブログをまだご覧になっていない方は、是非以下の記事を閲覧願います。
内容はと言うと、ハードウェアとソフトウェアの互換性に関連する内容を中心に、苦労したポイントなどを紹介します。
前回概要でも説明した通り、制御基盤として、メインコントロールユニット(以降、MCU)とモーターコントローラ(以降、MTC)の2つの基盤を設けています。よって、基盤毎に用意すると考えれば、大きくはメインプログラムとモーター制御プログラムの2つが必要になります。以下では、その各プログラム毎に遭遇した諸々の問題について説明します。
メインプログラム関連
メインプログラムを細分化すると、モデル基本特性の定義、シュミレーション用モデル生成、シュミレーションソフト(Gazebo)起動設定、カメラ設定、LiDAR設定、コントローラ(ジョイスティック等)制御、ナビゲーション起動、ボールトラッカー起動などに分けられます。
使用するOSの種類などを含めて、参考動画通りに沿って進めていたら、メインプログラム構築は概ね躓くことは無かったんだと思いますが、私の場合、先のことも見越して開発環境など色々を変更を加えた上で進めたので、不具合が多々発生しました😂
メインプログラム実行にあたって特に手間取ったのが、シュミレーションソフト起動設定です。ここでは、その内容について詳しく説明します。
※説明にあたって、専門用語をいくつか使っていますので、ご存じない方はご自分でググってみて下さい👍
Gazeboでセンサーが起動しない
ROS2での開発に際して、実機製作前のプログラム確認方法として、3D可視化ツールであるRviz2やシュミレーションソフトのGazeboは必ず使うことになるかと思います。
今回Rviz2は、ROS2に付属しているツールということも関係しているためか、特に起動に際して問題はなかったのですが、Gazeboの方はROSの外部補完ツールなので、ROSとの連携がどこかで上手く行かなかったのでは?と邪推しました。
Gazeboソフトのインストール方法が若干ややこしくて、上手く起動しなかったということは、以前のブログでも紹介しましたが、今回の不具合はGazeboが正常に起動した上での話で、カメラやLiDARなどのセンサーが起動しないというものです。
開発用PCのOS(ここではUbuntuの主要バージョンのみを示しています)に応じて、下図のように、各ソフトの対応バージョンが異なります。
OS version | Ubuntu20.04 | Ubuntu22.04 | Ubuntu24.04 |
ROS2 version | Foxy Fitzroy | Humble Hawksbill | Jazzy Jalisco |
Gazebo version | gazebo11 | Fortress | Harmonic |
私はUbuntu24.04を使用しているので、GazeboバージョンはHarmonicを使うことになります。片や、参考動画では少し古いUbuntu20.04を使っていてgazebo11なので、Gazeboシュミレーター上で各デバイスを呼び出す方法が異なっていました・・・😅
て、まあ、バージョン変わるとコマンドなども変わるって、ソフトウェアではよくある事ですね😮💨
それで、具体的な違いはと言うと、ROSとGazeboの相互通信に関して、gazebo11まではユーザー側でxacroファイルへのtopic記述などの簡単な設定をすれば、あとはプログラムで自動的に通信処理が実行されるようになっていたのですが、gazebo11以降のバージョン(通称 Ignitionと呼ばれるもの)では、相互通信にブリッジ通信方式を取り入れており、ブリッジ通信用のtopicやり取りを指示するyamlファイルを作成して、プログラム起動のためのlaunch.pyファイルからそのyamlファイルを呼び出して、通信を確立すると言う方法になっていました。また、Gazeboの画面表示にあたって、ベース空間となる”.world”(最新情報では”.sdf” ??)と言うファイルも個別に設定しないといけないようで、これを把握するのにも少々時間が掛かりました。
この通信の指示方式が変わったという内容は、Gazeboの公式ページにも記載はあったのですが、では具体的にどう指示をしたら良いかの情報は、例題としてこのturtlebot3_simulationsのページを見ろ!という説明のみで、とても理解に苦しみました😓
結局私は、別の方がYoutube上げていたこちらのGazeboチュートリアル動画も見て、ようやく理解するに至りました。
ロボットが動かない
次に、シュミレーション上のロボットが動かない(車輪が回転しない)という状況が発生したことについて紹介します。
原因を先に言ってしまうと、”gazebo_control.xacro”というファイルの記載内容の不備でした。Gazeboバージョン毎に、一部記載内容を変えないといけないというものです。
なぜ指示方法変えた!😫 って言いたくなりますねぇ。
以下の通り、記述変更しないといけない箇所がいくつかありました。
- plugin filenameの名称
- wheel_diameterからwheel_radiusに指示変更(直径から半径へ)
- max_wheel_torqueは使わない
- max_wheel_accelerationからmax_linear_accelerationに指示変更
- topicの記述追加
- odometry_frameからframe_idに指示変更
- robot_base_frameからchild_frame_idに指示変更
- odom_publisher_frequencyの記述追加(値は任意)
- publish_odomは使わない
- publish_odom_tfは使わない
- publish_wheel_tfは使わない
- tf_topicの記述追加
- Joint state publisherのplugin記述追加
具体的にどう内容を記載するかは、こちらの私のgithubをご参照下さい。
先ほど説明した”Gazeboでセンサーが起動しない”の対応と併せて、xacroファイルを変更したら、Gazebo上でロボットが動くようになりました😁
モーター制御プログラム関連
モーター制御プログラム構築では、簡便さに主眼を置いて進めたので、ハードウェアの選定が二転三転しました。なのでここでは、モーター関連の各ハードウェアを決定するに至った経緯について、主に紹介したいと思います。
まずは、モーターコンローラー(MTC)です。
MCUがラズパイ4Bだったので、MTCの方も当初ラズパイPicoを使うつもりだったんですが、ネット上で公開されている使えそうなMTCプログラムが、Arduino用のものしか見当たらなかったため、MTCにはArduinoプログラムが素直に実行できる基盤を選んだのでした。
もっとも、Arduino IDE(Arduino統合開発ツール)には、ラズパイPicoを使えるようなプラグインも用意されているのですが、Arm64版Linuxで使う場合は、最新のバージョン2ではなく、レガシーバージョンと言われるバージョン1の最終版(1.8.19)である古いものしか使えません。そのせいなのか分かりませんが、Arduino IDEから基盤へのプログラム転送時に、何度やってもエラーが出て転送できなかったため、敢えなくラズパイPicoの使用を断念しました😭
代わりに用意したのは、Arduino Picoの互換品である中国製のCH340 Nanoというものです。Arduino Picoは人気なのか、どこを探しても入荷に1ヶ月待ちとかだったので、購入を諦めました。それに、ちょっと価格も高過ぎる感があったので・・・。
次に、モータードライバーについてです。
当初モータードライバーには、性能面から判断してCytron製MDD3Aを準備していました。
参考動画で紹介されていたモータードライバーは、広く一般に普及しているL298Nというもので、Arduino用の制御プログラムも、web上で多数見つけれるほど充実していました。
一方、MDD3Aの方は、まだあまり普及していないようで、制御プログラムは公式サイトにて紹介されているC++で記述されたものしかなく、Arduino用に書き換える必要がありました。ですが、残念ながら私の場合、Arduinoを使うのは今回が初めての機会で、プログラム構成もまだよく把握できていない状態だったこともあり、今回のロボット用の制御プログラムを上手く仕立て上げる知識がまだありませんでした😔
そんなこんなで、まずはロボットを完成させることを優先したかったので、Arduinoプログラミングの理解とMDD3A用Arduinoプログラムを作成することは今後の課題とし、今回はL298Nを使うことにしました。
最後に、モーター選定について紹介します。
モーターも基本的には、参考動画で採用しているものになるべく近い仕様のもの、を揃えることに注力しました。但し、大前提として、モーターコントローラーで回転数制御できるように、エンコーダー付きのDCモーターが必要でした。その次に、動作電圧12Vのものという条件でした。消費電力も気になるところですが、これについては使うバッテリーとの兼ね合いで考えれば良いですね。ちなみに私が選定したものは、定格で0.16A必要なものでした。
以上の前提条件を基に、参考動画のホイール画像などから推測して、Amazonに似たようなものがあったので、それを選ぶことにしたんですが、見た目はほぼ同じだけど回転数とかサイズが微妙に違うものがいくつかあって、最初どれを選んでいいか迷いました。
あれこれ調べたところ、参考動画の中で、モーター1回転当たりのエンコーダーカウント数を確認する場面があって、その数値になるべく近い値を出せるものを選ぶことにしました。なお、ホイールとタイヤも付属していたので、追加で部品を探す手間も省けてとてもリーズナブルでした。
終わりに
基本的には参考動画に則って製作を進めれるのですが、そうそう一筋縄では行かないのが世の常でして、今回はそんな頭を抱えたことについて、淡々と書いてみました。
上手く行かないと最初はイライラしたり動揺したりしますが、またスキルアップのチャンスが来た!(ピンチはチャンス!)と捉えて、私は取り組むことにしています。
何事も根気強さが大事なんじゃないでしょうかね😁
差動駆動ロボットに関しては、もう少し紹介しておきたい内容があるので、また次回もこのテーマを継続したいと思います。
それでは、また次回。
〆