RflySimSDK v4.10
RflySimSDK说明文档
载入中...
搜索中...
未找到
Bat脚本使用参考

RflySim基于批处理技术开发了众多批处理脚本,让用户可以快速一键启动部署多架、多种、多样无人系统组合式仿真。提高了无人系统开发和仿真速度。平台较常用的批处理脚本:① SITLRun.bat:是开启多机软件在环仿真的批处理文件,其本质上是通过脚本方式启动并配置RflySim工具链的部分软件和选项,② HITLRun.bat:是开启多机硬件在环仿真的批处理文件,插入多个飞控之后,再双击该批处理文件,根据提示输入想要参与仿真的Pixhawk串口号,即可开启多机的硬件在环仿真(以输入串口顺序进行飞机ID排序)。除此之外RflySim工具链还提供众多批处理脚本文件,如:SITLRunPos.bat、SITLRunLowGPU.bat、SITLRunMAVLink.bat、HITLRunPos.bat、HITLPosSysID.bat、HITLPosStr.bat等等,部分脚本文件见*\PX4PSP\RflySimAPIs\BatScripts。用户可通过编辑器打开这些文件,根据个人需求修改其中的参数,实现自定义开发,快速开始仿真或算法的验证。

配套速查表:参见常见“批处理公共代码片段说明”以快速了解管理员提权、taskkill、WSL 管理、Xlaunch、延迟展开等常见片段的用途与写法。

仿真参数设置

CopterSim仿真功能区参数设置

绘图1
参数编号 CopterSim参数名称 BAT脚本参数名称 参数值 对应CopterSim参数值及含义
参数1 CopterID START_INDEX 自定义,应该设置为大于0的整数 设置飞机ID。这个选项在启用多机仿真时用于指定起始飞机的ID。
参数2 3DClassID CLASS_3D_ID 数字索引 设置在RflySim3D中显示的载具3D模型的类型或指定样式ID。三维样式参数可参考平台三维模型资源索引,如需使用自定义的三维样式,参考例程
-1 表示使用默认的3D模型。(通常由dll文件指定)
ClassID 指定载具构型(如四旋翼、固定翼),使用构型类下排在最前面的载具三维样式
Unique3DClassID 指定特定载具构型类下的特定排序三维载具样式
参数3 使用DLL模型文件 DLLModel 数字索引或名称字符串匹配 该参数用于选择不同的DLL文件,选项对应的文件夹地址为:*PX4PSP\CopterSim\external\model,dll模型序号按照命名排序
0 不使用dll文件,此时的动力学模型是在CopterSim的模型配置界面上搭建好的模型
从1开始的dll模型序号或名称 使用指定的dll模型
参数4 仿真模式 SimMode 数字索引或名称字符串匹配 用于选择不同的仿真模式
0 **PX4_HITL**:此模式为PX4官方硬件在环仿真模式。
1 **PX4_SITL**:此模式为PX4官方软在环仿真模式。
2 **PX4_SITL_RFLY**:此模式为RflySim工具链自定义的软件在环仿真模式,由于PX4_SITL仅支持10架无人机集群仿真,在本模式下可支持上百架无人机进行SITL仿真。
3 **Simulink&DLL_SIL**:Simulink中生成的DLL文件仿真模式。(对应综合模型)
4 **PX4_HITL_NET**(限完整版以上):对于Pixhawk 6x等带网口的飞控,支持通过局域网连接飞控实现硬件在环仿真。
5 **EXT_HITL_COM**(限完整版以上):串口方式连接第三方飞控。
6 **EXT_SIM_NET**(限完整版以上): 网络方式连接第三方飞控。
7 **APM_SITL_COM**(限完整版以上):支持连接APM飞控(Ardupilot)进行SITL软件在环仿真,NET表示CopterSim与飞控通过网络连接。
8 **PX4_SIH_COM**(限完整版以上):支持飞控SIH模式(模型运行在飞控中,降低电脑运算量提升稳定性),COM表示通过USB线连接飞控。
9 **PX4_SIH_NET**(限完整版以上):支持飞控SIH模式(模型运行在飞控中,降低电脑运算量提升稳定性),NET表示通过局域网连接飞控。
10 **PX4_SIH_SITL**(限完整版以上):PX4_SIH仿真模式软件在环仿真
11 **PX4_SIH_FLY**(限完整版以上):PX4_SIH仿真模式,硬件在环仿真
参数5 三维显示地图 UE4_MAP 数字索引或名称字符串匹配 该参数用于选择不同的三维场景,选项对应的文件夹地址为:*PX4PSP\CopterSim\external\map,三维场景序号按照命名排序,若需使用自定的三维地图,参考例程:../../3.RflySim3DUE/1.BasicExps/e0_StarterContent/1.UE4StarterContent/Readme.pdf
从0开始的三维地图序号或名称 使用指定的三维地图
参数6 联机 IS_BROADCAST 数字标识、IP地址或特定协议 开启局域网内联机仿真。注:启用联机模式,同时在RflySim3D/RflySimUE5中按下I键(限完整版),就能开启局域网联机仿真,支持多台电脑组网显示所有飞机。
0 仅本机
1 广播
IP地址 指定发送到特定IP地址,在IP模式下,0 等同于 127.0.0.11 等同于 255.255.255.255
使用逗号分隔的IP地址列表 指定发送到多个IP
json 该模式下CopterSim通过json文件中配置的ip和端口与其他仿真模块(RflySim3D、QGC等,可能运行于不同电脑或docker上)通信,由此避免局域网干扰,具体使用方法参见例程:../../2.RflySimUsage/1.BasicExps/e20.CopterSimJsonUsage/Readme.pdf
参数7 GPS坐标(限完整版) isPosGps 数字标识 用于选择不同的坐标初始化模式
0 默认模式,选择直角坐标系
1 启用GPS模式,选择LLA坐标系
参数8 起点位置 ORIGIN_POS_X 自定义整数 地图初始X位置,单位m
ORIGIN_POS_Y 自定义整数 地图初始Y位置,单位m
起点位置(LLA坐标系,限完整版) LatLongAlt 自定义三维浮点数列,用逗号分隔 三维数列依次为经度、纬度、海拔高度
参数9 偏航 ORIGIN_YAW 自定义整数 地图初始yaw角度,设置地图中的初始航向角,单位是度数(degree)。航向角是指在水平面上,相对于北方的方向角。
参数10 飞控选择 启动bat脚本后命令行输入 输入推荐的端口号 选择飞控连接的电脑COM口
参数11 波特率 BaudRate 标准波特率取值,默认为921600 波特率是指每秒钟传输的位数(bits per second, bps),通常用于串行通信中。在选择波特率时,需要确保所有通信设备支持相同的波特率,以确保数据传输的可靠性。
参数12 通信模式 UDPSIMMODE 数字索引 选择不同的MavLink消息通信模式
0 **UDP_Full**:数据最全,Python传输完整的UDP数据给CopterSim,传输数据量较大;CopterSim收到数据后,再转换为Mavlink后传输给PX4飞控;适合中小规模集群(数量小于10)仿真。
1 **UDP_Simple**:数据包大小与发送频率比UDP_Full模式小;适合大规模集群仿真,无人机数量小于100。
2 **Mavlink_Full**:Python直接发送MAVLink消息给CopterSim,再转发给PX4,数据量较大适合单机控制;适合单机或少量飞机仿真,无人机数量小于4;
3 **Mavlink_Simple**:屏蔽部分MAVLink消息包,并降低数据频率,发送数据量比MAVLink_Full小很多,适合多机集群控制;适合小规模集群仿真,无人机数量小于8。
4 **Mavlink_NoSend**:模式下CopterSim不会向外发送MAVLink数据,此模式需要配合硬件在环仿真+数传串口通信,通过有线方式传输MAVLink,此模式局域网内数据量最小,适合分布式视觉硬件在环仿真,无人机数量不限制
5 **Mavlink_NoGPS**:模式下CopterSim不会向外发送MAVLink数据和GPS数据。可以外部发送HIL_GPS数据去提供定位,或者修改EKF2_AID_MASK等参数修改 并配合视觉定位mavlink数据来进行室内定位。注:这种模式适合飞控SLAM仿真时,视觉感知算法需要视觉定位的mavlink消息发给飞控,形成无GPS环境下的视觉控制算法验证。
6 **Mavlink_Vision**:在Mavlink_NoGPS基础上,增加自动发送EKF2_AID_MASK等参数功能(匹配SLAM仿真需求),适合无GPS情况下的SLAM仿真。
7 **Redis_Full**(限完整版):传输完整的Redis数据给CopterSim
8 **Redis_Simple(限完整版)**:数据包大小与发送频率比Redis_Full模式小

