Ouster Python SDK 数据过滤 Filter 使用方法介绍 (一)
沙石、谷物,可以通过筛子过滤,过滤的依据条件是颗粒的尺寸不同。有些光学仪器,通过滤光片过滤光线,过滤的依据条件是光的波长不同。
还有生活中常见的净水器过滤饮用水,漏勺捞起锅里浮起的饺子,都是过滤的例子。
所有种种的过滤,都是依据物体的某个特性,采用某种设备或者方法,保留它,或者,除去它。
因此,提起过滤,想必大家应该都是不陌生的。
Ouster 激光雷达的点云数据,也有很多不同的属性或者说特性。依据这些属性,我们也可以对点云数据进行过滤。
那么 Ouster 激光雷达输出的点云数据,有哪些属性呢?
以下是从 Ouster 官网上摘取的 Ouster 激光雷达点云数据介绍。


除了以上所示的,包含在激光雷达点云UDP数据包中的原始内容之外,Ouster 激光雷达根据旋转扫描的工作方式和每个激光线束的水平、竖直角度分布,还可以得出物体上返回的每个激光点在整个点云帧中的行、列位置,以及每个激光点在空间的 XYZ 值。
到此为止,我们就知道 Ouster 激光雷达点云数据中,每个点的所有属性信息了,它们分别是:
- 点的行位置信息 U
- 点的列位置信息 V
- 点的反射率 REFLECTIVITY
- 点的强度 SIGNAL
- 点的距离 RANGE
- 点的空间 XYZ
依据以上点的属性,我们就可以根据实际应用需求,对 Ouster 激光雷达的点云数据进行过滤了。
从事点云数据处理和算法开发的软件攻城狮,了解了 Ouster 激光雷达的点云属性后,如果在使用 Ouster 激光雷达时需要用到数据过滤,那么不消我多言,分分钟键盘敲得冒烟,转眼间就能完成数据过滤。
这篇文章,并非详细阐述点云数据过滤的算法,而是介绍一下使用 Ouster 提供的 Python SDK,通过以上提到的点云属性,对点云数据进行过滤的方法。
实现方式,并非编写大量的程序代码,而是基于 Ouster Python SDK,通过终端命令行的方式,快速地、便捷地完成点云数据过滤。无论是七老八十年富力强的老登,还是蹒跚学步的黄口小儿,只要愿意,也能分分钟掌握操作,从而给雷达测试和数据分析处理带来便利。
关于这部分的内容,也有视频介绍,可以参考:
Ouster Python SDK 数据过滤 Filter 使用方法介绍 (一)_哔哩哔哩_bilibili
对 Ouster 激光雷达点云数据内容做了初步的介绍后,接下来我们就进入点云数据过滤的准本工作。
1. 电脑中安装 Python 和 Ouster Python SDK
如果要使用具有点云数据过滤功能的 Ouster Python SDK,建议电脑中安装的 Python3 的版本不低于 3.8,也不高于 3.13。
如果电脑中已经安装了 Python3,可以通过下方的指令,查看电脑中的 Python3 版本。
python3 --version 或 python3 -V
我所使用的 Ubuntu 电脑中安装的 Python3 版本是 3.10.12。

Python3 安装妥当之后,就可以安装 Ouster Python SDK 了。
安装指令是:
pip3 install ouster-sdk
如果电脑中已经安装了 Ouster Python SDK,可以通过下方的指令,查看一下 Ouster Python SDK 的版本。

Ouster Python SDK 从 0.15.0 的版本开始,才加入了数据过滤的功能,因此,在此之前的版本,还不支持点云数据过滤。
Ouster Python SDK 提供的点云数据过滤功能,既支持对在线运行的激光雷达点云数据进行实时过滤,也支持对录制好的 Ouster 激光雷达 pcap 点云数据包进行过滤处理。
本文中,为了呈现方便,我采用对录制的 pcap 点云数据包进行过滤的方法。录制点云数据时,我使用的是一台 128 线的 OS1 激光雷达(型号 OS1-128)。
(pcap 点云数据,务必要有与之对应的 json 格式的雷达内参 metadata文件 )
2. 通过 Ouster Python SDK 对点云数据进行过滤
(1)通过点云的行位置信息进行数据过滤
Ouster 激光雷达点云的总行数,也就是激光雷达的总线数。说白了,也就是激光雷达竖直方向的分辨率。
这个值,是由 Ouster 激光雷达的型号决定的。目前 Ouster 提供的激光雷达,竖直方向的总线数,有 32 线,64 线和 128 线的型号可选。

