【cartographer_slam源码阅读】4-6激光雷达数据的转换

HandleLaserScanMessage()函数

在这里插入图片描述

作用:

  1. 利用 ToPointCloudWithIntensities函数 将ros中的数据转换为carto中定义的数据类型;
  2. 传入 HandleLaserScan() 函数中进行处理;

Note:

  1. sensor_msgs::LaserScan数据格式:
  2. PointCloudWithIntensities数据格式:

HandleMultiEchoLaserScanMessage() 函数同上类似;

HandlePointCloud2Message()函数

在这里插入图片描述

作用:

  1. 利用ToPointCloudWithIntensities函数 将ros中的数据转换为carto中定义的数据类型;
  2. 传入 HandleRangefinder() 函数中进行处理;

上面三个函数都调用了ToPointCloudWithIntensities函数,该函数根据传参数据格式不同进行了重载;

ToPointCloudWithIntensities()函数

LaserScanToPointCloudWithIntensities()函数

模板函数,处理ros格式的sensor_msgs::LaserScan and sensor_msgs::MultiEchoLaserScan数据格式,得到PointCloudWithIntensities类型数据;

数据格式

LaserScan(单回波激光雷达):

header: 消息头,包含了该消息的帧id、时间戳和坐标系信息。
angle_min: 扫描起始角度,单位为弧度。(180度)
angle_max: 扫描终止角度,单位为弧度。(-180度)
angle_increment: 角度分辨率,即每个激光束之间的角度差,单位为弧度。(-0.18度)
time_increment: 时间分辨率,相邻两激光点的扫描时间增量,单位为秒。
scan_time: 一次扫描的持续时间,单位为秒。(0.06秒)
range_min: 能够测量到的最小距离值,单位为米。(0米)
range_max: 能够测量到的最大距离值,单位为米。(40米)
ranges: 扫描得到的距离值数组,按照顺序存放,单位为米。
intensities: 扫描得到的反射强度值数组,如果激光雷达不支持反射强度测量,则该字段为空。

MultiEchoLaserScan(多回波激光雷达):

程序逻辑

  1. 激光雷达异常数据判断
    在这里插入图片描述
    在这里插入图片描述

最终需要得到的数据格式:


在这里插入图片描述
在这里插入图片描述
激光点在指定坐标系的坐标position;
激光点时间戳time;
激光点强度intensities;

  1. point坐标获取

(1)以单回波雷达数据的处理为例,HasEcho判断测距数据是否为空;
(2)取ranges测距里面的第一个值,注意(ranges 里面的值是按 扫描起始角度->扫描终止角度 顺序存储的);
(3)判断数据在激光雷达有限测距范围内;
(4)根据测得的距离以及扫描起始角度,角度分辨率信息,循环计算每个扫描点在设置坐标系下的坐标,原理如图;
(5)这里还定义了第一次扫描点的时间为0,依次按照时间增量递增(与后面的时间戳定义有关);
(6)激光雷达长时间未扫描到障碍物没有办法建图;
在这里插入图片描述

在这里插入图片描述

  1. intensities强度数据获取

(1)强度可以理解为障碍物对激光束的反射率;
(2)判断雷达原始数据中有强度数据,检查扫描点个数必须与强度数据对齐,即一个扫描点必须对应一个强度信息,满足则push到carto定义的强度数据中,否则push数据0进去;

在这里插入图片描述

  1. time数据获取

(1)激光雷达每帧数据自带时间戳为开始扫描的时间;
(2)获取points数据时,最后一个点的points.time数据记录了扫描一帧的用时duration,时间戳为每帧扫描结束后的时间;
(3)相应的,每个扫描点记录的时间改为points.time-duration(其实就是保证这一帧数据的时间戳加上points.time是每个扫描点的扫描时间);
在这里插入图片描述

Cartographer_ros 是一个在 ROS 中使用 Google Cartographer 进行 2D 和 3D SLAM 的软件包。它提供了一个 ROS 节点,可以将 Cartographer 的输出与 ROS 生态系统中的其他软件包集成起来。 Cartographer_ros 的源代码框架如下: 1. launch 文件:Cartographer_ros 使用 launch 文件来配置和启动 ROS 节点。launch 文件包括 cartographer.launch、demo_backpack_2d.launch、demo_backpack_3d.launch 等。 2. ROS 节点:Cartographer_ros 的主要节点是 cartographer_node,它负责运行 Cartographer,并将数据发布到 ROS 话题上。cartographer_node 本身是由多个模块组成的,每个模块负责处理不同的任务。 3. ROS 话题:cartographer_node 将数据发布到 ROS 话题上,这些话题包括激光雷达数据、里程计数据、地图数据等。 4. Cartographer 模块:CartographerCartographer_ros 的核心部分,它包括了多个模块,如 sensor_bridge、mapping、localization 等。这些模块负责处理传感器数据、建立地图和定位机器人。 5. ROS 服务:Cartographer_ros 还提供了一些 ROS 服务,比如 start_trajectory、finish_trajectory 等,这些服务可以用于控制 Cartographer 的运行。 6. 消息定义:Cartographer_ros 使用了自定义的消息类型,如 cartographer_ros_msgs/TrajectoryState、cartographer_ros_msgs/SubmapList 等。 总的来说,Cartographer_ros 的源代码框架是基于 ROS 架构设计的,它通过 ROS 节点、话题和服务来实现 Cartographer 的集成和控制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值