当前位置: 首页 > news >正文

Ouster v3.2.0 固件区域监控功能介绍及通过 PLC 接收和处理区域监控数据

最近几天整理自己手头还残留的一些测试文档,发现有个关于 Ouster 激光雷达 v3.2.0 固件的区域监控功能(Zone Monitoring)配合 PLC 测试的截图和PLC程序还在。幸好当初是在自己的Windows 7老电脑上安装 PLC 软件做了这个测试。

这些测试数据,对我而言,用处不大。但想来写成博文发布到网上,对通过 PLC 接收和处理 Ouster 区域监控数据的小伙伴们,应该会有一定的帮助。否则的话,不久之后的某月某日,这些测试记录,可能会因为占用我电脑或U盘的存储空间,而不得不彻底清除掉,仿佛曾经完全没有存在过一般。

从事工控行业的小伙伴,对 PLC 想必是得心应手、运用自如、游刃有余。一提到区域监控,可能脑海中已经浮现出了清晰的轮廓:
不就是针对实际应用场景,画几个区域,然后每个区域对应一路开关量信号,发送 PLC 处理,信号的电平高低,对应区域是否被触发。仅此而已,这有何难?

但 Ouster 激光雷达的区域监控功能,配合 PLC 使用,实际情况可能比我们预想的要复杂一些。

首先一个因素就是硬件条件的限制。

使用过 Ouster 激光雷达的小伙伴应该很熟悉,Ouster 激光雷达的线缆接头,只有 12 芯。除去电源正负极的两芯和千兆以太网的 8 芯,就仅剩了两芯。且不说这两芯中,还有个仅作时钟同步脉冲 PPS 输入的 SYNC_PULSE_IN,最后剩下的一个可配置的多功能输入输出线芯 Multipurpose-IO,用来对应一个监控区域的状态,在实际应用中,是完全不够看的。

此外就是以往单线激光雷达通过开关量输出区域状态的方式,提供的信息量是非常有限的。PLC 只能通过开关信号的电平高低,判断划定的区域是否被触发。而对于多线激光雷达而言,对闯入监控区域的人或物体,检测到的点云数据,也是更加丰富的。Ouster 激光雷达的区域监控功能,除了可以给出监控区域的状态信息,还可以给出进入到 3D 监控区域中的目标物的总点数、点的最大距离、最小距离、平均距离等。这些信息,不光在实际应用中有现实意义,而且在划定监控区域以及设置区域触发条件时,也能起到参考作用。

鉴于这些因素(Ouster 研发部门考虑的因素可能会更多,但肯定无法忽视上边提到的两个因素),Ouster 只能在激光雷达本身的网络接口上做文章。

最终给出的方案,就是再新增一个 UDP 端口号,通过 UDP 数据报文的方式,输出监控区域的状态信息。

Ouster 激光雷达区域监控功能介绍:

● Ouster 激光雷达 v3.2.0 固件提供的区域监控功能,最多可以上载 128 个 3D 区域,仅设置一个区域也可以;

● 每次投入运行时,最多可以设置 16 个 Active 的 3D 区域进行监控,仅设置一个 Active 区域也可以;

● 已上载但未投入使用的 3D 区域处于 Staged 的状态。可以根据实际应用,随时通过指令将 Staged 的区域切换为 Active 的监控区域;

● 区域切换时,可以只切换一个,也可以一次切换多个。但切换为 Active 的区域数目,一次最多不能超过 16 个;

● 区域监控数据的 UDP 报文,长度是固定的(v3.2.0 固件发布时的 Zone Monitoring UDP 数据包长度是 688 Byte);

● 每个 UDP 报文中,包含 16 个区域的字段。每个字段中包含监控区域的触发状态,处于监控区域的目标物的总点数、点的最大距离、最小距离、平均距离等信息;

● 如果设置的 Active 区域数目不足 16 个,那么区域监控 UDP 数据包中,仅设置了 Active 区域的字段中有数据,剩余字段由 0 填充;

● Ouster 激光雷达区域监控功能的更新频率和 lidar_mode 设置有关。比如一个 OS 激光雷达,工作在 1024x10 的模式,即1秒钟旋转10圈,得到10个完整的点云 Frame,那么区域监控功能的数据输出频率最高也是 10 Hz;

