VLP-16-说明书摘要

Catalogue
  1. 1. 1. VLP-16-说明书摘要
  2. 2. 2. 激光脉冲间隔
  3. 3. 3. 数据量计算
  4. 4. 4. 旋转速度与水平角分辨率的关系
    1. 4.1. 4.1. 计算公式
  5. 5. 5. 激光数据与坐标系等信息
    1. 5.1. 5.1. 线束ID号与垂直角的关系
  6. 6. 6. 关于时间戳
    1. 6.1. 6.1. 详细讨论
    2. 6.2. 6.2. LIDAR内部计时逻辑
    3. 6.3. 6.3. PPS Qualifier
      1. 6.3.1. 6.3.1. 选项1:Require GPS Receiver Valid
      2. 6.3.2. 6.3.2. 选项2:Require PPS Lock
      3. 6.3.3. 6.3.3. 选项3:Delay
    4. 6.4. 6.4. GPS Qualifier
  7. 7. 7. 相位锁(用于多激光雷达抗干扰)
    1. 7.1. 7.1. Phase Lock
      1. 7.1.1. 7.1.1. Setting the Phase Lock
    2. 7.2. 7.2. 应用场景
  8. 8. 8. 关于水平扫描角度的设定
  9. 9. 9. 命令设置激光雷达的参数
    1. 9.1. 9.1. Set Motor RPM
    2. 9.2. 9.2. Set Field of View
    3. 9.3. 9.3. Set Return Type (Strongest, Last, Dual)
    4. 9.4. 9.4. Save Configuration
    5. 9.5. 9.5. Reset System
  10. 10. LOAM代码中关于VLP16的细节

1. VLP-16-说明书摘要

2. 激光脉冲间隔

3. 数据量计算

4. 旋转速度与水平角分辨率的关系

4.1. 计算公式

因为传感器的发射时间固定在每次发射序列的55.296us,旋转的速度改变了传感器的角度分辨率

5. 激光数据与坐标系等信息

激光点云数据的原点位于激光雷达底座中心轴上方37.7mm

5.1. 线束ID号与垂直角的关系

6. 关于时间戳

当传感器启动时,它开始使用内部时间基准计算微秒。然而,传感器可以与UTC时间异步它的数据,因此您可以确定任何特定数据包中的每一束激光的确切发射时间

UTC同步需要GPS/INS接收器生成一个同步的Pluse Per Second(PPS)信号和一个NMEA GPRMC语句,GPRMC消息提供了UTC中的分钟和秒,直到同步后,传感器从GPRMC语句读取分钟和秒数,然后使用这些信息来设置传感器的时间戳为当前这个小时所过去的毫秒数

6.1. 详细讨论

下面两个选项控制LIdar如何使用GPS数据

  • 第一控制选项确定传感器如何利用PPS信号(PPS)
  • 第二个控制选项决定传感器如何利用(NMEA)语句中提供的时间戳(GPS)

6.2. LIDAR内部计时逻辑

激光雷达内部维护一个计数器,它表示自最高小时(TOH)以来的微秒数。TOH计数基于内部振荡器递增,当传感器被提供一个有效的PPS信号,TOH计数被调整为每个PPS上升边,以将TOH与UTC时间对齐

TOH由两个独立的计数器组成。一个计数器维护从小时的顶部开始的分和秒数,另一个计数器维护次秒计数(图G-2)

6.3. PPS Qualifier

6.3.1. 选项1:Require GPS Receiver Valid

  • 如果设置为ON,那么传感器需要GPS接收器接收到有效的卫星的时候,才认为PPS有效,(此判定通过传感器接收到NMEA语句来决定)
  • 如果设置为OFF,传感器同步其亚秒计数器的上升边缘的PPS信号,而不管GPS接收机卫星状态

6.3.2. 选项2:Require PPS Lock

该设置决定了传感器在调整内部亚秒计数器到该PPS信号的上升边缘之前确认PPS信号的方式

  • 如果设置为ON,传感器利用在(选项3)Delay的值来确定在同步它的内部亚秒计数器到一个PPS信号的上升边缘之前的PPS的有效性
  • 如果设置为OFF,该传感器忽略(选项3)Delay的值,在PPS信号可能被认为有效之前,传感器使用2个周期的滚动窗口,然后被传感器用作时间参考。 关闭此选项相当于将延迟值设置为2

6.3.3. 选项3:Delay

该参数允许用户延长传感器验证PPS所需的时间。单位是整数(秒)。可接受的值范围从0到65535。默认值是5秒

6.4. GPS Qualifier

这个设置决定了TOH计数器的分和秒组件是根据GPS接收器提供的时间戳进行调整,(即使用NMEA语句来调整)

7. 相位锁(用于多激光雷达抗干扰)

当使用多个彼此接近的传感器(例如安装在车辆顶部)时,传感器数据中可能会出现偶尔的干扰模式。Velodyne提供了发射控制,通过控制数据聚集的位置来最小化这种干扰。然后可以将传感器配置为忽略包含干扰的数据。

7.1. Phase Lock

要求有PPS信号并且是Locked状态,传感器使用PPS信号的上升沿作为0度参考时刻,然后传感器调整它的时间,使得它序列起始的锁相偏移由用户指定。

举例

假设用户输入\(35\deg(\alpha)\)作为相位偏移,如下图红色箭头,红色箭头精确地表示了激光发射方向,此时传感器接收到PPS信号的上升边缘。

7.1.1. Setting the Phase Lock