其它关键参数

机架设置

参数名称 参数值 解释
PX4SitlFrame 机架名称 设置PX4飞控的机架模式,对应了相应的混控器,Firmware\ROMFS\px4fmu_common\init.d-posix 中查看支持的机架文件,也可以在该文件夹中创建自己的机架文件。

集群设置

参数名称 参数值 解释
TOTOAL_COPTER 自定义整数 设置载具总数
IsSysID 数字标识 是否自动根据 Pixhawk飞控的系统 ID(SysID)来确定载具的 ID(CopterID)
0 未根据飞控系统 ID 确定CopterID。
1 根据飞控系统 ID 确定CopterID。
VEHICLE_INTERVAL 自定义整数 设置两个载具之间的间隔距离,单位为米 (m)

GPS原点模式设置

参数名称 参数值 解释
isBatLLAOrin 数字标识 是否通过BAT脚本设置地图GPS原点
0 使用dll模型或地形校准文件默认的GPS原点
1 使用bat脚本设置地图GPS原点

载具初始位姿设置

参数名称 参数值 解释
PosXStr 命令行输入或自定义浮点数列 isPosGps=0时:载具x 位置列表;isPosGps=1时:载具lat位置列表
PosYStr 命令行输入或自定义浮点数列 isPosGps=0时:载具y位置列表;isPosGps=1时:载具lon位置列表
YawStr 命令行输入或自定义浮点数列 载具偏航角列表,单位deg

RflySim3D初始化启动配置

BAT脚本配置快捷键

-key=S(快捷键1),N1(快捷键2)

cd PSP PATH% RflySimUE5tasklist|find /i "RflySim3D.exe" start PSPPATH%\RflySimUE5\RflySim3D.exe -key=S,N1

BAT脚本配置控制台命令

-cmd=RflyChangeMapbyName(命令1)-LowGPU(参数),RflyChangeMapbyID(命令2)-15(参数)

tasklist|find /i "RflySim3D.exe" || start PSP_PATH%\RflySim3D\RflySim3D.exe -cmd=RflyChangeMapbyID-15

主程序及启动参数配置

设置仿真数量

REM Max vehicle number 50
SET /a MAX_VEHICLE=50
SET /P VehicleNum=Please input UAV swarm number:
SET /A Evaluated=VehicleNum
if %Evaluated% EQU %VehicleNum% (
IF %VehicleNum% GTR 0 (
​ IF %VehicleNum% GTR %MAX_VEHICLE% (
​ ECHO The vehicle number is too large, which may cause a crash
​ pause
​ )
​ GOTO StartSim
)
ECHO Not a positive integer
GOTO Top
) ELSE (
ECHO Not a integer
GOTO Top
)

首先限制最大仿真数量(这里默认限制为50台,可根据电脑硬件配置调整,也可修改UDP通信模式以支持更大数量的仿真);/P后输入集群的载具数量(根据这个数量会在之后启动对应的软件);然后根据最大仿真数量和输入的载具数量作出判断,判断通过则进行下一步,否则返回重新输入。

开始仿真

:StartSim
SET /A VehicleTotalNum=%VehicleNum% + %START_INDEX% - 1
if not defined TOTOAL_COPTER (
SET /A TOTOAL_COPTER=%VehicleTotalNum%
)
set /a sqrtNum=1
set /a squareNum=1
:loopSqrt
set /a squareNum=%sqrtNum% * %sqrtNum%
if %squareNum% EQU %TOTOAL_COPTER% (
goto loopSqrtEnd
)
if %squareNum% GTR %TOTOAL_COPTER% (
goto loopSqrtEnd
)
set /a sqrtNum=%sqrtNum%+1
goto loopSqrt
:loopSqrtEnd

