跳转至

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
  • 依赖库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()

进阶用法示例

展示复杂组合场景(如多类协作、异步控制、批量操作)

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完成窗口创建,再调用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