跳转至

VisionCaptureApi 接口文档

简介

简述:本文件定义了RflySim无人机仿真平台视觉感知模块所需的数据结构与API类,为Python端向UE4仿真环境请求相机图像、各类传感器数据提供了基础交互支撑。

在RflySim仿真中,视觉任务是无人机自主导航、目标检测等智能算法开发的核心场景,需要Python端与UE4端完成参数交互与数据传输。本模块定义了用于向UE4发送相机参数设置、图像请求请求的结构体,以及来自CopterSim的IMU数据、距离传感器数据等各类感知数据的封装结构,同时提供了核心的VisionCaptureApi类实现Python端从UE4仿真环境获取仿真图像。它适用于开发基于视觉的无人机仿真算法,为仿真环境的视觉感知数据交互提供了统一的规范接口,可支持单目、多目相机仿真数据获取,结合IMU、距离传感器信息可完成多传感器融合仿真任务。

快速开始

最简可用示例,复制后修改最少配置即可运行。

from RflySimSDK.vision.VisionCaptureApi import VisionCaptureApi, VisionSensorReqNew

# 1. 初始化视觉捕获API,默认连接本地RflySim仿真环境
vision_api = VisionCaptureApi(ip="127.0.0.1")

# 2. 创建一个新的视觉传感器请求对象,默认请求RGB图像和位姿数据
sensor_req = VisionSensorReqNew()

# 3. 将视觉传感器请求添加到捕获列表
try:
    vision_api.addVisSensor(sensor_req)
except Exception as e:
    print(f"添加视觉传感器失败: {e}")

# 4. 欧拉角转四元数示例:滚转0度,俯仰0度,偏航90度,转换为四元数
roll = 0
pitch = 0
yaw = 90
quat = vision_api.euler2quat(roll, pitch, yaw, copter="iris", coordinate_frame="global")
print(f"转换得到的四元数: {quat}")

环境与依赖

  • Python 环境>= 3.8.10
  • 依赖库Open3DShowcopyctrl.IpManagercv2emailjsonmathmmapnumpyosplatformpsutilresocketstructsubprocesssysthreadingtimewarnings
  • 前置准备:调用此接口前,需要确保已经正确导入RflySimSDK的vision模块。

核心接口说明

该模块 VisionCaptureApi.py 包含了配置变量、辅助函数及核心业务类。

全局常量与枚举定义

本节列出模块中所有可直接引用的全局常量和枚举定义。

独立常量


全局/独立函数


Queue

提供基础队列数据结构,用于先进先出(FIFO)形式的元素存储与管理。

__init__()

功能说明:初始化空队列实例 参数列表 (Args): 无参数 返回值 (Returns)

  • Queue 实例对象

异常 (Raises): 无


enqueue(item)

功能说明:将元素添加到队列尾部 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
item 任意类型 - 待添加到队列的元素

返回值 (Returns)

异常 (Raises): 无


dequeue()

功能说明:移除并返回队列头部元素 参数列表 (Args): 无参数 返回值 (Returns)

  • 队列头部元素

异常 (Raises): 无


is_empty()

功能说明:判断当前队列是否为空 参数列表 (Args): 无参数 返回值 (Returns)

  • bool: 队列为空返回True,否则返回False

异常 (Raises): 无


size()

功能说明:获取队列中当前存储的元素数量 参数列表 (Args): 无参数 返回值 (Returns)

  • int: 队列元素数量

异常 (Raises): 无

示例

from RflySimSDK.vision import Queue

# 创建队列并添加元素
q = Queue()
q.enqueue("first frame")
q.enqueue("second frame")

# 查看队列大小
print(q.size())  # 输出 2

# 取出队列元素
item = q.dequeue()
print(item)  # 输出 first frame

# 判断是否为空
print(q.is_empty())  # 输出 False

RflyTimeStmp

用于管理无人机视觉数据时间戳的工具类,可存储和更新时间戳数值,配合视觉捕获模块使用。

__init__(iv)

功能说明:初始化 RflyTimeStmp 实例,设置初始时间戳数值 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
iv 任意数值类型 - 初始时间戳数值

