概述
文章目录
- 一、原理
- 二、背景知识
- 三、Unity技术
- 1.C#作业系统
- 2.基于物理引擎的实现方法
- 3.基于深度图的实现方法
- 四、ROS传输
- 1.ROS消息类型
一、原理
真实激光雷达的原理
激光雷达的基本原理是发射激光至物体表面,接收返回的激光,并根据发射与返回的时间差,计算激光方向上障碍物的距离,还可以记录返回的激光的强度。返回的数据一般以点云形式提供给上层应用,用以识别障碍物类型。
激光雷达仿真的思路
参照真实激光雷达的扫描方式,模拟每一条真实雷达射线的发射,与场景中所有物体求交。
以某64 线
、水平分辨率
为0.4°、最大探测距离
为120 米的雷达为例,该雷达每一帧会发射出57600 条射线(64 * 360 / 0.4)与场景中所有物体求交,如果求得的交点位于最大探测距离内,则为有效点,对于10HZ
的雷达来说,每秒需要发射576000 条射线。
针对微电子机械系统激光雷达(MEMS),技术方案原理上与上述方法一致。主要差异是,水平方向扫描不再是360°,而是可以指定扫描的水平角度范围。
在模拟射线与场景求交时,一般需要为场景资源都添加足够精细的,甚至与原始模型完全一致的物理模型,以保证求交结果的准确性。
鉴于每秒需要扫描的雷达射线次数过多(50w+),且求交算法计算复杂度高,一般仿真时会利用CPU 并行
或GPU 并行
计算的方式来提高扫描效率,以达到实时仿真的效果。
反射强度
激光雷达反射强度
跟不同物理材质
对激光雷达所使用的近红外光线反射率
有关。反射强度受到障碍物距离、激光反射角度以及障碍物本身的物理材质影响。
仿真时需要给场景资源设置合适的物理材质,包括各种道路,人行道,车道线,交通牌,交通灯,汽车,行人等。每一种物理材质的激光反射率都不相同。可以使用仪器提前测得每一种物理材质的激光反射率,并记录下来。可以参照某些真实激光雷达的做法,将最终反射强度归一化到0~255。
参数配置
激光雷达仿真一般需要支持以下参数配置:
- 安装位置和角度,包括X, Y, Z, Roll, Pitch, Yaw.
- 工作频率,一般为10HZ
- 最大探测距离,比如120m
- 线数和水平分辨率。当修改线数或水平分辨率后,扫描总点数会相应增加。
- 垂直视场角设置,默认为-25°~ 15°
- 水平视场角一般为360°。针对固态激光雷达,可以设置水平视场角范围
仿真结果
激光雷达的仿真结果,包括带反射强度的点云和障碍物真值信息(位置、朝向、包围盒大小、速度和类型等等), 一般会通过局域网传输给自动驾驶系统。
二、背景知识
三、Unity技术
1.C#作业系统
借助 Unity C# 作业系统,用户可以编写与 Unity 其余部分良好交互的多线程代码,并使编写正确代码变得更加容易。
编写多线程代码可以带来高性能优势,包括显著提高帧率。将 Burst 编译器与 C# 作业配合使用可以提高代码生成质量,还可以大大降低移动设备的电池消耗。
C# 作业系统的一个重要特点是它与 Unity 内部使用的系统(Unity 的原生作业系统)相集成。用户编写的代码与 Unity 共享工作线程。此协作避免了创建超过 CPU 核心数的线程(这种情况会导致争用 CPU 资源)。
2.基于物理引擎的实现方法
激光雷达的实现可以用内嵌的物理引擎实现。通过物理引擎中的射线检测API,在适当时间向对应方向
发射射线进行检测,以模拟激光雷达的特性。
基于物理检测实现存在两大问题:
- 检测依赖于物体的物理碰撞模型。在实时应用场景中,使用完整的模型作为物理碰撞模型会导致运算效率低下,因此物体的物理碰撞模型往往会用简单形式进行拟合,如胶囊体、球体等,这使得用物理检测实现的仿真会导致检测结果不正确。
- 物理检测效率不足。目前常见引擎(Unity、Unreal)中的物理检测一般基于CPU 串行执行,而常见激光雷达生成的点数大于100 万点/每秒,导致数据生成效率低下。
3.基于深度图的实现方法
基于深度图渲染的激光雷达仿真方法,可以以实时效率运行,并且检测结果基于网格模型,与视觉效果相同。
四、ROS传输
1.ROS消息类型
[MessageType("sensor_msgs/PointCloud2")]
public class PointCloud2
{
public Header header;
public uint height;
public uint width;
public PointField[] fields;
public bool is_bigendian;
public uint point_step;
public uint row_step;
public PartialByteArray data;
public bool is_dense;
}
[MessageType("sensor_msgs/PointField")]
public class PointField
{
public const byte INT8 = 1;
public const byte UINT8 = 2;
public const byte INT16 = 3;
public const byte UINT16 = 4;
public const byte INT32 = 5;
public const byte UINT32 = 6;
public const byte FLOAT32 = 7;
public const byte FLOAT64 = 8;
public string name;
public uint offset;
public byte datatype;
public uint count;
}
public class PartialByteArray
{
public byte[] Array;
public int Length;
public string Base64;
}
最后
以上就是潇洒舞蹈为你收集整理的Unity激光雷达仿真调研(svl)的全部内容,希望文章能够帮你解决Unity激光雷达仿真调研(svl)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复