导读
一个开启多机软件在环仿真的批处理文件 (对应卓面RflyTools文件夹中SITLRun快捷方式),双击它,输入想要生成的飞机数量,即可生成多机软件在环仿真,等待RflySim3D显示3DFixed 4/4,然后可通过QGC控制飞机起飞。运行完毕后,在CMD命令窗口中按下任意键,即可自动关闭所有程序。注: 该批处理文件本质上是通过脚本方式配置CopterSim软件选项,可以用编辑器打开该文件,查看并根据需求修改其中的启动参数。
平台使用篇 | 批处理(bat)脚本使用教程(四)
仿真过程演示
01打开SITLRun.bat一键运行脚本
用“以管理员身份运行”打开,可以提高RflySim平台的软件在系统中的优先级,这样能够解决大部分如飞机抖动,无法起飞等问题。
02运行脚本
在终端输入飞机数量,会自动启用平台仿真软件,其中RflySim3D、QGC各自打开一个窗口,每个CopterSim窗口对应一架飞机,窗口数等于输入飞机数量。此时所有参数已设置完成,可以直接在QGC中对飞机进行起飞降落等操作,仿真完成后在终端按任意键,可以关闭所有软件结束仿真。
运行效果如图。
源码详解
此脚本是一个软件在环飞行仿真的 BAT 脚本,分为CopterSim参数设置和主程序两部分。参数设置包括设置 RflySim 工具路径、开始机器编号、飞行器数量、UDP 端口号、使用 DLL 模型名称或数字索引、仿真模式、PX4 SITL 仿真载具模型、UE4 地图名称、起始位置和间隔、UDP 数据传输模式、广播 IP 地址等选项。主程序包含打开 QGroundControl 和 RflySim3D 等应用程序、编译 PX4 SITL、启动 CopterSim.exe 仿真多个无人机、关闭所有应用程序等功能。用户可以在脚本中根据需要修改各项参数来进行多台无人机的飞行仿真。
01
参数设置
REM The text start with 'REM' is annotation, the following options are corresponding to Options on CopterSim
REM Set the path of the RflySim tools
SET PSP_PATH=C:\PX4PSP
SET PSP_PATH_LINUX=/mnt/c/PX4PSP
C:
...省略中间部分代码
REM Set broadcast to other computer; IS_BROADCAST=0: only this computer, IS_BROADCAST=1: broadcast;
REM or use IP address to increase speed, e.g., IS_BROADCAST=192.168.3.1
REM Note: in IP mode, IS_BROADCAST=0 equals to IS_BROADCAST=127.0.0.1, IS_BROADCAST=1 equals to IS_BROADCAST=255.255.255.255
REM You can also use a IP list with seperator "," or ";" to specify IPs to send, e.g., 127.0.0.1,192.168.1.4,192.168.1.5
SET IS_BROADCAST=0
REM Set UDP data mode; 0: UDP_FULL, 1:UDP_Simple, 2: Mavlink_Full, 3: Mavlink_simple. input number or string
REM e.g., UDPSIMMODE=1 equals to UDPSIMMODE=UDP_Simple
SET UDPSIMMODE=0
CopterSim界面中的参数设置(可参见上一讲)均包含在SITL/HITL一键脚本内
· 设置RflySim工具的路径
SET PSP_PATH=C:\PX4PSP SET PSP_PATH_LINUX=/mnt/c/PX4PSP C:
所有的批处理文件里的路径设置,都默认在 C 盘会生成一个 PX4PSP 的一个文件夹里面安装路径设为C盘
· 设置飞机起始的ID
SET /a START_INDEX=1
这里起始ID为1
· 设置飞机起始的ID
SET /a START_INDEX=1
这里起始ID为1
· 设置飞机起始UDP端口
SET /a UDP_START_PORT=20100
一个飞机占两个端口
· DLL文件模型调用
set DLLModel=0
是否使用DLL模型名称(赋值0则CopterSim中无名称,默认调用多旋翼模型)。可以使用数字索引或名称字符串调用其他类型的载具,而不仅仅是多旋翼。
SET /A DLLModelVal=DLLModel
if %DLLModelVal% NEQ %DLLModel% (
REM Copy the latest dll file to CopterSim folder
copy /Y "%~dp0"\%DLLModel%.dll %PSP_PATH%\CopterSim\external\model\%DLLModel%.dll)
检查“DLLModel”参数是否为名称字符串,如果是,将相应的DLL文件复制到CopterSim文件夹中。运行效果如图。
02
主程序
:Top
ECHO.
ECHO ---------------------------------------
REM Max vehicle number 50
...省略中间部分代码
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.
主程序部分是提前编辑完成的,不建议直接修改,如有需要,可改变之前的参数设置。
· 设置仿真数量
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.”的文本。
硬件在环一件运行脚本
开启多机硬件在环仿真的批处理文件,插入多个Pixhawk等飞控,再双击该批处理文件,根据提示输入想要参与仿真的Pixhawk串口号 (不同串口间逗号分隔),即可开启多机的硬件在环仿真 (以输入串口顺序进行飞机ID排序)
01
与SITLRun脚本的区别
HITLRun.bat一键脚本中的大部分与SITLRun.bat脚本相同,仅在端口设置(CopterSim中的对应参数设置也会改变)、软件启动顺序(QGC最后启动)和固件编译(硬件在环脚本中没有编译过程)上有所区别:
· 端口设置
ECHO.
ECHO ---------------------------------------
REM Get the Com port number
for /f "delims=" %%t in ('%PSP_PATH%\CopterSim\GetComList.exe 2') do set ComNumExe=%%t
REM Get the Com port list
for /f "delims=" %%t in ('%PSP_PATH%\CopterSim\GetComList.exe 0') do set ComNameList=%%t
REM Get the Com port info
for /f "delims=" %%t in ('%PSP_PATH%\CopterSim\GetComList.exe 1') do set ComInfoList=%%t
echo Please input the Pixhawk COM port list for HIL
echo Use ',' as the separator if more than one Pixhawk
echo E.g., input 3 for COM3 of Pixhawk on the computer
echo Input 3,6,7 for COM3, COM6 and COM7 of Pixhawks
echo.
set remain=%ComInfoList%
获取计算机上可用的串口列表和信息,并提示用户输入Pixhawk COM端口列表以便进行硬件在环仿真。
· 使用 GetComList.exe 获取当前计算机上可用的串口数量,保存在变量 ComNumExe 中。
· 再次使用 GetComList.exe 获取当前计算机上所有可用的串口名称列表,保存在变量 ComNameList 中。
· 第三次使用 GetComList.exe 获取当前计算机上所有可用串口的详细信息列表,保存在变量 ComInfoList 中。
·通过 echo 命令提示用户输入 Pixhawk 的 COM 端口列表,告知用户如果有多个 Pixhawk 设备,则需要使用逗号作为分隔符。效果如图。
在用户输入了 COM 端口列表后,脚本会使用 for 循环语句遍历 ComInfoList 变量中的每一个串口信息,输出该串口的详细信息,包括串口名称、波特率、数据位、校验位等。
if %ComNumExe% EQU 0 (
echo Warning: there is no available COM port
) else (
echo Available 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
echo.
echo Recommended COM list input is: %ComNameList%
)
如果当前计算机没有可用的 COM 端口,则输出提示信息;否则输出所有可用的 COM 端口,并且推荐使用的 COM 列表输入名称为 %ComNameList%的变量(此判断目的在于区分电脑连接的其余硬件和飞控)。
其中,"%" 符号表示环境变量,在脚本运行时会根据实际情况替换成对应的值。具体来说,"%ComNumExe%" 表示可用的 COM 端口数量,"%remain%" 是一个变量,用于存储剩余的 COM 端口列表。脚本通过 for 循环和 set 命令依次取出每个 COM 端口名称并输出,直到 remain 变量为空。
02
QGC启动
会在CopterSim参数设置完成之后再打开QGC, 因为如果QGC 先打开,可能会占用硬件的端口号导致CopterSim 不能开始仿真。