基于竖直方向的分辨率,也就是行位置进行点云数据过滤,可以使我们从所有线数的完整点云数据中,抽取其中某一部分激光线束的点云。
使用下方的指令,可以将 128 线激光雷达水平面以上 64 根激光线的点云数据都过滤掉。
ouster-cli source chris-chen_test-data.pcap filter U 0:63 viz
得到的点云显示效果如下。

通过对比,我们可以看出从高处的建筑物和树木返回的点被过滤掉了。采用这种过滤方式得到的点云效果,相当于使用了一台 OS1-64-BH 型号的激光雷达。
使用下方的指令,可以将 128 线激光雷达水平面以下的64 根激光线的点云数据都过滤掉。
ouster-cli source chris-chen_test-data.pcap filter U 64:127 viz
得到的点云显示效果如下。

通过对比,我们可以看出从地面和低处的物体返回的点被过滤掉了。采用这种过滤方式得到的点云效果,相当于使用了一台 OS1-64-AH 型号的激光雷达。
如果我使用下方的过滤指令,会得到怎样的点云效果呢?
ouster-cli source chris-chen_test-data.pcap filter U 48:80 viz
从过滤前后的点云效果对比中,我们可以看到,过滤后的点云,128线中间的一部分线束的点都消失了,高处的建筑物和树木返回的点云和最下方的地面返回的点云仍然存在。

这种过滤方式,想必应该不会有人去采用吧?
如果我们只想使用这个 128 线激光雷达中间的 32 根线束的点云,该如何操作呢?
可以使用下方的指令:
ouster-cli source chris-chen_test-data.pcap filter U :48 filter U 80: viz
我们将得到如下所示的点云效果:

如果你想将过滤后的点云数据再存储下来,那么在输入的过滤指令末尾(即 viz 之后),再加上空格 save your-filtered-data.pcap 即可。
(2)通过点云的列位置信息进行数据过滤
Ouster 激光雷达一帧点云的列数,取决于激光雷达的工作模式 lidar_mode。默认是一圈 360 度对应 1024 列。Ouster 激光雷达的工作模式,也可以设置为一圈 512 列或 2048 列。

根据 Ouster 激光雷达点云中的列属性,也可以对点云数据进行过滤。
熟悉 Ouster 激光的铁子们可能会产生一个疑问:通过设置水平视场角范围 Azimuth_window,也可以实现类似的过滤功能,二者之间有什么区别吗?

可以说,差别还是蛮大的。
设置了水平视场角范围,比如说 0 ~ 180 度,激光雷达在旋转扫描经过 180 ~ 360 度的角度范围时,是不发射红外激光的。也就是激光雷达输出的原始数据,在 180 ~ 360 度的水平视场角范围内,是不会有检测数据的。
基于点云的列属性所做的数据过滤,激光雷达输出的原始点云数据,仍然是包含所有列数的数据,只是通过过滤的方式,将其中某些列数的数据给去除掉了。
我采集数据所用的 128 线激光雷达工作在 1024x10 模式,一圈有1024列。我可以通过下方的指令,将 0 ~ 512 列的点云都滤除掉。
ouster-cli source chris-chen_test-data.pcap filter V 0:512 viz
过滤后的点云显示效果如下:

如果想将另一半的所有列数的点云都过滤掉,可以使用下方的指令:
ouster-cli source chris-chen_test-data.pcap filter V 512:1023 viz
得到的数据过滤效果如下:

接下来我们看一下将激光雷达前方180度范围内的点云都过滤掉的方法。
指令是:
ouster-cli source chris-chen_test-data.pcap filter V 256:768 viz
过滤后的点云显示效果如下:

最后,我们再来看一下将激光雷达后方180度扫描范围内的点云给过滤掉,保留激光雷达前方180度扫描范围内的点云的方法。
过滤的指令是:
ouster-cli source chris-chen_test-data.pcap filter V :256 filter V 768: viz
过滤后的点云显示效果如下:

如果想保存过滤后的点云数据,那么在输入的过滤指令末尾(即 viz 之后),再加上空格 save your-filtered-data.pcap 即可。
基于 Ouster 激光雷达点云数据的行、列属性,进行点云数据过滤的方法,也有视频内容进行介绍:
更多推荐




所有评论(0)