先计算集群的载具总数(为了更好的分配每个载具的ID);然后根据输入的载具数量,利用递归算法每生成一个载具就分配一个编号,并将结果存储在sqrtNum 变量中(便于之后定义每个载具的ID)。

REM QGCPath
tasklist|find /i "QGroundControl.exe" || start %PSP_PATH%\QGroundControl\QGroundControl.exe
ECHO Start QGroundControl
REM UE4Path
cd %PSP_PATH%\RflySim3D
tasklist|find /i "RflySim3D.exe" || start %PSP_PATH%\RflySim3D\RflySim3D.exe
choice /t 5 /d y /n >nul
tasklist|find /i "CopterSim.exe" && taskkill /im "CopterSim.exe"
ECHO Kill all CopterSims
REM CptSmPath
cd %PSP_PATH%\CopterSim

启动/关闭一些软件应用程序,并且进行路径的设置。先分别设置路径,找到并启动QGC和RflySim3D应用程序,然后关闭正在运行的CopterSim(因为之后要对CopterSim进行参数配置),再设置CopterSim应用程序的路径

set /a cntr=%START_INDEX%
set /a endNum=%VehicleTotalNum%+1
set /a portNum=%UDP_START_PORT%+((%START_INDEX%-1)*2)
:loopBegin
set /a PosXX=((%cntr%-1) / %sqrtNum%)*%VEHICLE_INTERVAL% + %ORIGIN_POS_X%
set /a PosYY=((%cntr%-1) %% %sqrtNum%)*%VEHICLE_INTERVAL% + %ORIGIN_POS_Y%
start /realtime CopterSim.exe 1 %cntr% %portNum% %DLLModel% %SimMode% %UE4_MAP% %IS_BROADCAST% %PosXX% %PosYY% %ORIGIN_YAW% 1 %UDPSIMMODE%
choice /t 1 /d y /n >nul
set /a cntr=%cntr%+1
set /a portNum=%portNum%+2
if %cntr% EQU %endNum% goto loopEnd
goto loopBegin
:loopEnd

打开CopterSim模拟器并设置一些参数。先根据之前的初始ID、集群总数及UDP发送端口设置变量(计数器、循环终止条件),随后进入循环,计算每个载具所在的初始位置坐标(PosXX和PosYY),并使用start命令打开CopterSim程序,传递相应的参数(DLL文件、三维场景等)。choice命令会等待1秒钟,然后返回结果(确保启动前参数及时设置)。之后进行载具ID、端口的递归,满足终止条件后结束循环。

REM Set ToolChainType 1:Win10WSL 3:Cygwin
SET /a ToolChainType=1
if "%IS_BROADCAST%" == "0" (
SET IS_BROADCAST=0
) else (
SET IS_BROADCAST=1
)
SET WINDOWSPATH=%PATH%
if %ToolChainType% EQU 1 (
wsl echo Starting PX4 Build; cd %PSP_PATH_LINUX%/Firmware; ./BkFile/EnvOri.sh; export PATH=$HOME/ninja:$HOME/gcc-arm-none-eabi-7-2017-q4-major/bin:$PATH;make px4_sitl_default; ./Tools/sitl_multiple_run_rfly.sh %VehicleNum% %START_INDEX% %PX4SitlFrame%;echo Press any key to exit; read -n 1
) else (
REM CYGPath
cd %PSP_PATH%\CygwinToolchain
CALL setPX4Env.bat
bash -l -i -c 'echo Starting SITL SIMULATION; cd %PSP_PATH_LINUX%/Firmware; ./BkFile/EnvOri.sh; pwd; make px4_sitl_default; ./Tools/sitl_multiple_run_rfly.sh %VehicleNum% %START_INDEX% %PX4SitlFrame%;echo Press any key to exit; read -n 1; pkill -x px4 || true;'
)
SET PATH=%WINDOWSPATH%

构建PX4飞控的固件并启动模拟器。先选择编译环境(默认为平台安装时选择的编译环境),随后进行广播的辨别(如果IS_BROADCAST未定义,则将其设为0),然后根据不同的编译环境设置路径并进行编译(包括传入载具数量,ID,记录飞行状态等)。

结束仿真

REM kill all applications when press a key
tasklist|find /i "CopterSim.exe" && taskkill /im "CopterSim.exe"
tasklist|find /i "QGroundControl.exe" && taskkill /f /im "QGroundControl.exe"
tasklist|find /i "RflySim3D.exe" && taskkill /f /im "RflySim3D.exe"
ECHO Start End.

首先使用任务列表命令(tasklist)查找是否有名为“CopterSim.exe”、“QGroundControl.exe”和“RflySim3D.exe”的进程正在运行。如果找到了这些进程,则使用任务终止命令(taskkill)终止它们。最后在终端输出“Start End.”的文本。

HITLRun与SITLRun脚本的区别

HITLRun.bat一键脚本中的大部分与SITLRun.bat脚本相同,仅在端口设置(CopterSim中的对应参数设置也会改变)、软件启动顺序(QGC最后启动)和固件编译(硬件在环脚本中没有编译过程)上有所区别:

端口设置

主要用于获取与 Pixhawk 控制器连接的串口信息,并提示用户输入 Pixhawk 的 COM 端口列表,其中,"%" 符号表示环境变量,在脚本运行时会根据实际情况替换成对应的值:

1. 获取 COM 端口信息字符串

REM Get the Com port number
for /f "delims=" %%t in ('%PSP_PATH%\CopterSim\GetComList.exe 3 %BaudRate%') do set ComInfoStr=%%t
  • 目的: 运行 GetComList.exe 工具,使用参数 3BaudRate% 获取所有 COM 端口的信息,并将其存储在 ComInfoStr 变量中。

2. 解析 COM 端口信息字符串

