ROS相关技术(经验版)

news2024/12/24 9:16:56

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。

一、参考资料

ROS相关技术介绍,可参考之前的文章:ROS相关技术(概念版)

Autolabor主站
ROS官网
ROS
ROS教程
ROS编程技术
ROS书籍整理:机器人操作系统 ROS 相关书籍整理合集 [古月居推荐]

二、ROS相关介绍

ROS与Apollo对比

Apollo可以看作是ROS的改进版,Apollo从通信功能优化、去中心化网络拓扑以及数据兼容性扩展三个方面做了定制化的改进。

单对多的传输场景下,ROS 在处理一对多的消息传输时,底层实现实际是多个点对点的连接,当把一份数据要发给三个节点时,相同的数据会传输三次,这会造成很大的资源浪费。而Apollo采用了共享内存的解决方案,减少传输过程中的数据拷贝,大幅度提升效率。

ROS系统非常依赖Master,一旦Master出现异常,将导致整个系统崩溃,且缺乏恢复自动机制。Apollo的整个网络拓扑不再以 master 为中心构建,当一个新的节点加入网络时,会通过 RTPS 协议向域内的所有其他节点发送广播信息,各个节点也会将自己的服务信息发送给新的节点,以代替 Master 的信息交换功能。

ROS 系统为了保证收发双方的消息格式一致,会对message定义做 MD5 校验,任何字段的增减或顺序调整都会使 MD5 变化。然而这种严格的限制也引起了兼容性的问题,OTA升级后可能出现兼容问题,在Apollo中,做了一整套对protobuf的支持, 在工程中可以不需要做格式转换,直接publish protobuf格式的消息,调试工具也能够非常正确的解析出来正确的protobuf消息。这样既能够很好解决兼容性问题,也不会产生额外的学习成本和使用成本。

三、常用指令

ROS笔记(2)——ROS的基本命令

roscore

功能描述:用于启动ROS系统的核心功能。

启动roscore是ROS系统的先决条件,必须运行roscore才能使ROS节点进行通信

启动roscore将:

  • 启动ROS Master节点;
  • ros参数服务器;
  • rosout日志节点;

ROS Master节点是ROS系统中的核心管理节点,负责管理所有节点之间的通信,包括节点的发现、消息的路由、参数服务器等。当执行 roscore 指令时,ROS Master节点将在计算机上启动,并将等待其他节点连接。只有在启动 roscore 之后,才能启动其他节点,并进行ROS操作。因此,通常在开始进行任何ROS项目之前,第一步是启动 roscore

rosrun

功能描述:启动ROS包中的节点。

# 启动小海龟节点用于演示机器人控制
rosrun turtlesim turtlesim_node

rosnode

rosnode

功能描述:用于获取节点信息。

# 测试节点的连接状态
rosnode ping

# 列出活动的节点
rosnode list

# 打印节点信息
rosnode info

# 列出指定设备上的节点
rosnode machine

# 杀死节点
rosnode kill

# 清除不可连接的节点
# ctrl+c并没有清除节点,需要用cleanup彻底清除
rosnode cleanup

roslaunch

功能描述:执行功能包的launch文件。

roslaunch <package_name> <launch文件名>

rostopic

功能描述:用于显示有关ROS 话题的调试信息,包括发布者,订阅者,发布频率和ROS消息。

# 显示话题使用的带框
rostopic bw

# 显示带有header的话题延迟
rostopic delay

# 打印话题的消息到屏幕
rostopic echo

# 根据消息类型查找话题
rostopic find

# 显示话题的发布频率
rostopic hz

# 显示话题的相关信息
rostopic info

# 显示所有活动状态下的话题
rostopic list -v

# 将数据发布到话题
rostopic pub </topic_name> <message_type> <message_content>

# 以10HZ的频率发送信息
rostopic pub -r 10 </topic_name> <message_type> <message_content>

# 打印话题的消息类型
rostopic type

rosmsg

rosmsg

功能描述:显示有关 ROS消息类型的信息。

# 显示消息描述
rosmsg show <message_type>

# 显示消息信息
rosmsg info

# 列出所有消息
rosmsg list

