Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino-LIDAR

Komponenten und Verbrauchsmaterialien

Arduino UNO
× 1
SparkFun ToF-Entfernungsmessersensor - VL6180
VL53L0X für große Reichweite und VL6180X für kurze Reichweite. hier habe ich VL6180X verwendet
× 1
Servomotor
× 1

Apps und Onlinedienste

Arduino-IDE
Verarbeitung

Über dieses Projekt

Ein paar Dinge zu LiDAR

LIDAR (Light Detection and Ranging) ist ein optisches Fernerkundungssystem, das die Entfernung eines Ziels messen kann, indem es mit Licht beleuchtet wird. Die LIDAR-Technologie wird in der Robotik zur Wahrnehmung der Umgebung sowie zur Objektklassifizierung eingesetzt. Die Fähigkeit der LIDAR-Technologie, 2D-Höhenkarten des Geländes, einen hochpräzisen Abstand zum Boden und eine Anfluggeschwindigkeit bereitzustellen, kann eine sichere Landung von Robotern und bemannten Fahrzeugen mit einem hohen Maß an Präzision ermöglichen.

LIDAR besteht aus einem Sender, der ein Ziel mit einem Laserstrahl beleuchtet, und einem Empfänger, der die Lichtkomponente erfassen kann, die im Wesentlichen koaxial zum gesendeten Strahl ist. Empfängersensoren berechnen eine Entfernung basierend auf der Zeit, die das Licht benötigt, um das Ziel zu erreichen und zurückzukehren. Ein mechanischer Mechanismus mit einem Spiegel schwenkt den Lichtstrahl, um die gewünschte Szene in einer Ebene oder sogar in drei Dimensionen abzudecken, wobei ein rotierender Nickspiegel verwendet wird.

Eine Möglichkeit, die Laufzeit des Lichtstrahls zu messen, besteht darin, einen gepulsten Laser zu verwenden und dann die verstrichene Zeit direkt zu messen. In solchen Geräten wird eine Elektronik benötigt, die in der Lage ist, Pikosekunden aufzulösen, und sie sind daher sehr teuer. Eine andere Methode besteht darin, die Phasenverschiebung des reflektierten Lichts zu messen.

Zur Phasenverschiebungsmessung wird ein kollimierter Infrarotlaser verwendet. Bei Oberflächen mit einer Rauhigkeit größer als die Wellenlänge des einfallenden Lichts tritt eine diffuse Reflexion auf. Die Komponente des Infrarotlichts wird bei Objekten fast parallel zum durchgelassenen Strahl zurückkehren.

Der Sensor misst die Phasenverschiebung zwischen den gesendeten und reflektierten Signalen. Das Bild zeigt, wie diese Technik zur Entfernungsmessung verwendet werden kann. Die Wellenlänge des modulierenden Signals gehorcht der Gleichung:

c =f ∙ τ  

wobei c die Lichtgeschwindigkeit und f die Modulationsfrequenz und τ die bekannte Modulationswellenlänge ist.

Die vom emittierten Licht zurückgelegte Gesamtstrecke D' beträgt:

D' =B + 2A =B + (θ * τ) / 2π 

wobei A der gemessene Abstand ist. B ist der Abstand von der Phasenmesseinheit. Der erforderliche Abstand D zwischen Strahlteiler und Ziel ist daher gegeben durch

D =τ * θ / 4π 

wobei θ die elektronisch gemessene Phasendifferenz zwischen den gesendeten und reflektierten Lichtstrahlen ist.

Es kann gezeigt werden, dass die Reichweite umgekehrt proportional zum Quadrat der empfangenen Signalamplitude ist, was sich direkt auf die Genauigkeit des Sensors auswirkt.

