rs_driver v1.5.7 源代码解析(一)

2022-09-19  本文已影响0人  RonZheng2010

rs_driver 是RoboSense雷达的基本驱动程序。本文是rs_driver的源代码解析文档,原文地址在:
https://github.com/RoboSense-LiDAR/rs_driver/blob/v1.5.7/doc/src_intro/rs_driver_intro_CN.md

1 基本概念

1.1 机械式雷达、MEMS雷达

rs_driver支持RoboSense的两种雷达:

1.2 通道 Channel

对于机械式雷达,通道指的是垂直方向上扫描的点数,每个通道上的点连成一条线。比如,RS16是16线雷达,也就是16个通道; RSBP是32线雷达,RS128是128线雷达。

MEMS雷达的通道与机械式雷达不同,它的每个通道可能对应一块区域,比如一个矩形区域。

1.3 MSOP/DIFOP

RoboSense雷达与电脑主机的通信协议有三种。

rs_driver处理前两类协议的包,也就是MSOP Packet和DIFOP Packet。

一般来说,激光雷达与电脑主机通过以太网连接,使用UDP协议。MSOP/DIFOP的格式,不同的雷达可能有较大差异。

1.4 点云帧

2 rs_driver的组件

rs_driver主要由三部分组成: Input、Decoder、LidarDriverImpl。

01_components.png

3 Packet接收

Input部分负责接收MSOP/DIFOP Packet,包括:

02_classes_input.png

3.1 Input

Input定义接收MSOP/DIFOP Packet的接口。

03_class_input.png

3.2 InputSock

InputSock类从UDP Socket接收MSOP/DIFOP Packet。雷达将MSOP/DIFOP Packet发送到这个Socket。

04_class_input_sock.png 05_packet_layers.png

3.2.1 InputSock::createSocket()

createSocket()用于创建UDP Socket。

该Socket的配置参数可以在RSInputParam中设置。根据设置的不同,createSocket()支持如下几种模式。

msop_port/difop_port host_address group_address
6699/7788 0.0.0.0 0.0.0.0 雷达的目的地址可以为广播地址、或电脑主机地址
6699/7788 192.168.1.201 0.0.0.0 雷达的目的地址可以为电脑主机地址
6699/7788 192.168.1.201 239.255.0.1 雷达的目的地址可以为组播地址、或电脑主机地址

3.2.2 InputSock::init()

init() 调用createSocket(),创建两个Socket,分别接收MSOP Packet和DIFOP Packet。

3.2.3 InputSock::start()

start() 开始接收MSOP/DIFOP Packet。

3.2.4 InputSock::recvPacket()

recvPacket() 接收MSOP/DIFOP Packet。
在while()循环中,

3.3 InputPcap

InputPcap解析PCAP文件得到MSOP/DIFOP Packet。使用第三方工具,如WireShark,可以将雷达数据保存到PCAP文件中。

06_class_input_pcap.png 07_packet_layers_full.png

用户配置参数RSInputParam中指定选项udp dst port。有如下几种情况。

msop_port difop_port 说明
0 0 如果PCAP文件中只包含一个雷达的Packet
6699 7788 如果PCAP文件中包含多个雷达的Packet,则可以只提取指定雷达的Packet(该雷达MSOP/DIFOP端口不同)
6699 6699/0 如果PCAP文件中包含多个雷达的Packet,则可以只提取指定雷达的Packet(该雷达DIFOP/DIFOP端口相同)

3.3.1 InputPcap::init()

init()打开PCAP文件,构造PCAP过滤器。

3.3.2 InputPcap::start()

start()开始解析PCAP文件。

3.3.3 InputPcap::recvPacket()

recvPacket()解析PCAP文件。
在循环中,

如果pcap_next_ex()还能读出Packet,

如果是MSOP Packet,

如果是DIFOP Packet,处理与MSOP Packet一样。

如果pcap_next_ex()不能读出Packet,一般意味着到了文件结尾,则:

用户配置RSInputParam的设置决定是否重新进行下一轮的解析。这个选项是RSInputParam::pcap_repeat

3.4 InputRaw

InputRaw是为了重播MSOP/DIFOP Packet而设计的Input类型。将在后面的Packet Record/Replay章节中说明。

3.5 InputFactory

InputFactory是创建Input实例的工厂。

08_class_input_factory.png

Input类型如下。

enum InputType
{
  ONLINE_LIDAR = 1, // InputSock
  PCAP_FILE,        // InputPcap
  RAW_PACKET        // InputRaw
};

3.5.1 InputFactory::creatInput()

createInput() 根据指定的类型,创建Input实例。

上一篇 下一篇

猜你喜欢

热点阅读