业务需求用到了G4激光雷达,需要对接雷达的sdk,最方便的是直接找unitypackage包来用,网上要么收费要么没用。所以还是自己对接吧

准备

先找相关文档,官网,sdk样例等。官网里各种文档和sdk都有。
Git
官网
For C#

1.首先需要有一个g4雷达(注意雷达型号,不同型号可能一些初始化参数不一样 例如串口波特率等)
2.根据使用文档,还要下载安装串口驱动
3.打开官网下载的雷达查看程序,选好雷达usb串口。就能在软件里看到雷达的运行了。

SKD

要自己使用雷达,就得使用它的sdk

1.下载雷达sdk包,下载完惊不惊喜意不意外 你还得下个cmake去给他弄成vs工程能打开的。
2.然后发现它虽然文档里写的有python,C# 结果sdk里就写了个C#脚本去调用。要在unity用你还得自己打链接库。
3.本着不自己造轮子的原则(其实是自己打dll老报错。。。)还真让我在github上找到了sdk的64位dll
4.将dll拉入unity的plugins中,开始调用!

这里不要忽视了下载的sdk程序,里边有个console启动案例,你启动运行一下,并结合它案例的cpp代码,就知道在调用雷达后,它传递给你的数据格式。

数据格式

这里我就直接发出来了,(以检测设置为180度来说)就是 给你发送一个数组,这个数组记录了0—180度的所有点(离雷达的距离 角度)
官方话来说就是 点云 数据

其实应该是有相关的算法来搞的,但我也不了解,只能自己来 对数据做分析,提取自己要的。

数据分析

我们可以知道360内的点距雷达的距离

  1. 将雷达的点云数据 划分出一个个线条轮廓 (相邻角度的点数据 相距距离判断)
  2. 对轮廓去除误差 (轮廓长度短的)
    这样就能得到 一段一段的有效遮挡 取每一段的特征点的距离和角度 即可获得一个雷达上我们需要的点数据
    其他的是取最近 取最远还是怎样根据业务需求来即可。
    在不同距离下的误差值是变动的

代码:

  1. 初始化sdk里的雷达类(端口,波特率,扫描角度等参数)
  2. 调用sdk雷达类方法,启动雷达
  3. 开启线程获取并更新雷达数据
  4. 在协程里对数据做计算(不一定非要协程,注意线程不能用unity方法即可)
  5. 雷达sdk提供了点的角度和距离,根据这些计算有效数据
  6. 使用计算出的有效数据即可