返回值 (Returns)

  • RflyTimeStmp 实例对象

异常 (Raises): 无


Update(iv)

功能说明:更新存储的时间戳数值为新的输入值 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
iv 任意数值类型 - 待更新的新时间戳数值

返回值 (Returns): 无 异常 (Raises): 无

示例

from RflySimSDK.vision import RflyTimeStmp
# 初始化时间戳为0
ts = RflyTimeStmp(0)
# 更新时间戳为当前仿真时间12.34
ts.Update(12.34)

VisionSensorReq

用于向UE4仿真环境请求并设置相机参数的C++结构体对应Python类,可在RflySim无人机视觉仿真中配置视觉传感器参数。

__init__()

功能说明:初始化VisionSensorReq类实例,所有参数成员按照结构体默认定义创建 参数列表 (Args): 无参数 返回值 (Returns)

  • VisionSensorReq 实例对象

异常 (Raises): 无

示例

from RflySimSDK.vision import VisionSensorReq
# 创建视觉传感器参数请求对象
sensor_req = VisionSensorReq()
# 配置目标飞机ID
sensor_req.TargetCopter = 1
# 设置相机安装位置
sensor_req.SensorPosXYZ = [0, 0, 0.1]

VisionSensorReqNew

该类是用于向UE4仿真环境发送请求、设置视觉传感器参数的C++风格结构体,在RflySim无人机视觉仿真中用于定义视觉传感器的配置信息。

__init__()

功能说明:初始化VisionSensorReqNew实例对象 参数列表 (Args): 无参数 返回值 (Returns)

  • VisionSensorReqNew 实例对象

异常 (Raises): 无


imuDataCopter

用于从CopterSim接收无人机IMU传感器数据的数据结构体,存储校验位、消息序号、时间戳、加速度计数据和陀螺仪数据。

__init__(imu_name, node=None)

功能说明:初始化imuDataCopter实例,设置IMU数据话题名称和ROS节点 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
imu_name str "/rflysim/imu" IMU数据的ROS话题名称
node Any None 用于发布IMU数据的ROS节点对象

返回值 (Returns)

  • imuDataCopter 实例对象

异常 (Raises)


AlignTime(img_time)

功能说明:将IMU数据时间戳与图像时间戳进行时间对齐,匹配对应时刻的IMU数据 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
img_time double - 需要对齐的图像时间戳

返回值 (Returns)

  • 对齐后匹配的IMU数据

异常 (Raises)


Imu2ros(node=None)

功能说明:将当前IMU数据转换为ROS格式并发布 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
node Any None 用于发布IMU数据的ROS节点对象,若为None则使用初始化时设置的节点

返回值 (Returns)

异常 (Raises)

示例

from RflySimSDK.vision import imuDataCopter
# 初始化IMU数据接收对象
imu = imuDataCopter()
# 对图像时间戳123.45进行时间对齐,获取对应时刻IMU
aligned_imu = imu.AlignTime(123.45)

DistanceSensor

测距传感器功能类,用于在RflySim无人机仿真中实现距离传感器相关的仿真逻辑。

__init__()

功能说明:初始化DistanceSensor类实例 参数列表 (Args): 无 返回值 (Returns)

  • DistanceSensor 实例对象

异常 (Raises): 无


SensorReqCopterSim

这是一个用于向UE4发送传感器数据请求的结构体类,对应C++结构体定义,主要在RflySim无人机仿真中传递传感器请求配置信息。

__init__()

功能说明:初始化空的传感器请求结构体实例 参数列表 (Args): 无 返回值 (Returns)

  • SensorReqCopterSim 实例对象

异常 (Raises): 无


VisionCaptureApi

这是Python端从UE4获取图像的API类。

__init__(ip='127.0.0.1')

功能说明:初始化视觉图像捕获API实例,建立与UE4端的图像服务连接。 参数列表 (Args)

参数名 类型 默认值 说明
ip str 127.0.0.1 UE4图像服务所在的IP地址,本地运行时使用默认本地回环地址即可

返回值 (Returns):无 异常 (Raises):无

euler2quat(r, p, y, copter, coordinate_frame="global")

