9 在线雷达 - 高级主题

9.1 概述

根据雷达的配置,它可能工作在单播/组播/广播模式下,或者在 VLAN 环境下,也可能加入用户自己的层。

本文说明了在每种场景下如何设置 ag_driver 的网络配置选项。

设置网络配置选项的前提,是先确定雷达工作在哪种场景,可参考《根据PCAP文件确定网络配置选项》。

为了清晰,本文所有的图都只列出了 MSOP 端口,DIFOP 端口的配置与 MSOP 类似。

在所有配置选项都正确的前提下,一些系统设置不正确,也可能导致 MSOP/DIFOP Packet 无法接收。本文也对这些环境因素作了说明。

9.2 单播、组播、广播

9.2.1 广播模式

广播模式的配置最简单。

下面的图中,雷达发送 MSOP/DIFOP Packet 到主机,ag_driver 运行在主机上。雷达数据发送到 255.255.255.255:51180,而 ag_driver 接收端绑定到端口 51180

../../_images/09_01_broadcast.png

如下代码配置 AGDriverParam。

AGDriverParam param;                         // Create a parameter object
param.input_type = InputType::ONLINE_LIDAR;  // get packet from online lidar
param.input_param.msop_port = 51180;         // Set the lidar msop port number, the default is 51180
param.input_param.difop_port = 7788;         // Set the lidar difop port number, the default is 7788
param.lidar_type = LidarType::A0;            // Set the lidar type.

9.2.2 单播模式

为减少网络流量,推荐使用单播模式。

如下的例子中,

  • 雷达发送到 192.168.101.233:51180, ag_driver 绑定到端口 51180

../../_images/09_02_unicast.png

如下代码配置 AGDriverParam。它与广播模式的配置完全相同。

AGDriverParam param;                         // Create a parameter object
param.input_type = InputType::ONLINE_LIDAR;  // get packet from online lidar
param.input_param.msop_port = 51180;         // Set the lidar msop port number, the default is 51180
param.input_param.difop_port = 7788;         // Set the lidar difop port number, the default is 7788
param.lidar_type = LidarType::A0;            // Set the lidar type.

9.2.3 组播模式

雷达也可以工作在组播模式。

在下面的例子中,

  • 雷达发送到 224.1.1.1:51180

  • ag_driver 绑定到端口 51180

  • ag_driver 让本地网卡加入组播组 224.1.1.1,这个网卡的地址是192.168.101.233

../../_images/09_03_multicast.png

如下代码配置 AGDriverParam。

AGDriverParam param;                                // Create a parameter object
param.input_type = InputType::ONLINE_LIDAR;         // get packet from online lidar
param.input_param.group_address = "224.1.1.1";      // Set the multicast group address.
param.input_param.host_address = "192.168.101.233"; // Set the host address.
param.input_param.msop_port = 51180;                // Set the lidar msop port number, the default is 51180
param.input_param.difop_port = 7788;                // Set the lidar difop port number, the default is 7788
param.lidar_type = LidarType::A0;                   // Set the lidar type. Make sure this type is correct 

9.3 多雷达的情况

9.3.1 雷达目的端口不同

如果要接入两个雷达,推荐给它们配置不同的目的端口。

在下面的例子中,

  • 第一个雷达发送到 192.168.101.233:51180,ag_driver 的第一个实例绑定到端口 51180

  • 第二个雷达发送到 192.168.101.233:51190,ag_driver 的第二个实例绑定到端口 51190

../../_images/09_04_multi_lidars_port.png

AGDriverParam param1;                         // Create a parameter object for Lidar 192.168.101.101
param1.input_type = InputType::ONLINE_LIDAR;  // get packet from online lidar
param1.input_param.msop_port = 51180;         // Set the lidar msop port number
param1.input_param.difop_port = 7788;         // Set the lidar difop port number
param1.lidar_type = LidarType::A0;            // Set the lidar type.

AGDriverParam param2;                         // Create a parameter object for Lidar 192.168.101.102
param2.input_type = InputType::ONLINE_LIDAR;  // get packet from online lidar
param2.input_param.msop_port = 51190;         // Set the lidar msop port number
param2.input_param.difop_port = 6688;         // Set the lidar difop port number
param2.lidar_type = LidarType::A0;            // Set the lidar type.

9.3.2 雷达的目的 IP 不同

虽然不推荐,也可以给接入的两个雷达配置不同的目的 IP。

  • 主机有两个网卡,地址分别是 192.168.101.233192.168.101.234

  • 第一个雷达发送到 192.168.101.233:51180,第一个 ag_driver 实例绑定到 192.168.101.233:51180

  • 第二个雷达发送到 192.168.101.234:51180,第二个 ag_driver 实例绑定到 192.168.101.234:51180

../../_images/09_05_multi_lidars_ip.png

如下代码分别配置两个 ag_driver 实例的 AGDriverParam。