# 显示md5加密后的消息
rosmsg hd5

# 显示某个功能包下的所有消息
rosmsg package <package_name>

# 列出包含消息的所有包
rosmsg packages

rosservice

rosservice

功能描述:用于列出和查询ROS服务。

# 打印服务参数
rosservice args </service_name>

# 按照服务类型查找服务
rosservice find <servervice_name>

# 打印指定服务的信息
rosservice info

# 列出所有活动的服务
rosservice list

# 打印服务的类型
rosservice type

# 打印服务的ROSRPC uri
rosservice uri

# 调用指定服务
rosservice call </service_name>

rosparam

功能描述:用于管理ROS参数。

# 设置指定参数的值
rosparam set param_name value

rosbag指令

rosbag详解

rosbag是ROS中的一种数据记录工具,它可以记录和回放ROS的消息数据。我们可以使用rosbag来记录ROS系统中的消息流,包括传感器数据、机器人状态等信息,然后在之后的时间点上回放这些消息数据,以便我们进行离线分析和调试。

rosbag可以将消息数据存储在文件中,并使用一种高效的压缩算法来减少文件大小。这样,我们可以在之后的时间点上使用rosbag回放工具来重新播放这些消息,以便我们在没有实际硬件的情况下进行测试和调试。rosbag还支持多个包(bag)之间的合并和分割,以便我们更好地管理消息数据。

rosbag常用指令

  • record:用指定的话题录制一个 bag 包;
  • info:显示一个 bag 包的基本信息,比如包含哪些话题;
  • play:回放一个或者多个 bag 包;
  • reindex:重新索引一个或多个损坏 bag 包。

记录bag

rosbag record 是一个用于记录 ROS 消息到 ROS Bag 文件中的命令行工具。它可以记录指定主题的消息,将消息保存到一个ROS Bag文件中。例如,以下命令将记录名为/scan的激光雷达数据并将其保存到名为scan.bag的文件中:

rosbag record /scan -O scan.bag

以下是 rosbag record 命令的常用参数:

  • -a, --all:记录所有主题。
  • -O, --output-name:指定输出的 ROS Bag 文件名。
  • -b, --buffer-size:设置ROS Bag文件的缓冲区大小。
  • -d, --duration:设置记录时间长度,以秒为单位。
  • -l, --limit:设置记录的消息数量限制。
  • -j, --bz2:使用bzip2压缩来压缩ROS Bag文件。
  • -z, --lz4:使用LZ4压缩来压缩ROS Bag文件。-p, --split:设置ROS Bag文件的分段大小。-t, --topics:指定要记录的主题列表。
  • -x, --exclude:指定要排除的主题列表。
# 录制所有话题数据
rosbag record -a

# 录制指定话题数据
rosbag record <topic_name1> <topic_name2> <topic_name3> ...

# 指定数据包名称
rosbag record  -O <bagname> <topic_name1> <topic_name2> <topic_name3> ...

查看bag信息

rosbag info指令可以数据包中包含的话题名称,话题数量,话题消息类型等信息。

rosbag info <bagname> 

播放bag

使用 rosbag play 指令可以从指定的ROS包文件中回放消息数据。

# 回放指定bag
rosbag play <bagname>

# 回放当前目录下所有bag
rosbag play *

# 从指定时间(n = 指定时间s)开始回放bag
rosbag play -s n <bagname>

# 延时指定时间(n = 延时时间s)开始回放bag
rosbag play -d n <bagname>

# 播放指定时间(n = 指定秒数)的bag
rosbag play -u n <bagname>

# 从指定时间(n = 开始时间s)开始播放指定时间(m = 指定播放时间s)的bag
rosbag play -s n -u m <bagname>

# 按指定倍率(n = 倍率)回放bag
rosbag play -r n <bagname>

修复bag

回放不成功,提示 reindex ,修复bag。

rosbag reindex

rqt_graph

ROS计算图

ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph能够创建一个显示当前系统运行情况的动态图形。

# 安装rqt_graph
# <distro>是ROS的版本,例如:kinetic、melodic、Noetic等
sudo apt install ros-<distro>-rqt
sudo apt install ros-<distro>-rqt-common-plugins

