跳转至

ReqCopterSim 接口文档

简介

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

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

快速开始

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

# 导入 ReqCopterSim 类,用于与 RflySim 的 CopterSim 进行通信
from RflySimSDK.ctrl import ReqCopterSim

# 创建 ReqCopterSim 实例,默认启动监听 20005 端口接收 RflyTimeStmp
req = ReqCopterSim()

# 获取本机 IP 地址(静态方法,无需实例即可调用)
local_ip = ReqCopterSim.getLocalIp()
print(f"本机IP: {local_ip}")

# 验证 IP 地址是否合法
is_valid = req.isValidIp("192.168.1.1")
print(f"IP验证结果: {is_valid}")

# 获取本机所有网卡的 IP 地址列表
all_ips = req.get_all_ip()
print(f"所有IP: {all_ips}")

环境与依赖

  • Python 环境>= 3.8.10
  • 依赖库copyospsutilresocketstructthreadingtime
  • 前置准备:调用此接口前,必须先通过 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):无

进阶用法示例

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

from RflySimSDK.ctrl.ReqCopterSim import ReqCopterSim, Ue4EKFInit, GetUe4EKFInit, RflyTimeStmp

class MultiCopterManager:
    """多无人机协同管理器:实现批量无人机状态监控与时间同步"""

    def __init__(self):
        self.sim = ReqCopterSim()
        self.ekf_init = GetUe4EKFInit()
        self.time_sync = RflyTimeStmp()
        self.active_copters = {}

    def discover_and_sync(self):
        # 批量发现所有仿真无人机
        copter_ids = self.sim.getAllCopterID()
        ip_list = self.sim.getSimIpList()

        for cid in copter_ids:
            ip = self.sim.getSimIpID(cid)
            self.active_copters[cid] = {
                'ip': ip,
                'local': self.sim.isIpLocal(ip)
            }

        # 异步时间同步:更新所有节点时间戳
        self.time_sync.Update()
        return self.active_copters

    def reset_all_ekf(self, copter_subset=None):
        """批量重置指定无人机的EKF状态"""
        targets = copter_subset or list(self.active_copters.keys())
        for cid in targets:
            if cid in self.active_copters:
                # 本地仿真直接重置,远程需通过通信
                if self.active_copters[cid]['local']:
                    self.ekf_init.reset()
        print(f"已重置 {len(targets)} 架无人机的EKF状态")

# 使用示例
manager = MultiCopterManager()
manager.discover_and_sync()
manager.reset_all_ekf([1, 3, 5])  # 批量重置指定ID的无人机

注意事项与避坑指南

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

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

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

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

  • IP列表缓存失效getSimIpListgetSimIpID 内部维护查询缓存,仿真节点异常退出(如崩溃而非正常关闭)后,缓存条目可能残留,导致 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