Open3DShow 接口文档¶
简介¶
简述:该文件定义了Open3DShow类,提供从Unreal Engine 4获取仿真环境图像的Python接口,可配合Open3D完成无人机仿真视觉数据的可视化处理。
在RflySim无人机仿真平台中,视觉仿真任务需要获取UE4端生成的虚拟环境图像数据,才能开展目标检测、点云重建、视觉SLAM等算法的开发与验证。本模块属于RflySimSDK的视觉工具组件,专为仿真环境下的视觉开发场景设计,能够简化Python端获取UE4仿真图像的流程,方便用户快速结合Open3D完成视觉数据的可视化展示与算法测试,适用于无人机视觉导航、环境感知等仿真开发场景。
快速开始¶
最简可用示例,复制后修改最少配置即可运行。
from RflySimSDK.vision.Open3DShow import Open3DShow
import time
# 初始化Open3D点云可视化对象
visualizer = Open3DShow()
# 创建可视化窗口,使用默认ID 0
visualizer.CreatShow(idx=0)
# 模拟循环更新点云,演示实时可视化
try:
for _ in range(100):
# 获取最新的点云数据(从仿真环境中自动获取)
visualizer.get_new_point_cloud()
# 间隔100ms更新一次,控制刷新频率
time.sleep(0.1)
except KeyboardInterrupt:
print("可视化已退出")
环境与依赖¶
- 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()
进阶用法示例¶
展示复杂组合场景(如多类协作、异步控制、批量操作)
import RflySimSDK.vision as vis
import numpy as np
from threading import Thread
# 多机协同点云拼接进阶示例:异步采集+实时拼接可视化
def cooperative_mapping_task():
# 初始化可视化窗口,设置俯视FRD视角
pcd_show = vis.Open3DShow()
pcd_show.CreatShow("多机协同建图")
pcd_show.SetFRDView(flip_direction=True)
# 定义异步点云采集回调,每架无人机独立采集后追加
collected_pcds = []
def async_capture(drone_id, capture_interval):
while True:
new_pcd = pcd_show.get_new_point_cloud()
# 模拟不同无人机坐标系下的点云平移变换
transformed_pcd = new_pcd.translate(np.array([drone_id*5, 0, 0]))
collected_pcds.append(transformed_pcd)
pcd_show.AppendPcd(transformed_pcd)
# 每采集5帧自动去重更新显示
if len(collected_pcds) % 5 == 0:
pcd_show.remove_duplicates(voxel_size=0.05)
pcd_show.UpdateShow()
time.sleep(capture_interval)
# 启动3架无人机异步采集点云
for drone_id in range(3):
Thread(target=async_capture, args=(drone_id, 1), daemon=True).start()
# 启动主可视化循环
pcd_show.show_point_cloud()
if __name__ == "__main__":
cooperative_mapping_task()
本示例结合多线程异步控制实现了多无人机协同采集点云,同时利用AppendPcd增量添加、remove_duplicates降采样去重和UpdateShow实时刷新,完成了分布式建图场景下的端侧可视化,也可以通过调用merge_point_cloud将所有采集的点云合并为完整地图后保存。
注意事项与避坑指南¶
- 可视化窗口初始化要求:必须先调用
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