for /f "tokens=1,2,3 delims=#" %%a in ("%ComInfoStr%") do (
set ComNumExe=%%a
set ComNameList=%%b
set ComInfoList=%%c
)
  • 目的: 将 ComInfoStr 变量中的信息解析成三个部分,分别存储在 ComNumExe, ComNameListComInfoList 变量中。
  • 工作原理: 使用 # 作为分隔符,for /f 循环将 ComInfoStr 拆分为三部分并赋值给相应的变量。

3. 显示所有可用的 COM 端口

bat复制代码set remain=%ComInfoList%
echo All COM ports on this computer are:
echo.
:loopInfo
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
echo %%a
set remain=%%b
)
if defined remain goto :loopInfo
echo.
ECHO ---------------------------------------
  • 目的: 显示当前计算机上的所有 COM 端口。
  • 工作原理:
    • set remain=ComInfoList%: 初始化 remain 变量,将所有 COM 端口信息存入其中。
    • :loopInfo 标签和 for /f 循环用于逐个提取 remain 中的端口信息并显示出来。
    • delims=; 指定 ; 作为分隔符,将每次提取的端口信息存入 %a,剩余部分继续存入 remain
    • if defined remain goto :loopInfo: 如果 remain 变量中还有剩余内容,继续循环显示。

4. 检查 COM 端口数量并输出推荐的端口列表

bat复制代码if %ComNumExe% EQU 0 (
echo Warning: there is no available COM port
) else (
echo Recommended COM list input is: %ComNameList%
)
  • 目的:

    根据 ComNumExe变量的值判断是否存在可用的 COM 端口。

    • 如果 ComNumExe 等于 0,则表示没有可用的 COM 端口,输出警告信息。
    • 否则,输出推荐的 COM 端口列表(ComNameList 变量中的内容)。

5. 提示用户输入用于 HITL 仿真的 COM 端口列表

bat复制代码ECHO.
ECHO ---------------------------------------
SET /P ComNum=My COM list for HITL simulation is:
  • 目的: 提示用户输入用于硬件在环 (HITL) 仿真的 COM 端口列表(如果有多个 Pixhawk,用户需要使用逗号 , 分隔每个端口号),并将其保存到 ComNum 变量中。
image-20240812101009313

6. 解析并验证用户输入的 COM 端口列表

bat复制代码SET string=%ComNum%
set subStr = ""
set /a VehicleNum=0
:split
for /f "tokens=1,* delims=," %%i in ("%string%") do (
set subStr=%%i
set string=%%j
)
set /a eValue=subStr
if not %eValue% EQU %subStr% (
echo Error: Input '%subStr%' is not a integer!
goto EOF
)
set /a VehicleNum = VehicleNum +1
if not "%string%"=="" goto split
REM echo total com number is %VehicleNum%
  • 目的

    : 将用户输入的 COM 端口列表解析为单个端口,并逐个验证输入是否为整数。

    • SET string=ComNum%: 将用户输入的 COM 端口列表存入 string 变量中。
    • for /f 循环使用 , 作为分隔符,从 string 中提取第一个端口并存入 subStr
    • 验证 subStr 是否为整数。如果不是整数,输出错误信息并跳转到脚本末尾。
    • 如果有多个端口,继续循环解析,直到处理完所有端口。

QGC启动顺序

REM CptSmPath
cd /d %PSP_PATH%\CopterSim
set /a cntr = %START_INDEX%
set /a endNum = %VehicleTotalNum% +1
SET string=%ComNum%
:split1
for /f "tokens=1,* delims=," %%i in ("%string%") do (
set subStr=%%i
set string=%%j
)
set /a PosXX=((%cntr%-1) / %sqrtNum%)*%VEHICLE_INTERVAL% + %ORIGIN_POS_X%
set /a PosYY=((%cntr%-1) %% %sqrtNum%)*%VEHICLE_INTERVAL% + %ORIGIN_POS_Y%
REM echo start CopterSim
start /realtime CopterSim.exe 1 %cntr% %CLASS_3D_ID% %DLLModel% %SimMode% %UE4_MAP% %IS_BROADCAST% %PosXX% %PosYY% %ORIGIN_YAW% %subStr%:%BaudRate% %UDPSIMMODE% %IsSysID%
choice /t 2 /d y /n >nul
set /a cntr=%cntr%+1
REM TIMEOUT /T 1
if not "%string%"=="" goto split1
REM QGCPath
tasklist|find /i "QGroundControl.exe" || start %PSP_PATH%\QGroundControl\QGroundControl.exe -noComPix
ECHO Start QGroundControl

会在CopterSim参数设置完成之后再打开QGC, 因为如果QGC 先打开,可能会占用硬件的端口号导致CopterSim 不能开始仿真。

BAT脚本示例

HITLRun.bat

常规硬件在环仿真脚本,支持输入串口序列(英文逗号","分隔),来启动多机的硬件在环仿真 注:REM打头的行是注释语句,不会被执行。其他的bat脚本语法规则可自行搜索学习。 注:本脚本的飞机位置是由脚本按矩形队列自动生成的,控制变量包括:

REM Run script as administrator(管理员方式运行,能够确保CopterSim以实时优先级运行,跑起来更可靠。)
SET /a START_INDEX=1(初始飞机序号,本脚本生成的飞机的CopterID,以此START_INDEX为初始值,依次递增1)
SET /a TOTOAL_COPTER=8 (总飞机数量,仅在多机联机仿真才需要幅值,告诉本脚本实际的飞机总数,以此来确定矩形队列的边长)
SET UE4_MAP=Grasslands (设置地图名字)
SET /a ORIGIN_POS_X=0 (矩形编队的原点X位置,单位米,只支持整数输入)
SET /a ORIGIN_POS_Y=0 (矩形编队的原点Y位置,单位米,只支持整数输入)
SET /a ORIGIN_YAW=0 (矩形编队的原点yaw角度,单位度,只支持整数输入)
SET /a VEHICLE_INTERVAL=2 (矩形编队的飞机间隔,单位米,只支持整数输入)SET /a CLASS_3D_ID=-1(重定义飞机的样式ID,默认-1将使用DLL模型或内置三维样式,如果>0,则重定义为设定样式)
SET /A DLLModelVal=DLLModel (是否使用DLL模型,DLL模型的名字。这里支持将Simulink的飞行器模型生成DLL来导入平台,此模式支持固定翼、无人车等模型)
SimMode (仿真模式,这里设置为0或PX4_HITL,表示硬件在环仿真)
SET IS_BROADCAST=0 (是否联机仿真,这里可输入目标IP地址序列)
SET UDPSIMMODE=0 (UDP模式传输的是平台私有结构体,支持Simulink控制;MAVLink模式传输的是MAVLink协议,支持Python和mavros等控制模式)

