K-ei
格安USD 10.00LiDAR が動いた!
見出し画像

格安USD 10.00LiDAR が動いた!

K-ei

~ 経緯 ~
ツイッターのTLに某中華通販サイトで売られている半ばジャンク(?)なLiDARが動いたという話を見かけすぐにポチったのが2020/8/19のことでした。価格は送料込USD 10.00ポッキリ。
思ったより早く2020/9/3には無事に手元に届きました。

~ そもそもLiDARって何よ? ~
- レーザー光を発射して周囲の物体からの反射時間で距離を測ります。
- 測定ユニットがモーターで回転し周囲360°を測定出来ます。
- 高性能なら遠くまでより正確に測れます。

最近では自動車の自動運転技術とかのコンテクストで見かけたことがあるかもしれませんが、なんせ今までは非常に高価なデバイスで個人で買うものではありませんでした。それでも短距離用の単体センサ(例えばSTMのVL53L0Xとか)はそこそこ安くなってきたのですが、周囲を測定するにはグルグル回す必要がありパッケージとなるとやはり数百~千ドル位なイメージ。

なのでUSD10.00(送料込)はコンビニの〇〇クジの感覚で買い。不稼働品もあるようで、ある報告では半々位の確率で外れがくるという話しも...。

~ 接続 ~
実際にはロボット等に搭載するのですが稼働実験なのでPCにつなぎます。
このLiDAR、データシート等の資料は提供されていないですが既に先人達が成果を共有してくれているのでそれらを参考に進めます。
基板上には空きコネクタがありこれは基板上のシルクで表示されている様にTX, GND, VCC (5V) につながっています。

画像1

残念なことにこのコネクタよくあるJSTのパチモノではない上2mmピッチの様で手持ちのコネクタ、ジャンパ線等がうまく挿さりませんでした。
なので基板上部にある6ピン用のランドにピンヘッダをハンダします、こちらは通常の0.1"ピッチ。

画像2

モーターの電源ケーブルを抜き、4本のタッピングビスを外すと基板が動かせるようになります、但し、基板中央の穴に通ってるウレタン線は(多分)センサユニットにワイヤレス給電するためのコイルにつながっておりそのままではひっこ抜けないので、慎重にウレタン線を伸ばしながら基板をユニットから離しハンダ作業できるスペースを作ります。
今回はL字ピンヘッダを6ピン分切出し、ピンの先端がモーターと反対側へ向くようにハンダします。

画像3

ウレタン線がつながっているのが画像に映っています。うまいこと基板を浮かしてピンヘッダをマスキングテープ等で仮止めしてさっくりハンダします。鏝先をあまり突っ込めないのでハンダ不足の感はありますがよしとしましょう。

画像4

出来上がり & USBシリアル基板との接続 (「試験品」のシールが^^;)

 (LiDAR) TX --> RX (USBシリアル)

あとはGND (黒) と VCC (赤) とをつなげばOK。VCC は 5V なので上のUSBシリアル基板ではジャンパピンを 5V 側に挿してあります。
(DC モータの電源もUSBシリアル基板からとるのはどうかとも思いましたが、他でも別途給電していない例があり動いているので今は良しとします)

この状態でUSBシリアル基板をUSBケーブルでPCのUSBにPCにつなぐとモーターが回転、プーリーにかかったバンドで測定ユニットも回転し始めます。計測の為にはユニットから出力されるデータをPC側で受信する必要があるのでまずはデバイスマネージャー等でこのUSBシリアル基板にどのCOMポートが割り当てられたか確認します。

画像5

COM3 です、COM1 もありますが USB シリアル基板の載っているチップのメーカーが FTDI なので COM3 と判別できます。設定は 115200bps、データ 8、パリティ なし、ストップ 1、フロー制御 なし。

シリアルターミナル等を立ち上げ COM3 から何かを受信していれば疎通が確認できます。Arduino の IDE を立ち上げシリアルモニタで眺めます。

画像6

判読できないデータが受信され自動スクロールを ON にしておくとどんどん画面が流れていきます。まずは何かを受信していることが確認出来ました。

~ LiDAR っぽく使ってみる、周囲の距離測定 ~
先人の Python スクリプトで360° 方向の距離が測れているか (=周囲の形状がとれているかどうか) を試します。測定値表示の上限が2mだったのを4mに変更して実行。

    # 表示する最大距離の初期値を2000に設定
   rmax = 4000

画像7

小さい物が置いてあったりカーテンだったりのところはそれなりの反応ですが、壁やらドアやらはおおまかに形状が読み取れます。これで一応稼働していることは確認できたということで。

~ おまけ、ロジアナで信号を読む ~
ロジアナというのはロジックアナライザーのことで、電気信号を可視化してくれます。信号 (ユニットのTX) と GND にプローブをつなぎ電位の変化 (0~5V) をグラフ的に表示してくれます。更には信号の解析までやってるれるので下の画像ではビット列を16進数の列に再構成してくれています。

画像10

このユニットの素性は某中華ロボット掃除機に搭載されていた Camsense X1 と判明しています。測定距離は 8~800cm と遊ぶには十分。
プロトコル解析の結果、送信されてくるデータのヘッダは、
 0x55, 0xAA, 0x03, 0x08
の 4byte で、その後に回転速度、開始位置、距離、信号強度...が続きます。

画像8

画像9

上がひとかたまりのデータで下は最初の部分の拡大。
固定のヘッダ 4byte のあとは
 0xA8, 0x4D = 0x4DA8 = 19880 これを 64 で割った値 約310.6rpm = 約5rps
 0x61, 0xD4 = 0xD461 = 54369 ここから固定値40960を引いて64で割ると 約209° (開始角度) が求められます。
 0xF8, 0x00 = 0x00F8 = 248 mm (距離)
 0x1C = 28 (信号強度)
... (計測データ、距離 (2byte) と信号強度 (1byte) のペアが合計8回分)
 0x06, 0xD6 = 0xD606 = 54790 ここから固定値40960を引いて64で割ると 約216° (終了角度) が求められます。

なので17°の間に8回計測データを送ってくるので角度分解能は2.4° (?)。角度分解能は1°未満という話も見かけたのでこの辺りは「試験品」ならではなのかも。製品ページには測定速度は2080Hzとあるので5rpsならば1周当たり416回計測してくれるから360÷416=0.87° が角度分解能と計算したのかも。移動しなければ少し角度がずれた状態で計測されるので結果1°未満の分解能を得ているのかもしれませんが、生データ1個だけ取り上げてみれば上記のようなことなのかもしれません...。
回転速度が上がれば (限界はあるでしょうが) 分解能が上がる構造なのでプーリーの軸に潤滑剤を差す手も...(やりません)。

因みに上記データ以降の開始/終了角度を追いかけてみると
 209/216, 216/223, 224/230, 231/237...
で、6 ~ 7° を 7分割 (8データポイント) で計測しているようです。
1°ずれて2周すれば角度分解能は約半分の1+°か。
ザックリザックリ^^。

(追記)
そういえば電源が...^^;、モーターへの給電もUSBシリアルからのせいぜい数百mA、これを別途用意してやればもっと早くモーターが回りそう=角度分解能は公称の値に近づく(?)。
追試したら書き足します。

~ 参考 ~
激安LiDAR(Camsense X1)を使ってみる
6ドルの激安LiDAR(Camsense X1)を使ってみる
rossihwang/camsense_parser.py
Vidicon (ROS1/2用ドライバやDiscordが)

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
K-ei
文系マスターな社会人 2020年2月に実施されたPiscineを乗り越え42Tokyo 1期生として在籍中