找不到引用的基本上都是项目的业务相关

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using YDLidarSharp;public class LeidaSDKFunction : MonoBehaviour
{public Transform parent;public GameObject prefab;public GameObject people;// Start is called before the first frame updateList<RectTransform> list = new List<RectTransform>();YDLidarSDK sdk;Thread getdata;LaserScan ls;//扫描结果结构const int Maxl = 1000;double[] angle_ = new double[Maxl];double[] ranger_ = new double[Maxl];//初始化雷达相关参数public void InitLeiDa(){if (sdk == null){sdk = new YDLidarSDK();}//初始化sdk相关参数SetSDKProperties();//初始化计算数据相关阈值SetCalculateData();}//开启雷达public void StartLeiDa(){if (sdk.Initialize()){sdk.TurnOn();//开启雷达//开启线程不断更新 雷达数据getdata = new Thread(() => Getdatadd());getdata.Start();// 线程无法调用unity函数,只在线程更新数据,分析数据放在协程里StartCoroutine(SetUIData());}else{Debug.LogError("雷达开启失败!");}}public void Getdatadd(){while (true){ls = sdk.GetData();//北阳数据长度是固定的角度分辨率,G4数据长度不固定//根据之前设置的雷达参数 打印下 调整合适的有效长度if (ls.LaserPoints == null || ls.LaserPoints.Count < 500)continue;//sdk提供的扫描到的点数据:角度,距离//根据角度从0-180排列ls.LaserPoints.Sort((a, b) => a.Angle.CompareTo(b.Angle));//0-180for (int i = 0; i < Maxl && i < ls.LaserPoints.Count; i++)//数据存储 保证Maxl>count{angle_[i] = ls.LaserPoints[i].Angle;ranger_[i] = ls.LaserPoints[i].Range;}Thread.Sleep(1);}}//关闭雷达public void CloseLeiDa(){if(getdata!=null)getdata.Abort();StopAllCoroutines();sdk.TurnOff();}private void SetSDKProperties(){//雷达串口sdk.SerialPort = SystemParam.LeiDaCom;int baudrate;int.TryParse(SystemParam.LeiDaBaudrate, out baudrate);sdk.SerialBaudrate = baudrate;//雷达波特率//不管sdk.FixedResolution = false;sdk.Reversion = true;sdk.AutoReconnect = true;sdk.SampleRate = 9;//?//雷达扫描角度0-180sdk.MaxAngle = 180;sdk.MinAngle = 0;//雷达扫描距离 0.15m-6m sdk.MinRange = 0.15f;sdk.MaxRange = 6;int fre;int.TryParse(SystemParam.LeiDaBaudrate, out fre);//扫描频率 貌似对扫描到的数据长度有影响sdk.ScanFrequency = fre;}private void SetCalculateData(){//数据提取距离float tempfloat;int tempint;float.TryParse(SystemParam.LeiDaMinDataRange, out tempfloat);LeiDaPoint.minR = minR = tempfloat;float.TryParse(SystemParam.LeiDaMaxDataRange, out tempfloat);LeiDaPoint.maxR = maxR = tempfloat;float.TryParse(SystemParam.MoveSensitivity, out tempfloat);LeiDaPoint.MoveSensitivity = tempfloat;//将点数据分段的有效长度float.TryParse(SystemParam.LeiDaEndLineLength, out tempfloat);lineEndLenght = tempfloat;int.TryParse(SystemParam.LeiDaLineMinAngle, out tempint);lineMinAngle = tempint;}//UI模拟雷达点public void CreateUIMap(){anglescale = 180f / Maxl;for (int i = 0; i < Maxl; i++){Vector2 t;t.x = Mathf.Cos(i * anglescale * Mathf.PI / 180) * 200;t.y = Mathf.Sin(i * anglescale * Mathf.PI / 180) * 200;RectTransform temp = Instantiate(prefab, parent).GetComponent<RectTransform>();temp.anchoredPosition = t;list.Add(temp);}showUIPoint = true;}int scale = 1000 / 2;float minR = 0.3f;float maxR = 1f;Dictionary<string, List<double>> keyValuePairs = new Dictionary<string, List<double>>();Dictionary<int, List<double>> finalLine = new Dictionary<int, List<double>>();List<LeiDaPoint> getDatas = new List<LeiDaPoint>();bool isSort = false;bool showUIPoint = false;float anglescale = 0;float lineEndLenght = 0.1f;int lineMinAngle = 5;/// <summary>/// 解析雷达数据/// 解析思路:/// /// 将雷达的点云数据 划分出一个个线条轮廓  (相邻角度的点数据 相距距离判断)/// 对轮廓去除误差 (轮廓长度短的)/// ////// </summary>/// <returns></returns>IEnumerator SetUIData(){while (true){yield return null;if (ls.LaserPoints == null || ls.LaserPoints.Count < 500)continue;//根据之前设置的角度范围来 计算角度分辨率anglescale = 180f / ls.LaserPoints.Count;LeiDaPoint.anglescale = anglescale;//项目业务数据 忽略Vector2 startPos = Vector2.zero;//double startRange = 0;string x = string.Empty;keyValuePairs.Clear();//遍历点云数据for (int i = 0; i < Maxl && i < ls.LaserPoints.Count; i++){//是否需要ui模拟点云分布 if (showUIPoint){#region ui模拟排布//if (isSort)//    if (ranger_[i] > 1)//    {//        list[i].anchoredPosition = Vector2.zero;//    }//ui坐标计算Vector2 t;t.x = Mathf.Cos(i * anglescale * Mathf.PI / 180) * (float)ranger_[i] * scale;t.y = Mathf.Sin(i * anglescale * Mathf.PI / 180) * (float)ranger_[i] * scale;list[i].anchoredPosition = t;list[i].localScale = Vector3.one * 0.072853f;#endregion}#region 点位计算//位置点计算(计算指定范围的点) //业务需要的最近最远距离内的数据if (ranger_[i] > minR && ranger_[i] < maxR){//将点转换到坐标 进行比较Vector2 nowPos;nowPos.x = Mathf.Cos(i * anglescale * Mathf.PI / 180) * (float)ranger_[i];nowPos.y = Mathf.Sin(i * anglescale * Mathf.PI / 180) * (float)ranger_[i];if (string.IsNullOrEmpty(x))//起始标志 第一个记录点{//startPos = nowPos;//startRange = ranger_[i];x = i.ToString();keyValuePairs.Add(x, new List<double>() { ranger_[i] });}else//和起始点比较{//小于阈值,判定为一条线段内的数据点//待优化:随着与雷达的距离远近,阈值应该是动态的,即越近阈值可以越小,越远阈值越大if (Vector2.Distance(nowPos, startPos) < lineEndLenght)//两点距离阈值 range越大 阈值越大{keyValuePairs[x].Add(ranger_[i]);startPos = nowPos;//startRange = ranger_[i];}else//断开当前线条{//待优化:给定容错   //中断x = string.Empty;startPos = Vector2.zero;}}}#endregion}//遍历一遍后获取到的keyValuePairs线段finalLine.Clear();foreach (var va in keyValuePairs.Keys){int pp;int.TryParse(va, out pp);//#region 原始人物点位UI模拟//list[pp].localScale = Vector3.one * 0.072853f * 5;//#endregion#region 点位去杂(去除长度不够的点)if (keyValuePairs[va].Count > lineMinAngle / anglescale)//占5度{finalLine.Add(pp, keyValuePairs[va]);}#endregion}getDatas.Clear();//去除无效数据后的线条数据//将首个位置作为 线段(人) 位置foreach (var N in finalLine.Keys){//int value = N + finalLine[N].Count / 2;int value = N;#region 点位UI模拟  (中值会有波动,使用首个位置)if(showUIPoint)list[value].localScale = Vector3.one * 0.072853f * 5;#endregion//range首个位置的距离getDatas.Add(new LeiDaPoint(value, finalLine[N][0]));}//数据由近到远排列//getDatas.Sort((a, b) => a.range.CompareTo(b.range));//修改成由距屏幕近到远getDatas.Sort((a, b) => a.pos.y.CompareTo(b.pos.y));// Debug.Log(getDatas[0].range);//发送获取到的数据点if (EventManager.ins != null){EventManager.ins.DispatchEvent(Showroom.EventType.SendPonitData, getDatas);}}}bool op = false;// Update is called once per framevoid Update(){//if (Input.GetKey(KeyCode.Alpha1))//{//    isSort = !isSort;//}if (Input.GetKey(KeyCode.Alpha2)){if (!op){CreateUIMap();op = true;}}//if (Input.GetKey(KeyCode.K))//{//    scale = 1000;//}//if (Input.GetAxis("Mouse ScrollWheel") > 0)//{//    scale -= 10;//}//if (Input.GetAxis("Mouse ScrollWheel") < 0)//{//    scale += 10;//}}private void OnDestroy(){CloseLeiDa();sdk.Disconnecting();}
}