SITLRun.bat

常规软件在环脚本,支持输入飞机数量,自动开启多机软件在环仿真 与HITLRun.bat相比,关键代码如下

set SimMode=2 (这里设置为软件在环模式,对应CopterSimUI的值)
set PX4SitlFrame=iris (这里对应了PX4飞控的机架模式,这里是一个四旋翼)

HITLPos.bat

开启硬件在环仿真,支持输入PosX、PosY和Yaw的值来初始化飞机位置偏航角 注:输入的位置字符串,以英文逗号“,”分隔 关键代码如下:

SET /P PosXStr=Please enter the PosX (m) list: (输入X的初始位置序列,单位米,可以为浮点数)
SET /P PosYStr=Please enter the PosY (m) list: (输入Y的初始位置序列,单位米,可以为浮点数)
SET /P YawStr=Please enter the Yaw (degree) list:(输入偏航的初始值序列,单位度,可以为浮点数)

SITLPos.bat

开启软件在环仿真,支持输入PosX、PosY和Yaw的值来初始化飞机位置偏航角 注:其余注意事项同上

HITLPosAlt.bat

开启硬件在环仿真,支持输入PosX、PosY和Yaw的值来初始化飞机位置偏航角(可初始化空中或水下) 注:其余注意事项同上

SITLPosAlt.bat

开启软件在环仿真,支持输入PosX、PosY和Yaw的值来初始化飞机位置偏航角(可初始化空中或水下) 注:其余注意事项同上

HITLPosAltStr.bat

开启硬件在环仿真,自动输入PosX、PosY和Yaw的值来初始化飞机位置偏航角(可初始化空中或水下) 注:其余注意事项同上

SITLPosAltStr.bat

开启软件在环仿真,自动输入PosX、PosY和Yaw的值来初始化飞机位置偏航角(可初始化空中或水下) 注:其余注意事项同上

HITLPosStr.bat

开启硬件在环仿真,PosX、PosY和Yaw的值以字符串的形式写在bat文件的PosXStr、PosYStr、YawStr变量中,不需要手动输入 注:使用时,需要手动去修改PosXStr、PosYStr、YawStr字符串的值,来设置生成飞机的位置和偏航 注:输入的位置字符串,以英文逗号“,”分隔 注:位置序列的数量可以大于插入飞控数量,会依次取前面的位置进行幅值,例如本例子位置字符串包含10组飞机初始位姿,因此支持仿真1到10个飞机的硬件在环仿真 关键代码如下:

SET PosXStr=1,2,3,4,5,6,7,8,9,10 (X的初始位置序列,单位米,可以为浮点数)
SET PosYStr=0,0,0,0,0,0,0,0,0,0(Y的初始位置序列,单位米,可以为浮点数)
SET YawStr=0,0,0,0,0,0,0,0,0,0(偏航的初始值序列,单位度,可以为浮点数)

SITLPosStr.bat

开启软件在环仿真,PosX、PosY和Yaw的值以字符串的形式写在bat文件的PosXStr、PosYStr、YawStr变量中,不需要手动输入 注:其余注意事项同上

HITLRunSysID.bat

开启硬件在环仿真,但是CopterID不是自动增1排序,而是根据SysID的值(在QGroundControl中可配置)来自动确定 注:如果使用常规模式,CopterID是和电脑串口序列先后顺序绑定的,每次插拔飞控后串口号会变化,因此无法通过CopterID定位到确定的飞控硬件 注:使用本方法,CopterID可以直接和飞控硬件绑定,便于故障时快速确定飞控序号。 注:如果要再使用常规模式的HITLRun.bat脚本,建议将SysID改回默认值1 关键代码如下:

SET /a IsSysID=1 (开启通过SysID自动计算CopterID的功能)

HITLPosSysIDStr.bat

开启硬件在环仿真,通过SysID自动确定CopterID取值,且支持配置初始位置序列 注:本脚本会以SysID - START_INDEX的值,去索引PosXStr、PosYStr、YawStr列表来确定最终位置 注:例如SysID为15,START_INDEX为11,PosXStr=1,2,3,4,5,6,7,8,9,10,则飞机最终的x取值应该是PosXStr的第4位(从0开始数),也就是PosX=5 关键代码如下:

SET /a IsSysID=1 (开启通过SysID自动计算CopterID的功能)
SET /a START_INDEX=1 (位置列表的初始飞机的值)
SET PosXStr=1,2,3,4,5,6,7,8,9,10 (X的初始位置序列,单位米,可以为浮点数)
SET PosYStr=0,0,0,0,0,0,0,0,0,0(Y的初始位置序列,单位米,可以为浮点数)
SET YawStr=0,0,0,0,0,0,0,0,0,0(偏航的初始值序列,单位度,可以为浮点数)

HITLPosSysID.bat

开启硬件在环仿真,通过SysID自动确定CopterID取值(同HITLPosSysIDStr.bat),但初始位置序列是手动输入的

HITLPosStrGPS.bat

开启硬件在环仿真,使用全球GPS坐标初始化飞机位置 关键代码如下:

SET isPosGps=1(如果isPosGps设为1,则PosXStr和PosYStr可使用纬度和精度格式(单位度)输入;如果无isPosGps或设为0,则使用xy的北东地(单位米)的格式输入初始位置。)
SET isBatLLAOrin=1(如果isBatLLAOrin设置为1,且LatLongAlt设定了经纬高的值,则会使用LatLongAlt的经纬高作为北东地坐标系下,GPS坐标原点。反之,使用模型内部GPS设定值,或者png+txt地形文件中指定的值。)
注:本功能仅支持完整版及以上,免费版无法配置GPS初始位置。

SITLPosStrGPS.bat