要启用相位锁定,在下图所示的相位锁定偏移量字段中输入所需的相位偏移量。

例如,如果所需的偏移量是270,则在偏移量字段中输入270。单击按钮上的相位锁定(根据需要),然后单击右边的设置按钮

7.2. 应用场景

当为两个或更多的传感器设置相位锁定偏移时,Velodyne建议将传感器配置为to fire at each other。这是最小化干扰的最佳配置,因为干扰的位置在用户控制之下。

下图显示两个传感器安装在一辆车上。安装在车辆左侧的传感器将其相位锁偏置设置为90,安装在车辆右侧的传感器锁相偏置设置为270,如红色箭头表示

在这两种情况下,两个传感器在彼此背后创建数据阴影,为了避免来自相反传感器的阻塞或反射造成的任何虚假数据,用户应该忽略在shadowed方位角范围内的任何数据,如下面的图H-5所示。

要做到这一点,你需要知道传感器的直径(见第93页的传感器规格)和传感器中心之间的距离

8. 关于水平扫描角度的设定

默认Y轴正方向为0度,那如果想要从X轴负方向开始扫描,那么设定如下

START: 270度 END: 450度

9. 命令设置激光雷达的参数

这里只列出几个,具体参见VLP-16说明书,第10章

9.1. Set Motor RPM

Sets the RPM of the motor. Valid integer values range from 300 to 1200, in increments of 60. (If the RPM setting is not evenly divisible by 60, neither motor speed control nor phase lock functions will function properly.) For values 1 through 299, the sensor defaults back to 300 RPM. If a value of 0 or less is entered, the sensor motor powers down and the lasers are turned off, as leaving them on with the motor stopped would be an unsafe eye state. This has the same effect as setting the value for the Motor RPM in the Web Interface.

Command:

1
curl --data “rpm=[integer]” http://192.168.1.201/cgi/setting

Example:

1
curl --data “rpm=600” http://192.168.1.201/cgi/setting

9.2. Set Field of View

Sets the field of view (0° to 359°). Numbers outside this range are quietly ignored. This has the same effect as setting the FOV Start and FOV End values on the Web Interface.

Command:

1
curl --data “[start]|[end]=[integer]” http://192.168.1.201/cgi/setting/fov

Examples:

1
2
curl --data "start=10" http://192.168.1.201/cgi/setting/fov
curl --data "end=270" http://192.168.1.201/cgi/setting/fov

9.3. Set Return Type (Strongest, Last, Dual)

This command sets the return type (or mode) of the sensor. Choose one: Strongest, Last, and Dual. This has the same effect as selecting the Web Interface Return Type.

Command:

1
curl --data “returns=[Strongest]|[Last]|[Dual]” http://192.168.1.201/cgi/setting

Examples:

1
2
3
curl --data “returns=Strongest” http://192.168.1.201/cgi/setting
curl --data “returns=Last” http://192.168.1.201/cgi/setting
curl --data "returns=Dual" http://192.168.1.201/cgi/setting

9.4. Save Configuration

Saves the configuration so that the settings are persistent across power cycles. This is equivalent to clicking on the Save Configuration button under the Configuration tab in the Web Interface.

Command:

1
curl --data “submit” http://192.168.1.201/cgi/save

9.5. Reset System

Resets the sensor. This command performs the same operation as pressing the Reset System button under the System tab in the Web Interface, or if you cycled power to the sensor.

Command:

1
curl --data "reset_system" http://192.168.1.201/cgi/reset

Example Response:

1
The system resets.

LOAM代码中关于VLP16的细节

1
2
3
4
5
6
7
8
9
10
11
12
13
//!lidar scan开始点的旋转角,atan2范围[-pi,+pi],计算旋转角时取负号是因为velodyne是顺时针旋转
float startOri = -atan2(laserCloudIn.points[0].y, laserCloudIn.points[0].x);
//lidar scan结束点的旋转角,加2*pi使点云旋转周期为2*pi
float endOri = -atan2(laserCloudIn.points[cloudSize - 1].y,
laserCloudIn.points[cloudSize - 1].x) + 2 * M_PI;

//结束方位角与开始方位角差值控制在(PI,3*PI)范围,允许lidar不是一个圆周扫描
//正常情况下在这个范围内:pi < endOri - startOri < 3*pi,异常则修正
if (endOri - startOri > 3 * M_PI) {
endOri -= 2 * M_PI;
} else if (endOri - startOri < M_PI) {
endOri += 2 * M_PI;
}

根据点的仰角,区分所在线束编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//坐标轴交换,velodyne lidar的坐标系也转换到z轴向前,x轴向左的右手坐标系
point.x = laserCloudIn.points[i].y;
point.y = laserCloudIn.points[i].z;
point.z = laserCloudIn.points[i].x;

//计算点的仰角(根据lidar文档垂直角计算公式),根据仰角排列激光线号,velodyne每两个scan之间间隔2度
float angle = atan(point.y / sqrt(point.x * point.x + point.z * point.z)) * 180 / M_PI;
int scanID;
//仰角四舍五入(加减0.5截断效果等于四舍五入)
int roundedAngle = int(angle + (angle<0.0?-0.5:+0.5));
if (roundedAngle > 0){
scanID = roundedAngle;
}
else {
scanID = roundedAngle + (N_SCANS - 1);
}
//过滤点,只挑选[-15度,+15度]范围内的点,scanID属于[0,15]
if (scanID > (N_SCANS - 1) || scanID < 0 ){
count--;
continue;
}