补充:

后续又用到北阳雷达等,其实是一样的
北阳雷达:
通过它自己带的程序发送雷达数据。自己写socket监听数据发送。
北阳比g4好的是,它一种设备是固定扫描角度频率,从设备参数就可以了解:
【测量距离:0.06 to 10m, Max.30m, 270°】
【角度分辨率=0.25° (360°/1,440 steps)】
即它的数据给的是270/0.25份。而不是像g4一样不太精确

相关文章

YDLIDAR G4雷达的unity使用相关+北阳雷达相关推荐

  1. 【radar】毫米波雷达-相机-激光雷达融合相关论文汇总(特征融合、RPN融合、弱监督融合、决策融合、深度估计、跟踪)(5)

    [radar]毫米波雷达-相机-激光雷达融合相关论文汇总(特征融合.RPN融合.弱监督融合.决策融合.深度估计.跟踪)(5) Radar Camera Fusion Feature-level Fus ...

  2. 【radar】毫米波雷达动态障碍物检测相关论文汇总(聚类、分类、稀疏2D点、4D点、雷达成像、原始数据处理)(4)

    [radar]毫米波雷达动态障碍物检测相关论文汇总(聚类.分类.稀疏2D点.4D点.雷达成像.原始数据处理)(4) Detection of Dynamic Objects Clustering 20 ...

  3. Unity 面试题汇总(三)Unity 基础相关

    Unity 面试题汇总(三)Unity 基础相关 目录 Unity 面试题汇总(三)Unity 基础相关 0.FSM(状态机).HFSM(分层状态机).BT(行为树)的区别 1.什么是协同程序? 2. ...

  4. 北阳Hokuyo UST-10LX 虚拟机Ubuntu 环境下运行配置

    一直想学习ros,自己也是一个小白,之前一直是在模型场景下学习,今天有机会拿到一个北阳Hokuyo UST-10LX 2d激光想在虚拟机环境下ubuntu 16.04 下用起来.csdn上资料挺多的, ...

  5. 毫米波雷达_最新的7个毫米波雷达应用案例

    毫米波雷达传感器如何做到"全天候"? 毫米波雷达使用的技术是毫米波(millimeterwave),通常缩写为MMW,波长为1-10毫米,频率为30~300GHz的电磁波. 根据波 ...

  6. 智能家居雷达感应技术,存在感应毫米波雷达应用

    雷达感应模块是一种通过雷达对人体感应区进行检测的一种产品,是营造智能家居环境中极其重要的一环. 但是传统的人体传感器却存在着很大的缺点,当一个人长时间没有明显运动时,就会判断空间里没有人,比如刷手机. ...

  7. 雷达信号处理程序源码 python 需达围像识别 雷达系统仿真代码源码 matlab SAR 雷达系统仿真程序集合 雷达压制干扰matlab程序 线性调联(IFM)脉冲压缩雷达伤真

    雷达信号处理程序源码 雷达系统仿真代码源码 matlab SAR 1.MAITOFPR 探地雷达数据处理MMITLAB程序 2.python 需达围像识别 3.SAR团达回波仿真matlab 4.SA ...

  8. vue 雷达扫描_Qt自定义控件之仪表盘3–雷达扫描图

    1.设计思想 雷达扫描图,在影视作品中见到较多,比如飞机雷达.舰艇雷达,有一个扫描线转圈代表雷达一周旋转或一个批次的收发,发现目标就在表盘上标记位置.和汽车仪表盘类似,汽车仪表盘有底盘背景图.同圆.刻 ...

  9. 毫米波雷达图解算法原理(基于TI雷达)

    毫米波雷达数据处理原理 前言 基础 bin文件解读 以下我们取1帧进行操作: 对数据矩阵进行操作前的转换-- 开始计算结果矩阵 一维FFT(距离) 二维FFT(速度) 角度维FFT (假设利用结果已经 ...

最新文章

  1. 原理竟然是这!2021年字节跳动74道高级程序员面试
  2. boost::hana::detail::type_foldr1用法的测试程序
  3. 转 CentOS下php安装mcrypt扩展
  4. 有效事件: 可取代数十种设计模式
  5. [六字真言]1.唵.遁入佛门之异常.md
  6. 长连接测试_电磁兼容测试照片
  7. Hadoop2.0安装
  8. MapXtreme2004鹰眼程序
  9. Qt TCP服务端、客户端;QTcpSocket
  10. Ajax请求下载文件
  11. Affine set 和 convex set 的定义
  12. 12306余票查询(二)——获取余票数据
  13. CVTE校招嵌入式经历
  14. php源码中powerby,小龙源码网 - discuz论坛怎么去掉power by discuz版权
  15. 王道_线性表代码合集
  16. C语言 二分法查找与递归二分法查找
  17. Spring Boot项目打war包(idea:多种方式)
  18. 2012年经济与股市战略
  19. WoShop分销积分直播短视频商城全开源无加密商城源码
  20. 天津理工大学计算机网络选择题与判断题

热门文章

  1. STM32F103学习之系统时钟配置
  2. Java枚举是什么?关于Java枚举的一些理解
  3. 《深入理解Linux内核》-3.3. 进程切换
  4. 从《欲望都市》到《绝望主妇》 美剧的疯狂
  5. 对邮件服务器的一点思考
  6. 微信小程序全局配置分享指定标题、图片、路径
  7. oracle chr 49824,Systemy sprzętowo-programowe | Oracle Polska
  8. Qt小例子学习52 - 卡片游戏
  9. vue-购物车小球抛物线
  10. 【原创】samba移植到android流程