开启软件在环仿真,使用全球GPS坐标初始化飞机位置 关键代码如下:

SET isPosGps=1(如果isPosGps设为1,则PosXStr和PosYStr可使用纬度和精度格式(单位度)输入;如果无isPosGps或设为0,则使用xy的北东地(单位米)的格式输入初始位置。)
SET isBatLLAOrin=1(如果isBatLLAOrin设置为1,且LatLongAlt设定了经纬高的值,则会使用LatLongAlt的经纬高作为北东地坐标系下,GPS坐标原点。反之,使用模型内部GPS设定值,或者png+txt地形文件中指定的值。)
注:本功能仅支持完整版及以上,免费版无法配置GPS初始位置。

HITLRunExtNet.bat

使用第三方飞控开启硬件在环仿真

关键代码如下:

set SimMode=EXT_SIM_NET

HITLRunMAVLinkNoGPS.bat

SET UDPSIMMODE=Mavlink_NoGPS

SITLRunMAVLinkNoGPS.bat

用于软件在环(SITL)仿真下,关闭 GPS 相关的 MAVLink 数据通道,适合在无 GPS 场景(室内、SLAM)中进行算法验证。

典型设置:

set SimMode=2 & rem SITL(PX4_SITL_RFLY)
SET UDPSIMMODE=Mavlink_NoGPS
  • 说明:
    • 与 HITL 版的 Mavlink_NoGPS 相同,此模式下 CopterSim 不向外发送 GPS/MAVLink 的部分定位相关消息。
    • 如需 EKF 视觉融合,请使用 Mavlink_Vision(在 HITL/SITL 对应脚本中设置 SET UDPSIMMODE=Mavlink_Vision),或在 PX4 参数中手动调整 EKF2_AID_MASK 等配置。

HITLRunPX4Net.bat

set SimMode=PX4_HITL_NET

SITLPosStrSel.bat

开启软件在环仿真,使用“字符串形式”的位置/偏航列表,并支持在脚本中对位置列表进行“选择/启用子集”的便捷配置(Sel)。

  • 适用场景:
    • 预先在脚本中写好多组位姿,按实验需要选择其中一部分参与仿真。
    • 便于课程/演示时快速切换不同队形或子集,不必每次手动编辑全部列表。
  • 特点:
    • SITLPosStr.bat 类似,但增加了“选择性启用”的便捷性(如仅启用前 N 项或按索引启用一部分)。
    • 与 HITL 系列不同,本脚本不涉及串口与波特率配置。

提示:具体“选择/子集”的参数名与写法可能随版本略有差异,可参考同目录下的示例注释或根据现有位置字符串(PosXStr/PosYStr/YawStr)按需裁剪启用。

StartCFclient.bat

在 Windows 系统中运行 cfclient.exe 程序

if not defined PSP_PATH (
SET PSP_PATH=C:\PX4PSP
SET PSP_PATH_LINUX=/mnt/c/PX4PSP
)

这部分代码检查是否已经定义了环境变量 PSP_PATH。如果没有定义,则设置两个环境变量:

  • PSP_PATH 设置为 C:\PX4PSP,这是在 Windows 系统中的路径。
  • PSP_PATH_LINUX 设置为 /mnt/c/PX4PSP,这是在 WSL(Windows Subsystem for Linux)中的路径。
%1(start /min cmd.exe /c %0 :& exit )

这行代码有点复杂,实际上它是用来确保脚本在一个最小化的命令提示符窗口中运行。具体来说:

  • %1 代表批处理文件的第一个命令行参数。如果没有参数,这部分会被忽略。
  • start /min cmd.exe /c %0 启动一个新的最小化命令提示符窗口,并执行当前批处理文件(%0 代表批处理文件自身)。
  • :& exit 确保当前窗口在启动新窗口后立即退出。
cd /d %PSP_PATH%\RflySimAPIs\Python38Scripts

这行代码将当前目录切换到 RflySimAPIs\Python38Scripts 目录,该目录位于之前定义的 PSP_PATH 路径下。

  • /d 参数允许切换到一个不同的驱动器上的目录。
SET PATH=%PSP_PATH%\Python38;%PSP_PATH%\Python38\Scripts

这行代码将 Python 3.8 和其脚本目录添加到系统环境变量 PATH 中,这样在运行 Python 脚本时可以找到相应的可执行文件。

cfclient.exe

最后,这行代码运行名为 cfclient.exe 的可执行文件,假设它位于当前目录或已添加到 PATH 中的某个目录。

StopBuild.bat

在 Windows 系统中检查并终止与 Windows Subsystem for Linux (WSL) 相关的进程。

tasklist|find /i "wsl.exe" && taskkill /f /im "wsl.exe"

这行代码执行以下操作:

  1. tasklist 列出当前正在运行的所有进程。
  2. 通过管道符号 (|),将 tasklist 的输出传递给 find 命令。
  3. find /i "wsl.exe" 在进程列表中查找不区分大小写的字符串 "wsl.exe"。
  4. 如果找到了 "wsl.exe" 进程,&& 后的命令 taskkill /f /im "wsl.exe" 将被执行。taskkill 命令强制(/f)终止(杀掉)进程名为 "wsl.exe" 的所有实例。
tasklist|find /i "wslhost.exe" && taskkill /f /im "wslhost.exe"

这行代码与上一行类似,但它检查并终止 "wslhost.exe" 进程。如果找到 "wslhost.exe" 进程,使用 taskkill /f /im "wslhost.exe" 强制终止它。

tasklist|find /i "bash.exe" && taskkill /f /im "bash.exe"

这行代码同样类似,但它检查并终止 "bash.exe" 进程。如果找到 "bash.exe" 进程,使用 taskkill /f /im "bash.exe" 强制终止它。

CloseALL.bat

一键清理仿真相关进程与 WSL 环境,快速“复位”开发机。

  • 会强制结束:CopterSim、QGroundControl、RflySim3D、python、wsl/wslhost/bash、VcXsrv 等进程,并执行 wsl --shutdown
  • 注意:脚本末尾包含结束 cmd.exe 的语句,可能会把当前命令窗口也一并关闭,建议用于彻底清场时运行。

