跳转至

BAT 脚本使用参考

RflySim 基于批处理技术开发了众多批处理脚本,让用户可以快速一键启动部署多架、多种、多样无人系统组合式仿真,提高无人系统开发和仿真速度。

常用脚本:

  • SITLRun.bat — 开启多机软件在环仿真
  • HITLRun.bat — 开启多机硬件在环仿真(插入飞控后按提示输入串口号)

更多脚本见 *\PX4PSP\RflySimAPIs\BatScripts 目录。


仿真参数设置

CopterSim 仿真功能区参数

CopterSim 参数映射

以下参数在 BAT 脚本中通过 SET 命令配置,与 CopterSim GUI 界面一一对应:


参数1 · CopterID / START_INDEX

设置飞机 ID,多机仿真时用于指定起始飞机编号。

SET /a START_INDEX=1

参数2 · 3DClassID / CLASS_3D_ID

设置 RflySim3D 中显示的载具三维模型样式。

取值 含义
-1 使用默认 3D 模型(由 DLL 文件指定)
ClassID 指定载具构型(如四旋翼、固定翼),使用该构型下默认样式
Unique3DClassID 指定特定构型下的特定三维样式

三维样式参数参考 平台三维模型资源索引


参数3 · 使用DLL模型文件 / DLLModel

选择不同的 DLL 动力学模型文件(位于 *PX4PSP\CopterSim\external\model)。

取值 含义
0 不使用 DLL,使用 CopterSim 界面上搭建的模型
≥1 的序号或名称 使用指定的 DLL 模型

参数4 · 仿真模式 / SimMode

仿真模式取值表
模式名称 说明
0 PX4_HITL PX4 官方硬件在环仿真
1 PX4_SITL PX4 官方软件在环仿真
2 PX4_SITL_RFLY RflySim 自定义 SITL,支持上百架集群
3 Simulink&DLL_SIL Simulink 生成的 DLL 仿真(综合模型)
4 PX4_HITL_NET 网口飞控 HIL(限完整版)
5 EXT_HITL_COM 串口连接第三方飞控(限完整版)
6 EXT_SIM_NET 网络连接第三方飞控(限完整版)
7 APM_SITL_COM APM (Ardupilot) SITL(限完整版)
8 PX4_SIH_COM SIH 模式 USB 连接(限完整版)
9 PX4_SIH_NET SIH 模式局域网连接(限完整版)
10 PX4_SIH_SITL SIH 软件在环(限完整版)
11 PX4_SIH_FLY SIH 硬件在环(限完整版)

参数5 · 三维显示地图 / UE4_MAP

选择三维场景(位于 *PX4PSP\CopterSim\external\map),支持序号或名称。

SET UE4_MAP=Grasslands

参数6 · 联机 / IS_BROADCAST

开启局域网联机仿真(同时需在 RflySim3D 中按 I 键)。

取值 含义
0 仅本机
1 广播到全网
IP地址 指定 IP(0=127.0.0.11=255.255.255.255
IP1,IP2,... 发送到多个 IP
json 通过 JSON 文件配置通信 IP 和端口

参数7 · GPS坐标 / isPosGps(限完整版)

取值 含义
0 直角坐标系(默认)
1 GPS/LLA 坐标系

参数8 · 起点位置

SET /a ORIGIN_POS_X=0    :: 初始 X 位置 (m)
SET /a ORIGIN_POS_Y=0    :: 初始 Y 位置 (m)
SET LatLongAlt=116.3,39.9,50  :: LLA 坐标(限完整版)

参数9 · 偏航 / ORIGIN_YAW

初始航向角(度),相对于北方。

SET /a ORIGIN_YAW=0

参数10 · 飞控选择

启动 BAT 后在命令行输入推荐的 COM 端口号。


参数11 · 波特率 / BaudRate

串口通信波特率,默认 921600


参数12 · 通信模式 / UDPSIMMODE

UDPSIMMODE 通信模式取值表
模式 适用规模 说明
0 UDP_Full <10 架 数据最全,Python→CopterSim→PX4
1 UDP_Simple <100 架 精简结构体,适合大规模集群
2 Mavlink_Full <4 架 Python 直发 MAVLink,数据量大但最接近真机
3 Mavlink_Simple <8 架 屏蔽部分消息包,降低频率
4 Mavlink_NoSend 不限 CopterSim 不发 MAVLink,需配合数传串口
5 Mavlink_NoGPS 不发 GPS 数据,适合室内 SLAM 仿真
6 Mavlink_Vision NoGPS + 自动发送 EKF2_AID_MASK 参数
7 Redis_Full Redis 完整模式(限完整版)
8 Redis_Simple Redis 精简模式(限完整版)

其它关键参数

机架设置

参数 取值 说明
PX4SitlFrame 机架名称 对应 Firmware\ROMFS\px4fmu_common\init.d-posix 中的机架文件

集群设置

参数 取值 说明
TOTOAL_COPTER 整数 载具总数
IsSysID 0/1 是否按飞控 SysID 确定 CopterID
VEHICLE_INTERVAL 整数 载具间隔距离 (m)

GPS 原点模式

参数 取值 说明
isBatLLAOrin 0 使用 DLL/地形文件默认 GPS 原点
1 使用 BAT 脚本设置 GPS 原点

载具初始位姿

参数 说明
PosXStr isPosGps=0 时为 X 位置列表;=1 时为纬度列表
PosYStr isPosGps=0 时为 Y 位置列表;=1 时为经度列表
YawStr 偏航角列表 (deg)

RflySim3D 初始化启动配置

BAT 脚本配置快捷键:

start %PSP_PATH%\RflySimUE5\RflySim3D.exe -key=S,N1

BAT 脚本配置控制台命令:

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,可调整),输入载具数量后校验并进入仿真。

