跳转至

ReqCopterSim 接口文档

简介

简述:UE4 无人机仿真状态同步与请求模块,提供 EKF 初始化检测、时间戳同步及多机仿真状态查询功能。

本模块专为 RflySim 无人机仿真平台 的 UE4 三维场景设计,用于解决多无人机协同仿真中的状态同步难题。核心场景包括:分布式仿真中多机 EKF(扩展卡尔曼滤波)初始化状态检测、UE4 引擎与 CopterSim 的时间戳同步、以及批量查询所有无人机的三维位置固定状态(allCopterSim3DFixed)。模块通过类 Ue4EKFInit 和 GetUe4EKFInit 实现非阻塞式状态轮询,类 RflyTimeStmp 支持向指定远端主机的 20005 端口发送带校验的时间同步消息,而 ReqCopterSim 则封装了与 CopterSim 仿真核心的请求-响应协议,适用于需要精确时序控制的硬件在环(HIL)仿真与视觉-惯性导航算法验证场景。

快速开始

以下示例以非阻塞方式创建请求实例并获取本机局域网地址,可作为分布式仿真控制程序的初始化步骤。

参考例程:[RflySim安装路径]\RflySimAPIs\10.RflySimSwarm\3.CustExps\e0.CustApiExps\2.DistSimCommAPIExps\1.HelloWorldTestExp

import ReqCopterSim


# False 表示不持续更新仿真消息,可减少初始化等待
req = ReqCopterSim.ReqCopterSim(False)
localIp = req.getLocalIp()
print("本机 IP:", localIp)

环境与依赖

  • Python 环境:>= 3.8.10
  • 依赖库:copy、os、psutil、re、socket、struct、threading、time
  • 前置准备:调用此接口前,必须先通过 UE4 或 CopterSim 建立仿真环境连接。

核心接口说明

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

全局常量与枚举定义

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

独立常量

无


全局/独立函数

无


Ue4EKFInit 类

该类用于初始化 UE4 场景中的 EKF(扩展卡尔曼滤波)状态,通常在无人机仿真开始前重置位姿估计。

__init__()

功能说明:初始化 Ue4EKFInit 实例,准备 EKF 初始化功能。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
- - - - 无需参数

返回值 (Returns):

  • Ue4EKFInit 实例对象

异常 (Raises):

  • 无

reset()

功能说明:重置 UE4 场景中的 EKF 状态,将位姿估计恢复至初始值。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
- - - - 无需参数

返回值 (Returns):

  • 无

异常 (Raises):

  • 无

示例:

ekf_init = Ue4EKFInit()
# 在仿真开始前重置 EKF
ekf_init.reset()

GetUe4EKFInit 类

该类用于初始化并持续检测所有 CopterSim 实例的 3D 固定状态。初始化后即开始检测,外部需通过不断查询 allCopterSim3DFixed 属性来获取检测结果。


__init__(expected_copter_ids, localIp="None")

功能说明:初始化检测器,开始对所有指定的 CopterSim 实例进行 3D 固定状态检测。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
expected_copter_ids list 是 - 需要检测的 CopterSim ID 列表
localIp str 否 "None" 本地 IP 地址,用于网络通信

返回值 (Returns):

  • GetUe4EKFInit 实例对象

异常 (Raises):

  • 无

RflyTimeStmp 类

RflyTimeStmp 是用于 RflySim 仿真平台的时间戳数据结构,主要用于心跳包的时间同步。该结构体包含仿真开始时间、当前时间戳以及心跳计数器,通过 UDP 协议发送至指定远端电脑的端口 20005,用于多机协同仿真中的时间同步和心跳检测。

__init__(iv)

功能说明:初始化 RflyTimeStmp 实例,根据输入参数初始化时间戳相关的成员变量。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
iv list 是 - 包含时间戳数据的列表,格式为 [checksum, copterID, SysStartTime, SysCurrentTime, HeartCount]

返回值 (Returns):

  • RflyTimeStmp 实例对象

异常 (Raises):

  • 无

Update(iv)

功能说明:更新 RflyTimeStmp 实例的时间戳数据,用于心跳包数据的动态更新。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
iv list 是 - 包含更新时间戳数据的列表,格式为 [checksum, copterID, SysStartTime, SysCurrentTime, HeartCount]

返回值 (Returns):

  • 无

异常 (Raises):

  • 无

