平台使用篇 | 批处理(bat)脚本使用教程(四)

news2024/11/28 18:44:59

导读

一个开启多机软件在环仿真的批处理文件 (对应卓面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 不能开始仿真。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity API详解——Time类

Time类是Unity中获取时间信息的接口类,只有静态属性。本博客介绍Time类的一些静态属性。 一、Time类静态属性 在Time类中,涉及的静态属性有realtimeSinceStartup、smoothDeltaTime和time属性,在介绍time属性时涉及了Time类的多个其他属性的…

学姐生日快到了~这不得用Python把她的照片做成视频当礼物送给她....

前言 这不是学姐生日快到了,于是我学了一手Python~ 来把学姐的照片生成为视频,到时候给她一个惊喜! 好了先不说了,下面分享一下用python代码 实现多张图片合成MP4视频为实例,做下详细代码讲解。 一、需要调入的模块…

设计模式之~迭代器模式

迭代器模式: 迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF 给出的定义为:提供一种方法顺序访问一个容器(container)对象中各个元素,而又不需暴露该对象…

数据库DBMS并发控制(1)

pgsql(PostgreSQL)常用命令行操作_pgsql常用命令_石头wang的博客-CSDN博客 重要:事务的操作和事务的性质 操作演示 四种典型数据不一致现象: 串行调度和可串行调度 串行调度 顾名思义 就是可以进行调度的意思 可串行调度 就是 一种和串行…

C Primer Plus第十六章编程练习答案

学完C语言之后,我就去阅读《C Primer Plus》这本经典的C语言书籍,对每一章的编程练习题都做了相关的解答,仅仅代表着我个人的解答思路,如有错误,请各位大佬帮忙点出! 由于使用的是命令行参数常用于linux系…

常见的ACL攻击方式,集权设施如何防御攻击?

本文主要介绍了 WindowsAD域中基于访问控制列表(ACL)的攻击,在AD域的攻击手法中,基于ACL的攻击由于理解起来比较困难,现有的安全设备也很少有对ACL的监控,这种类型的攻击通常会被安全人员所忽视。 1.什么是…

[SpringBoot]创建聚合项目

首先&#xff0c;创建父级项目&#xff1a; 因为手动添加依赖&#xff0c;以下只选版本不打钩 因为父项目不写代码&#xff0c;所以删除src 调整pom.xml文件&#xff08;并刷新maven&#xff09;&#xff0c;如下&#xff1a; <?xml version"1.0" encoding&qu…

如何入门渗透测试

1. 什么是渗透测试 渗透测试就是模拟真实黑客的攻击手法对目标网站或主机进行全面的安全评估&#xff0c;与黑客攻击不一样的是&#xff0c;渗透测试的目的是尽可能多地发现安全漏洞&#xff0c;而真实黑客攻击只要发现一处入侵点即可以进入目标系统。 一名优秀的渗透测试工程…

Flink SQL之Regular Joins

1.Regular Joins&#xff08;双流join&#xff09; 双流join是最通用的联接类型&#xff08;支持 Batch\Streaming&#xff09;&#xff0c;其中任何新记录或联接两侧的更改都是可见的&#xff0c;并影响整体的Join结果。 特点&#xff1a; 对于流式查询&#xff0c;双流join…

深入分析 OpenShift 内部 DNS

深入分析 OpenShift 内部 DNS OpenShift 中的DNS 相关组件及其配置1.1 Pod 中的 DNS 配置1.2 Pod 所在宿主机上的 DNS 配置及服务1.2.1 resolv.conf 文件 DNS 配置DNS 查询流程为什么需要内部 DNS&#xff1f; 本文基于 OpenShift 3.11&#xff0c;Kubernetes 1.11 进行测试 O…

Linux服务器禁止密码登录,设置秘钥登录

生成SSH密钥 (客户机端) 执行ssh-keygen -t rsa命令创建RSA密钥对&#xff0c;执行结果如下(键入3次回车)&#xff1a; [rootnode01 .ssh]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): [回车] En…

【十五】设计模式~~~行为型模式~~~状态模式(Java)

【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★☆☆】 4.1. 模式动机 在很多情况下&#xff0c;一个对象的行为取决于一个或多个动态变化的属性&#xff0c;这样的属性叫做状态&#xff0c;这样的对象叫做有状态的(stateful)对象&#xff0c;这样的…

向后切片,正向切片和其他形式的切片

向后切片,正向切片和其他形式的切片 向后切片Backward Slices 假设我们希望确定哪些语句影响节点 n。 这是由 n 和在 n 处引用的变量。 我们只是&#xff1a; 从 n 回溯控制和流依赖边。 我们保留由此到达的节点。 一般后向切片 通常&#xff0c;我们的切片标准是一个节点和一…

【CMake 入门与进阶(1)】一个例子搞懂什么是CMakeLists——从“Hello World”开始(附代码)

在前面两篇内容中&#xff0c;我们编写了很多示例程序&#xff0c;但这些示例程序都只有一个.c 源文件&#xff0c;非常简单。因此&#xff0c;编译这些示例代码其实都非常简单&#xff0c;直接使用 GCC 编译器编译即可&#xff0c;连 Makefile 都不需要。但是&#xff0c;在实…

中国人民大学与加拿大女王大学金融硕士项目——在职攻读金融硕士,努力迈进高阶人生

学历重要吗&#xff1f;入职门槛、晋升、考公等多方面都考核学历。学历代表的并不只是学习经历&#xff0c;也是学习能力的体现。在快速发展的社会&#xff0c;学历越高&#xff0c;学习能力越强&#xff0c;机会就越多。金融行业在职的你&#xff0c;有计划在职攻读硕士学位吗…

如何在 K3s 中使用网络策略

本文将介绍如何在示例项目中使用网络策略&#xff0c;并解释它在 K3s 中的工作原理&#xff0c;从而帮助用户提高部署的安全性。 关于 K3s 对网络策略的支持存在一个普遍的误解&#xff0c;因为 K3s 默认使用 Flannel CNI&#xff0c;而 Flannel CNI 不支持网络策略。其实&…

Docker+Jenkins+Gitee+Pipeline部署项目

1.前言 Hello&#xff0c;各位小伙伴大家好。&#x1f604; 在上一篇文章【DockerJenkinsGitee自动化部署maven项目】中&#xff0c;咱们详细介绍了如何自动化部署maven项目&#xff0c;如果说你的项目仅仅为maven项目&#xff0c;那么这种部署方式是很契合的&#xff0c;如果…

超全,Selenium4自动化测试并行测试详解,进阶之路看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Selenium4 自动化测…

万字解析PELT算法!

Linux是一个通用操作系统的内核&#xff0c;她的目标是星辰大海&#xff0c;上到网络服务器&#xff0c;下至嵌入式设备都能运行良好。做一款好的linux进程调度器是一项非常具有挑战性的任务&#xff0c;因为设计约束太多了&#xff1a; 它必须是公平的快速响应系统的throughp…

如何学习R-Meta分析与【文献计量分析、贝叶斯、机器学习等】多技术融合?

专题一&#xff1a;Meta分析的选题与文献计量分析CiteSpace应用 1、Meta分析的选题与文献检索 1) 什么是Meta分析 2) Meta分析的选题策略 3) 文献检索数据库 4) 精确检索策略&#xff0c;如何检索全、检索准 5) 文献的管理与清洗&#xff0c;如何制定文献纳入排除标准 6…