# 启动rqt_graph
rosrun rqt_graph rqt_graph

在这里插入图片描述

四、机器人系统建模与仿真

ROS学习笔记16:机器人系统建模与仿真

1. 机器人系统仿真

机器人系统仿真是通过计算机对实体机器人系统进行模拟的技术。在ROS中,仿真实现涉及的内容主要有三:对机器人建模(URDF)、创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现。

2. 机器人系统仿真所需组件

2.1 创建机器人模型(URDF)

URDF (Unified Robot Description Format,统一(标准化)机器人描述格式),以XML的方式描述机器人的部分结构,比如地盘、摄像头、激光雷达、机械臂以及不同关节的自由度,该文件可以被C++内置的解释器转换成可视化的机器人模型,是ROS中实现机器人仿真的重要组件。

2.2 显示各种传感器信息(rviz)

rviz(ROS Visualization Tool,ROS的三维可视化工具),它的主要目的是以三维方式显示ROS信息,可以将数据进行可视化表达。例如,可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感器到障碍物的距离,Kinect或Xtion等三维距离传感器的点云数据(PCD,Point Cloud Data),从相机获取的图象值等。

2.3 搭建仿真环境(Gazebo)

Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及用户和程序非常友好的交互方式。

五、ROS Bag

ROS笔记(5)——Bag包概述与解析

ROS Bag是一种文件格式,用于存储ROS系统中的消息。ROS Bag可以将ROS节点发布的消息记录下来,然后在需要的时候将这些消息再次播放回ROS系统中。

1. ROS Bag适用场景

  1. 离线数据处理:在无法连接实时ROS系统时,可以使用ROS Bag记录消息,然后在离线状态下进行数据处理和算法开发;
  2. 数据集手机:ROS Bag可以用于收集数据集,以用于机器学习和深度学习等应用;
  3. 调试和测试:ROS Bag可以用于调试和测试ROS节点和程序的行为。

2. 生成ROS Bag文件的方式

ROS Bag文件以 .bag 拓展名结尾,可以通过以下两种方式保存:

  1. rosbag 方式。在终端中使用rosbag record命令来记录指定主题的消息,将消息保存到ROS Bag文件中。
  2. ROS API方式。在ROS程序中使用ROS API来记录消息,将消息保存到ROS Bag文件中。

2.1 rosbag 方式

rosbag 方式,参见rosbag指令。

2.2 ROS API方式

以下代码段将记录名为/scan的激光雷达数据并将其保存到名为scan.bag的文件中。

C++代码示例

#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>
#include <rosbag/bag.h>
 
void scanCallback(const sensor_msgs::LaserScan::ConstPtr& msg)
{
  static rosbag::Bag bag;
  if (!bag.isOpen()) {
    bag.open("scan.bag", rosbag::bagmode::Write);
  }
  bag.write("/scan", ros::Time::now(), *msg);
  /*
  当程序退出时,ROS Bag 的析构函数会自动关闭文件。
  如果您想手动关闭文件,可以在程序退出前显式地删除ROS Bag对象或调用rosbag::Bag::close()方法来关闭 
  文件。
 */
}
 
int main(int argc, char** argv)
{
  ros::init(argc, argv, "scan_logger");
  ros::NodeHandle nh;
 
  ros::Subscriber sub = nh.subscribe<sensor_msgs::LaserScan>("/scan", 1, scanCallback);
 
  ros::spin();
 
  return 0;
}

python代码示例

#!/usr/bin/env python
 
import rospy
import rosbag
from sensor_msgs.msg import LaserScan
 
def scanCallback(msg):
    global bag
    if bag is None:
        bag = rosbag.Bag('scan.bag', 'w')
    bag.write('/scan', msg)
 
if __name__ == '__main__':
    rospy.init_node('scan_logger')
    bag = None
    sub = rospy.Subscriber('/scan', LaserScan, scanCallback)
    rospy.spin()
    bag.close()

3. 解析ROS Bag文件

rosbag::View 是ROS Bag文件中的一组消息的视图,它提供了一些方便的方法来遍历和访问这些消息。

