上一篇 Ouster Python SDK 数据过滤 Filter 使用方法介绍的博文发布后,过去了一周还没有后续,有些铁子们可能就想了:是不是数据过滤 Filter 使用方法介绍的内容烂尾了,还是说只要遇到 Ouster 激光雷达点云数据的过滤,我用上一篇介绍的方法,横竖过滤就完了?

岂止于此!

这里就将 Ouster Python SDK 过滤点云数据的其他方法一并奉上。

(3)通过点云的反射率信息进行数据过滤

反射率并不是 Ouster 激光雷达的属性,而是被测目标物的表面的属性,如材质、颜色、纹理、表面光滑程度等。激光雷达接收到从目标物反射回来的激光回波后,会通过 REFLECTIVITY 来表征除了距离之外的这一目标物属性。

反射率值,是一个无量纲的数据,也就是没有单位。
对于 Ouster 激光雷达输出的点云数据的反射率而言,取值范围是从 0 到 255。
反射率范围在 0 ~ 100 的目标物,表面主要呈现为漫反射(Diffuse);
反射率范围在 100 ~ 255 的目标物,表面主要呈现为逆反射或回归反射(Retro-reflective)。

我们生活中常见的物体,诸如室外的路面(包括沥青路面、水泥路面、土路面、砖路面、沙石路面等)、建筑物、树木、桥梁、围栏、电线杆......以及室内的地面、墙壁、屋顶、桌椅和其他各种家具等,大多表面都是以漫反射为主,反射率通常会低于100。
而道路指示牌、警示牌、机动车车牌、交通路锥、路口隔离栏上贴有的反光条、安全背心等,表面则以逆反射或回归反射为主,反射率值通常会远远高于 100。

总之就是,逆光也清晰,照亮你的美!

以下用几幅图片具体化一下。

   

了解了不同目标物的反射率特点后,我们来看一下如何通过反射率对点云数据进行过滤。

下方的指令,可以将场景中,反射率低于 100 的物体上的点都过滤掉。

ouster-cli source chris-chen_test-data.pcap filter REFLECTIVITY :100 viz

得到的点云显示效果如下:

发现没?这种过滤操作后,就剩从贴有 3M 膜的测试板和远处高反路牌上的零星几个点了。

将激光雷达输出的绝大部分点云都滤除掉,肯定不是我们使用激光雷达产品的本意吧?

那么我们来看一下将反射率 100 以下的点都保留,而将反射率高于 100 的点都过滤掉,是怎样一种情形呢。

过滤指令如下:

ouster-cli source chris-chen_test-data.pcap filter REFLECTIVITY 100: viz

过滤后得到的点云则是这样的:

不知道大家有没有看出差别?
我从过滤后点云中,可以看到板子上贴的 3M 反射膜上的点云没有了。

如果我们在使用中,想将反射率高于 100 的点都过滤掉,同时也想将反射率低于 1 的点(也就是反射率都是 0 的点)也过滤掉,该如何操作呢?

可以使用下方的指令:

ouster-cli source chris-chen_test-data.pcap filter REFLECTIVITY :1 filter REFLECTIVITY 100: viz

过滤后的点云显示效果如下:

这个过滤方法的真正意义在于将反射率低于 1,也就是反射率为 0 的点,都过滤掉。因为在有些场景中,一些特定目标物的周边,可能会因高反膨胀或多路径出现一些噪点,这些噪点会对设备运行造成严重干扰,而这些噪点有个特点,就是反射率基本上都是0,那么设置反射率过滤条件 :1,可以将这些噪点都滤除掉。

如果设置的过滤条件不是低于1,而是低于2,3,甚至是 5 或更大的反射率值,那么这里必须着重进行强调:请务必充分评估应用场景中低反射率目标物的点云滤除,是否会带来风险!
因为如果激光雷达应用场景中,存在一些很黑的物体,或者表面潮湿带水的物体,那么反射率可能也会很低,甚至是 1 或低于 1。如果将这些物体上的点都过滤掉会带来风险,则不建议在这种情况下,设置滤除低反射率点云的条件。

(四)通过点云的强度信息进行数据过滤

Ouster 激光雷达手册上对点云的强度(Signal Strength)的表述是:Ouster 数字式激光雷达的强度,是通过检测到的光子数来表示的。

大家也可以忽略我的描述,直接查看下图中复制的英文内容。

Ouster 激光雷达提供的点云的 Signal Strength 强度信息,是用 16 bit 的数据长度来表述,取值范围是从 0 到 65535。数值越大,表示强度值越强。

我们先从第一个示例中,看一下将强度值高于 3000 的点都过滤掉,会得到怎样的一个效果。

过滤的指令如下:

ouster-cli source chris-chen_test-data.pcap filter SIGNAL 3000: viz

差别看上去不是很明显。我直观的感受是,板子上贴的 3M 反射膜上的点云没有了。

接下来我换一个过滤条件,将强度值 500 以下的点都过滤掉。

过滤指令如下:

ouster-cli source chris-chen_test-data.pcap filter SIGNAL :500 viz

过滤后的点云对比效果如下图所示。

从原始点云和过滤后的点云显示效果对比来看,远距离处的建筑物和树木上的点云都被过滤掉了,只剩一些远处的高反牌上的点云。
据此,我们也大致可以得出一个结论:就是距离越远,目标物上反射回来的点云的强度也越弱。关于点云的强度,我们有这个概念,大致就可以了。(除此之外,其实点云的强度信息,也和入射角是有关系的。激光直接正对着照射,得到的点云强度,肯定比斜着照射得到的点云强度值要大。)

