Arduino LIDAR
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 |
アプリとオンラインサービス
> |
| |||
|
このプロジェクトについて
LiDARに関するいくつかのこと
LIDAR(Light Detection and Ranging)は、ターゲットに光を当てることでターゲットの距離を測定できる光学リモートセンシングシステムです。 LIDARテクノロジーは、ロボット工学で環境の認識とオブジェクトの分類に使用されています。地形の2D標高マップ、地面までの高精度の距離、および接近速度を提供するLIDARテクノロジーの機能により、ロボットおよび有人車両を高精度で安全に着陸させることができます。
LIDARは、ターゲットをレーザービームで照らす送信機と、送信ビームと本質的に同軸である光の成分を検出できる受信機で構成されています。受信機センサーは、光がターゲットに到達して戻るのに必要な時間に基づいて距離を計算します。ミラーを備えた機械的メカニズムが光線を掃引し、回転するうなずきミラーを使用して、平面内または3次元でさえ必要なシーンをカバーします。
光ビームの飛行時間を測定する1つの方法は、パルスレーザーを使用して、経過時間を直接測定することです。このようなデバイスには、ピコ秒を解決できる電子機器が必要であるため、非常に高価です。もう1つの方法は、反射光の位相シフトを測定することです。
位相シフト測定には、コリメート赤外線レーザーを使用します。入射光の波長よりも粗さが大きい表面の場合、拡散反射が発生します。赤外光の成分は、物体の透過ビームとほぼ平行に戻ります。
センサーは、送信信号と反射信号の間の位相シフトを測定します。写真は、この手法を使用して距離を測定する方法を示しています。変調信号の波長は次の式に従います。
c =f∙τ
ここで、cは光速、fは変調周波数、τは既知の変調波長です。
放出された光がカバーする合計距離D 'は次のとおりです。
D '=B + 2A =B +(θ*τ)/2π
ここで、Aは測定された距離です。 Bは位相測定ユニットからの距離です。したがって、ビームスプリッターとターゲットの間に必要な距離Dは、
によって与えられます。 D =τ*θ/4π
ここで、θは透過光ビームと反射光ビームの間の電子的に測定された位相差です。
範囲は受信信号の振幅の2乗に反比例し、センサーの精度に直接影響することを示すことができます。
(http://home.roboticlab.eu/en/examples/sensor/lidarからコピー)
最終年度のプロジェクトの一環として、自動運転車の周囲の2Dマップが必要です。そのため、LiDARを選択します。これは、非常に高速で正確だからです。超音波を跳ね返すソナーとは異なり、センシングの「コーン」は非常に狭いです。
VL6180xまたはVl53l0xは、STMicroelectronicsの光学センサーです。VL53L0xははるかに正確で、直線性の問題や、オブジェクトが非常に遠いのか非常に近いのかがわからない「ダブルイメージング」はありません。
この飛行時間センサーは、実際に携帯電話でカメラの焦点を調整するために使用されます。
回路図
Adafruitライブラリをインストールする
Arduinoコード
#include #include "Adafruit_VL6180X.h" #include Adafruit_VL6180X vl =Adafruit_VL6180X(); Servo myservo; float pos =0; const float Pi =3.14159; void setup(){myservo.attach(9); Serial.begin(115200); while(!Serial){delay(1); } if(!vl.begin()){while(1); }} void loop(){for(pos =0; pos <=180; pos + =.5){myservo.write(pos); uint8_t range =vl.readRange(); Serial.println(String(range)+ "p" + String(pos * Pi / 180)+ "p" + String(pos)); delay(10); } / * for(pos =180; pos> =0; pos- =.5){myservo.write(pos); uint8_t range =vl.readRange(); {Serial.println(String(range)+ "p" + String(pos * Pi / 180)+ "p" + String(pos)); delay(10);}} * / myservo.write(0); delay(2000);}
コードの処理 (優れたレーダーインターフェースが必要な場合は、他のレーダープロジェクトを参照してください)実行する前にArduinoポート番号(「COM3」など)を変更します。
importprocessing.serial。*; Serial myPort; String val; int range、i =0; float pos; void setup(){size(550,500); String portName ="COMx"; // x =あなたのarduinoポート番号myPort =new Serial(this、portName、115200); background(255);} void draw(){if(myPort.available()> 0){val =myPort.readStringUntil( '\ n'); if(val!=null){String [] nums =split(val、 "p"); //受信したデータを 'p'で分割するif(nums.length ==3){range =int(nums [0 ]); //文字列から整数への変換pos =float(nums [1]); i =int(nums [2]); if(i ==180){background(255); }}}} translate(25、-50); line(250,500,250-2 *(range * cos(pos))、500-2 *(range * sin(pos))); }
センサーの速度は10Hzに制限されており、高速ではサーボの応答が悪くなります。高速LIDARの作成を計画している場合は、フィードバックシステム付きのステッピングモーターまたはDCモーターを使用してください。連続回転にはスリップリングを使用します(https://www.adafruit.com/product/736)。
ご質問、ご提案は大歓迎です!
コード
- Arduinoコード
- コードの処理
Arduinoコード Arduino
#include#include "Adafruit_VL6180X.h" #include Adafruit_VL6180X vl =Adafruit_VL6180X(); Servo myservo; float pos =0; const float Pi =3.14159; void setup(){myservo.attach(9); Serial.begin(115200); while(!Serial){delay(1); } if(!vl.begin()){while(1); }} void loop(){for(pos =0; pos <=180; pos + =.5){myservo.write(pos); uint8_t range =vl.readRange(); Serial.println(String(range)+ "p" + String(pos * Pi / 180)+ "p" + String(pos)); delay(10); } / * for(pos =180; pos> =0; pos- =.5){myservo.write(pos); uint8_t range =vl.readRange(); {Serial.println(String(range)+ "p" + String(pos * Pi / 180)+ "p" + String(pos)); delay(10); }} * / myservo.write(0); delay(1000);}
コードの処理処理
importprocessing.serial。*; Serial myPort; String val; int range、i =0; float pos; void setup(){size(550,500); frameRate(36); String portName ="COMx"; // x =あなたのarduinoポート番号myPort =new Serial(this、portName、115200);背景(255); } void draw(){if(myPort.available()> 0){val =myPort.readStringUntil( '\ n'); if(val!=null){String [] nums =split(val、 "p"); //受信したデータを 'p'で分割するif(nums.length ==3){range =int(nums [0 ]); //文字列から整数への変換pos =float(nums [1]); i =int(nums [2]); if(i ==180){background(255); }}}} translate(25、-50); line(250,500,250-2 *(range * cos(pos))、500-2 *(range * sin(pos))); }
製造プロセス