功能说明:将欧拉角转换为四元数,支持不同载具和坐标系下的转换 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
r Any 滚转角欧拉角分量
p Any 俯仰角欧拉角分量
y Any 偏航角欧拉角分量
copter str 载具类型标识
coordinate_frame Any "global" 坐标系类型,默认为全局坐标系

返回值 (Returns):转换后的四元数 异常 (Raises):无


addVisSensor(vsr=VisionSensorReq())

功能说明:向视觉传感器列表中添加一个新的旧版本VisionSensorReq视觉传感器请求结构体 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
vsr Any VisionSensorReq() 待添加的旧版本视觉传感器请求结构体

返回值 (Returns):无 异常 (Raises)Exception - 添加失败时抛出异常


addVisSensor(vsr=VisionSensorReqNew())

功能说明:向视觉传感器列表中添加一个新的新版本VisionSensorReqNew视觉传感器请求结构体 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
vsr Any VisionSensorReqNew() 待添加的新版本视觉传感器请求结构体

返回值 (Returns):无 异常 (Raises)Exception - 添加失败时抛出异常


sendReqToCopterSim(srcs=SensorReqCopterSim(), copterID=1, IP="127.0.0.1")

功能说明:向CopterSim发送SensorReqCopterSim类型UDP请求消息,请求获取传感器数据,通过copterID指定请求的目标CopterSim实例索引 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
srcs Any SensorReqCopterSim() 传感器请求结构体
copterID Any 1 目标载具的ID,指定请求的CopterSim实例索引
IP Any "127.0.0.1" 目标CopterSim所在主机的IP地址

返回值 (Returns):无 异常 (Raises):无


sendImuReqCopterSim(copterID=1, IP="127.0.0.1", freq=200)

功能说明:向CopterSim发送IMU数据请求指令,该函数会初始化一个线程用于监听接收IMU数据 其中实际端口 = 基础端口 + 载具ID - 1 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
copterID Any 1 目标载具的ID
IP Any "127.0.0.1" 请求发送目标主机的IP地址
freq Any 200 请求的IMU数据发送频率

返回值 (Returns):无 异常 (Raises):无


sendImuReqClient(copterID=1, IP="127.0.0.1", freq=200)

功能说明:向CopterSim发送IMU数据请求指令,实际端口 = 基础端口 + 载具ID - 1 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
copterID Any 1 目标载具的ID
IP Any "127.0.0.1" 请求发送目标主机的IP地址
freq Any 200 请求的IMU数据发送频率

返回值 (Returns):无 异常 (Raises):无


sendImuReqServe(copterID=1)

功能说明:向CopterSim发送IMU数据请求指令,该函数会初始化一个线程用于监听接收IMU数据,其中实际端口 = 基础端口 + 载具ID - 1 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
copterID Any 1 目标载具的ID

返回值 (Returns):无 异常 (Raises):无


getIMUDataLoop(copterID)

功能说明:循环获取指定载具的IMU数据,作为IMU监听线程的工作函数 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
copterID Any 目标获取数据的载具ID

返回值 (Returns):无 异常 (Raises):无


get_all_ip()

功能说明:获取本机所有可用的网络接口IP地址 参数列表 (Args):无参数 返回值 (Returns):本机所有IP地址组成的列表 异常 (Raises):无


isIpLocal(IP)

功能说明:判断给定IP地址是否为本机IP地址 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
IP Any 待判断的IP地址

返回值 (Returns)bool,如果是本机IP返回True,否则返回False 异常 (Raises):无


StartTimeStmplisten()

功能说明:启动监听线程,监听20005端口以获取各个载具ID对应的Rfly时间戳 参数列表 (Args):无参数 返回值 (Returns):无 异常 (Raises):无


getTimeStmp(CopterID=1)

功能说明:获取指定载具ID对应的最新Rfly时间戳 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
CopterID Any 1 目标载具ID

返回值 (Returns):指定载具对应的最新Rfly时间戳 异常 (Raises):无


endTimeStmplisten()

功能说明:结束时间戳监听线程,停止监听时间戳数据 参数列表 (Args):无参数 返回值 (Returns):无 异常 (Raises):无


TimeStmploop()

