当前位置: 首页 > article >正文

【Chrono Engine学习总结】5-sensor-5.3-LiDAR扫描顺序、时间戳计算与去畸变

Chrono仿真LiDAR是可以模拟出运动畸变的,也可以根据扫描顺序赋予每个点一个时间戳。本文用于记录整理。

1、如何开启去畸变

Chrono中,每个sensor都有一个 采集窗口(collection window),经测试,需要将这个采集窗口设置非0,才能看出来畸变。
一个典型的LiDAR.json配置文件如下(按照Ouster32线雷达):

{
  "Name": "Ouster32",
  "Type": "Sensor",
  "Template": "Lidar",
  "Properties": {
    "Update Rate": 10,
    "Width": 1024,
    "Height": 32,
    "Horizontal Field of View": 6.28318530718,
    "Max Vertical Angle": 0.3926990817, // 22.5 deg
    "Min Vertical Angle": -0.3926990817, // -22.5 deg
    "Max Distance": 200.0,
    "Lag": 0.00,
    "Collection Window": 0.1,
    "Divergence Angle": 0.0,
    "Sample Radius": 2,
    "Return Mode": "STRONGEST_RETURN"
  },

其中"Collection Window"设置为0.1s,这意味着10Hz更新,每次更新的窗口是0.1s,符合机械式雷达扫描的基本原理。

2、确定扫描方向

Chrono文档中并没有找到哪里描述LiDAR的扫描方向,所以测一下。
首先在chrono中搭建了四面墙,lidar放到中间,然后沿x正方向高速运动,此时墙的“缺口”就是扫描的起止点。
在这里插入图片描述
这个图中可以看到,缺口在x的负方向。地面一个格子1m,缺口0.5m,我们设置的速度5m/s,符合预期。由于lidar向x+方向运动,所以x-方向应该是开始时近、结束时远,因此我们可以确定,扫描顺序是从 x的负轴,逆时针旋转。即:(x -) -> (y-) -> (x+) -> (y+) -> 回(x -)。

3、时间戳计算

确定了扫描的方向,我们就可以根据扫描的角度判断是什么时刻扫到的。
采用atan2(y,x)函数进行计算。该函数的输出范围是 (-pi, pi]:
在这里插入图片描述
那么,就可以根据这个点到的角度,在(-pi, pi]之间的占比,判断扫描时间。部分代码如下:

double angle = atan2(y, x);
angle += PI;
vp.t = (angle / (2*PI)) * dt;

在rviz中按照t字段颜色显示(从红到绿),如下:
在这里插入图片描述
可以看出,扫描开始时红色,截止时绿色,符合预期。

4、注意事项

如果运行SLAM算法需要去畸变,用chrono仿真的结果需要注意:

  1. 去畸变有两类代码实现,一种是根据时间戳,直接去畸变,例如fastlio、liosam、pointlio等;另一种是根据这个点的角度推算时间戳,一些早期的代码可能当时并没有带时间戳的lidar,所以用这种方式进行推断,例如LOAM, Lego-LOAM, Lio-Mapping等,这类方法需要注意他们的计算的lidar可能并不是和chrono的扫描方向一致。例如,liomapping采用ouster/velodyne的扫描方向如下:
    在这里插入图片描述

所以这种情况下需要去改源码,搞清楚 ±pi 的一些操作。

  1. 如果要给时间戳,注意单位,有的是ns,有的是s

http://www.kler.cn/a/390983.html

相关文章:

  • Unity3D学习FPS游戏(12)敌人检测和攻击玩家
  • 事件循环 -- 资源总结(浏览器进程模型、事件循环机制、练习题)
  • 机器学习day3-KNN算法、模型调优与选择
  • Mit6.S081-实验环境搭建
  • RoseTTAFold MSA_emb类解读
  • 外星人入侵
  • AttriPrompter:基于属性语义的自动提示,用于通过视觉-语言预训练模型实现零样本细胞核检测|文献速递-基于深度学习的病灶分割与数据超分辨率
  • 【JavaEE初阶】多线程上部
  • 使用wordpress搭建简易的信息查询系统
  • 实现 think/queue 日志分离
  • Redhat8.6通过rpm安装RabbitMQ
  • 分段式爬虫和数据采集有什么关系
  • EHOME视频平台EasyCVR视频融合平台使用OBS进行RTMP推流,WebRTC播放出现抖动、卡顿如何解决?
  • easyexcel实现自定义的策略类, 最后追加错误提示列, 自适应列宽,自动合并重复单元格, 美化表头
  • Java 类加载机制详解
  • ssm088基于JAVA的汽车售票网站abo+vue(论文+源码)_kaic
  • 多维视角下的知识管理:Spring Boot应用
  • Python 网络编程指南(初学者版)
  • Unity类银河战士恶魔城学习总结(P118 Thunder Strike On Ability 制作一把带有雷电效果的项链)
  • Ubuntu20.04 安装build-essential问题
  • 丹摩征文活动 | 轻松上手图像生成:FLUX.1遇上ComfyUI,让复杂变简单!
  • 小程序与 H5 的交互
  • mac 中python 安装mysqlclient 出现 ld: library ‘ssl‘ not found错误
  • Vue全栈开发旅游网项目(10)-设计用户模型
  • C++ | Leetcode C++题解之第557题反转字符串中的单词III
  • Rust使用DX11进行截图并保存