示例:

# 创建时间戳实例
timestamp_data = [123456789, 1, 1699123456789, 1699123466789, 100]
rfly_ts = RflyTimeStmp(timestamp_data)

# 更新心跳数据
new_data = [123456789, 1, 1699123456789, 1699123476789, 101]
rfly_ts.Update(new_data)

ReqCopterSim 类

用于与 RflySim 仿真环境进行通信的请求类,主要负责监听指定端口以获取仿真时间戳信息。

__init__(updateMsg=True)

功能说明:初始化 ReqCopterSim 实例,启动对 20005 端口的监听,用于接收 RflyTimeStmp 消息,从而获取指定无人机的仿真时间信息。

参数列表 (Args):

参数名 类型 默认值 说明
updateMsg bool True 是否启用消息更新功能,设置为 True 时自动监听并更新消息

返回值 (Returns):

类型 说明
None 构造函数无返回值

异常 (Raises):

异常类型 说明
socket.error 当无法绑定或监听 20005 端口时抛出
OSError 当网络接口初始化失败时抛出

getLocalIp()

功能说明:获取本地 IP 地址。优先尝试连接 8.8.8.8 来获取本地 IP,失败后尝试连接 114.114.114.114,如果都失败则返回 127.0.0.1。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明

无参数

返回值 (Returns):str - 本地 IP 地址字符串,如 "192.168.1.100"

异常 (Raises):无


isValidIp(address)

功能说明:验证给定的字符串是否为有效的 IP 地址(IPv4)。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
address str 是 - 待验证的 IP 地址字符串

返回值 (Returns):bool - 如果 address 是有效的 IPv4 地址则返回 True,否则返回 False

异常 (Raises):无


get_all_ip()

功能说明:获取本机所有网络接口的 IPv4 地址列表,包括 127.0.0.1。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明

无参数

返回值 (Returns):list[str] - 包含所有 IPv4 地址的列表

异常 (Raises):无


get_all_enable_ip()

功能说明:获取本机所有启用的(活动的)网络接口的 IPv4 地址列表。过滤掉禁用或未连接的接口。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明

无参数

返回值 (Returns):list[str] - 包含所有启用的 IPv4 地址的列表

异常 (Raises):无


isIpLocal(IP)

功能说明:判断给定的 IP 地址是否为本机地址(包括 127.0.0.1 和所有本地网络接口的 IP)。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
IP str 是 - 待检查的 IP 地址字符串

返回值 (Returns):bool - 如果 IP 是本机地址则返回 True,否则返回 False

异常 (Raises):无


getAllCopterID()

功能说明:获取当前系统中所有已注册/活动的 Copter(无人机)ID 列表。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明

无参数

返回值 (Returns):list[int] - 包含所有 Copter ID 的列表

异常 (Raises):无


updateSimMsg()

功能说明:更新(接收并处理)来自 CopterSim 的仿真消息。该方法会接收 UDP 数据包并更新内部的仿真状态信息。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明

无参数

返回值 (Returns):无

异常 (Raises):无


getSimIpList()

功能说明:获取当前所有已注册仿真的 IP 地址列表。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明

无参数

返回值 (Returns):list[str] - 包含所有仿真 IP 地址的列表

异常 (Raises):无


getSimIpID(CopterID=1)

功能说明:根据 Copter ID 获取对应仿真的 IP 地址。如果找不到对应 ID,则返回空字符串。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 要查询的无人机 ID

返回值 (Returns):str - 对应仿真的 IP 地址,未找到时返回空字符串

异常 (Raises):无


getHostIP()

功能说明:获取主机(Host)IP 地址。与 getLocalIp 类似,但可能在特定网络配置下有不同的获取策略。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明

无参数

返回值 (Returns):str - 主机 IP 地址字符串

异常 (Raises):无


sendReCopterSim(CopterID=1, isReqIP=1, UDP_mode=-1, isXyYaw=0, xyYaw=[0, 0, 0], isZRP=0, zRollPitch=[0, 0, 0], otherParams=[0, 0, 0, 0])