● 每个监控区域的更新频率还可以单独设置,可以各不相同。

对 Ouster 激光雷达 v3.2.0 固件的区域监控功能,有了以上的初步了解后,接下来我们看一下如何使用这个区域监控功能。

如上所述,Ouster 激光雷达的区域监控数据,是通过 UDP 通讯协议输出的。
对于从事点云数据处理和算法的攻城狮而言,若个毫秒之间超过 1M Byte 长度的点云数据也能轻松处理完毕。在工控机或者高性能边缘计算设备中,接收和处理这 688 Byte 长度的区域监控 UDP 数据,简直是易如反掌,不费吹灰之力。

但在实际应用中,一个需要 3D 区域监控功能的工业现场,控制柜中可能只有 PLC 作为所有传感器和执行器的数据采集和处理的控制器,也可能之前现场已经部署了单线开关量输出的区域监控激光雷达且连接到了 PLC。

现在只是想丝滑地切换到 3D 区域监控的激光雷达,不可能为了增加一个 3D 区域监控功能,就要为激光雷达单独增加一个上位机处理器。直接将支持 3D 区域监控功能的激光雷达数据,接入到 PLC 肯定是用户无可辩驳的首选方案。

我自己呢,在2025年初时,就有多次通过Python程序和C语言程序接收和处理 Ouster 激光雷达 Zone Monitoring 区域监控数据的测试经历。

想到多年前,自己也曾频繁调试各种 PLC 和单线激光雷达以及多种工业传感器的数据交互,到2025年底时,也就狠下心来购置了一台PLC,用于 Ouster 多线激光雷达3D区域监控功能的测试。

做工控的小伙伴们目前手上在用的,基本上都是各个厂家最新的主流的 PLC 了吧?再不济,用的也是次新品或是两三年前的 PLC 型号吧?我是自己花钱搞测试,验证功能,肯定无法像工控企业或自动化系统集成商那样采购最新版的性能最强大的 PLC 了,只是淘一个老掉牙的西门子小型 PLC,S7-200 PLC ST20 CPU。

这款 PLC 是西门子在 2012年发布的,只有12个 DI 输入点和8个 DO 输出点。虽然不足以输出Ouster 激光雷达 Zone Monitoring 功能支持的最多16个 Active 区域的监控状态,但在一般应用中,能同时输出8个区域的监控状态,也已经戳戳有余了。

此外,如果我能用这个低配的老 PLC 正常解析和处理 Ouster 激光雷达通过 UDP 包发送的 Zone Monitoring 区域监控数据,那么使用不同厂家最新PLC的小伙伴们,如果要处理Ouster激光雷达的Zone Monitoring 区域监控数据,就更不再话下了。

PLC 硬件准备好了,那么接下来就要准备编程软件了。我在自己的一台 Win7 老电脑中安装了 STEP 7-Micro/WIN SMART Version V2.8 软件,用来编写梯形图程序。


接下来我详细列举一下我通过这款西门子 PLC 接收和处理 Zone Monitoring 区域监控数据的思路以及梯形图程序。
其他品牌的 PLC,只要支持 UDP 通讯,即使编程语言或功能块千差万别,但程序设计思路都是一致的。

0. IP 地址设置

PLC 和激光雷达进行 UDP 网络数据通讯,将二者设置为同一个子网内的IP地址是最基本的前提。
我在测试中,需要频繁使用激光雷达,只是因为测试,偶尔用到 PLC。因此,我将 PLC 的 IP 地址修改到了和激光雷达同网段。

在实际应用中,现场电控柜中的PLC可是连接着很多个以太网接口的仪器、仪表或其他控制器,不可能为了加入一台有区域监控功能的激光雷达,就要修改PLC的IP地址。通常需要将激光雷达的IP地址,修改到和PLC同网段。

修改Ouster激光雷达IP地址的方法,可以参考之前分享的博文:
Ouster激光雷达IP地址获取与设置_ouster雷达初始ip-CSDN博客

1. 建立PLC和Ouster激光雷达的UDP连接

高级语言编程中,如C,C++,C#,Python,Visual Basic,可以很容易的建立一个 UDP Socket,来接收UDP数据。我测试所用的这款西门子PLC,虽然已经发布有年头了,但其提供的UDP连接功能块,还是为我建立PLC和Ouster激光雷达的UDP连接提供了极大的便利。