开始仿真

: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

计算集群载具总数,利用递归算法分配编号。

REM 启动 QGC 和 RflySim3D
tasklist|find /i "QGroundControl.exe" || start %PSP_PATH%\QGroundControl\QGroundControl.exe
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"
cd %PSP_PATH%\CopterSim
REM 循环启动 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 实例。

REM 编译并启动 PX4 SITL
SET /a ToolChainType=1
SET WINDOWSPATH=%PATH%
if %ToolChainType% EQU 1 (
  wsl echo Starting PX4 Build; cd %PSP_PATH_LINUX%/Firmware; ...
) else (
  cd %PSP_PATH%\CygwinToolchain
  CALL setPX4Env.bat
  bash -l -i -c '...'
)
SET PATH=%WINDOWSPATH%

结束仿真

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.

HITLRun 与 SITLRun 的区别

HITLRun.bat 与 SITLRun.bat 大部分相同,区别在于:

差异点 HITLRun SITLRun
端口设置 需输入 COM 串口号 自动分配 UDP 端口
QGC 启动顺序 CopterSim 之后启动(避免占用串口) 先启动
固件编译 WSL 中编译 PX4

端口设置(HITLRun 特有)

1. 获取 COM 端口信息
for /f "delims=" %%t in ('%PSP_PATH%\CopterSim\GetComList.exe 3 %BaudRate%') do set ComInfoStr=%%t
2. 解析 COM 端口信息
for /f "tokens=1,2,3 delims=#" %%a in ("%ComInfoStr%") do (
    set ComNumExe=%%a
    set ComNameList=%%b
    set ComInfoList=%%c
)
3. 显示可用 COM 端口
set remain=%ComInfoList%
echo All COM ports on this computer are:
:loopInfo
for /f "tokens=1* delims=;" %%a in ("%remain%") do (
    echo %%a
    set remain=%%b
)
if defined remain goto :loopInfo
4. 输出推荐端口
if %ComNumExe% EQU 0 (
    echo Warning: there is no available COM port
) else (
    echo Recommended COM list input is: %ComNameList%
)
5. 输入 COM 端口列表
SET /P ComNum=My COM list for HITL simulation is:

COM 端口输入界面

6. 解析并验证输入
SET string=%ComNum%
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

QGC 启动顺序(HITLRun)

CopterSim 参数设置完成后再启动 QGC,避免 QGC 占用串口。

start /realtime CopterSim.exe 1 %cntr% %CLASS_3D_ID% ... %subStr%:%BaudRate% %UDPSIMMODE% %IsSysID%
...
tasklist|find /i "QGroundControl.exe" || start %PSP_PATH%\QGroundControl\QGroundControl.exe -noComPix

BAT 脚本速查索引

下表列出所有可用的 BAT 脚本及其关键特性:

基础仿真脚本

脚本名 仿真类型 功能特点
HITLRun.bat HIL 常规硬件在环,手动输入 COM 串口
SITLRun.bat SIL 常规软件在环,输入飞机数量自动开启
HITLRunAuto.bat HIL 自动分配串口,无需手动输入
SITLRunDebug.bat SIL PX4 官方 SITL 单机调试

位置初始化脚本

脚本名 仿真类型 功能特点
HITLPos.bat HIL 手动输入 PosX/PosY/Yaw
SITLPos.bat SIL 手动输入 PosX/PosY/Yaw
HITLPosAlt.bat HIL 支持空中/水下初始化
SITLPosAlt.bat SIL 支持空中/水下初始化
HITLPosStr.bat HIL 位置以字符串写入脚本
SITLPosStr.bat SIL 位置以字符串写入脚本
HITLPosAltStr.bat HIL 自动输入,支持空中/水下
SITLPosAltStr.bat SIL 自动输入,支持空中/水下
SITLPosStrSel.bat SIL 字符串位置 + 选择性启用子集

GPS 坐标脚本(限完整版)

脚本名 仿真类型 功能特点
HITLPosStrGPS.bat HIL 全球 GPS 坐标初始化
SITLPosStrGPS.bat SIL 全球 GPS 坐标初始化

关键设置:SET isPosGps=1 + SET isBatLLAOrin=1