功能说明:向 CopterSim 发送请求消息,用于重新配置仿真参数,包括请求 IP、设置初始位置、修改 UDP 模式等。支持多种高级配置如 GPS 原点设置、GPS 位置设置等。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机 ID,用于验证请求
isReqIP int 否 1 是否请求 IP。>0 时勾选联机并将飞控数据发送给本电脑
UDP_mode int 否 -1 UDP 传输模式。<0 不响应,>=0 修改为指定模式
isXyYaw int 否 0 是否设置 XY 位置和偏航角。>0 使用 xyYaw 值重新部署飞机位置。特殊值:2 设置 GPS 原点(lat/lon/alt),3 设置 GPS 位置(lat/lon/yaw)
xyYaw list[float] 否 [0, 0, 0] XY 位置和偏航角 [x, y, yaw],单位米和度。isXyYaw=2 时:[lat, lon, alt];isXyYaw=3 时:[lat, lon, yaw]
isZRP int 否 0 是否设置 Z 高度和滚转俯仰角。>0 使用 zRollPitch 值,否则 Z 贴合地形、滚转俯仰角为 0
zRollPitch list[float] 否 [0, 0, 0] Z 高度、滚转角、俯仰角 [z, roll, pitch],单位米和度,Z 向下为正
otherParams list[int] 否 [0, 0, 0, 0] 保留的其他参数,共 4 个字节,留给将来使用

返回值 (Returns):无

异常 (Raises):无


sendReDllMap(CopterID=0, dllOrMap=-1, index=-1, name="")

功能说明:请求改变 CopterSim 的 DLL 模型或地图。可以向指定飞机、所有飞机或广播发送切换指令。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 0 目标飞机 ID。0 不响应;-1 广播给所有飞机;>0 指定飞机
dllOrMap int 否 -1 切换选项。<=0 不响应;1 修改 DLL 模型;2 修改地图
index int 否 -1 选项 ID 序号。<0 不响应,使用 name 确定选项;>=0 用序号而非 name 确定选项
name str 否 "" DLL 模型或地图的名字,最大 48 字节

返回值 (Returns):无

异常 (Raises):无


sendReSimDllName(CopterID=1, name="")

功能说明:请求设置指定 CopterSim 的 DLL 模型名称。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机 ID
name str 否 "" DLL 模型的名称

返回值 (Returns):无

异常 (Raises):无


sendReSimDllIdx(CopterID=1, index=-1)

功能说明:请求设置指定 CopterSim 的 DLL 模型索引。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机 ID
index int 否 -1 DLL 模型的索引序号,<0 表示使用名称方式设置

返回值 (Returns):无

异常 (Raises):无


sendReSimMapName(CopterID=1, name="")

功能说明:请求设置指定 CopterSim 的地图名称。

参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机 ID
name str 否 "" 地图的名称

返回值 (Returns):无

异常 (Raises):无

sendReSimMapIdx(CopterID=1, index=-1)

功能说明:发送地图索引重配置请求,用于在仿真中切换指定无人机的地图场景。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID
index int 否 -1 地图索引,-1表示不指定

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


sendReSimIP(CopterID=1)

功能说明:发送IP重配置请求,用于重新配置指定无人机的通信IP地址。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID

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


sendReSimUdpMode(CopterID=1, UDP_mode=-1)

功能说明:发送UDP模式重配置请求,用于切换指定无人机的UDP通信模式。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID
UDP_mode int 否 -1 UDP通信模式,-1表示不指定

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


sendReSimXYyaw(CopterID=1, xyYaw=[0, 0, 0])

功能说明:发送XY平面位置及偏航角重配置请求,用于设置指定无人机在XY平面的位置和偏航角。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID
xyYaw list 否 [0, 0, 0] XY平面位置和偏航角 [x, y, yaw],单位:米、弧度

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


sendReGPSOrin(CopterID=1, LLA=[0, 0, 0])

功能说明:发送GPS原点重配置请求,用于设置指定无人机的GPS原点位置(经纬度高度)。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID
LLA list 否 [0, 0, 0] GPS原点 [纬度, 经度, 高度],单位:度、度、米

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


sendReGPSPos(CopterID=1, lat=0, lon=0, yaw=0)

功能说明:发送GPS位置重配置请求,用于设置指定无人机的GPS位置和偏航角。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID
lat float 否 0 纬度,单位:度
lon float 否 0 经度,单位:度
yaw float 否 0 偏航角,单位:弧度

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


sendEnGpsMode(CopterID=1)

功能说明:发送启用GPS模式请求,用于启用指定无人机的GPS定位模式。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID

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


sendEnXyMode(CopterID=1)