基于 Ouster 激光雷达点云数据反射率(REFLECTIVITY)和强度(SIGNAL)属性,进行点云数据过滤的方法,也有视频内容进行介绍:

Ouster Python SDK 数据过滤 Filter 使用方法介绍 (三)_哔哩哔哩_bilibili

(五)通过点云的距离信息进行数据过滤

Range 是指基于 ToF (time of flight)原理,计算得出的每个激光脉冲从 lidar 原点到目标物的距离。因此,所有点的 RANGE 值,都肯定是正的。讲的再严谨一点,应该说是非负的,因为会有 RANGE 为 0 的点。
RANGE 值为 0 的点,通常是那些因为激光照射向空中无法返回,或远远的打向水面被吸收或被镜反,而导致没有回波的点。

因为 OS 系列激光雷达是旋转扫描的,因此,激光雷达在水平放置时,如果地面开阔且无遮挡,那么激光雷达下方的每个线束会从地面上返回圆环形的点云。
我们通过 RANGE 进行点云数据过滤时,也会有这种圆环截取点云的感受。

接下来,我们看一下如何通过距离 RANGE 对 Ouster 激光雷达的点云数据进行过滤。

通过距离进行点云数据过滤时,我们就需要在过滤指令中的距离值后,加入单位了。

第一个示例中,我们来看一下将 6 米以内的点都过滤掉,会是怎样的效果。
过滤指令如下:

ouster-cli source chris-chen_test-data.pcap filter RANGE :6m viz

过滤后的点云显示效果如下:

有没有发现,地面上没有点云的圆形区域是不是变大了?这是因为我们设置的过滤距离之内的点,都被滤除掉了。

接下来的示例中,我们看一下将 RANGE 是 30 米之外的点都过滤掉之后的显示效果。

点云过滤的指令是:

ouster-cli source chris-chen_test-data.pcap filter RANGE 30m: viz

过滤后的点云显示效果如下所示:

从过滤后的点云,我们可以看出远处建筑物和树木上的点云都被滤除掉了。
但它与基于强度值过滤的第二个示例的显示效果差异在于,它将 RANGE 30 米之外的点,都滤除掉了,即使 30 米之外有强度值(SIGNAL)很大的来自高反路牌的点。

然后我们设置一个距离区间,将 6 米以内,30 米以外的点都过滤掉。

过滤的指令是:

ouster-cli source chris-chen_test-data.pcap filter RANGE :6m filter 30m: viz

过滤后的点云显示效果如下:

这种点云过滤方式,其实是有很高的实用性的。它可以将检测区域之外物体上反射回来的点云给滤除掉,只保留我们感兴趣的检测范围(ROI,Region of Interest)之内的点云,给后续的数据处理,带来便利。

(六)通过点云的空间 X,Y,Z坐标信息进行数据过滤

Ouster 激光雷达每个点的 RANGE 值,结合这个点对应的激光线束在雷达内参中的水平和竖直角度,就可以计算出这个点在空间的 XYZ 值。
无论是 Ouster C++/Python SDK,还是 Ouster-ROS/ROS2 驱动,每个点的 RANGE 值最终会被换算到 sensor 坐标系下以 X,Y,Z 空间坐标的形式输出。

最后一部分内容,我将介绍一下通过点云的 XYZ 空间位置进行过滤的方法。
根据点云的 XYZ 空间位置进行过滤时,我们一定要了解上图中所示 Sensor 坐标系的方向。否则设置过滤条件时,会遇到困惑,或者会误将需要的数据给过滤掉。

接下来我们看一下设置过滤条件的方法。在哪个坐标轴的方向进行点云数据过滤,那么在 filter 关键字后,就需要输入坐标轴。
比如下方的示例,我首先在 X 轴方向进行过滤,将 -5m之外的点云都过滤掉。

过滤的指令如下。注意:过滤指令中的距离值后,也必须要加入单位。

ouster-cli source chris-chen_test-data.pcap filter X :-5m viz

我们看一下过滤后的点云显示效果。

激光雷达接头所在的方向,是 X 轴的负方向。设置 :-5m 的过滤条件后,我们可以看到,在 X 轴上 -5 米之外的点,都被 “一刀切” 的滤除掉了。

然后我将 Y 轴方向的过滤条件也加入进来,只保留 Y 轴 -30 米到 30 米区间内的点云,而将之外的点都过滤掉。

过滤点云数据的指令是:

ouster-cli source chris-chen_test-data.pcap filter X :-5m filter Y :-30m filter Y 30m: viz

过滤后的点云显示效果如下:

过滤后的点云,看上去是不是比基于 RANGE 值进行过滤的点云要 “方正” 一点?

最后,我将 Z 轴方向的过滤条件也加入进来。

下方的示例中,我在 filter Z 之后,输入1m:,将Z轴方向高于1m 的点都过滤掉。过滤指令如下:

ouster-cli source chris-chen_test-data.pcap filter X :-5m filter Y :-30m filter Y 30m: filter Z 1m: viz

我们可以得到如下所示的过滤后的点云。

从图中,我们可以看到高出 OS 激光雷达 Sensor 坐标系水平面 1m 以上的高处的建筑物、树木、电线杆等物体上的点云都被滤除掉了。

如果想保存过滤后的点云数据,记得在输入的过滤指令末尾(即 viz 之后),再加上空格 save your-filtered-data.pcap。

基于 Ouster 激光雷达点云数据的距离(RANGE)和 XYZ 空间位置,进行点云数据过滤的方法,也有视频内容进行介绍:

Ouster Python SDK 数据过滤 Filter 使用方法介绍 (四)_哔哩哔哩_bilibili


 

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