我是靠谱客的博主 潇洒舞蹈,最近开发中收集的这篇文章主要介绍Unity激光雷达仿真调研(svl),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

      • 一、原理
      • 二、背景知识
      • 三、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。

参数配置

激光雷达仿真一般需要支持以下参数配置:

  1. 安装位置和角度,包括X, Y, Z, Roll, Pitch, Yaw.
  2. 工作频率,一般为10HZ
  3. 最大探测距离,比如120m
  4. 线数和水平分辨率。当修改线数或水平分辨率后,扫描总点数会相应增加。
  5. 垂直视场角设置,默认为-25°~ 15°
  6. 水平视场角一般为360°。针对固态激光雷达,可以设置水平视场角范围

仿真结果

激光雷达的仿真结果,包括带反射强度的点云和障碍物真值信息(位置、朝向、包围盒大小、速度和类型等等), 一般会通过局域网传输给自动驾驶系统。

二、背景知识

三、Unity技术

1.C#作业系统

借助 Unity C# 作业系统,用户可以编写与 Unity 其余部分良好交互的多线程代码,并使编写正确代码变得更加容易。

编写多线程代码可以带来高性能优势,包括显著提高帧率。将 Burst 编译器与 C# 作业配合使用可以提高代码生成质量,还可以大大降低移动设备的电池消耗。

C# 作业系统的一个重要特点是它与 Unity 内部使用的系统(Unity 的原生作业系统)相集成。用户编写的代码与 Unity 共享工作线程。此协作避免了创建超过 CPU 核心数的线程(这种情况会导致争用 CPU 资源)。

2.基于物理引擎的实现方法

激光雷达的实现可以用内嵌的物理引擎实现。通过物理引擎中的射线检测API,在适当时间向对应方向
发射射线进行检测,以模拟激光雷达的特性。

基于物理检测实现存在两大问题:

  1. 检测依赖于物体的物理碰撞模型。在实时应用场景中,使用完整的模型作为物理碰撞模型会导致运算效率低下,因此物体的物理碰撞模型往往会用简单形式进行拟合,如胶囊体、球体等,这使得用物理检测实现的仿真会导致检测结果不正确。
  2. 物理检测效率不足。目前常见引擎(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)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部