Open3DShow 接口文档¶
简介¶
简述:该文件定义了Open3DShow类,提供从Unreal Engine 4获取仿真环境图像的Python接口,可配合Open3D完成无人机仿真视觉数据的可视化处理。
在RflySim无人机仿真平台中,视觉仿真任务需要获取UE4端生成的虚拟环境图像数据,才能开展目标检测、点云重建、视觉SLAM等算法的开发与验证。本模块属于RflySimSDK的视觉工具组件,专为仿真环境下的视觉开发场景设计,能够简化Python端获取UE4仿真图像的流程,方便用户快速结合Open3D完成视觉数据的可视化展示与算法测试,适用于无人机视觉导航、环境感知等仿真开发场景。
快速开始¶
以下示例读取分割点云中的 RGB555 标记值,将其解码为颜色后更新 Open3D 点云窗口。
参考例程:[RflySim安装路径]\RflySimAPIs\8.RflySimVision\0.ApiExps\1-UsageAPI\1.ImgSenorAPI\5.SegmentImageDemo
import numpy as np
import Open3DShow
import VisionCaptureApi
show3d = Open3DShow.Open3DShow()
vis = VisionCaptureApi.VisionCaptureApi()
vis.jsonLoad(jsonPath="Config_udp.json")
vis.sendReqToUE4()
vis.startImgCap()
show3d.CreatShow(0)
while True:
if vis.hasData[2]:
data = vis.Img[2]
# 将第 4 列的 RGB555 标记值解码为 RGB 颜色
stencil = data[:, 3].astype(np.int32)
red = ((stencil >> 10) & 0x1F) * 8
green = ((stencil >> 5) & 0x1F) * 8
blue = (stencil & 0x1F) * 8
color = np.stack([red, green, blue], axis=1) / 255.0
show3d.UpdateShowWithColor(data[:, :3], color)
vis.hasData[2] = False
环境与依赖¶
- Python 环境:
>= 3.8.10 - 依赖库:
numpy、sys、time - 前置准备:调用此接口前,无需特殊前置准备,需确保已正确安装RflySimSDK并导入vision模块下Open3DShow相关依赖。
核心接口说明¶
该模块 Open3DShow.py 包含了配置变量、辅助函数及核心业务类。
全局常量与枚举定义¶
本节列出模块中所有可直接引用的全局常量和枚举定义。
独立常量¶
无
全局/独立函数¶
无
Open3DShow 类¶
用于从UE4获取点云数据并通过Open3D进行可视化展示的API类,适用于RflySim仿真环境中的三维点云可视化处理场景。
__init__()¶
功能说明:初始化 Open3DShow 类实例
参数列表 (Args):
无
返回值 (Returns):
Open3DShow实例对象
异常 (Raises): 无
get_new_point_cloud()¶
功能说明:获取新的点云数据 参数列表 (Args): 无 返回值 (Returns):
- 无
异常 (Raises): 无
update_callback(vis)¶
功能说明:Open3D可视化窗口更新回调函数,用于定时更新点云数据 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
vis |
open3d.visualization.Visualizer |
是 | - | Open3D可视化器实例 |
返回值 (Returns):
- 无
异常 (Raises): 无
CreatShow(idx=0)¶
功能说明:创建并启动点云可视化窗口 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
idx |
int |
否 | 0 |
可视化窗口标识索引 |
返回值 (Returns):
- 无
异常 (Raises): 无
SetFRDView()¶
功能说明:设置 FRD 坐标系的俯视视角,模拟鼠标上划操作调整观察视角 参数列表 (Args): 无 返回值 (Returns):
- 无
异常 (Raises): 无
AppendPcd(Cloud)¶
功能说明:追加点云数据到当前点云集合 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Cloud |
open3d.geometry.PointCloud |
是 | - | 需要追加的点云对象 |
返回值 (Returns):
- 无
异常 (Raises): 无
merge_point_cloud(other_pcd)¶
功能说明:叠加点云,将另一个点云合并到当前点云中 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
other_pcd |
open3d.geometry.PointCloud |
是 | - | 需要合并的外部点云对象 |
返回值 (Returns):
- 无
异常 (Raises):
ValueError: 当输入点云对象无效时抛出
show_point_cloud()¶
功能说明:显示当前存储的点云数据 参数列表 (Args): 无 返回值 (Returns):
- 无
异常 (Raises): 无
clear_point_cloud()¶
功能说明:清空点云,移除所有点,并更新可视化 参数列表 (Args): 无 返回值 (Returns):
- 无
异常 (Raises): 无
remove_duplicates()¶
功能说明:去除重复点云,移除坐标相同的点 参数列表 (Args): 无 返回值 (Returns):
- 无
异常 (Raises): 无
UpdateShow(Cloud)¶
功能说明:更新点云数据并刷新可视化显示 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Cloud |
open3d.geometry.PointCloud |
是 | - | 需要更新显示的点云对象 |
返回值 (Returns):
- 无
异常 (Raises): 无
UpdateShowWithColor(Cloud, colors=None)¶
功能说明:更新并显示带颜色的点云数据,应用 FRD 坐标转换 参数列表 (Args):
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Cloud |
numpy.ndarray |
是 | - | 输入的点云坐标数组,形状为(N, 3) |
colors |
numpy.ndarray |
否 | None |
点云颜色数组,形状为(N, 3),取值范围[0, 1] |
返回值 (Returns):
- 无
异常 (Raises): 无
UpdatePCD()¶
功能说明:更新可视化窗口中的点云数据 参数列表 (Args): 无 返回值 (Returns):
- 无
异常 (Raises): 无
CloseShow()¶
功能说明:关闭点云可视化窗口 参数列表 (Args): 无 返回值 (Returns):
- 无
异常 (Raises): 无
示例:
from RflySimSDK.vision import Open3DShow
import numpy as np
# 创建可视化实例并启动窗口
pcd_show = Open3DShow()
pcd_show.CreatShow()
# 设置FRD俯视视角
pcd_show.SetFRDView()
# 生成示例带颜色点云并更新显示
test_points = np.random.randn(1000, 3)
test_colors = np.random.rand(1000, 3)
pcd_show.UpdateShowWithColor(test_points, test_colors)
# 清空点云后关闭窗口
# pcd_show.clear_point_cloud()
# pcd_show.CloseShow()
进阶用法示例¶
以下示例通过
VisionCaptureApi获取激光雷达点云,并以 10 Hz 频率更新 Open3D 显示窗口。
参考例程:[RflySim安装路径]\RflySimAPIs\8.RflySimVision\0.ApiExps\1-UsageAPI\3.PointCloudAPI\2.LidarAPIPointCloudDemo
import sys
import time
import Open3DShow
import VisionCaptureApi
show3d = Open3DShow.Open3DShow()
vis = VisionCaptureApi.VisionCaptureApi()
vis.jsonLoad()
if not vis.sendReqToUE4():
sys.exit(0)
vis.startImgCap()
show3d.CreatShow(0)
lastTime = time.time()
while True:
lastTime += 1 / 10.0
sleepTime = lastTime - time.time()
if sleepTime > 0:
time.sleep(sleepTime)
else:
lastTime = time.time()
if vis.hasData[0]:
show3d.UpdateShow(vis.Img[0])
vis.hasData[0] = False
注意事项与避坑指南¶
- 可视化窗口初始化要求:必须先调用
CreatShow完成窗口创建,再调用SetFRDView、AppendPcd等视角或点云操作,未初始化窗口会导致后续操作抛出访问异常。 - 实时更新性能限制:频繁调用
UpdateShow会占用过多OpenGL渲染资源,建议批量添加点云后再统一更新,单帧追加点云数量尽量不超过1e5个,避免画面卡顿。 - 去重参数设置要求:调用
remove_duplicates时,体素大小voxel_size需根据点云实际尺度设置,参数过小会无法起到降采样效果,参数过大会丢失场景关键结构信息。 - 多线程访问安全:
Open3DShow的可视化渲染必须运行在主线程,点云采集、处理等耗时操作可以放在子线程,禁止在子线程调用show_point_cloud启动主渲染循环。
更新日志¶
2026-01-31: fix: 优化点云显示接口2026-01-30: fix: 修复点云预览方向问题2025-12-31: fix: 更新open3d的版本提示2025-08-19: fix: 增加识别机制,WSL本机模式下使用1400发包,降低WSL丢包概率2025-07-26: fix: 修复激光点云共享内存bug2025-07-25: fix: 更新Open3D点云预览效果2024-08-05: fix:增加HTML版API注释2024-07-17: fix:更新VisionCaptureApi接口API2024-06-03: fix:更新2024-05-31: fix: 更新pdf