SysID 绑定脚本

脚本名 仿真类型 功能特点
HITLRunSysID.bat HIL CopterID 按飞控 SysID 自动确定
HITLPosSysID.bat HIL SysID + 手动输入位置
HITLPosSysIDStr.bat HIL SysID + 字符串位置

关键设置:SET /a IsSysID=1

联机与集群脚本

脚本名 仿真类型 功能特点
HITLRunLANSwarm.bat HIL 局域网联机群飞 (IS_BROADCAST=1)
SITLRunLANSwarm.bat SIL 局域网联机群飞

特殊模式脚本

脚本名 仿真类型 功能特点
HITLRunFw.bat HIL 固定翼 (DLLModel=FixWingModel)
SITLRunFw.bat SIL 固定翼 SITL
HITLRunChange3D.bat HIL 切换 3D 载具样式
SITLRunChange3D.bat SIL 切换 3D 载具样式
HITLRunMAVLinkNoGPS.bat HIL 无 GPS 模式 (SLAM)
SITLRunMAVLinkNoGPS.bat SIL 无 GPS 模式 (SLAM)
HITLRunPX4Net.bat HIL 网口飞控 (PX4_HITL_NET)
HITLRunExtNet.bat HIL 第三方飞控 (EXT_SIM_NET)
HITLRunLowGPU.bat HIL 低显卡模式 (UE4_MAP=LowGPU)
SITLRunLowGPU.bat SIL 低显卡模式
HITLRunNoUI.bat HIL 无界面后台运行
SITLRunNoUI.bat SIL 无界面后台运行
HITLRunUE5.bat HIL 使用 UE5 版三维程序
SITLRunUE5.bat SIL 使用 UE5 版三维程序

ROS 集成脚本

脚本名 仿真类型 功能特点
HITLRunROS.bat HIL HIL + MAVROS 自动拉起
SITLRunROS.bat SIL SIL + MAVROS 自动拉起

工具与环境脚本

脚本名 功能
CloseALL.bat 一键清理所有仿真进程 + WSL
StopBuild.bat 终止 WSL 相关进程
DistSim.bat 启动分布式仿真管理器
UdpPortFree.bat 端口占用排查与释放
Python38Env.bat 打开配置好 Python3.8 的命令行
Python38Run.bat 在当前目录打开 Python3.8 环境
StartCFclient.bat 启动 cfclient
WinWSL.bat 打开 WSL 控制台 + VcXsrv
WslGUI.bat 一键开启 WSL GUI 支持
WslSwith2.bat WSL1/WSL2 切换与网络配置
gpedit.bat Win 家庭版安装组策略编辑器

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

1) 管理员权限自提权

NET SESSION >nul 2>&1 || powershell -Command "Start-Process cmd -ArgumentList '/c, ""%~f0""' -Verb RunAs" && exit /b

NET SESSION 只有管理员可成功执行,失败时自举为管理员并重新运行当前脚本。

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

someCommand >nul 2>&1

抑制标准输出与错误输出。常用组合:cmd1 || cmd2(前者失败才执行后者)。

3) 进程查询与安全结束

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

先查再杀,避免"未找到进程"报错。/f 强制终止。

4) WSL 环境管理

wsl --shutdown          :: 关闭所有 WSL 发行版
wsl -d RflySim-20.04    :: 在指定发行版中执行

5) X 服务器与 GUI 启动

cd /d %PSP_PATH%\VcXsrv
tasklist|find /i "vcxsrv.exe" >nul || Xlaunch.exe -run config.xlaunch

6) 路径与工作目录

cd /d %PSP_PATH%\CopterSim     :: 跨盘符切换
pushd "%~dp0"                   :: 进入脚本所在目录

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

start /realtime CopterSim.exe ...
start cmd.exe /k "SET PATH=...;%PATH% & someCommand"

/min 最小化窗口,/realtime 高优先级,/k 保留窗口,/c 执行完退出。

8) 延时与节流

choice /t 2 /d y /n >nul

无交互等待 2 秒,给进程预留启动时间。

9) 环境变量与算术

set /a VEHICLE_INTERVAL=2
setlocal enabledelayedexpansion
echo !var!   :: 延迟展开,循环中使用

%var% 解析时展开,!var! 执行时展开。

10) 字符串与列表解析

for /f "tokens=1,2,3 delims=#" %%a in ("%ComInfoStr%") do (
  set ComNumExe=%%a
  set ComNameList=%%b
  set ComInfoList=%%c
)

11) 标签与子例程

call :check_and_kill 20010
goto :eof

:check_and_kill
REM ...实现...
exit /b 0

12) 临时 PATH 注入

SET WINDOWSPATH=%PATH%
SET PATH=%PSP_PATH%\Python38;%PATH%
...
SET PATH=%WINDOWSPATH%

13) 管道与条件执行

tasklist | find /i "RflySim3D.exe" || start %PSP_PATH%\RflySim3D\RflySim3D.exe

未找到进程则启动新实例。