可以通过选择“Libraries”下方“Open User Communication”中的“UDP_CONNECT”来添加这个功能块。

因为这个功能块只需要在 PLC 进入 RUNNING 状态后执行一次,因此这个功能块的 EN 端和 Req端,我都用了PLC提供的 First_Scan_On 脉冲。
ConnID 的设置,必须于后续使用该UDP通讯的功能块的 ConnID 设置保持一致。
LocalPort 的设置,必须与 Ouster 激光 Web 浏览器连接后,Configuration 界面的 Zone Monitoring UDP 端口号的设置保持一致。

2. 接收 Zone Monitoring 区域监控 UDP 数据

同样的,我通过选择 “Libraries” 下方 “Open User Communication” 中的 “UDP_RECV”,添加了数据接收这个功能块。

一旦 PLC 和 Ouster 激光雷达进入工作运行状态后,PLC 就需要持续的接收激光雷达发来的 Zone Monitoring UDP 数据了。因此,这个 UDP 数据接收的功能块,需要一直工作,功能块的使能端En就需要使用 Always_On 的高电平了。

ConnID 的设置,需要与上方 UDP_CONNECT 功能块 ConnID 的设置保持一致。

MaxLen 需要输入 Zone Monitoring UDP 数据包的最大长度,这里我输入的是 680 Bytes。
有些小伙伴可能要问了:我使用的 PLC 因功能限制,最大能接收的 UDP 数据包长度不支持那么大的值,还能继续和 Ouster 激光雷达的区域监控功能配合使用吗?
答案当然是肯定的!但也要分具体情况。如果你查看 Ouster 激光雷达 Zone Monitoring 的 UDP 数据包的结构,你会看到它由三部分组成,分别是报头、数据区、报尾。
报尾就有近百个字节,收不到报尾的所有字节,并不会影响 UDP 数据包中包含的16个监控区域的状态数据。如果只需要监控三个区域的状态,那么接收区域的长度满足150 Byte 的长度就已经足够了。

接收数据的地址指针 DataPtr 指向你为接收 UDP 数据指定的存储区的首地址。这里我指向为接收Zone Monitoring 区域监控UDP数据定义的缓存器起始位 VB1000。

下图是我的测试中,PLC接收到的部分UDP数据的截屏。

3. 解析 UDP 数据并输出监控区域状态

解析 UDP 数据,就需要知道 Ouster 激光雷达 Zone Monitoring 区域监控 UDP 数据包的结构了。这个数据结构可以从 Ouster 官网上 v3.2.0 固件的 Firmware User Manual 中看到。

了解了 Zone Monitoring UDP 包的数据结构后,我们就能知道哪个 Byte 中包含哪个区域的触发状态了。
区域的触发状态,其实只是用这个 Byte 中一个 Bit 位表示。我们可以单独取这个区域触发状态的Bit 位来控制 PLC 的某个 DO 数字量输出,也可以用整个 Byte 的值来控制 PLC 的某个 DO 数字量输出。

我在测试中,采用整个 Byte 值来判断该 Byte 对应的区域是否被触发。
如上图所示,当我用 VB1000 起始的存储区接收 Zone Monitoring UDP 数据时,
第一个监控区域 Zone0 对应的触发状态 Byte VB1075 为 132 (1000 0100) 时,数字量输出 DO0 被置为高电平;
第二个监控区域 Zone1 对应的触发状态 Byte VB1111为 132 (1000 0100) 时,数字量输出 DO1 被置为高电平;
第三个监控区域 Zone2 对应的触发状态 Byte VB1147 为 132 (1000 0100) 时,数字量输出 DO2 被置为高电平。
如果某个区域没有被触发,那么这个区域对应的触发状态 Byte 值则为 4 (0000 0100)。

我的测试中每次只监控三个区域,因此只需判断3个区域对应的状态 Byte 值即可。Ouster 激光雷达的 Zone Monitoring UDP 包中,包含16个监控区域的详细状态数据。如果你的应用需要同时监控16个区域,你所用的 PLC 也有16个数字量输出 DO 点,那么你绘制了16个3D监控区域并上传到激光雷达后,就可以在 PLC 程序中,通过判断每个区域对应的触发状态 Byte 值,获知该区域是否有被触发了,也就是有人或物体进入这个区域且这个区域中检测到的总点数超过了设置的触发条件的点数值。

