自制激光雷达设计

1、概述

由于课题要求,需要设计一款适合于果园应用的激光雷达。因此采用单线扫描激光雷达和角度传感器来设计能采集二维数据的激光雷达。关于数据的转化的理论,我们可以查阅相关文献。在此,只讲基本的构造和程序。

2、整体外形设计

在这里插入图片描述
此图为设计图:硬件包括单点激光模块,无线电源模块,HC-05模块,降压模块,步进电机及驱动器,控制器arduino Mage2560(可以换其他控制器),usb数据传出模块。

下图为实际图片:
在这里插入图片描述
因为还未封装,走线布局可能有些乱,最后应该是这样:
在这里插入图片描述
因为果园路面不平,后期还要考虑怎么固定传感器。

3、软硬件调试流程

1)首先、熟悉各个硬件的基本性能和基本操作;
2)其次、各个模块调试,我首先将激光模块调试好,其次是步进电机及驱动的简单调试,然后将角度传感器模块调好,再将蓝牙模块调试好,再旋转编码器调试好。
3)然后、将硬件模块关系紧密的两两联合调试,再到三个模块,到四个模块等;
4)再然后、将硬件组合在一起,整体调试及测试;
5)最后、优化各个模块,再测试以及优化外观设计。

4、程序部分

因为代码有注释,就不再多讲,直接上代码吧。(无语,还是再说一句)但是此代码还有很多不足,需要后期的优化设计,这仅仅是为了测试而编写的。

/*以下为步进电机连接引脚
 * dir -->d2
 * en --> d5
 * stp -->d6
 * com -->5v
 * V --> 12v
 * GND-->GND
 */
#define dir_pin 2
#define en_pin 5
#define stp_pin 6

//激光雷达的相关变量机常量
float range = 0;//目标距离
unsigned char uart[8]={0},counter = 0;//存放雷达测量的数据
unsigned char data[3]={0};
unsigned char sign=0;
const unsigned char HEADER=0x55;//数据包帧头
const unsigned char END=0xAA;//终止序列

//将接收的数据整合到一个结构体中,使其存储到一个连续的内存中,较为高效
struct Target_Bits
{
  unsigned char    Target_header:8;        /* 0:7    */
  unsigned char    Target_key:8;           /* 8:15   */
  unsigned char    Target_value:8;          /* 16:23  */
  unsigned char    Target_data1:8;         /* 24:31  */
  unsigned char    Target_data2:8;          /* 32:39  */
  unsigned char    Target_data3:8;         /* 40:47  */
  unsigned char    Target_CRC:8;            /* 48:55  */
  unsigned char    Target_end:8;           /* 56:63  */
};

//联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量
typedef union{                    
  unsigned char Byte[8];
  struct  Target_Bits bit;
}TargetData;

void setup()
{  
  Serial.begin(9600);//设置arduino与电脑连接串口的波特率
  Serial1.begin(9600);//设置雷达与arduino连接串口的波特率
           
  //set timer4
    TCCR4A = 0;
    TCCR4B = 0;
    TCNT4  = 0;
    // Mode 10: phase correct PWM with ICR4 as Top (= F_CPU/2/25000)
    // OC4A OC4B OC4C as Non-Inverted PWM output
    ICR4   = (F_CPU/2000)/2;
    TCCR4A =_BV(COM4A1) | _BV(COM4B1) | _BV(COM4C1) | _BV(WGM41);
    TCCR4B = _BV(WGM43) | _BV(CS40);
    
    // Set the PWM pin as output.
    pinMode(6,  OUTPUT);
    pinMode(2,OUTPUT);
    
}

void loop()
{
    //just set this for step motor
    Pwm_out(6,1000);
    digitalWrite(2,HIGH);
    //for(;;); //infinite loop

    if(sign)
   { 
       sign=0;
       if(uart[1]==0x07)
       {
          TargetData TargetData;
          for (uint8_t i = 0; i < 8; i++)
          {
            TargetData.Byte[i] = uart[i];    //  Buf指向有效数据起始
    //       Serial.print(TargetData.Byte[i]);
    //       Serial.print("\n");
          }
          for(int j =0;j<3;++j)
          {
            data[j]=TargetData.Byte[j+3];
           }
         range=readCharToLL(data,3);
         Serial.print(range);
         Serial.print("\n");
       }                               
    } 
    
}

//激光数据采集
void serialEvent1() {
    while (Serial1.available()) {
    uart[counter]=(unsigned char)Serial1.read();
    if(counter==0&&uart[0]!=HEADER) return;      //第0号数据不是帧头             
    counter++;   
    if(counter==8)             //接收到8个数据
    { 
       counter=0;               //重新赋值,准备下一帧数据的接收 
       sign=1;
    }   
  }
}

/** 
 * 将unsigned char数组转换成long long数值
 * @param str 数组 
 * @param len str数组长度
 * @returns 0 on error
 */
int readCharToLL(unsigned char* str, int len)
{
    if (str == NULL||len <= 0)  //指针的判断
    {
        return 0;
    }
    int i = 0;
    int value = 0;
    for (i=0;i<len;i++)
    {
        value = value*16*16 + (str[i]/16)*16 + str[i]%16;
    }
    return value;
}

//motor driver 
void Pwm_out(int pin ,int value)
{ 
  switch(pin){
    case 5:
        OCR3A = value;
        break;    
    case 6:
        OCR4A = value;
        break;
    case 7:
        OCR4B = value;
        break;
    case 8:
        OCR4C = value;
        break;
    default:
        //no other pin will work
        break;  
  }
}

