激光数据去畸变

2023-05-16

机械激光雷达产生数据原理

  机械激光雷达中内置高速旋转的电机,电机旋转的频率决定了激光雷达产生数据的频率。比如一个fov为360度的激光雷达,每秒旋转一圈,那么激光数据的频率就是1Hz;如果每秒旋转10圈,那么激光数据的频率就是10Hz。而激光雷达在旋转一圈时会根据机械结构设计顺序发射激光,激光遇到障碍发生发射,反射的光线被激光雷达获取后根据光发射和接收的时间差计算出被测障碍物的距离。测距公式如下,c表示光速。
d = 1 2 c ( t r e c v − t s e n d ) d = \frac{1}{2}c(t_{recv} - t_{send}) d=21c(trecvtsend)
  这里需要重点说明的是激光雷达电机旋转一圈会发射上千束激光。发射的激光束越多,激光的角分辨率就越高。比如常用的即机械激光雷达VLP,其激光数据的频率为10Hz或者20Hz,但是每秒钟发射的激光束数量 (专业术语是:采样率)是固定的。那么就会得到这样的结果,激光电机的转速越高,那么激光数据的角度分辨率就越低;反之,激光电机转速越低,激光数据的角度分辨率就越高。

为什么要去畸变

  如上所述,在实际使用中比如机器人,无人车等,这些搭载激光雷达的平台大多情况下是运动的。激光雷达产生激光数据的同时机器人也在运动,但是机器人输出定位数据的频率没有那么高,普通也就10Hz左右。假设激光产生激光数据的频率也是10Hz,而每一帧的激光数据有1000个激光束的情况下,那么就需要插值得到每束激光产生时刻的激光雷达的位姿,这就不可避免的需要对定位输出进行插值去获取每个激光束时刻激光雷达的位姿。还有一点是因为激光雷达产生数据后是每0.1s才会上传一帧数据,1000束激光数据会在一个时刻集中上传,所以需要增加后处理操作把每一束激光雷达产生的时间反算出来。所以计算出每个激光束产生的时间,插值得到激光束产生时刻的激光雷达位姿,这样就可以得到障碍物物的实际位置。
  在ros下使用激光雷达时,激光数据是相对于激光本体坐标系的。画个图看下会比较直观一点。
在这里插入图片描述

  如图所示,假设三角形表示激光雷达,在激光雷达上有2个激光发射孔,左右对称分布。这里设定激光雷达从 t 0 t_0 t0 t 1 t_1 t1时间内激光雷达顺时针旋转角度为 θ \theta θ。在 t 0 t_0 t0时刻激光位置为 P 1 P_1 P1时发射了一束激光,在 t 1 t_1 t1时刻激光位置为 P 2 P_2 P2时又发射了一束激光。激光数据是在激光雷达自身坐标系下表示的,那么静止时刻下2束激光的坐标为[ r c o s θ 1 rcos\theta_1 rcosθ1, r s i n θ 1 rsin\theta_1 rsinθ1],[ r c o s θ 2 rcos\theta_2 rcosθ2, r s i n θ 2 rsin\theta_2 rsinθ2]。
t 0 t_0 t0时刻到 t 1 t_1 t1时刻激光数据在激光雷达坐标系下的坐标与静止条件下一致的,但是两束激光在惯性坐标系下的在 t 1 t_1 t1时刻坐标明显与惯性系下是不一致的。所以这里就存在一个问题,一帧激光雷达数据包含成百上千个激光束,每个激光束发射时激光雷达本身在惯性系下的坐标是实时变化的。在实际使用中我们要把所有的激光束转换到最后一个时刻时激光雷达在惯性系的位姿 T l a s t T^{last} Tlast下。
l i li li时刻的激光束数据转换到最后一束激光位姿的公式表示如下,其中 I I I表示参考坐标系:
T l a s t I − 1 T l i I p l i = T l i l a s t p l i = p l a s t {T_{last}^I}^{-1} T_{li}^{I} p^{li}= T_{li}^{last} p^{li} = p^{last}\\ TlastI1TliIpli=Tlilastpli=plast
  究其原理,其实就是要确定每束激光发射时激光雷达在参考坐标系下的位姿,就可以把局部坐标系下的坐标转换到目标坐标系下。举个定位中常见例子来表述就是,激光数据与地图进行匹配时,如果知道发射激光束时,激光雷达在地图坐标系下的全局位姿,那么直接使用下面的转换公式就可以得到每束激光在地图坐标系下的坐标。说白了,就是如果能得到每个激光束发射时刻的激光雷达位姿,那么就没必要去畸变了。加入去畸变的原因就是很难准确获取到激光束发射时刻的激光雷达位姿。