功能说明:时间戳监听线程的循环工作函数,持续接收处理CopterSim发送的时间戳数据 参数列表 (Args):无参数 返回值 (Returns):无 异常 (Raises):无


sendUpdateUEImage(vs=VisionSensorReq(), windID=0, IP="")

功能说明:向UE4发送视觉传感器图像更新请求 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
vs Any VisionSensorReq() 视觉传感器请求结构体
windID Any 0 窗口ID标识
IP Any "" 目标UE4所在主机的IP地址,为空则自动判断

返回值 (Returns):无 异常 (Raises)Exception - 请求发送失败时抛出异常


sendUpdateUEImaged(vs=VisionSensorReqNew(), windID=0, IP="")

功能说明:向指定窗口的RflySim3D更新视觉传感器配置 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
vs - VisionSensorReqNew() 视觉传感器请求配置对象
windID - 0 RflySim3D窗口索引
IP - "" 目标IP地址,为空使用默认地址

返回值 (Returns):无返回值 异常 (Raises)Exception - 发送过程出错时抛出


sendUE4Cmd(cmd, windowID=-1)

功能说明:向UE4发送自定义命令 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
cmd - 要发送的命令内容
windowID - -1 目标RflySim3D窗口索引,-1表示发送给所有窗口

返回值 (Returns):无返回值 异常 (Raises):无


sendReqToUE4(windID=0, IP="")

功能说明:发送视觉传感器列表到RflySim3D,请求获取对应图像,通过windID指定发送请求的RflySim3D窗口索引 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
windID - 0 RflySim3D目标窗口索引
IP - "" 目标IP地址,为空使用默认地址

返回值 (Returns):无返回值 异常 (Raises):无


img_udp_thrdNew(udpSok, idx, typeID)

功能说明:UDP接收图像的线程工作函数,用于处理指定视觉传感器的图像UDP接收 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
udpSok - UDP套接字对象
idx - 视觉传感器索引
typeID - 传感器类型ID

返回值 (Returns):无返回值 异常 (Raises):无


img_mem_thrd(idxList)

功能说明:共享内存方式接收图像的线程工作函数,处理指定索引列表视觉传感器的图像接收 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
idxList - 需要接收的视觉传感器索引列表

返回值 (Returns):无返回值 异常 (Raises):无


startImgCap(isRemoteSend=False)

功能说明:启动循环,从UE4接收图像。当isRemoteSend为True时,会将从内存获取的图像转发到UDP端口 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
isRemoteSend - False 是否开启图像远程转发,开启后会将图像从共享内存转发到UDP端口

返回值 (Returns):无返回值 异常 (Raises):无


sendImgUDPNew(idx)

功能说明:将指定索引视觉传感器的图像通过新UDP协议发送 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
idx - 视觉传感器索引

返回值 (Returns):无返回值 异常 (Raises):无


sendImgBuffer(idx, data)

功能说明:发送指定索引视觉传感器的图像缓冲区数据 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
idx - 视觉传感器索引
data - 要发送的图像数据缓冲区

返回值 (Returns):无返回值 异常 (Raises):无


jsonLoad(ChangeMode=-1, jsonPath="")

功能说明:加载配置JSON文件,创建用于图像采集的相机列表。如果ChangeMode>=0,会将发送协议的第一项SendProtocol[0]设置为ChangeMode以修改图像传输方式 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
ChangeMode - -1 传输模式修改值,大于等于0时会覆盖配置中的传输模式
jsonPath - "" 配置JSON文件的路径,为空使用默认路径

返回值 (Returns):无返回值 异常 (Raises):无


dictLoad(jsData, ChangeMode=-1)

功能说明jsonLoad方法的封装,提供直接从内存中读取dict类型的传感器数据,数据组织方式和jsonLoad方法中JSON文件的组织方式一致 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
jsData - 内存中存储的传感器配置字典数据
ChangeMode - -1 传输模式修改值,大于等于0时会覆盖配置中的传输模式

返回值 (Returns):无返回值 异常 (Raises):无


stopRun()

功能说明:停止图像采集运行循环,终止所有图像接收线程 参数列表 (Args):无参数 返回值 (Returns):无返回值 异常 (Raises):无