到此为止,通过 PLC 接收和解析 Ouster 激光雷达 Zone Monitoring 区域监控 UDP 数据的方法就已经介绍完毕了。
不同厂家的 PLC,数据接收和处理程序会略有差异,但编程的思路总体上是毫无二致的。

这些数据接收和处理的操作,对于从事 PLC 程序开发和调试的自动化工程师而言,也是易如反掌,不费吹灰之力。

深谙现场应用和生产工艺的小伙伴可能又发现问题了!
最多16个可同时监控的3D区域是够多,但是我的实际应用防护需求可能是动态的。我不需要激光雷达一直一成不变的监控固定的防护区域,我需要它根据实际生产工艺的需求,能在不同的时间切换到不同的防护区域。

这就涉及到基于具体应用的区域切换功能了。很多单线激光雷达的区域监控都是有这个功能的。

Ouster 激光雷达的 Zone Monitoring 3D 区域监控,也是支持区域切换功能的。但 Ouster REV-07硬件版本能支持区域切换功能的激光雷达,自从 2024 年发布 v3.1.0 的固件时,已经弃用 TCP API 了,转而全面拥抱 HTTP API。也就是说,REV-07 硬件版本的 OS 激光雷达,使用 v3.2.0 固件提供的区域监控功能,要切换区域或区域组,只能使用 HTTP API。
那如果我所使用的 PLC,不支持 HTTP 协议,但实际应用中又要用到区域切换功能,该咋办?

莫慌!HTTP 协议也不是凭空产生的。在 OSI 开放系统互连的七层模型中,HTTP 是应用层的协议,在模型下方的传输层上,它仍然是靠 TCP 协议在传输数据。我们将 Ouster 激光雷达支持的HTTP/1.1 的区域切换 API,通过 TCP 协议发送到端口号 80,不就解决问题了吗!

事实也是如此!我所用的西门子 S7-200 SMART PLC ST20 CPU 也不支持 HTTP 协议,我就是通过 PLC 提供的 TCP 数据通讯的功能块,发送区域切换的 API 来实现区域组切换的功能的。

首先,我需要添加 “TCP_CONNECT” 的功能块,建立 PLC 与激光雷达的连接。
通过选择 “Libraries” 下方 “Open User Communication” 中的 “TCP_CONNECT” 即可添加这个功能块。

功能块的引脚中,ConnID 可以设置任意的有效值,但必须要与后续使用该 TCP 连接的功能块的ConnID 设置保持一致。
IPaddr1 ~ IPaddr4 分别依次输入激光雷达 IPv4 地址的每个字段。
RemPort 输入80。
LocPort 可随意输入了一个 TCP 端口号允许的有效值,我在这里输入了 3000。

建立连接后,就可以通过“TCP_SEND”功能块发送区域切换的指令了。

“TCP_SEND” 功能块可以通过选择 “Libraries” 下方 “Open User Communication” 中的“TCP_SEND” 添加。

我自己在测试中,绘制了三个区域组,每个区域组中包含三个区域。通过按钮在不同的区域组之间做切换。

TCP_SEND 功能块的 Req 请求端用三个区域组切换按钮触点做了互锁的操作,避免误操作的情况下,多个区域组的区域同时有效。
ConnID 的值,需要与上方 TCP_CONNECT 功能块 ConnID 的设置保持一致。
DataLen 需要输入区域切换指令的字节长度。
发送数据的地址指针 DataPtr 指向你存放区域切换指令的存储区的首地址。这里我将区域切换指令存储到了 VB200 开头的字节存储区中。

考虑到我们使用 TCP协议发送HTTP API,因此发送的指令的格式,是非常关键的。
以我测试中的区域组切换为例,我预先绘制了7个3D监控区域并上传到了激光雷达。
区域编号Zone0,Zone1和Zone2作为一个区域组,用于小车直行时的区域监控;
区域编号Zone0,Zone3和Zone4作为一个区域组,用于小车左转时的区域监控;
区域编号Zone0,Zone5和Zone6作为一个区域组,用于小车右转时的区域监控。