rosbag::View 实际上是一个包含 rosbag::Connection 对象的集合,每个对象代表一个主题。rosbag::Connection 对象包含一组时间戳和消息,表示该主题的所有消息。您可以使用以下方法来访问这些消息:

  • begin():返回指向第一条消息的迭代器。
  • end():返回指向最后一条消息后面的位置的迭代器。
  • rbegin():返回指向最后一条消息的迭代器。
  • rend():返回指向第一条消息前面的位置的迭代器。
  • size():返回视图中消息的数量。

在使用 rosbag::View 遍历Bag文件中的所有消息时,每个迭代器会返回一个 rosbag::MessageInstance 对象。这个对象包含了消息的时间戳、消息类型和消息数据等信息。可以使用以下方法来访问这些信息:

  • getTime():返回消息的时间戳。
  • getTopic():返回消息所属的主题名称。
  • getDataType():返回消息的数据类型。
  • instantiate():将消息实例化为指定的数据类型。如果无法实`例化,则返回空指针。

3.1 C++代码示例

#include <ros/ros.h>
#include <rosbag/bag.h>
#include <std_msgs/String.h>
 
int main(int argc, char** argv) {
    // 初始化ROS节点
    ros::init(argc, argv, "rosbag_parser");
    ros::NodeHandle n;
 
    // 打开bag文件
    rosbag::Bag bag;
    bag.open("/path/to/bagfile.bag", rosbag::bagmode::Read);
 
    // 遍历bag文件中的所有消息
    rosbag::View view(bag);
    for (rosbag::MessageInstance const m : view) {
        std_msgs::String::ConstPtr msg = m.instantiate<std_msgs::String>();
        if (msg != nullptr && m.getTopic() == "/my_topic") {
            // 打印消息内容
            ROS_INFO("Message: %s", msg->data.c_str());
        }
    }
 
    // 关闭bag文件
    bag.close();
 
    return 0;
}

3.2 python代码示例

import rosbag
import rospy
from std_msgs.msg import String
 
# 初始化ROS节点
rospy.init_node('rosbag_parser')
 
# 打开bag文件
bag = rosbag.Bag('/path/to/bagfile.bag')
 
# 遍历bag文件中的所有消息
for topic, msg, t in bag.read_messages():
    # 检查消息类型和主题名称
    if topic == '/my_topic' and isinstance(msg, String):
        # 打印消息内容
        rospy.loginfo("Message: %s", msg.data)
 
# 关闭bag文件
bag.close()

在这个示例中,我们使用了ROS提供的rospy.loginfo函数来输出消息,它类似于Python的print函数,但是它会将消息输出到ROS的日志系统,这有助于调试和记录机器人的运行情况。

python执行

rosrun <package_name> <filename.py>

3.3 C++与Python接口对比

C++与Python 解析ROS Bag文件两种方式的对比。

  • Python 中使用 rosbag.Bag 读取 Bag 文件,C++ 中使用 rosbag::Bag
  • Python 中使用 bag.read_messages() 方法遍历 Bag 文件中的消息,C++ 中使用 rosbag::View 类和 C++11 的范围 for 循环来遍历消息。
  • Python 中的 t 变量表示消息的时间戳,C++ 中使用 rosbag::MessageInstance::getTime() 方法来获取消息的时间戳。
  • Python 中使用 msg 变量来存储消息的内容,C++ 中使用 rosbag::MessageInstance::instantiate() 方法将消息实例化为指定的数据类型,如果无法实例化,则返回空指针。
  • Python 中使用 topic 变量来表示消息所属的主题,C++ 中使用 rosbag::MessageInstance::getTopic() 方法来获取消息所属的主题名称。
  • Python 中使用 rospy.loginfo() 函数来输出消息,C++ 中可以使用 ROS 的日志系统来输出消息,例如使用 ROS_INFO 宏来输出消息。

使用 C++ 代码来解析 ROS Bag 文件,大致流程如下:

  1. 打开 Bag 文件并创建 rosbag::Bag() 对象。
  2. 创建 rosbag::View() 对象并遍历 Bag 文件中的消息。
  3. 对于每条消息,使用 rosbag::MessageInstance::instantiate() 方法将消息实例化为指定的数据类型,并使用 rosbag::MessageInstance::getTopic() 方法获取消息所属的主题名称和 rosbag::MessageInstance::getTime() 方法获取消息的时间戳。
  4. 对于符合条件的消息,使用 ROS 的日志系统或其他方式输出消息内容。
  5. 关闭 Bag 文件。

六、ROS相关经验

1. ROS Melodic

待补充

2. D435i相机标定

D435i相机标定(不同标定方法总结)

深度相机D435i

Realsense d435i内参、外参标定

Realsense d435i驱动安装、配置及校准

3. 古月居ROS入门21讲

古月居ROS入门21讲学习笔记

4. 雷达相机标定(ROS)

雷达相机标定(ROS)

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

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

相关文章

小红书如何打造爆款引流吸粉?11个秘诀助你秒变达人!

在这个充满信息和内容的时代&#xff0c;小红书以其独特的社交平台特性和个性化内容吸引了众多用户。今天&#xff0c;我们就来揭秘小红书关注战略&#xff0c;了解如何在这个平台上打造独特的内容体验&#xff0c;与用户建立更亲近的连接。#小红书# 1、定位清晰&#xff0c;找…

数字化车间mes生产执行管理系统

数字化车间mes是一款基于B/S结构的生产执行管理系统&#xff0c;主要目的是为中小企业提供了高效率、低成本、通用性强的一个MES系统解决方案&#xff0c;能够实时监控当前完成进度。 功能简介&#xff1a; 生产管理 大屏展示&#xff1a;可以从大屏展示页面看到任工序…

C++ 二叉树(建立、销毁、前中后序遍历和层次遍历,寻找双亲结点等)

&#xff08;1&#xff09;结构体和类定义 struct BTreeNode {T data;BTreeNode* left, * right;BTreeNode() :data(0), left(nullptr), right(nullptr) {}BTreeNode(T val, BTreeNode<T>* leftChild nullptr, BTreeNode<T>* rightChild nullptr):data(val), le…

两个pdf合并成一个pdf怎么合并?这几个方法值得推荐

两个pdf合并成一个pdf怎么合并&#xff1f;pdf文件的合并是一个很常见的需求&#xff0c;特别是在处理工作文件或学习资料时。为了更好的帮助你了解如何将两个pdf文件合并成一个&#xff0c;下面就给大家详细介绍几种合并方法。 方法一&#xff1a;使用迅捷PDF转换器 这是一款…

【虫洞攻击检测】使用多层神经网络的移动自组织网络中的虫洞攻击检测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

一文教你学会Termux+SFTP+远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

设计HTML5表格

在网页设计中&#xff0c;表格主要用于显示包含行、列结构的二维数据&#xff0c;如财务表格、调查数据、日历表、时刻表、节目表等。在大多数情况下&#xff0c;这类信息都由列标题或行标题及数据构成。本章将详细介绍表格在网页设计中的应用&#xff0c;包括设计符合标准化的…

页面跳转和两个页面之间的数据传递-鸿蒙ArkTS

页面跳转和两个页面之间的数据传递-ArkTS 页面跳转和两个页面之间的数据传递-ArkTS关于router的使用**跳转页面的实现方式。**页面接受跳转传递的参数页面返回及携带参数效果代码Index页面Second页面 参考资料 页面跳转和两个页面之间的数据传递-ArkTS 本篇文章主要是对两个页面…

怎么把CAD转成JPG图片?一个方法教你如何转换

CAD是计算机辅助设计的缩写&#xff0c;通常指的是AutoCAD软件所生成的DWG文件格式。DWG是一种二进制文件格式&#xff0c;用于保存2D和3D设计数据和元数据&#xff0c;支持多种操作系统和程序使用。该格式通常用于工程、建筑、制造和其他领域的设计和绘图。 CAD文件转换成JPG图…

企业安全架构体系的现状和解决方案

一、企业安全现状 从2016年底开始随着网络安全事件的爆发和国家层面对网络安全的重视程度&#xff0c;让网络安全已经上升到国家战略层面&#xff0c;同时网络空间已经成为领土、领海、领空和太空之外的第五空间&#xff0c; 是国家主权建设的新疆域。 随着中国对外开放的进一…

echarts tooltip提示框加单位

效果&#xff1a; 1.比较简单的方法 series: [{name: "重大风险",type: "bar",data: data2,color: ExtremeRiskColor,tooltip: {valueFormatter: function (value) {return value 个;}},},{name: "较大风险",type: "bar",data: dat…

GPT垂直领域相关模型 现有的开源领域大模型

对于ToC端来说&#xff0c;广大群众的口味已经被ChatGPT给养叼了&#xff0c;市场基本上被ChatGPT吃的干干净净。虽然国内大厂在紧追不舍&#xff0c;但目前绝大多数都还在实行内测机制&#xff0c;大概率是不会广泛开放的&#xff08;毕竟&#xff0c;各大厂还是主盯ToB、ToG市…

实例038 设置窗体在屏幕中的位置

实例说明 在窗体中可以设置窗体居中显示&#xff0c;本例通过设置窗体的Left属性和Top属性可以准确设置窗体的位置。运行本例&#xff0c;效果如图1.38所示。 技术要点 设置窗体在屏幕中的位置&#xff0c;可以通过设置窗体的属性来实现。窗体的Left属性表示窗体距屏幕左侧的…

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题

问题:【IntelliJ IDEA】解决idea自动声明变量加finall修饰符问题 场景复现 1 new String() 2 快捷方式生成变量 final修饰的 final String s new String();步骤一&#xff1a;确保settings配置信息 settings-----》Editor------》Code Style--------》java下的这两个选项不…

通过TightVNC远程访问MacOS

目录 一、下载 TightVNC 下载链接&#xff1a;https://www.tightvnc.com/ 下载后按步骤进行安装&#xff0c;安装完成后安装目录如下&#xff1a; 运行 tvnviewer.exe&#xff0c;输入远程 IP&#xff0c;点击【connect】&#xff1a; 输入密码&#xff0c;点击【OK】后即可远…

Android布局【TableLayout】

文章目录 说明常见属性子控件设置属性 项目结构主要代码 说明 TableLayout也称为表格布局 常见属性 android:collapseColumns&#xff1a;设置需要被隐藏的列的序列号&#xff0c;从0开始android:stretchColumns&#xff1a;设置允许被拉伸的列的列序号&#xff0c;从0开始&…

数据结构算法--2 冒泡排序,选择排序,插入排序

基础排序算法 冒泡排序 思想就是将相邻元素两两比较&#xff0c;当一个元素大于右侧相邻元素时&#xff0c;交换他们的位置&#xff0c;小于右侧元素时&#xff0c;位置不变&#xff0c;最终序列中的最大元素&#xff0c;像气泡一样&#xff0c;到了最右侧。 这时冒泡排序第一…

vulnhub靶场之ADROIT: 1.0.1

准备&#xff1a; 攻击机&#xff1a;虚拟机kali、本机win10。 靶机&#xff1a;Adroit: 1.0.1&#xff0c;下载地址&#xff1a;https://download.vulnhub.com/adroit/Adroit-v1.0.1.ova&#xff0c;下载后直接vbox打开即可。 知识点&#xff1a;shell反弹&#xff08;jar&…

接口自动化必备技能——jmeter提取token方式以及设置成全局变量(跨线程组传token值)方式

前言 今天Darren洋教大家如何使用jmeter中的插件来进行token值的提取与调用&#xff0c;今天Darren洋介绍两种jmeter提取token值的方式&#xff0c;一种是在当前线程组中直接提取token值&#xff0c;一种是跨线程组的方式进行token值的提取并调用给不同线程组里的HTTP接口使用。…

LeetCode算法递归类—平衡二叉树

目录 110. 平衡二叉树 题解&#xff1a; 运行结果&#xff1a; 优化版1&#xff1a; 运行结果&#xff1a; 给定一个二叉树&#xff0c;判断它是否是高度平衡的二叉树。 本题中&#xff0c;一棵高度平衡二叉树定义为&#xff1a; 一个二叉树每个节点 的左右两个子树的高度…