AGDriverParam param1;                                // Create a parameter object for Lidar 192.168.101.101
param1.input_type = InputType::ONLINE_LIDAR;         // get packet from online lidar
param1.input_param.host_address = "192.168.101.233"; // Set the host address.
param1.input_param.msop_port = 51180;                // Set the lidar msop port number
param1.input_param.difop_port = 7788;                // Set the lidar difop port number
param1.lidar_type = LidarType::A0;                   // Set the lidar type.

AGDriverParam param2;                                // Create a parameter object for Lidar 192.168.101.102
param2.input_type = InputType::ONLINE_LIDAR;         // get packet from online lidar
param2.input_param.host_address = "192.168.101.234"; // Set the host address.
param2.input_param.msop_port = 51180;                // Set the lidar msop port number
param2.input_param.difop_port = 7788;                // Set the lidar difop port number
param2.lidar_type = LidarType::A0;                   // Set the lidar type.

9.4 VLAN

有些场景下,雷达工作在 VLAN 环境下。这时 MSOP/DIFOP 包带 VLAN 层,如下图。

../../_images/09_06_vlan_layer.png

ag_driver 工作在应用层,接触不到 VLAN 层。这时需要用户手工创建一个虚拟网卡来剥除 VLAN 层。

请看下面一个例子。

  • 给雷达分配的 VLAN ID 是 80。雷达发送到 192.168.101.233:51180。发送的包带 VLAN 层。

  • 主机上装的物理网卡 eno1 也在 VLAN ID 80 上,它接收雷达发出的带 VLAN 层的包。

../../_images/09_07_vlan.png

要剥除 VLAN 层,需要用户手工创建一个虚拟网卡。如下的命令在物理网卡 eno1 上创建虚拟网卡 eno1.80,并给它指定 IP 地址 192.168.101.233

sudo apt-get install vlan -y
sudo modprobe 8021q

sudo vconfig add eno1 80
sudo ifconfig eno1.80 192.168.101.233 up

注意这里不需要设置 eno1 的 IP 地址,保持 0.0.0.0 就好了。尤其不要设置成与 eno1.80 一样,这样反而可能导致 eno1.80 无法接收。

现在 ag_driver 就可以从 eno1.80 网卡上接收 MSOP/DIFOP Packet 了,这些包不带 VLAN 层。

如下代码配置 AGDriverParam。

AGDriverParam param;                         // Create a parameter object
param.input_type = InputType::ONLINE_LIDAR;  // get packet from online lidar
param.input_param.msop_port = 51180;         // Set the lidar msop port number, the default is 51180
param.input_param.difop_port = 7788;         // Set the lidar difop port number, the default is 7788
param.lidar_type = LidarType::A0;            // Set the lidar type.

另外可能需要说明的一点是:

连接在线雷达时,不需要、不关心选项 AGInputParam.use_vlan 的值。这个选项是为解析 PCAP 文件准备的。

9.5 User Layer, Tail Layer

某些场景下,用户可能在 MSOP/DIFOP 数据前后加入自己的层。例如 USER_LAYER 在 MSOP/DIFOP 数据之前,TAIL_LAYER 在 MSOP/DIFOP 数据之后。

../../_images/09_08_user_layer.png

这些层是 UDP 数据的一部分,所以 ag_driver 可以自己剥除他们。只需要告诉 ag_driver 每个层的字节数就可以。

如下的例子中,指定 USER_LAYER 为 8 字节,TAIL_LAYER 为 4 字节。

AGDriverParam param;                         // Create a parameter object
param.input_type = InputType::ONLINE_LIDAR;  // get packet from online lidar
param.input_param.msop_port = 51180;         // Set the lidar msop port number, the default is 51180
param.input_param.difop_port = 7788;         // Set the lidar difop port number, the default is 7788
param.input_param.user_layer_bytes = 8;      // user layer bytes. there is no user layer if it is 0
param.input_param.tail_layer_bytes = 4;      // tail layer bytes. there is no user layer if it is 0
param.lidar_type = LidarType::A0;            // Set the lidar type.

9.6 其他可能影响接收的系统设置

Wireshark 等抓包工具能抓到包,ag_driver 的所有的网络配置选项也是正确的,但它仍有可能收不到 MSOP/DIFOP Packet。

如下是一些可能的原因。

  • 雷达工作在 VLAN 模式,物理网卡(而不是虚拟网卡)配置了雷达发送 MSOP/DIFOP Packet 的目标地址。

  • 雷达工作在广播模式,但是主机的掩码不正确,导致主机不认为雷达发出的包是广播包。

    举个例子,假设主机的 IP 地址是 192.168.101.233/255.255.0.0,则广播地址就是 192.168.255.255。 如果雷达的目的地址是 192.168.101.255,那它发出的包,就不是广播包,主机会丢掉这些包。

  • 防火墙可能挡住了 MSOP/DIFOP Packet。

    在 Ubuntu上,可以用 iptables 工具查看防火墙设置。

    sudo iptables -L       # list all rules
    suod iptalbes --flush  # clear all rules
    
  • ag_driver 的其他实例,或者其他程序(如 AGView),已经先绑定了相应的的端口。