跳转至

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
  • 依赖库numpysystime
  • 前置准备:调用此接口前,无需特殊前置准备,需确保已正确安装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完成窗口创建,再调用SetFRDViewAppendPcd等视角或点云操作,未初始化窗口会导致后续操作抛出访问异常。
  • 实时更新性能限制:频繁调用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: 修复激光点云共享内存bug
  • 2025-07-25: fix: 更新Open3D点云预览效果
  • 2024-08-05: fix:增加HTML版API注释
  • 2024-07-17: fix:更新VisionCaptureApi接口API
  • 2024-06-03: fix:更新
  • 2024-05-31: fix: 更新pdf