这也只是蓝牙,激光,电机的测试代码,角度传感器和旋转编码器的还需后期加上。

5、初步展示

可以这个视频

6、问题总结

1)激光雷达的初始化比较长,有时也不知为什么突然采集不到数据(还待解决)
2)蓝牙模块的传输速率应该还需设置高些
3)无线电源模块的底板很容易破裂
4)arduino Mage2560 Pro的供电有点问题

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
前言: 说起来,该3D激光扫描测距仪(3D激光雷达)就核心设计原理来而言,应该在激光键盘(https://www.cirmall.com/circuit/2978/detail?3)设计项目之后。现在给大伙讲讲3D扫描测距仪的相关原理和制作细节。请耐心读完,方可吸收其中的精华。 在开始介绍原理前,先给出一些扫描得到的3D模型以及演示视频,给大家一个直观的认识 扫描得到的房间一角: 扫描的我 扫描仪实物 激光三角测距原理这里统一列出他们的参数: 摄像头:VGA画质的USB摄像头,30fps (市面普遍可以购买的型号)。非广角 激光器:50mW 红外一字线激光 808nm 滤光片:10mm直径红外低通滤光片 舵机:HS-322hd 43g标准舵机 本文结构简单介绍了激光雷达产品的现状 : 线状激光进行截面测距原理 3D激光扫描仪的制作考虑 参考文献 简介-激光扫描仪/雷达: 这里所说的激光扫描测距仪的实质就是3D激光雷达。如上面视频中展现的那样,扫描仪可以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像是由很多小点组成的云团,因此常被称之为:点云(Point Clould)。在获得扫描的点云后,可以在计算机中重现扫描物体/场景的三维信息。 这类设备往往用于如下几个方面: 机器人定位导航 目前机器人的SLAM算法中最理想的设备仍旧是激光雷达(虽然目前可以使用kinect,但他无法再室外使用且精度相对较低)。机器人通过激光扫描得到的所处环境的2D/3D点云,从而可以进行诸如SLAM等定位算法。确定自身在环境当中的位置以及同时创建出所处环境的地图。这也是我制作他的主要目 的之一。 零部件和物体的3D模型重建 地图测绘 现状: 目前市面上单点的激光测距仪已经比较常见,并且价格也相对低廉。但是它只能测量目标上特定点的距离。当然,如果将这类测距仪安装在一个旋转平台上,旋转扫描一周,就变成了2D激光雷达 (LIDAR)。相比激光测距仪,市面上激光雷达产品的价格就要高许多: Hokuyo 2D激光雷达截图: 上图为Hokuyo这家公司生产的2D激光雷达产品,这类产品的售价都是上万元的水平。其昂贵的原因之一在于他们往往采用了高速的光学振镜进行大角度范围(180-270)的激光扫描,并且测距使用了计算发射/反射激光束相位差的手段进行。当然他们的性能也是很强的,一般扫描的频率都在10Hz以上,精度也在几个毫米的级别。 2D激光雷达使用单束点状激光进行扫描,因此只能采集一个截面的距离信息。如果要测量3D的数据 ,就需要使用如下2种方式进行扩充: 采用线状激光器 使用一个2D激光雷达扫描,同时在另一个轴进行旋转。从而扫描出3D信息。 说明: 第一种方式是改变激光器的输出模式,由原先的一个点变成一条线型光。扫描仪通过测量这束线型光在待测目标物体上的反射从而一次性获得一个扫描截面的数据。这样做的好处是扫描速度可以很快 ,精度也比较高。但缺点是由于激光变成了一条线段,其亮度(强度)将随着距离大幅衰减,因此测距范围很有限。对于近距离(<10m)的测距扫描而言,这种方式还是很有效并且极具性价比的,本文介绍的激光雷达也使用这种方式, 对于第二种方式,优点是可以很容易用2D激光雷达进行改造,相对第一种做法来说,他在相同的激光器输出功率下扫描距离更远。当然,由于需要控制额外自由度的转轴,其误差可能较大,同时扫描速度也略低。 这类激光雷达产品目前在各类实验室、工业应用场景中出现的比较多,但对于个人爱好着或者家用 设备中,他们的价格实在是太高了。当然,目前也有了一个替代方案,那就是kinect,不过他的成像 分辨率和测距精度相比激光雷达而言低了不少,同时无法在室外使用。 低成本的方案 造成激光雷达设备高成本的因素为 使用测量激光相位差/传播时间差测距 高速振镜的高成本 矫正算法和矫正人工成本 对于个人DIY而言,第三个因素可以排除,所谓知识就是力量这里就能体现了:-) 对于前2个因素,如果要实现完全一样的精度和性能,那恐怕成本是无法降低的。但是,如果我们对精度、性能要求稍 微降低,那么成本将可以大幅的下降。 首先要明确的是投入的物料成本与能达成的性能之间并非线型比例的关系,当对性能要求下降到一 定水平后,成本将大幅下降。对于第一个因素,可以使用本文将介绍的三角测距方式来进行。而对于 扫锚用振镜,则可以使用普通的电机机构驱动激光器来替代。 本文介绍的低成本3D激光扫描仪实现了如下的成本/性能: 成本:~¥150 测量范围:最远6m 测量精度:(测量距离与实际距离的误差)最远6m出最大80mm误差,近距离(<1m),误差水平在 5mm以内 扫描范围:180度 扫描速度:30 samples/sec (比如以1度角度增量扫描180度,耗时6秒) 对于精

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值