2018年6月10日日曜日

YDLidar X4 をESP32で使ってみた

1万円LidarのYDLidar X4を使ってみた記録です。

概要

・YDLidar X4のシリアル信号デューティ比問題を改造で乗り切り、ESP32を含む様々なシリアルに繋ぎやすくした。
・ESP-IDF向けの実装でデータを取得できるようにした。
・角度計算の式を近似式で軽量化した。


ハードウェアの修正

YDLidar X4にはシリアルのデューティ比が狂うという問題があります。以下のオシロの図はLow/High/Low/Highとなっていますが、真ん中のHiとLowの幅をみると長さが違います。これを修正する必用があります。
この問題を修正する改造ポイントが以下になります。ここは赤外線で来た鈍った信号を閾値で0/1に変換するコンパレータが入っています。矢印の先が閾値を決定する12kの抵抗(
2個)です。

 上の図でP2の位置の電圧を可変にするために、既存の抵抗をとっぱらった後に、
抵抗とポテンショを以下のように繋ぎます。
P1==[R4.7k]==[POT 10k]==[R4.7k]==P3
ポテンショの中点をP2に接続すればOKです。
調整はオシロがあれば、良いのですが、なければ以下の私の実装だと、check sum errorをESP_LOGEで出力しているので、そのerrorが減るように真ん中付近からポテンショを動かしてみて下さい。

ESP-IDF用の実装

オフィシャルにはArduino用の実装があります。(https://github.com/EAIBOT/ydlidar_arduino)しかし、この実装はIO待ちをループで実装しているため、ESP-IDFにはむきません。ということで、実装してみました。
 https://bitbucket.org/akira_you/esp-ydlidarx4/

使い方はmain.c及びydlidarTask.hを見て下さい。C言語でのインターフェイスで呼び出しています。複数のYDLidarを使うにはydlidar_beginの中身を参考にYDLidarクラスを直接呼び出して下さい。

計算高速化(興味ある人向け余談)

 ESP32で使う上で残る問題が計算量です。YDLidar X4のデータは「角度」と「距離」からなりますがこの角度は、距離に依存して補正するAngCorrectという関数で補正をかける必要があります。こいつがatanを含んでいるのですが、5kHzでatanを計算するのはESP32には余裕というわけではないです。
角度補正式

このAngCorrectは十分にDistanceがあれば、1/(a*[Distance]+b)-cという式の形に近似できます。Cは無限遠時の値、約-7.99に固定できるのでa,bを以下のスクリプトで120mmから10mの範囲で最適化しました。(ちなみに120mmは最小測定距離)
  https://gist.github.com/akirayou/3fd54239e6bbd4abb416c8bea73ad1f0




YDLidarX4は罠の多い製品ですが、1万円ならないよかましですよね。
以上