Episode 17 ROSで差動駆動ロボットを作ってみた(その3)

ブログ
Vol.3

皆さん、こんにちは、グレキチです。

6月に入りました。
先週は梅雨らしく雨天が続きましたが、今週の天気予報を見てみると、一転して晴れマークが続いています。本日は、日中はもう初夏のような暑さです。
会社勤めしていた時は、もう二度と夏休みみたいな長期休暇は取れないなーと思っていましたが、フリーランスになってみると、毎日が休暇のようにも受け取れる感覚に、非常に楽しさと嬉しさを感じています。
以前は毎日、日々の仕事に追われていたこともあって、自分がブログを書くなんか全く想像できませんでしたが、このような自分裁量の環境に身を置くことを選んだから心に余裕が出来て、今こうして継続してブログ作成等に取り組めているんだろうなと強く感じます。

と、感傷にふけるのはこれ位にして😆、今回は“ROSで差動駆動ロボットを作ってみた”の第3回目の投稿になります。

前回は、ハードウェアとソフトウェアの互換性に関することについて紹介しました。今回は、もっと具体的な部品単位の話で、カメラとLiDARに関して、部品選定から使用に至るまでの設定方法等について語っていきたいと思います。

カメラについて

メインコントロールユニット(MCU)にはラズパイを採用したので、配線や電源供給などの観点から考えて、ラズパイ純正品(Raspberry Pi Camera V2など)を使った方が良かったんですが、以前ROS学習のチュートリアル用に買ったUSBカメラが既にあったので、できれば流用したいということで、今回はそれを使うことにしました。そのため、参考動画には無い内容なので、自分で調べて実装対処する必要がありました。
USBカメラを使用する場合、WindowsやMacなら自動的にドライバーをダウンロードするのですぐに使うことができますが、Linuxの場合はそうはいきません。
ということで、カメラに見合ったドライバーソフトが必要になります。今回選んだカメラのメーカーであるLogicoolのホームページにあるかと思ったら、対応OSがWindowsとMac用のものしか提供されてませんでした😭
そんな冷たい対応にもめげることなく、さらにググること小一時間、ようやく何とか使えそうなドライバーソフトを発見できたのでした。それがこちらのサイトなんですが、このサイトは、UVC(USB Vidoe Class)に準拠した多くのデバイスのドライバーを提供してくれています👍

それで、このサイトからデバイスドライバーをダウンロードしてインストールしました。しかし、まだRviz2とGazebo上でカメラ画像が表示されません・・・。試しに、ロボットの起動プログラムを実行してみると、カメラドライバーが起動しているのは確認できたので、追加したドライバーのせいではない他の何かが原因のようでした🤔
いやー、これの原因特定には、実に丸2日ほど掛かりました。時系列でいうと、一日やってよく分からなかったので、一旦はこの原因特定を中断し、他の単元の項目に移ったりして1週間くらい放置後、再度トライして解決した感じでした💦
で、具体的に何だったかと言うと、前回記事のGazeboの通信方法のところでも紹介したブリッジ通信に関するcamera.xacroファイルの記述内容の不備でした。topic内容として、“camera/image_raw”という設定をして、それをブリッジ通信を使って読み込むようにする必要がありました。正しく設定した結果?、これで晴れて、各シュミレーターでもカメラ画像を表示できるようになりましたが、もう一つ気になることがありました。
それは、Rviz2でのグラフィック上の表示の問題で、カメラの画角がわかるように、ワイヤフレームで視覚的に表示するものです。(タイトル画像にもあるワイヤフレームのこと)
実際にカメラは起動できるので、ここにあまりこだわる必要は無かったのかも知れませんが、参考動画の内容と違うと何か納得いかなかったので、ちょっと必死になって設定してみました😅
調べた結果、これもxacroファイルの記述内容の不備が原因でした。gazebo -> sensor -> cameraの中の記述に、”camera_info_topic”として”camera/camera_info”というものを設定しないといけないようでした。詳細はここにあります。ちなみに、sensor項目の中にあった、”plugin”の記述は不要になったようでした。

これでようやく、カメラの一連の設定が完了出来たのでした。

LiDARについて

LiDARって今回のロボット制作で初めて使ったんですが、基本的には値が張るもので、部品選びに際しては開発費との兼ね合いが大きかったです。そのため、要求性能を満足した極力値段が安いものを必死に探しました。結果、やはり中国製になったんですが、昨今の状況から、何か変な回路組まれたりしてないよな?と、ついつい疑ってしまう自分がいます😅
LiDARに関しては、将来的には3D測定できるものも購入して、より実世界に即したデータを活用するデバイスの開発などに活用したいと考えています。
今回選んだLiDARは深圳EAIテクノロジー社製YDLIDARのT-mini Proというもので、その主要スペックを下表に示します。

項目仕様
測距方式ToF
作動電圧5V
消費電流(max)1A
範囲周波数帯4,000Hz
測定可能距離0.02〜12m
角度分解能0.54°
スキャン頻6〜12Hz
スキャン角度360°
外観サイズ39 ✖︎ 39 ✖︎ 34mm