DistSim.bat

启动分布式仿真管理器 DistSim.exe(位于 PSP_PATH%\CopterSim),用于多机/多机位分布式协同仿真。

cd /d %PSP_PATH%\CopterSim
start DistSim.exe

gpedit.bat

为 Windows 家庭版等环境安装本地组策略编辑器(gpedit.msc)所需的组件包,便于进行系统策略配置。

  • 使用 DISM 批量添加 Microsoft-Windows-GroupPolicy-* 的 .mum 包。
  • 需要管理员权限,执行完毕后可运行 gpedit.msc

HITLRunAuto.bat

硬件在环(HITL)自动分配串口脚本:输入飞机数量而非逐个 COM 口,CopterSim 将按检测到的 Pixhawk 顺序自动绑定。

  • 关键点:
    • 先通过 GetComList.exe 统计可用 Pixhawk 数量,防止超量。
    • 启动 CopterSim 时使用 0:BaudRate% 作为端口占位,表示自动匹配。
  • 适用:多机 HIL 快速起飞,不想手动输入串口列表。

HITLRunChange3D.bat

HIL 脚本的 3D 机型切换版:通过设置 CLASS_3D_ID 为特定排序 ID(如 100003 对应 N00003),直接更换 RflySim3D 中的载具外观样式。

  • 其余流程同 HITLRun.bat。

HITLRunFw.bat

固定翼硬件在环示例:

  • 设置 DLLModel=FixWingModel,地图为 OldFactoryUDPSIMMODE=2(Mavlink_Full)。
  • 仍以 HIL 模式与 Pixhawk 串口连接,适合固定翼整机链路联调。

HITLRunLANSwarm.bat

局域网联机的 HIL 群飞脚本:

  • IS_BROADCAST=1,并以 -key=I1 启动 RflySim3D,便于在 3D 端启用联机显示。
  • 其它参数与 HITLRun 类似,适合多电脑协同显示/控制。

HITLRunLowGPU.bat

低显卡/低算力环境的 HIL 脚本:

  • 使用 UE4_MAP=LowGPU 的简化场景,以降低 3D 渲染压力。

HITLRunNoUI.bat

无界面 HIL:使用 CopterSimNoUI.exe 以“纯后台”方式运行 CopterSim,节省图形资源,适合服务器或批量测试。

start /realtime CopterSimNoUI.exe 1 %cntr% ... %UDPSIMMODE%

HITLRunROS.bat

HIL + ROS 集成:在完成 CopterSim/QGC 启动后,通过 WSL 运行 ~/mavros_run.sh START_INDEX%,VehicleNum%,自动拉起 MAVROS 等 ROS 节点。

  • 结束时自动 wsl --shutdown 清理。

HITLRunUE5.bat

使用 UE5 版三维程序(PSP_PATH%\RflySimUE5\RflySim3D.exe)进行 HIL,适合需要 UE5 资产/效果的场景。

Python38Env.bat

打开一个已配置好 Python3.8 环境的新命令行窗口(已包含 OpenCV、pymavlink、numpy、pyulog 等),并切换到 RflySimAPIs\Python38Scripts 目录。

  • 用于运行/调试 RflySim 提供的 Python 示例或自定义脚本。

Python38Run.bat

在当前代码目录打开已配置好 Python3.8 的命令行窗口,并将当前目录加入 PATH,便于直接 python XXX.py 运行脚本。

SITLRunChange3D.bat

SITL 的 3D 机型切换版:将 CLASS_3D_ID 设为特定排序 ID(如 100003),更换 RflySim3D 显示机型;其余同 SITLRun.bat

SITLRunDebug.bat

单机 SITL 调试脚本(PX4 官方 SITL):

  • SimMode=PX4_SITL,仅 1 架机;在 WSL 中执行 make px4_sitl none_iris,便于调试 PX4 原生 SITL 行为。
  • 结束时关闭相关进程并 wsl --shutdown

SITLRunFw.bat

固定翼 SITL 示例:

  • DLLModel=FixWingModelPX4SitlFrame=standard_plane,地图 OldFactoryUDPSIMMODE=2(Mavlink_Full)。

SITLRunLANSwarm.bat

局域网联机的 SITL 群飞脚本:

  • IS_BROADCAST=1,RflySim3D 以 -key=I1 启动以便联机显示。

SITLRunLowGPU.bat

低显卡/低算力环境的 SITL 脚本:

  • 使用 UE4_MAP=LowGPU 的简化场景,减轻渲染负担。

SITLRunNoUI.bat

无界面 SITL:使用 CopterSimNoUI.exe 后台运行,结合 WSL 编译运行 PX4;适合批量/服务器场景。

SITLRunROS.bat

SITL + ROS 集成:在 WSL 构建并启动 PX4 SITL 后,附加运行 ~/mavros_run.sh START_INDEX%,VehicleNum% 以启动 MAVROS;完成后 wsl --shutdown 清理。

SITLRunUE5.bat

使用 UE5 版三维程序进行 SITL:PSP_PATH%\RflySimUE5\RflySim3D.exe,示例地图 Quarry

UdpPortFree.bat

端口占用一键排查与释放工具:

  • 输入仿真机数量后,按固定端口(如 20005–20011、14550)与按编号推算的端口段(20100/30100 等)遍历,通过 netstat -ano 查 PID 并 taskkill 强制结束。
  • 同时支持 TCP(如 4560+N)与 UDP 端口检查。
call :check_and_kill 20010 & rem UDP
call :check_and_kill_tcp 4560 & rem TCP

WinWSL.bat

快速打开 WSL 控制台并确保 X 服务器(VcXsrv)已按 config1.xlaunch 配置启动,便于随后运行带 GUI 的 WSL 程序。

WslGUI.bat

一键开启 WSL 图形界面支持:启动 VcXsrv(config.xlaunch),随后在发行版 RflySim-20.04 中执行 ~/StartUI.sh,脚本末尾会关闭 VcXsrv。

WslSwith2.bat

