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.1,1 等同于 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 工具,使用参数 3 和 BaudRate% 获取所有 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, ComNameList 和 ComInfoList 变量中。
- 工作原理: 使用 # 作为分隔符,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%
)
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%
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
使用第三方飞控开启硬件在环仿真
关键代码如下:
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
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 路径下。
SET PATH=%PSP_PATH%\Python38;%PSP_PATH%\Python38\Scripts
这行代码将 Python 3.8 和其脚本目录添加到系统环境变量 PATH 中,这样在运行 Python 脚本时可以找到相应的可执行文件。
最后,这行代码运行名为 cfclient.exe 的可执行文件,假设它位于当前目录或已添加到 PATH 中的某个目录。
StopBuild.bat
在 Windows 系统中检查并终止与 Windows Subsystem for Linux (WSL) 相关的进程。
tasklist|find /i "wsl.exe" && taskkill /f /im "wsl.exe"
这行代码执行以下操作:
- tasklist 列出当前正在运行的所有进程。
- 通过管道符号 (|),将 tasklist 的输出传递给 find 命令。
- find /i "wsl.exe" 在进程列表中查找不区分大小写的字符串 "wsl.exe"。
- 如果找到了 "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 中的载具外观样式。
HITLRunFw.bat
固定翼硬件在环示例:
- 设置 DLLModel=FixWingModel,地图为 OldFactory,UDPSIMMODE=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 节点。
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=FixWingModel,PX4SitlFrame=standard_plane,地图 OldFactory,UDPSIMMODE=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=mirrored、guiApplications=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 确认弹窗。
- 提示:若脚本中带有相对路径,建议配合 %~dp0 或 cd /d 确保工作目录一致。
2) 静默输出与错误重定向
- 作用:抑制标准输出与错误输出,保持控制台干净。
- 常见组合: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.xlaunch 或 config1.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) 延时与节流
- 作用:无交互等待若干秒(此处 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 /b 或 goto :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 形成“存在则杀/不存在则启”的对偶写法。