こだわりポイントは、測距方式がToF(Time of Flight)であること、測定可能距離が近距離(今回のものは20mm)から可能であること、スキャン角度が360°、外観サイズが極力小さいこと、です。
その内、測距方式については、他に三角測量方式というものがあるようで、こちらは近距離測定の精度が良くて、ToF方式に比べると価格は比較的安い一方、外観が大きくなってしまうのがマイナスポイントのようでした。
参考動画で使われているRPLiDARは、広く一般的に普及しているもののようでした(eBayで調べたら大量にヒットしました)が、外観サイズが少々大きかったのと、センサーを回転させる駆動部品(ベルトなど)が剥き出しになっていたのが気に入らなかったので、選択肢から外しました。

次に、LiDAR実装にあたっての設定についてのポイントとなるところです。まずは簡単な内容となるxacroファイルの記述変更について。
LiDARはカメラ設定ほど込み入ってはおらず、参考動画で提示されているxacroファイルのいくつかの項目を、下記の通り変更するだけでした。

  • <gazebo>タグ内の <sensor type=”ray”> → <sensor type=“gpu_lidar”> に変更
  • <sensor>タグ内に <topic>scan</topic>を追記
  • <sensor>タグ内の <ray> → <lidar> に変更
  • <sensor>タグ内の <plugin>の記述をタグごと削除

なお、記述内容の詳細は、カメラ同様にこちらもGazeboホームページのここに記載されています。

xacroファイルについては、こんな感じで項目をちょっと書き換えれば済んだんですが、最も設定に苦戦したのは、LiDARドライバーのインストール方法と起動プログラムの設定でした。これについては、設定がうまくいくまでに、実に1週間ほど掛かったと思います😮‍💨
苦戦したポイントを箇条書きにすると、

  1️⃣ LiDARドライバーインストールで使用するYDLidar-SDKのバージョン
  2️⃣ YDLidar-SDKのビルド方法(※UbuntuOSバージョンに起因する問題)
  3️⃣ ydlidar_launch.py、ydlidar_launch_view.pyの内容書き換え

と、こんな感じです。
それでは、各々具体的に見て行きましょう。

1️⃣ LiDARドライバーインストールで使用するYDLidar-SDKのバージョン
YDLIDARはドライバーやマニュアルなどを自社のHPに掲載しています。マニュアルを確認すると、Linuxへのドライバーインストールの場合、YDLidar-SDKとROS Driverの2つをインストールする必要があり、先にSDKの方をインストールしないといけません。
SDKはメーカーHPからダイレクトにダウンロード出来るんですが、これだとバージョンが古いらしく、ROSドライバーのインストール時にエラーが出ます。よって、SDKは別途、メーカーのgithubにアップされてる最新のものを使わないといけません。(※2025/6/17現在、SDKはダイレクトでダウンロードできなくなっており、 githubへのリンクが表示されるように変更されていました)

2️⃣ YDLidar-SDKのビルド方法
ビルド作業を進めて行くと、Python APIのインストールを促されて、下記コマンドの実行を指示されます。

pip install .

しかし、ここでエラーが出て、インストールに失敗しました。
これは、UbuntuOSのバージョンに起因する問題?のようでした。Ubuntu18.04までは動作確認しているようでしたが、それ以降のバージョンを使う場合は同じ問題に遭遇すると思われます。
さらに調べてみたら、pip version 23.0から設定されたpython環境を保護するための措置(PEP668)というもののようでした。
考えた結果、強制的にインストールを実行する、下記コマンドを使いました。

pip install --user . --break-system-packages

本来なら、代替案として提示されているpipxを導入するなどで対応し、上記コマンドでの強制インストールはしない方がいいんだと思います。が、私の場合、自己責任にて、今回は時間優先のため、良しとしました😄

3️⃣ ydlidar_launch.py、ydlidar_launch_view.pyの内容書き換え
両ファイル共に、書き換える箇所は同じで、下記2箇所の変更が必要です。

  • “params_declare”のyamlファイル名を、”TminiPro.yaml”に変更
  • “tf2_node”の”arguments”の内容を、数値だけから要素名と数値の記述に変更
    例:arguments=[‘–x’, ‘0’, ‘–y’, ‘0’, ‘–z’, ‘0.02’, ‘–yaw’, ‘0’, ‘–pitch’, ‘0’, ‘–roll’, ‘0’, ‘–frame-id’, ‘base_link’, ‘–child-frame-id’, ‘laser_frame’]

ということで、LiDARの実装上のポイントについても、これで以上になります。

まとめ

全3回に渡って、差動駆動ロボットの製作過程に関して、長々と記事にしてみました。
もっと細かい設定のところなんかでも、実装上で足踏みしたところが他にもいくつもありましたが、それらについては、参考動画と動画のコメント欄をよーく観ればわかる範囲のことなので、ここでは割愛することとし、このシリーズはこれ位で締めくくることにします。

すでに次のロボットの開発構想を始めていたりするので、それが完成できたら、また同じように紹介したいなと思っています。

ということで、初めての長編ブログはこれにて完結です。

それでは、また🖐️