通过 TCP 协议,发送切换到左转监控区域组的指令时(也就是将当前的 Active 区域设置为 Zone0,Zone3 和 Zone4 时),需要严格按照下方的格式输入指令:

POST /api/v1/zone_monitor/live_ids HTTP/1.1 Host:192.168.1.200 Connection:keep-alive Content-Type:application/json Content-Length:9 [0,3,4]

其中,Host 后边是 OS 激光雷达的 IPv4 地址;
Content-Length 不是整个指令的长度,而是发送的切换区域的总长度;
切换区域间隔一行后,添加到指令的末尾,在方括号中用逗号分隔。

当然,如果有小伙伴想在测试中,用 PLC 接收和处理区域监控的 UDP 数据,但是偶尔需要切换一下区域,且区域切换并不会用在实际生产中,那么可以直接通过发送 HTTP API 进行区域切换。
通过 HTTP API 与 Ouster 激光雷达交互的方法,可以参考这个文档中的介绍:
Ouster 激光雷达 HTTP API 交互操作_ouster lidar 地址设置-CSDN博客

我当时用西门子 S7-200 PLC 测试 Ouster 激光雷达 Zone Monitoring 区域监控功能时,有录制一个视频并上传到了网上。如果有兴趣也可以通过点击下方的链接查看:
Ouster LiDAR v3.2.0 固件区域监控功能测试_PLC 控制器交互测试_哔哩哔哩_bilibili

http://www.jsqmd.com/news/734579/

相关文章:

  • Krita-AI-Diffusion中文支持深度解析:如何为专业AI绘画插件实现本土化技术架构
  • 最新aws-waf-token算法
  • 为OpenClaw Agent工作流配置Taotoken作为模型供应商
  • ai 时代程序员的核心不适:从确定性逻辑到概率性交互的范式转移(伍)
  • KORMo-10B:韩英双语大模型的合成数据训练与部署实践
  • Win10下用VirtualBox给Xilinx ISE 14.7安个家:共享文件夹配置与项目迁移指南
  • 2026AI大模型接口代理站排行榜揭晓!五大头部服务商谁能脱颖而出引领行业潮流?
  • Windows域渗透新思路:在暗月靶场中复现并绕过MS14-068与黄金票据
  • FBX转BVH全攻略:从Mixamo在线工具到Blender脚本,5种方法实战评测
  • 如何快速解决Windows软件依赖问题:VisualCppRedist AIO完整指南
  • PyQt5实战:给你的串口调试工具一键换肤(Windows/Fusion风格对比)
  • 倒果为因的认知场:碳硅共生的未来操作系统(世毫九实验室原创研究)
  • aws-waf-token 亚马逊 cookie算法
  • **Oneira的“梦”:一个开源管道的低成本自我镜像,还是AI“内在生命”的幻觉?**
  • 告别Matplotlib?手把手教你用C++/GDI+为OpenCV打造一个像素级精准的工业级图像显示控件
  • Leetcode hot100 螺旋矩阵【中等】
  • 别再只重装Ensp了!WinPcap、Wireshark、VirtualBox版本兼容性才是AR1报错40/41的元凶
  • AI视频剪辑:自然语言指令与风格迁移实战
  • YOLO11性能暴增:主干网络升级 | 替换为RepGhostNet,结合重参数化与Ghost模块,打造极致轻量的YOLO11
  • 3步快速上手:用vectorizer将位图智能转换为可无限缩放的矢量图
  • 爱芯元智以独立算力底座,搅动智驾芯片生态
  • 香港理工大学项目交付,打造高扩展科研无人机平台
  • 【机械臂】基于RRT算法实现puma560机械臂路径规划附matlab代码
  • LLaMA Pro渐进式块扩展:避免灾难性遗忘的模型进化方法
  • 猫抓浏览器扩展:重新定义网页媒体资源获取的智能解决方案
  • 从压缩机到AI芯片,追觅空调系统性技术背后的人与空气新关系
  • **一笔“工程化印钞”:Polymarket上164K美元单笔大胜的背后,是MiroFish仿真引擎的胜利,还是量化FOMO的镜像?**
  • 如何解决Mac鼠标滚动冲突?Mos工具完整指南帮你轻松搞定
  • 终极指南:5步轻松为Unity游戏添加实时翻译功能
  • 20260501生活反思——把她当做煮饭阿姨即可