用64个测距点拼出一个3D世界?基于MCU的TOF+IMU实时点云实践

strongerHuang 2026-08-31 11:30
来源 | 瑞萨嵌入式小百科

你有没有想过不用摄像头,而是用64个距离数字在电脑上拼出一个会动的3D世界?


把手伸到传感器前,屏幕上的点云会立刻靠近;左右移动物体,点云也会随之移动;轻轻转动开发板,整个3D画面的方向还会同步改变。


用64个测距点拼出一个3D世界?基于MCU的TOF+IMU实时点云实践图1
用64个测距点拼出一个3D世界?基于MCU的TOF+IMU实时点云实践图2


实现这个效果的硬件并不复杂:一枚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环形队列,由单一线程写入、单一线程读取。


01

第一步:采集TOF和IMU

Stage 1等待VL53L7CX的数据就绪中断,读取64区距离结果,并通过sh2_demo_read_rv()取得BNO080缓存中的最新Rotation Vector。两类数据写入同一个数据帧,再送入raw_queue。


02

第二步:处理距离数据

Stage 2从raw_queue取得数据,使用3×3空间中值滤波处理孤立噪点,通过4帧滑动平均平滑连续测量结果,并根据距离范围和帧间变化标记异常点。


03

第三步:转换三维坐标

系统根据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": [41424344],    "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

串口终端测试:

用64个测距点拼出一个3D世界?基于MCU的TOF+IMU实时点云实践图3


02

TOF点云上位机展示

用64个测距点拼出一个3D世界?基于MCU的TOF+IMU实时点云实践图5
用64个测距点拼出一个3D世界?基于MCU的TOF+IMU实时点云实践图6


64个独立的距离数据被转换成了一幅可以随物体移动、随开发板姿态变化的三维画面,也完成了从传感器、RA6M4固件到电脑上位机的完整项目构建。


对该项目以及完整代码感兴趣的开发者可以点击文末“阅读原文”查看相关内容。



关于科技区角:国内科技展会垂直内容策划服务商,提供从论坛内容全案策划、会展市场化IP打造到精准专业观众一站式邀约服务,以产业内容吸引高质量B端人群,打通展会从议题设计、演讲嘉宾邀约、宣传预热、精准邀观到供需对接全链路。
声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。
MCU
more
240MHz + 5.33MSPS:这颗国产MCU,开始正面“逼近”STM32腹地?
林肯汽车胎压传感器拆解,气压计MCU射频都放在一起,集成度太高了!
“芯”耀“慕展”:意法半导体STM32H5尽显通用MCU“芯实力”
安谋科技祭出组合拳,加速AI MCU落地
32位MCU,都在争最小
斩获 2025 年度汽车电子科学技术奖!国芯科技 AI MCU 重塑国产车规芯片标杆
干掉30+器件,凌鸥创芯MCU硬核演绎“阻容降本”
SoC+安全+射频+电源全栈布局,国民技术领航国产MCU平台化发展
又一家MCU厂商宣布涨价!
三核M7+EtherCAT,一颗满足六轴工业机器人!纳芯微NS800RTA7刷新实时控制MCU算力上限
Copyright © 2025-成都区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号