SensorPreview(seq_id=-1)

功能说明:预览指定序号的视觉传感器采集的图像 参数列表 (Args)

参数名 类型 是否必填 默认值 说明
seq_id - -1 要预览的视觉传感器序号,-1表示预览所有传感器

返回值 (Returns):无返回值 异常 (Raises):无

进阶用法示例

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

from RflySimSDK.vision import VisionCaptureApi, Queue, imuDataCopter
import threading

# 初始化队列缓存传感器数据,实现异步数据接收
imu_data_queue = Queue()
vision_capture = VisionCaptureApi()

# 批量添加5个异构视觉传感器到仿真环境
for sensor_id in range(5):
    # 自定义不同传感器的安装位姿,自动完成四元数转换
    roll, pitch, yaw = 0.1*sensor_id, 0.05, -0.02*sensor_id
    quat = vision_capture.euler2quat(roll, pitch, yaw)
    vision_capture.addVisSensor(sensor_id=sensor_id, position=[0.1*sensor_id, 0, 0.2], quaternion=quat)

# 启动异步IMU数据获取线程,时间对齐后存入队列
def get_imu_async():
    imu_handler = imuDataCopter()
    while True:
        raw_imu = vision_capture.getIMUDataLoop()
        if raw_imu is not None:
            # 对齐IMU与视觉帧时间戳
            aligned_imu = imu_handler.AlignTime(raw_imu)
            if not imu_data_queue.is_empty() and imu_data_queue.size() > 10:
                imu_data_queue.dequeue()
            imu_data_queue.enqueue(aligned_imu)

# 启动异步线程处理数据,主线程同步请求视觉帧进行SLAM计算
threading.Thread(target=get_imu_async, daemon=True).start()
vision_capture.sendReqToCopterSim()

注意事项与避坑指南

  • 重复添加视觉传感器问题:多次调用addVisSensor时需保证输入的sensor_id全局唯一,重复ID会导致仿真端传感器覆盖,最终获取到的视觉数据会出现错乱。
  • 异步数据缓存溢出:使用自定义队列缓存IMU或视觉数据时,需要定期清理旧数据,长时间运行会导致队列累积占用大量内存,可以通过判断队列大小,超出阈值后弹出队首旧数据。
  • 跨主机连接IP检测:调用isIpLocal检测IP属性后再建立连接,如果仿真端运行在非本地主机,需要确认IP端口权限开放,默认端口会被远程防火墙拦截导致请求超时。
  • 时间对齐前提条件:调用imuDataCopter.AlignTime之前需要先完成时间戳初始化,未调用RflyTimeStmp.Update更新参考时间戳会导致对齐结果偏差,引发SLAM位姿跳变。

更新日志

  • 2026-03-03: feat:SDK增加IP处理机制,兼容本地版上云
  • 2026-02-02: 增加深度转点云的odom发布
  • 2026-02-02: fix:优化协议
  • 2026-02-01: fix:注释路径打印
  • 2026-01-31: fix: 更新深度转点云协议
  • 2026-01-31: fix: 更新深度转点云的通信协议
  • 2026-01-23: 对话题/Depth_Cloud 添加对齐时间戳
  • 2026-01-22: Merge branch 'master' of http://rflysim.synology.me:8418/FeisiLab/RflySimSDK
  • 2026-01-22: 更改ROS 输出的IMU坐标系方向,使接口输出的始终为FLU坐标系,更改前按照FRD—> FLU 转换,但是平台的IMU 角速度符合FRD系,但是线加速度不符合FRD系,而是BLD
  • 2025-12-12: fix: 优化图像时间戳同步机制,解决Windows下的图像时间戳不同步bug
  • 2025-12-08: 更改平台odom数据在0模式下 local 系下平移从FRD->FLU 变更
  • 2025-12-07: fix: 新增激光雷达的相对位置传输数据
  • 2025-12-04: fix: 修复点云传感器问题
  • 2025-09-30: 解决鱼眼相机在UDP模模式下的bug
  • 2025-09-29: ROS2 深度转点云的seq 变量已经被取消,接口需要适配