WSL1/WSL2 切换工具并自动配置网络:

  • 检查 Windows 版本与虚拟化支持;可在交互中选择切换到 WSL1 或 WSL2。
  • 切到 WSL2 时:
    • 在发行版内写入较大的 net.core.*mem* 缓冲以优化网络吞吐;
    • 生成 USERPROFILE%\\.wslconfig,设置 networkingMode=mirroredguiApplications=false 以获得更好的网络直连体验;
    • 自动 wsl --shutdown 应用设置。

附:常见批处理公共代码片段说明

下面汇总 RflySim 各类 bat 脚本中反复出现的“公共代码”,说明其作用、原理与注意事项,方便阅读与二次开发。

1) 管理员权限自提权

REM Run script as administrator
NET SESSION >nul 2>&1 || powershell -Command "Start-Process cmd -ArgumentList '/c, ""%~f0""' -Verb RunAs" && exit /b
  • 原理:NET SESSION 只有管理员可成功执行。若失败(非管理员),右侧使用 PowerShell 启动一个“以管理员身份运行”的 cmd,并让其继续执行当前脚本(%~f0 为脚本绝对路径)。随后 exit /b 结束当前非管理员进程。
  • 特点:无须额外文件即可自举为管理员;会触发 UAC 确认弹窗。
  • 提示:若脚本中带有相对路径,建议配合 %~dp0cd /d 确保工作目录一致。

2) 静默输出与错误重定向

someCommand >nul 2>&1
  • 作用:抑制标准输出与错误输出,保持控制台干净。
  • 常见组合:command1 || command2(前者失败才执行后者),command1 && command2(前者成功才执行后者)。

3) 进程查询与安全结束进程

tasklist | find /i "CopterSim.exe" && taskkill /im "CopterSim.exe"
tasklist | find /i "QGroundControl.exe" && taskkill /f /im "QGroundControl.exe"
  • 原理:tasklist 枚举进程,通过 find /i 不区分大小写匹配进程名。若找到则执行 taskkill
  • 参数:
    • /im name.exe 指定按映像名结束;/pid N 按进程号结束。
    • /f 强制终止,确保无法正常退出时也能清理。
  • 习惯用法:先查再杀,避免“未找到进程”带来的报错信息。
  • 注意:CloseALL.bat 中如包含 cmd.exe 的终止,会关闭当前窗口,请谨慎使用或放在脚本末尾。

4) WSL 环境管理

wsl --shutdown
wsl -d RflySim-20.04
  • wsl --shutdown:关闭所有 WSL 发行版与后台服务,常用于释放被占用端口/文件句柄。
  • wsl -d <Distro>:在指定发行版中执行后续命令(常与 GUI/X11 配置配合)。

5) X 服务器与 GUI 启动(VcXsrv)

cd /d %PSP_PATH%\VcXsrv
tasklist|find /i "vcxsrv.exe" >nul || Xlaunch.exe -run config.xlaunch
  • 作用:如未启动 VcXsrv,则用预设的 .xlaunch 配置启动,用于 WSL GUI 程序显示。
  • 提示:不同脚本可能使用 config.xlaunchconfig1.xlaunch

6) 路径与工作目录

cd /d %PSP_PATH%\CopterSim
pushd "%~dp0" & rem 进入脚本所在目录
  • /d:允许跨盘符切换目录。
  • %~dp0:当前脚本所在目录的盘符与路径(以反斜杠结尾),适合定位相对资源。
  • pushd/popd:成对使用可临时切换目录并在结束后还原。

7) 程序启动与控制台会话

start /realtime CopterSim.exe ...
start cmd.exe /k "SET PATH=...;%PATH% & someCommand"
  • start:以新进程方式启动程序,常见参数:
    • /min 最小化窗口;/realtime 以高优先级运行(慎用)。
    • cmd.exe /k 启动新控制台并保留窗口;/c 执行完即退出。
  • 提示:在 start 的参数中需要用双引号包裹整段命令,内部引号需转义。

8) 延时与节流

choice /t 2 /d y /n >nul
  • 作用:无交互等待若干秒(此处 2 秒),常用于给进程预留启动时间。
  • 参数:/d y 设定默认选择,/n 不显示选项字母,>nul 静默输出。

9) 环境变量与算术

set /a VEHICLE_INTERVAL=2
setlocal enabledelayedexpansion
echo !var! & rem 延迟展开,循环/异步场景下使用
  • set /a:执行整数算术运算。
  • enabledelayedexpansion:使用 !var! 读取变量的“运行期值”(在 for/if 循环体内尤为重要)。
  • 区分:var% 在解析阶段展开,!var! 在执行阶段展开。

10) 字符串与列表解析

for /f "tokens=1,2,3 delims=#" %%a in ("%ComInfoStr%") do (
set ComNumExe=%%a
set ComNameList=%%b
set ComInfoList=%%c
)
for /f "tokens=1,* delims=," %%i in ("%string%") do (
set subStr=%%i
set string=%%j
)
  • 用途:解析外部命令输出或逗号分隔的用户输入,按分隔符切分并逐段处理。
  • 细节:在批处理文件中循环变量需使用双百分号 %i;在命令行直接运行用单 i

11) 标签与“子例程”

call :check_and_kill 20010
goto :eof
:check_and_kill
REM ...实现...
exit /b 0
  • 说明:以 :label 定义脚本内“子例程”,通过 call :label args 调用,exit /bgoto :eof 返回。
  • 示例:UdpPortFree.bat 中的 :check_and_kill 用于按端口查询并杀进程。

12) 临时 PATH 与工具链注入

SET WINDOWSPATH=%PATH%
SET PATH=%PSP_PATH%\Python38;%PSP_PATH%\Python38\Scripts;%PATH%
start cmd.exe /k "echo ENV OK & ..."
SET PATH=%WINDOWSPATH%
  • 用途:在当前/子进程范围内临时改写 PATH,保证所需工具优先级与隔离性。
  • 提示:放入 start cmd.exe /k 中可仅影响新开的终端会话。

13) 管道与条件执行的组合套路

tasklist | find /i "RflySim3D.exe" || start %PSP_PATH%\RflySim3D\RflySim3D.exe
  • 语义:若未找到进程(find 失败),则启动新实例。与 && taskkill 形成“存在则杀/不存在则启”的对偶写法。