(kopiert von http://home.roboticlab.eu/en/examples/sensor/lidar).

Als Teil meines Abschlussprojekts benötige ich die 2D-Umgebungskarte für mein autonomes Fahrzeug, also wähle ich LiDAR, weil es so schnell und genau ist. Im Gegensatz zu Sonaren, die Ultraschallwellen reflektieren, ist der „Kegel“ der Wahrnehmung sehr schmal.

VL6180x oder Vl53l0x ist ein optischer Sensor von STMicroelectronics. VL53L0x ist viel präziser und hat keine Linearitätsprobleme oder "doppelte Bildgebung", bei der Sie nicht sagen können, ob ein Objekt sehr weit oder sehr nahe ist.

Dieser Time-of-Flight-Sensor wird tatsächlich in unserem Mobiltelefon verwendet, um den Fokus der Kamera einzustellen.

Schaltplan

Installieren Sie die Adafruit-Bibliothek

Arduino-Code

#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 (!Seriell) { Verzögerung (1); }if (! vl.begin()) { while (1); }}void loop () { for (pos =0; pos <=180; pos +=.5) { myservo.write (pos); uint8_t-Bereich =vl.readRange(); Serial.println (String (Bereich) + "p" + String (pos * Pi/180) + "p" + String (pos)); Verzögerung(10); } /*für (pos =180; pos>=0; pos -=.5) { myservo.write(pos); uint8_t-Bereich =vl.readRange(); { Serial.println (String (Bereich) + "p" + String (pos * Pi/180) + "p" + String (pos)); delay(10);} }*/ myservo.write(0); Verzögerung(2000);} 

Verarbeitungscode (Wenn Sie eine gute Radarschnittstelle benötigen, beziehen Sie sich auf ein anderes Radarprojekt.) Ändern Sie die Arduino-Portnummer (zB "COM 3"), bevor Sie sie ausführen.

import processing.serial.*;Serial myPort;String val;int range,i=0;float pos;void setup(){ size(550,500); String portName ="COMx"; // x =Ihre Arduino-Portnummer 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"); // Aufteilen der empfangenen Daten, die mit 'p' getrennt sind if(nums.length==3) { range=int(nums[0 ]); //String in Integer-Konvertierung pos=float(nums[1]); i=int(Zahlen[2]); Wenn (i ==180) { Hintergrund (255); } } }}translate(25,-50);line(250,500,250-2*(range*cos(pos)),500-2*(range*sin(pos))); } 

Die Geschwindigkeit des Sensors ist auf 10 Hz begrenzt und die Reaktion des Servos ist bei höheren Geschwindigkeiten schlecht. Wenn jemand plant, Hochgeschwindigkeits-LIDAR herzustellen, verwenden Sie Schrittmotoren oder Gleichstrommotoren mit Feedback-System. Verwenden Sie Schleifringe für kontinuierliche Rotation (https://www.adafruit.com/product/736).

Bei Fragen, Anregungen sind willkommen!

Code

  • Arduino-Code
  • Verarbeitungscode
Arduino-CodeArduino
#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 (!Seriell) { Verzögerung (1); } if (! vl.begin()) { while (1); }}void loop () { for (pos =0; pos <=180; pos +=.5) { myservo.write (pos); uint8_t-Bereich =vl.readRange(); Serial.println (String (Bereich) + "p" + String (pos * Pi/180) + "p" + String (pos)); Verzögerung(10); } /*für (pos =180; pos>=0; pos -=.5) { myservo.write(pos); uint8_t-Bereich =vl.readRange(); { Serial.println (String (Bereich) + "p" + String (pos * Pi/180) + "p" + String (pos)); Verzögerung(10); } }*/ myservo.write(0); Verzögerung(1000);}
VerarbeitungscodeVerarbeitung
import processing.serial.*;Serial myPort;String val;int range,i=0;float pos;void setup(){ size(550,500); FrameRate(36); String portName ="COMx"; // x =Ihre Arduino-Portnummer myPort =new Serial (this, portName, 115200); Hintergrund(255); }void draw(){ if ( myPort.available()> 0) { val =myPort.readStringUntil('\n'); if(val!=null) { String[] nums=split(val,"p"); // Aufteilen der empfangenen Daten, die mit 'p' getrennt sind if(nums.length==3) { range=int(nums[0 ]); //String in Integer-Konvertierung pos=float(nums[1]); i=int(Zahlen[2]); Wenn (i ==180) { Hintergrund (255); } } } }translate(25,-50);line(250,500,250-2*(range*cos(pos)),500-2*(range*sin(pos))); }

Herstellungsprozess

  1. Gaslaterne
  2. Laserpointer
  3. Taschenlampe
  4. Kaleidoskop
  5. Halbleiterlaser
  6. Fotografieren
  7. Verkehrssignal
  8. Glühbirne
  9. Glasfaser
  10. Kodiak 3D-LiDAR