功能说明:发送启用XY模式请求,用于启用指定无人机的XY平面定位模式。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID

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


sendReSimXyzRPYaw(CopterID=1, Xyz=[0, 0, 0], RPYaw=[0, 0, 0])

功能说明:发送完整位姿重配置请求,用于设置指定无人机的三维位置和姿态(滚转、俯仰、偏航)。 参数列表 (Args):

参数名 类型 是否必填 默认值 说明
CopterID int 否 1 目标无人机的ID
Xyz list 否 [0, 0, 0] 三维位置 [x, y, z],单位:米
RPYaw list 否 [0, 0, 0] 姿态角 [roll, pitch, yaw],单位:弧度

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

进阶用法示例

以下示例发现 1 号 CopterSim 所在主机,并远程设置其数据回传地址、UDP 模式、初始位姿、模型和地图。

参考例程:[RflySim安装路径]\RflySimAPIs\2.RflySimUsage\0.ApiExps\e3_ReqCopterSim

import time

import ReqCopterSim


req = ReqCopterSim.ReqCopterSim()
print("当前 CopterSim:", req.getSimIpList())

CopterID = 1
targetIP = req.getSimIpID(CopterID)
print("目标 IP:", targetIP)

# 请求目标 CopterSim 将数据回传到本机
req.sendReSimIP(CopterID)
time.sleep(5)

# 切换为 MAVLink Full 通信模式
req.sendReSimUdpMode(CopterID, 2)
time.sleep(5)

# 修改初始平面位置和偏航角
req.sendReSimXYyaw(CopterID, [1, 2, 30])
time.sleep(5)

# 修改三维位置和姿态
req.sendReSimXyzRPYaw(CopterID, [4, 5, -30], [0, 0, 45])
time.sleep(5)

req.sendReSimDllName(CopterID, "HexarotorModelCTRL")
req.sendReSimMapName(CopterID, "VisionRing")

注意事项与避坑指南

  • IP地址验证陷阱:isValidIp 和 getLocalIp 仅做格式校验,不保证目标主机可达;isIpLocal 判断的是网卡归属而非仿真实例运行状态,跨网段部署时需额外心跳检测。

  • CopterID动态变化:getAllCopterID 返回的ID列表随仿真启停实时变化,禁止在循环中缓存旧ID进行控制指令发送;建议每次操作前调用 updateSimMsg 刷新状态。

  • EKF重置的异步延迟:Ue4EKFInit.reset() 触发后需等待UE4渲染线程完成状态重置(通常50-200ms),立即读取位姿数据可能拿到旧协方差;批量操作时应串行执行并插入固定延时。

  • 时间戳跨平台偏差:RflyTimeStmp.Update() 依赖系统时钟,Windows/Linux的计时精度差异(~1ms vs ~10μs)会导致多机协同控制时出现相位抖动;高精度场景建议配合PTP硬件同步。

  • IP列表缓存失效:getSimIpList 和 getSimIpID 内部维护查询缓存,仿真节点异常退出(如崩溃而非正常关闭)后,缓存条目可能残留,导致 getHostIP 返回不可达地址;生产环境应设置定期全量刷新机制。

更新日志

  • 2026-03-30: fix:修复SITL sh脚本规则,新增git规则,上云sdk修复
  • 2026-03-07: fix:请求局域网里CopterSim回传数据的逻辑增加容错机制,保证成功率
  • 2025-11-18: feat: ReqCopterSim.py添加新接口get_all_enable_ip,获取本机启用的IP地址 (有线优先、其次wifi、再其他)
  • 2025-11-17: fix: 优化机制
  • 2025-11-17: fix: 优化IP获取机制
  • 2025-11-17: fix:解决Windows下程序报错的bug
  • 2025-11-14: 新增NAT模式网络识别,能够正确请求IP地址。
  • 2025-11-11: refactor: 同步DistSim最新修改
  • 2025-11-05: [feat] 提供检测CopterSim是否达到Fixed状态接口
  • 2025-09-11: fix: 增加Linux端口复用的支持
  • 2025-07-30: fix: 更新
  • 2024-09-29: fix:修复虚拟机模式下NAT无法请求的问题
  • 2024-08-16: fix: 更新本地网卡获取机制
  • 2024-08-16: fix: 更新获取本地CopterSim的代码
  • 2024-07-10: fix: 修复断网情况下,程序报错的bug