Arduino LIDAR
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
| ||||
|
关于这个项目
关于 LiDAR 的一些事情
激光雷达(Light Detection and Ranging)是一种光学遥感系统,可以通过用光照射目标来测量目标的距离。激光雷达技术正在机器人技术中用于环境感知和物体分类。激光雷达技术能够提供二维地形高程图、高精度对地距离和接近速度,可以使机器人和载人车辆高精度安全着陆。
LIDAR 由一个发射器和一个接收器组成,发射器用激光束照射目标,接收器能够检测与发射光束基本同轴的光分量。接收器传感器根据光到达目标并返回所需的时间计算距离。带有镜子的机械机构使用旋转点头镜将光束扫过,以覆盖平面甚至三维所需的场景。
测量光束飞行时间的一种方法是使用脉冲激光,然后直接测量经过的时间。在此类设备中需要能够解析皮秒的电子设备,因此它们非常昂贵。另一种方法是测量反射光的相移。
准直红外激光用于相移测量。对于粗糙度大于入射光波长的表面,会发生漫反射。红外光的分量将几乎平行于物体的透射光束返回。
传感器测量传输和反射信号之间的相移。图片显示了如何使用这种技术来测量距离。调制信号的波长服从方程:
c =f ∙ τ
其中c为光速,f为调制频率,τ为已知调制波长。
发射光覆盖的总距离D'为:
D' =B + 2A =B + (θ * τ) / 2π
其中 A 是测量距离。 B 是与相位测量单元的距离。因此,分束器和目标之间所需的距离 D 为
D =τ * θ / 4π
其中 θ 是透射光束和反射光束之间的电子测量相位差。
可以看出,距离与接收信号幅度的平方成反比,直接影响传感器的精度。
(复制自 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);而(!串行){延迟(1); }if (!vl.begin()) { while (1); } }void loop() { for (pos =0; pos <=180; pos +=.5) { myservo.write(pos); uint8_t 范围 =vl.readRange(); Serial.println(String(range)+"p"+String(pos*Pi/180)+"p"+String(pos));延迟(10); } /*for (pos =180; pos>=0; pos -=.5) { myservo.write(pos); uint8_t 范围 =vl.readRange(); { Serial.println(String(range)+"p"+String(pos*Pi/180)+"p"+String(pos));延迟(10);} }*/ myservo.write(0);延迟(2000);}
处理代码 (如果您需要良好的雷达接口,请参阅其他雷达项目)在运行前更改 Arduino 端口号(例如“COM 3”)。
import processing.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]);如果(i==180){ 背景(255); } } }translate(25,-50);line(250,500,250-2*(range*cos(pos)),500-2*(range*sin(pos))); }
传感器速度限制在10Hz,高速时舵机响应较差。如果有人计划制作高速激光雷达,请使用带有反馈系统的步进电机或直流电机。使用滑环进行连续旋转 (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);而(!串行){延迟(1); } if (!vl.begin()) { while (1); } }void loop() { for (pos =0; pos <=180; pos +=.5) { myservo.write(pos); uint8_t 范围 =vl.readRange(); Serial.println(String(range)+"p"+String(pos*Pi/180)+"p"+String(pos));延迟(10); } /*for (pos =180; pos>=0; pos -=.5) { myservo.write(pos); uint8_t 范围 =vl.readRange(); { Serial.println(String(range)+"p"+String(pos*Pi/180)+"p"+String(pos));延迟(10); } }*/ myservo.write(0);延迟(1000);}
处理代码处理
import processing.serial.*;Serial myPort;String val;int range,i=0;float pos;void setup(){ size(550,500);帧率(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]);如果(i==180){ 背景(255); } } }translate(25,-50);line(250,500,250-2*(range*cos(pos)),500-2*(range*sin(pos))); }
制造工艺