p m a p = T l i m a p p l i p^{map} = T_{li}^{map}p^{li} pmap=Tlimappli

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

激光数据去畸变 的相关文章

  • 初识强化学习,什么是强化学习?

    相信很多人都听过 机器学习 和 深度学习 但是听过 强化学习 的人可能没有那么多 那么 什么是强化学习呢 强化学习是机器学习的一个子领域 它可以随着时间的推移自动学习到最优的策略 在我们不断变化的纷繁复杂的世界里 从更广的角度来看 即使是单
  • 强化学习形式与关系

    在强化学习中有这么几个术语 智能体 Agent 环境 Environment 动作 Action 奖励 Reward 状态 State 有些地方称作观察 Observation 奖励 Reward 在强化学习中 奖励是一个标量 它是从环境中
  • 多层网络和反向传播笔记

    在我之前的博客中讲到了感知器 xff08 感知器 xff09 xff0c 它是用于线性可分模式分类的最简单的神经网络模型 xff0c 单个感知器只能表示线性的决策面 xff0c 而反向传播算法所学习的多层网络能够表示种类繁多的非线性曲面 对
  • 在Kaggle手写数字数据集上使用Spark MLlib的朴素贝叶斯模型进行手写数字识别

    昨天我在Kaggle上下载了一份用于手写数字识别的数据集 xff0c 想通过最近学习到的一些方法来训练一个模型进行手写数字识别 这些数据集是从28 28像素大小的手写数字灰度图像中得来 xff0c 其中训练数据第一个元素是具体的手写数字 x
  • Ros使用自定义数据通讯无法收到消息的分析和解决

    nbsp 在实际的开发中 和别的模块定义了自定义的 数据类型 比如 userMsg msg文件 Header header int32 nState string strImageName string strYamlName 报错和原因
  • 在Kaggle手写数字数据集上使用Spark MLlib的RandomForest进行手写数字识别

    昨天我使用Spark MLlib的朴素贝叶斯进行手写数字识别 xff0c 准确率在0 83左右 xff0c 今天使用了RandomForest来训练模型 xff0c 并进行了参数调优 首先来说说RandomForest 训练分类器时使用到的
  • 遇见AI,从Java到数据挖掘。

    在上小学的时候就听说过AI xff0c 人工智能 xff0c 那个时候我对人工智能的感受都来自于各类影视作品 xff0c 类人的外表 xff0c 能听说读写 xff0c 有情感 xff0c 会思考 所以那个时候的我将人工智能想象成和人类相似
  • PyTorch模型保存与加载

    torch save xff1a 保存序列化的对象到磁盘 xff0c 使用了Python的pickle进行序列化 xff0c 模型 张量 所有对象的字典 torch load xff1a 使用了pickle的unpacking将pickle
  • ROS和ROS2.0到底该用哪个呢?

    很多朋友经常问ROS1 0 下文简称ROS 和ROS2 0我到底该学习 使用哪个呢 欢迎拍砖讨论 但若是因此对您的项目或产品造成了损失 本人不负任何责任 我先给出个人的观点 再说明其中原因 对于大众学习者 普通开发者 机器人算法开发者 在2
  • C++ Primer第五版_第一章习题答案

    文章目录 题目概览1 1 编译器文档1 2 错误标识1 3 Hello World1 4 两数相乘1 5 独立语句1 6 程序合法性1 7 不正确的嵌套注释1 8 语句合法性1 9 50到100的整数相加1 10 递减顺序打印10到0之间的
  • C++ Primer第五版_第十五章习题答案(11~20)

    文章目录 练习15 11练习15 12练习15 13练习15 14练习15 15Disc quote hBulk quote h 练习15 16练习15 17练习15 18练习15 19练习15 20 练习15 11 为你的 Quote 类
  • ROS机器人操作系统(roscpp)

    1 Client Library与roscpp 1 1 Client Library简介 ROS为机器人开发者们提供了不同语言的编程接口 比如C 接口叫做roscpp Python接口叫做rospy Java接口叫做rosjava 尽管语言
  • OpenCVSharp之ArucoSample例程

    ArUco xff1a 是一个根据预设黑白Markers来估计相机位姿的开源库 该库由C 43 43 编写 xff0c 运行速度很快 已被应用在了机器人导航 增强现实和目标姿态估计中 DetectorParameters xff1a 检测标
  • PUTTY连接虚拟机linux,出现connection refused的解决方法!

    先确认是否已经给UBUNTU安装了SSHD 在终端输入SSHD 若未安装 xff0c 按提示安装 sudo apt get install openssh server 若出现以下问题 xff1a E Could not get lock
  • docker-compose部署emqx集群 配置带mysql授权认证

    EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器 作为全球最具扩展性的 MQTT 消息服务器 xff0c EMQX 提供了高效可靠海量物联网设备连接 xff0c 能够高性能实时移动与处理消息和事件流数据 xff0c
  • ES6(ECMAScript6)新特性

    点击打开链接 箭头操作符 ES6中新增的箭头操作符 61 gt 简化了函数的书写 xff0c 操作符左边为输入的参数 xff0c 右边是进行的操作以及返回的值 引入箭头操作符后可以方便地写回调了 xff1a var array 61 1 2
  • K8s --HPA容器水平伸缩

    目录 一 什么是HPA 1 HPA伸缩过程 2 HPA进行伸缩算法 二 HPA实例 创建HPA 1 压力测试 2 同时监控cpu和memory 一 什么是HPA HPA的全称为 xff08 Horizontal Pod Autoscalin
  • linux磁盘读写命令,ubuntu命令行查看硬盘使用情况

    linux磁盘读写命令 ubuntu命令行查看硬盘使用情况 除了CPU和内存 xff0c 硬盘读写 I O 能力也是影响Linux系统性能的重要因素之一 本节介绍了可用于检查硬盘读写性能的几个系统命令 xff0c 并介绍了如何根据这些命令的
  • byr论坛技术楼

    链接 xff1a http bbs byr cn article MobileTerminalAT 17730 p 61 1

