当前位置: 首页 > news >正文

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

导读

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

相关文章:

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

导读 一个开启多机软件在环仿真的批处理文件 (对应卓面RflyTools文件夹中SITLRun快捷方式),双击它,输入想要生成的飞机数量,即可生成多机软件在环仿真,等待RflySim3D显示3DFixed 4/4,然后可通过QGC控制飞机起飞。运行…...

接口的讲解

在这里之前我想童鞋们都学习过了springmvc。mybatis-plus。Springboot等一些框架 那么下面我们就整合这些框架 我们通过写crud这些接口 写接口的第一步就是引入pom文件 在pom文件里引入一下几种依赖 引入父级工程 thymeleaf导入模版工具类 SpringMVCjar包文件 热部署工具 l…...

G0第21章 :gin框架介绍、RESTful API、Gin渲染

G0第21章 :gin框架 01 内容介绍 https://gin-gonic.com/zh-cn/docs/ web本质 Web是基于HTTP协议进行交互的应用网络Web就是通过使用浏览器/APP访问的各种资源 package mainimport ("fmt""net/http" )func sayHello(w http.ResponseWriter, r…...

python list,dict操作

一、list 操作 Python中的列表是一种有序、可变的数据类型,可以存储任意类型的数据。以下是Python中常用的列表操作: 创建列表:使用[]或list()函数创建一个空列表,或者使用[value1, value2, ...]创建一个包含初始值的列表。 访问…...

我有一个页面a,在页面a中调用了一个组件,然后组件中要切换页面a的一块区域,该怎么实现?

你可以在组件中使用路由的编程式导航,通过访问路由实例来切换页面a的对应区域。具体来说,你可以先在页面a中设置一个具有唯一标识的占位符元素,然后在组件中通过路由实例访问这个元素并修改其内容或样式来实现区域切换。路由的编程式导航可以…...

ChatGPT唤醒AI游戏:AIGC持续走深,游戏或成AI最佳抓手

随着人工智能技术的不断发展,AI在游戏行业的应用日益深入。本文将详细探讨ChatGPT在AI游戏领域的应用,以及游戏如何成为AI技术的最佳抓手。让我们一起探讨这个有趣且充满潜力的领域。 一、引言 人工智能在各行各业都取得了巨大的成功,而游戏…...

远程服务和web服务和前端,三方通过socket和websocket进行双向通信传输数据

1. 什么是socket? 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 2. 什么是websocket?…...

Linux 网络基础(2)应用层(http/https协议、请求格式、响应格式、session、cookie、加密传输)

说明:网络基础2讲解的是应用层的典型协议, 通过对于典型协议的理解,来体会数据的网络传输的软件层面的流程与原理。 面试中网络通信相关问题占了很大的比重,而网络通信相关的问题大多都集中在网络基础2这个单元中 下面是应用层的位…...

解决sshfs挂载报错

使用ssh命令和sshfs命令报错 read: Connection reset by peer rootjiangcheng01:~/common/remote# sshfs -o allow_other htrdxxx.xxx.xxx.xxx:/home/htrd /root/common/remote/dev01 read: Connection reset by peer 报错问题排查,追加命令 -o debug -o sshf s_d…...

由于过多的连接错误而被 MySQL服务器 阻止

Caused by: com.mysql.cj.exceptions.CJException: null, message from server: "Host 10.105.***.** is blocked because of many connection errors; unblock with mysqladmin flush-hosts" 这个错误可能表示当您尝试使用 IP 地址为 "10.105.***.**" 的…...

Go语言实现JDBC

Go语言操作数据库 Go语言提供了关于数据库的操作,包下有sql/driver 该包用来定义操作数据库的接口,这保证了无论使用哪种数据库,操作方式都是相同的; 准备工作: 下载驱动 需要在代码所在文件夹下执行相应的命令 go get github.com/go-sql-driver/mys…...

ubuntu修改环境变量的几种方法

ubuntu修改环境变量的几种方法 有多种方法可以修改Ubuntu系统的环境变量,包括: 临时修改环境变量:在终端中使用export命令可以临时修改环境变量。例如,要将PATH环境变量添加到新目录,可以运行以下命令: …...

基于html+css的图展示95

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...

数据库基础——5.运算符

这篇文章我们来讲一下SQL语句中的运算符操作。 说点题外话:SQL本质上也是一种计算机语言,和C,java一样的,只不过SQL是用来操作数据库的。在C,java中也有运算符,这两种语言中的运算符和数学中的运算符差距不…...

JMeter 性能测试基本过程及示例

jmeter 为性能测试提供了一下特色: 2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!_哔哩哔哩_bilibili2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!共计11条视频&…...

漏洞复现 CVE-2018-2894 weblogic文件上传

vulhub weblogic CVE-2018-2894 1、 搭建好靶场,按提示访问 http://192.168.137.157:7001/console 按照给出的文档,会查看容器的日志,找到管理员用户名/密码为 weblogic / h3VCmK2L,暂时用不到,不需要登录 2、未授权…...

二叉树:填充每个节点的下一个右侧节点指针(java)

leetcode116:填充每个节点的下一个右侧节点指针 leetcode原题链接:题目描述递归解法一递归方法二(效率更高)二叉树专题 leetcode原题链接: 116题:填充每个节点的下一个右侧节点指针 题目描述 给定一个 完美二叉树 &a…...

Android 12.0修改系统默认设备类型的平板电脑类型为设备类型

1.概述 在12.0的系统rom产品开发中,对于产品设备类型都默认为tablet即平板电脑类型,即 product="tablet" 在一些不是平板的项目中,可能需要修改这个类型为device类型 即 product="device",这就需要找到相关设置系统属性的代码,修改系统属性就可以了 2…...

debug研究

debug研究 debug的condition 通常用在for循环里面 for循环中实际使用 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UsmJ93w5-1685344057464)(D:\typora_pic_all\image-20230529145417753.png)] log.info("当前共有{}条数据待处理", vos…...

zabbix监控系统

一、Zabbix概述 1、使用zabbix的原因 作为一个运维,需要会使用监控系统查看服务器状态以及网站流量指标,利用监控系统的数据去了解上线发布的结果,和网站的健康状态。 利用一个优秀的监控软件,我们可以: ●通过一个友好的界面进…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

爬虫基础学习day2

# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...