你有没有想过不用摄像头,而是用64个距离数字在电脑上拼出一个会动的3D世界?
把手伸到传感器前,屏幕上的点云会立刻靠近;左右移动物体,点云也会随之移动;轻轻转动开发板,整个3D画面的方向还会同步改变。
实现这个效果的硬件并不复杂:一枚TOF传感器负责测量前方64个区域的距离,一颗IMU负责判断开发板的倾斜和旋转,RA6M4则基于Zephyr完成数据采集、处理和传输,把这些信息转换成电脑能够显示的3D点云。
从64个距离点,到一幅可以实时互动的三维画面,整条数据链路是如何构建的?接下来,我们从硬件连接开始,一步步搭建这套TOF+IMU实时点云系统。
01 系统组成:距离、姿态与3D显示
本项目以RA-Eco-RA6M4-V2.0开发板为核心,连接VL53L7CX多区TOF传感器和BNO080九轴IMU。VL53L7CX在8×8模式下,将前方视野划分成64个区域,每个区域分别输出一个距离值,形成一张8×8深度矩阵。
BNO080提供设备当前的Rotation Vector,也就是旋转四元数。RA6M4结合距离矩阵和旋转姿态,对数据进行滤波与坐标转换,再通过USB CDC虚拟串口发送至电脑。
1)VL53L7CX获取8×8距离矩阵+BNO080获取旋转四元数
↓
2)距离滤波与异常点处理→四元数转旋转矩阵
↓
3)64点三维坐标转换→USB CDC输出JSON→上位机显示3D点云
上位机采用WebUI与FastAPI实现,支持演示模式、UDP客户端和USB虚拟串口。本项目主要使用USB虚拟串口完成从开发板到电脑端的完整数据闭环。
02、 硬件平台与接口连接
项目使用的RA6M4型号为R7FA6M4AF3CFP,搭载200MHz Arm Cortex-M33内核,具有1MB Flash和256KB SRAM,并支持TrustZone。传感器及通信接口配置如下。
模块 | 通信方式 | 项目配置 |
VL53L7CX | I²C,1MHz | 地址0x29;8×8模式;INT=P3.5;LPn=P3.7 |
BNO080 | SPI Mode 3,2MHz | CS=P1.3;INT=P3.1;RESET=P3.6 |
USB CDC ACM | USB Full Speed | 点云数据输出 与控制命令接收 |
VL53L7CX的数据就绪中断为低电平有效,BNO080的片选、中断和复位信号同样采用低电平有效逻辑。设备连接电脑后,USB CDC会枚举为虚拟串口。
03、软件架构:三级任务完成一帧数据
整个3D扫描系统被划分为三个处理阶段,并通过raw_queue和processed_queue两个队列连接。
Stage 1:TOF+IMU数据采集
↓ raw_queue
Stage 2:滤波、姿态处理与3D转换
↓ processed_queue
Stage 3:JSON格式化与USB发送
系统还包含BNO080服务线程和USB命令线程。BNO080服务线程负责SPI通信和传感器报告解析,将最新姿态保存到缓存中,不直接参与点云业务处理;USB命令线程负责接收start、stop、status和模式设置等指令。
VL53L7CX的数据就绪中断只负责发出通知,具体的I²C读取由线程完成,避免在中断回调中执行耗时的传感器通信。VL53L7CX结果等较大的数据对象则设置为静态对象,避免占用线程栈。
04、数据帧、队列与点云处理
项目定义了统一的数据帧结构,用于保存时间戳、64区TOF距离矩阵、BNO080旋转四元数、三维点坐标、有效性标志、帧类型和引用计数。
系统使用Zephyr的K_MEM_SLAB建立深度为16的静态帧池。
- Stage 1采集前通过scan3d_frame_pool_alloc()取得空闲帧;
- 数据进入队列时增加引用计数;
- 各线程处理完成后减少引用;
- 引用归零时,数据帧返回池中。
- raw_queue和processed_queue均采用深度为8的SPSC环形队列,由单一线程写入、单一线程读取。
第一步:采集TOF和IMU
Stage 1等待VL53L7CX的数据就绪中断,读取64区距离结果,并通过sh2_demo_read_rv()取得BNO080缓存中的最新Rotation Vector。两类数据写入同一个数据帧,再送入raw_queue。
第二步:处理距离数据
Stage 2从raw_queue取得数据,使用3×3空间中值滤波处理孤立噪点,通过4帧滑动平均平滑连续测量结果,并根据距离范围和帧间变化标记异常点。
第三步:转换三维坐标
系统根据64个测距区域在视场中的位置,计算每个区域对应的水平角和垂直角,再结合距离得到传感器坐标系中的X、Y、Z坐标。BNO080输出的Rotation Vector被转换为四元数,并进一步生成3×3旋转矩阵。
修正后的点坐标=旋转矩阵×传感器坐标
经过姿态修正的64个三维点被写入数据帧,再送入processed_queue,等待Stage 3处理。
05、JSON协议与USB CDC通信
Stage 3从processed_queue取得数据,将时间戳、TOF距离和旋转四元数封装成JSON。实际tof数组包含64个距离值。
左右滑动查看完整内容
{ "data": { "ts": 180883, "frame_type": "raw", "tof": [41, 42, 43, 44], "rv": {"i": 0.5208, "j": -0.2365, "k": -0.8156, "real": 0.0870} }}命令 | 用途 | 示例 |
start | 开始扫描 | {"cmd":"start"} |
stop | 停止扫描 | {"cmd":"stop"} |
status | 查询状态 | {"cmd":"status"} |
set_prediction | 设置预测模式 | {"cmd":"set_prediction", "mode":1} |
get_prediction | 读取预测模式 | {"cmd":"get_prediction"} |
发送端使用32KB环形缓冲保存待发送的JSON数据,再由USB CDC接口持续发送至电脑。USB命令线程解析来自上位机的控制指令,并将控制信息交给对应任务。
06、工程配置与固件构建
项目通过Kconfig提供传感器帧率、预测模式、卡尔曼参数以及队列、滤波器和帧池单元测试等配置项。板级配置文件ra-eco_ra6m4.conf中启用主要模块:
CONFIG_ENABLE_VL53L7CX=yCONFIG_ENABLE_BNO080=yCONFIG_ENABLE_USB_CDC=yCONFIG_ENABLE_SCAN3D=yCONFIG_TOF_RESOLUTION_8X8=yCONFIG_BNO080_DEFAULT_ALL=yCONFIG_USB_DEVICE_STACK_NEXT=yCONFIG_SERIAL=yCONFIG_UART_LINE_CTRL=yCONFIG_USBD_CDC_ACM_CLASS=yCONFIG_SCAN3D_SENSOR_FPS=60完成配置后,使用已建立的Zephyr开发环境选择RA-Eco-RA6M4板级工程进行编译,并将生成的固件烧录至开发板。固件启动后完成VL53L7CX、BNO080和USB CDC初始化,连接电脑后即可看到对应的虚拟串口。
07、构建并启动上位机
上位机代码位于3d_scan_webdemo工程中,由前端页面和Python服务组成。运行前需要准备Node.js、npm和Python环境。
首先进入frontend目录,安装前端依赖并完成构建:
cd frontendnpm installnpm run build
随后返回项目根目录,根据requirements.txt安装Python依赖,并启动点云查看器:
cd ..python -m pip install -r requirements.txtpython -m viewer.start服务启动后,根据终端提示打开Web页面,选择RA6M4对应的虚拟串口并建立连接。可以先发送status查询系统状态,确认通信正常后,再发送start启动扫描。
此时,RA6M4开始持续输出TOF和IMU数据,上位机解析JSON并刷新3D点云。将手掌或其他物体放在VL53L7CX前方并缓慢移动,可以观察64个点随距离变化;转动开发板,则可以看到点云根据BNO080姿态同步调整方向。
08、最终实现效果如下:
01)串口终端测试:
02)TOF点云上位机展示
64个独立的距离数据被转换成了一幅可以随物体移动、随开发板姿态变化的三维画面,也完成了从传感器、RA6M4固件到电脑上位机的完整项目构建。
来源:瑞萨
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。