随机推荐

  • Zabbix5系列-监控华为、H3C交换机(snmpv2c/snmpv3/snmptrap) (二)

    Zabbix5系列 监控华为 H3C交换机 一 参考二 配置交换机2 1 华为SNMP v2c版本2 2 华为SNMP v3版本2 3 H3C SNMP v2c版本2 4 H3C SNMP v3版本 三 添加主机3 1 snmp v2c创建
  • docker 之普通用户运行

    ubuntu 不加sudo 执行 docker 时报错 Got permission denied while trying to connect to the Docker daemon socket at unix var run do
  • matlab simulink 自定义bus使用

    使用matlab simulink 可以方便的查看数据 xff0c simulink支持自定义bus xff0c 在bus中可以自定义数据结构 其中需要注意的是 xff0c 自定义的数据结构是有顺序的 xff0c 当signal需要和bus
  • stl container adapter

    容器适配器 xff1a stack queue priority queue stack Definition namespace std template lt typename T typename Container 61 deque
  • C 字符串获取元素地址

    打印出c字符串元素的地址 xff0c 需要将取地址符号 amp 进行静态类型转换为 void xff0c 或者使用static cast lt void gt 进行转换 const char p 61 34 abcdefg 34 char
  • MarkDown 内部跳转链接

    最近在用markdown写文档 xff0c 文档中需要有内部跳转链接 在此记录下可行的办法 这边我用表格中的文字跳转到另一个表格为例子 xff1a 表格1 商品 价格 备注 iphone13 6000 xff5e 10000 可参考采购平台
  • 深度学习 - TensorFlow Lite模型,云侧训练与安卓端侧推理

    TensorFlow Lite模型 xff0c 云侧训练与安卓端侧推理 引言一 云侧深度模型的训练代码1 加载数据集的格式分析1 1 从数据集加载的数据格式1 2 对加载的数据进行处理 2 深度模型搭建3 模型训练 评估 保存 转换4 模型
  • 无人驾驶-激光雷达与相机联合校准(Lidar Camera Calibration)

    1 激光雷达与摄像头性能对比 在无人驾驶环境感知设备中 xff0c 激光雷达和摄像头分别有各自的优缺点 摄像头的优点是成本低廉 xff0c 用摄像头做算法开发的人员也比较多 xff0c 技术相对比较成熟 摄像头的劣势 xff0c 第一 xf
  • vim c++开发

    vim 编写c 43 43 代码的快捷键 代码折叠 zf 创建折行 xff0c f 表示 foldzo 打开折行 xff0c o 表示 openzc 关闭折行 xff0c c 表示 closezd 删除折行 xff0c d 表示 delet
  • ros2 colcon

    ros2 项目构建之colcon 常用指令 colcon build symlink install cmake args DCMAKE BUILD TYPE 61 Release packages up to lt name of pkg
  • vscode docker clangd

    配置中报错 xff0c 找不到omp h头文件 sudo ln s usr lib gcc x86 64 linux gnu 9 include omp h usr include omp h
  • ros CMakeLists.txt template

    这里记录一个使用ros的CMakeLists txt的模板 xff0c 方便以后套用 示例 cmake minimum required VERSION 3 0 2 project rs parse set CMAKE CXX FLAGS
  • python 读取csv文件绘图

    python 读取csv文件数据 xff0c 然后通过plot绘图 bin bash python import csv import numpy as np from matplotlib import pyplot as plt col
  • ros utest

    在ros框架下编写代码 xff0c 在CMakeLists txt配置好之后 xff0c 在编译的时候执行下面指令即可生成测试代码的可执行文件 catkin make run tests 代码发布前 xff0c 测试用例一定要做好 xff0
  • boost 创建文件夹

    这里记录下如何使用boost创建文件夹的方法 主要步骤 包含filesystem头文件 include lt boost filesystem hpp gt 检测传入的文件目录 log path 是否存在 xff0c 目录不存在的话会新建一
  • GVINS论文阅读笔记

    Code Pseudorange Measurement c o d e p s e
  • matlab 读取csv文件绘图

    话不多说 xff0c 直接上代码 读取csv文件然后绘图 clc data 61 csvread 39 home lyb tools matlab files test csv 39 x 61 data 1 y 61 data 2 t 61
  • vins-mono初始化代码分析

    大体流程 初始化主要分成2部分 xff0c 第一部分是纯视觉SfM优化滑窗内的位姿 xff0c 然后在融合IMU信息 这部分代码在estimator processImage 最后面 主函数入口 xff1a void Estimator p
  • 浅谈嵌入式驱动设计

    一 总体说明 提到嵌入式的概念 xff0c 一时间脑容量已经容纳不下 xff0c 转到驱动的设计刚刚好 xff0c 习惯将一件事分层次去做 xff0c 驱动设计亦是如此 xff0c 很多人做工程时因为项目的时间紧张 xff0c 直接想到如何
  • 激光数据去畸变

    机械激光雷达产生数据原理 机械激光雷达中内置高速旋转的电机 xff0c 电机旋转的频率决定了激光雷达产生数据的频率 比如一个fov为360度的激光雷达 xff0c 每秒旋转一圈 xff0c 那么激光数据的频率就是1Hz xff1b 如果每秒