LiDAR:从激光脉冲到三维视觉

LiDAR 起源于 20 世纪 60 年代,紧随激光器的发明之后。

最初被气象学家用来测量云层。

LiDAR/ˈlaɪdɑːr/,也写作 LIDAR,是"Light Detection and Ranging"(光探测与测距)或"Laser Imaging, Detection, and Ranging"(激光成像、探测与测距)的缩写)是一种通过向目标物体或表面发射激光并测量反射光返回接收器所需时间来确定距离的方法。— Wikipedia

LiDAR 技术是一种强大的工具,用于从环境中收集精确而详细的数据。

LiDAR 的工作原理基于一个简单的概念,涉及激光脉冲发射和精确的时间测量。核心过程可以总结如下:

  1. 激光脉冲发射: LiDAR 系统向地面或目标物体快速发射激光脉冲。
  2. 时间测量: 系统测量每个脉冲击中物体后弹回所需的时间。这个时间差对于计算距离至关重要。用于此计算的公式为:距离 = (光速 × 经过时间)/ 2

LiDAR 通常使用红外波长(约 900–1550 nm),因为 散射更少,穿透力更强。

根据瑞利散射实验:

1、从 LiDAR 传感器获取实时数据

当我们清楚了 LiDAR 在理论上的工作原理——激光脉冲发射、反射和距离计算——之后,下一步就是从我们的 LiDAR 传感器获取实时数据

1.1 了解网络设置

大多数 LiDAR 传感器通过 以太网(UDP 数据包)进行通信,至于原因,你看过《速度与激情》系列电影吗?

要接收 LiDAR 的数据,我们的计算机和传感器必须处于同一子网

1.2 为你的网络接口分配一个临时 IP 地址

这样电脑和 LiDAR 地址共享同一子网(192.168.1.x),使它们能够相互通信。

在终端中运行以下命令,手动为你的电脑以太网接口分配 IP 地址:

sudo ip addr add 192.168.1.102/24 dev eth0

说明:

  • sudo 赋予修改网络设置的管理员权限。
  • ip addr add 分配一个新的 IP 地址。
  • /24 指定子网掩码(255.255.255.0)。
  • dev eth0 指定你的以太网接口(根据系统不同,也可能是 enp1s0eth1 等)。

要验证更改,输入:

ip addr show

1.3 测试连接

通过发送 ping 请求检查你的电脑是否能访问 LiDAR:

ping 192.168.1.200

如果配置正确,你会看到类似这样的输出:

64 bytes from 192.168.1.200: icmp_seq=1 ttl=64 time=0.345 ms

1.4 验证来自 LiDAR 的数据流

sudo tcpdump -i eno1 host 192.168.1.200

1.5 记录数据以供分析

sudo tcpdump -i eth0 -w lidar_data.pcap

此外,还可以使用 Wireshark:

Wireshark 是一个图形化网络协议分析器——非常适合可视化检查 LiDAR UDP 数据包。它可以帮助你确认 LiDAR 是否正常传输并理解数据格式。

打开 Wireshark 并选择网络接口

  • 启动 Wireshark。
  • 选择连接到 LiDAR 的以太网接口(例如 eth0enp1s0)。
  • 点击开始捕获数据包(蓝色的鲨鱼鳍图标)。
  • 设置捕获过滤器:
udp.port == 6699 && ip.src == 192.168.1.200

保存捕获的数据

  • 进入 文件 → 另存为 并存储捕获的数据。

2、三维点云

LiDAR 以三维点数据的形式捕获关于世界的空间信息。每个激光脉冲测量一个距离,当与角度传感器位置结合时,就创建了环境的三维图像,称为点云

2.1 LiDAR 通信协议(RS-LiDAR-M1P)

RS-LiDAR-M1P 与计算机之间的通信协议主要分为两类。

主数据流输出协议(MSOP) 将 LiDAR 测量的距离、角度、反射率等信息封装成数据包并输出到计算机。

LiDAR 信息输出协议(DIFOP) 将当前使用的 LiDAR 的各种配置信息输出到计算机。

2.2 主数据流输出协议(MSOP)

主数据流输出协议缩写为 MSOP。

  • I/O 类型:LiDAR 输出,计算机分析。
  • 默认端口号:6699。

MSOP 数据包输出与三维测量相关的数据,包括激光测距值、返回反射率值、垂直角度、水平角度和时间戳。MSOP 数据包的有效载荷长度为 1210 字节,由 32 字节的同步头、1175 字节的数据包(共 25 个 47 字节的数据块)和 3 字节的尾部组成。MSOP 数据包的基本结构如下图所示:

形象说明:

想象我们的 LiDAR 就像在写一本关于三维点的书。

  • 每一本书 = 一次完整的 360° 扫描
  • 每一页 = 一个数据包
  • 每一页上的段落 = 一个数据块
  • 每一段落中的句子 = 一个通道测量(一个激光器)

所以:

  • 1 个数据包 = 25 个数据块
  • 1 个数据块 = 5 个通道

因此每个数据包 = 25 × 5 = 125 个独立的激光点。

所以前 32 个字节只是元数据(如时间、温度等),接下来的 1175 个字节才是实际测量数据

然后是代码:

payload = packet[32:32 + 1175]
  • packet → 是完整的二进制数据(总共 1210 字节)
  • [32:32 + 1175] → 从字节索引 32 开始切片,直到字节索引 (32 + 1175 = 1207)

用通俗的话说:

"跳过前 32 个字节(头部),然后取接下来的 1175 个字节(LiDAR 测量数据)。"

LiDAR 将数据组织成 25 个组(称为数据块):

payload = 25 * 47 bytes = 1175 bytes

每个数据块(47 字节)包含 5 个通道的数据。

所以在代码中:

for block_idx in range(25):
    block_offset = block_idx * 47
    block = payload[block_offset:block_offset + 47]

# 将 1175 字节逐个切片为 47 字节的块

2.3 LiDAR 信息输出协议(DIFOP)

LiDAR 信息输出协议缩写为 DIFOP。

  • I/O 类型:LiDAR 输出,计算机读取。
  • 默认端口号:7788。

DIFOP 是一个"仅输出"协议,用于定期向用户发送 LiDAR 序列号(S/N)、固件版本信息、主机驱动兼容性信息、网络配置信息、校准信息、运行状态和故障诊断信息。通过读取 DIFOP,用户可以了解当前使用的 LiDAR 各参数的具体信息。

一个完整的 DIFOP 数据包由同步头、保留字节和数据包组成。每个 DIFOP 数据包长度为 256 字节,包括 8 字节的同步头、1 个保留字节和 247 字节的数据包。DIFOP 数据包的基本结构如下图所示。


原文链接: LiDAR for Self-Driving Cars: From Laser Pulses to 3D Vision

BimAnt翻译整理,转载请标明出处