ros2 c++实现JY_95T IMU解算三轴 加速度 角速度 欧拉角 磁力计 四元数

news2024/11/26 4:35:28

起因,机器人建图导航程序需要做里程计 imu数据融合,需要填充imu数据,但对imu填充的数据一直不是很了解,并且正在学习c++的类与对象,新近入手了一款JY_95T IMU,没有ros2的c++实现,所幸就拿它练练手,用c++实现读取imu数据。

JY_95T IMU 解算数据的python实现:

ros2小车串口安装GY_95T IMU陀螺仪加速度计初体验_JT_BOT的博客-CSDN博客

配置环境参考:

怎样愉快的连接使用usb转串口设备_JT_BOT的博客-CSDN博客

串口读取原理参考:

怎样愉快的使用串口发送16进制数据并读取串口内容_JT_BOT的博客-CSDN博客

JY_95T IMU九轴模块使用说明:

imu传感器数据解算原理:

 此款imu内置44个寄存器,每个寄存器存储一个字节的数据,对应于不同的功能,具体功能参考上面的使用说明,其中8-42号寄存器储存的是imu的3个轴的实时数据,我们的目的就是通过c++读取这35个寄存器数据并加以解算。从串口读取到的一个完整的数据帧包含40位数据,0-3位4个Byte是imu的配置信息,4-38位35个Byte是数据信息,39位是校验和低八位。下面的程序就围绕这个原理展开。

运行环境:ubuntu 20.04    ros2 foxy 

需要提前安装好ros2 ,不会安装的参考:

从零开始安装机器人foxy系统_foxy安装_JT_BOT的博客-CSDN博客

创建ros2工作空间:

mkdir -p ros2_ws/src   //创建ros2工作空间
cd ros2_ws/src
ros2 pkg create imu_get_cpp --build-type ament_cmake --dependencies rclcpp //创建功能包
cd imu_get_cpp/src
touch publisher_imu.cpp  //生成文件
touch transform.hpp      //生成文件
cd ~/ros2_ws             //返回工作空间
colcon build             //编译

文件目录结构:

 publisher_imu.cpp

//publisher_imu.cpp
#include <chrono>
#include <math.h>
#include "serial/serial.h" //导入串口库,ros2不带串口库,需要单独安装
#include <memory.h>
#include "std_msgs/msg/string.hpp"
#include "sensor_msgs/msg/magnetic_field.hpp"
#include "sensor_msgs/msg/imu.hpp"
#include "tf2/LinearMath/Quaternion.h"
#include "tf2_ros/transform_broadcaster.h"
#include "tf2_ros/static_transform_broadcaster.h"
#include "nav_msgs/msg/odometry.hpp"
#include <string>
#include "rclcpp/rclcpp.hpp"

#include "transform.hpp"

serial::Serial ser;

using namespace std::chrono_literals;

class publisher_imu_node : public rclcpp::Node// 创建imu发布类继承自rclcpp::Node
{
private:
    std::string port;   //端口名
    int baudrate;       //波特率查看硬件说明
    transform_imu imu_fetch; //创建imu获取对象
    rclcpp::TimerBase::SharedPtr timer_;   //创建定时器
    rclcpp::Publisher<sensor_msgs::msg::Imu>::SharedPtr pub_imu; // 创建发布者
public:
    publisher_imu_node()
        : Node("publisher_imu_node")  //构造函数
    {
        port = "/dev/ttyUSB0";  // 根据自己的主机修改串口号
        baudrate = 115200;      // 波特率,imu在波特率115200返回数据时间大概是1ms,9600下大概是10ms
        try
        {
            ser.setPort(port);           //设置端口
            ser.setBaudrate(baudrate);   //设置波特率
            serial::Timeout to = serial::Timeout::simpleTimeout(1); //设置超时
            ser.setTimeout(to);
            ser.open();  //打开串口
        }
        catch (serial::IOException &e)
        {
            RCLCPP_INFO(this->get_logger(), "不能打开端口 ");
            return;
        }

        if (ser.isOpen())
        {
            RCLCPP_INFO(this->get_logger(), "串口初始化完成!");
            unsigned char cmd_buffer[5] ={0xA4,0x03,0x08,0x23,0xD2}; //JY-95T启用35个寄存器 需要发送的串口包命令
            ser.write(cmd_buffer,5);  //JY-95T可以根据命令选择工作方式
            printf("发出命令: %x %x %x %x %x\n",cmd_buffer[0],cmd_buffer[1],cmd_buffer[2],cmd_buffer[3],cmd_buffer[4]);
         
        }
        else
        {
            RCLCPP_INFO(this->get_logger(), "Serial Port ???");
            return;
        }

        pub_imu = this->create_publisher<sensor_msgs::msg::Imu>("/imu_data", 20);//创建了话题 /imu_data
        
        // 创建定时器,100ms为周期,定时发布,这个时间设置超过200毫秒发布的数据卡顿
        timer_ = this->create_wall_timer(100ms, std::bind(&publisher_imu_node::timer_callback, this));
        printf("发布线程工作中\n");
    }

public:
    void timer_callback()   //定时器的回调函数,每20毫秒回调一次
    {
        int count = ser.available(); // 读取到缓存区数据的字节数
        
        if (count > 0)
        {
          
            int num;
            rclcpp::Time now = this->get_clock()->now(); // 获取时间戳

            std::vector<unsigned char> read_buf(count);//这里定义无符号,是因为read函数的形参是无符号
           
            num = ser.read(&read_buf[0], count); // 读出缓存区缓存的数据,返回值为读到的数据字节数

            imu_fetch.FetchData(read_buf, num);

            sensor_msgs::msg::Imu imu_data;         
            
            //----------------imu data填充数据----------------
            imu_data.header.stamp = now;
            //imu_data.header.frame_id = "imu_link";
            imu_data.header.frame_id = "map";
            //加速度
            imu_data.linear_acceleration.x = imu_fetch.acc_x;
            imu_data.linear_acceleration.y = imu_fetch.acc_y;
            imu_data.linear_acceleration.z = imu_fetch.acc_z;
            //角速度
            imu_data.angular_velocity.x = imu_fetch.gyro_x ;
            imu_data.angular_velocity.y = imu_fetch.gyro_y ;
            imu_data.angular_velocity.z = imu_fetch.gyro_z ;
            //四元数
            imu_data.orientation.x = imu_fetch.quat_Q0;
            imu_data.orientation.y = imu_fetch.quat_Q1;
            imu_data.orientation.z = imu_fetch.quat_Q2;
            imu_data.orientation.w = imu_fetch.quat_Q3;
            
            pub_imu->publish(imu_data);  //向话题放数据
             /*
            Author: Mao Haiqing 
            Time: 2023.7.6
            description: 读取IMU数据
            */
          
        }
    }   
   
   
};



int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<publisher_imu_node>();//创建对应节点的共享指针对象
    rclcpp::spin(node);   //运行节点,并检测退出信号
    printf("线程退出\n");
    rclcpp::shutdown();
    return 0;
}

 transform.hpp

//transform.hpp
#include <string>
#include <ctype.h>
#include <float.h>
#include <math.h>
class transform_imu
{

public:
    
    double acc_x=0;//加速度
    double acc_y=0;
    double acc_z=0;
   
    double gyro_x=0; //陀螺仪角速度
    double gyro_y=0;
    double gyro_z=0;
   
    double angle_r=0; //欧拉角
    double angle_p=0;
    double angle_y=0;
    
    double temp=0;  //imu温度计 
   
    double mag_x=0;  //磁力计                                                               
    double mag_y=0;
    double mag_z=0;
   
    double quat_Q0=0; //四元数
    double quat_Q1=0;
    double quat_Q2=0;
    double quat_Q3=0;
    
    
public:
    transform_imu(){};  //默认构造函数
    ~transform_imu(){}; //析构函数

    void FetchData(auto &data, int usLength) //获取数据
{   
    int index = 0;
    unsigned char sum=0;
    //for(int i = 0;i < usLength;i++){printf("%x ",data[i]);} //打印数据,查看收到的数据是否正确

    while (usLength >= 40)//一个完整数据帧40字节[0xA4,0x03,0x08,0x23,数据35字节,校验位] 
    {
            
        // 收到的数据开头4位:0xA4 帧头,0x03 读取,0x08 从8号寄存器开始,0x23 35个寄存器
        if (data[index] != 0xA4)//0xA4是协议头
        {
            index++;//指针(/索引)后移,继续找协议帧头
            usLength--;  
            continue;
        }
        //printf("找到数据包帧头,index是%d,uslength=%d\n",index,usLength);//每一次读取的数据长度
        
        if(data[index + 1] != 0x03)   //判断第二个数据是否正确
        {
           
            printf("第2数据包内容不对,进入下个循环");
            usLength = usLength - 40;
            index += 40;
            continue;
        }   
        // printf("读imu数据\n");

         if(data[index + 2] != 0x08)  //判断第3个数据是否正确
        {
            printf("第三数据包内容不对,进入下个循环");
            usLength = usLength - 40;
            index += 40;
            continue;
        }
         // printf("第08寄存器是数据\n");

         if(data[index + 3] != 0x23) //判断第4个数据是否正确
        {
            printf("第四数据包内容不对,进入下个循环\n");
            usLength = usLength - 40;
            index += 40;
            continue;
        }
          //printf("35个数据包\n");  

            //0-39字节相加的值取低8位与第40位校验,参考GY-95T 九轴模块使用说明
          for(int i=index;i<index+40;i++) //前39为求和
          {
            sum=0+data[i]; 
          }
            
         if(sum != data[index+39]) //判断前39个数据的和是否与第40位相等
        {
            printf("校验和不对,进入下个循环\n");
            usLength = usLength - 40;
            index += 40;
            continue;
        }
         // printf("校验和通过,数据没有问题\n"); 


        /*
        根据模块使用说明可知,一个完整数据帧40字节[0xA4,0x03,0x08,0x23,数据35字节,校验位]
        1.开头4位:0xA4 帧头,0x03 读取,0x08 数据位从8号寄存器开始,0x23 35个寄存器
        2.加速度位:4-9   
        3.陀螺仪位:10-15
        4.欧拉角:16-21
        5.磁场校准:22
        6.器件温度:23-24
        5.磁场:25-30
        6.四元数:31-38
        数据解析一定注意2个字节拼在一起用short类型,然后在转换成double类型,总体加小括号在作除法,
        否则short类型作除法会被截断降低精度,表现在图形显示界面会卡,数据不流畅。拼好的数据单位参考
        使用手册。
        */

        // 加速度
            acc_x = ((double)((short)(data[index + 5]<<8 | data[index + 4])))/2048 * 9.8;  //单位m/s^2
            acc_y = ((double)((short)(data[index + 7]<<8 | data[index + 6])))/2048 * 9.8;
            acc_z = ((double)((short)(data[index + 9]<<8 | data[index + 8])))/2048 * 9.8;

        // 陀螺仪角速度
            gyro_x = ((double)((short)(data[index + 11]<<8 | data[index + 10])))/16.4*57.3; //单位rad/sec
            gyro_y = ((double)((short)(data[index + 13]<<8 | data[index + 12])))/16.4*57.3;  
            gyro_z = ((double)((short)(data[index + 15]<<8 | data[index + 14])))/16.4*57.3;  
       
        //欧拉角
            angle_r = ((double)((short)(data[index + 17]<<8 | data[index + 16])))/100 ; 
            angle_p = ((double)((short)(data[index + 19]<<8 | data[index + 18])))/100 ; 
            angle_y = ((double)((short)(data[index + 21]<<8 | data[index + 20])))/100 ; 
        
        //imu温度
            temp = ((double)((short)(data[index + 24]<<8 | data[index + 23])))/100 ; //单位摄氏度
        //磁力计
            mag_x = ((double)((short)(data[index + 26]<<8 | data[index + 25]))); 
            mag_y = ((double)((short)(data[index + 28]<<8 | data[index + 27]))); 
            mag_z = ((double)((short)(data[index + 30]<<8 | data[index + 29])));
            

        //四元数  
            quat_Q0 = ((double)((short)(data[index + 32]<<8 | data[index + 31])))/10000 ; //无单位
            quat_Q1 = ((double)((short)(data[index + 34]<<8 | data[index + 33])))/10000 ; 
            quat_Q2 = ((double)((short)(data[index + 36]<<8 | data[index + 35])))/10000 ; 
            quat_Q3 = ((double)((short)(data[index + 38]<<8 | data[index + 37])))/10000 ; 

            //JY-95T imu传感器9轴,数据解析完成,具体用什么数据可以根据实际需要选用
          
            //调试结束后可以屏蔽以下printf
            printf("加速度x y z: %lf %lf %lf\n",acc_x,acc_y,acc_z);
            printf("角速度x y z: %lf %lf %lf\n",gyro_x,gyro_y,gyro_z);
            printf("欧拉角r p y: %lf %lf %lf %lf\n",angle_r,angle_p,angle_y);
            printf("imu温度计 %lf\n",temp);
            printf("磁力计x y z: %lf %lf %lf\n",mag_x, mag_y,mag_z);
            printf("四元数Q0 Q1 Q2 Q3: %lf %lf %lf %lf\n",quat_Q0,quat_Q1,quat_Q2,quat_Q3);
            /*
            Author: Mao Haiqing 
            Time: 2023.7.6
            description: 读取IMU数据
            */
            usLength = usLength - 40;
            index += 40;
    
     }
}

};

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(imu_get_cpp)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
find_package(serial REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(rosidl_default_generators REQUIRED)
#find_package(geometry_msgs)
find_package(nav_msgs REQUIRED)
find_package(tf2_ros REQUIRED)
find_package(tf2_msgs REQUIRED)
find_package(tf2_geometry_msgs REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

add_executable(publisher_imu_node src/publisher_imu.cpp src/transform.hpp)
ament_target_dependencies(publisher_imu_node rclcpp std_msgs)
ament_target_dependencies(publisher_imu_node rclcpp serial)
ament_target_dependencies(publisher_imu_node rclcpp sensor_msgs)
ament_target_dependencies(publisher_imu_node rclcpp rosidl_default_generators)
ament_target_dependencies(publisher_imu_node rclcpp nav_msgs)
ament_target_dependencies(publisher_imu_node rclcpp tf2_ros)
ament_target_dependencies(publisher_imu_node rclcpp tf2_msgs)
ament_target_dependencies(publisher_imu_node rclcpp tf2_geometry_msgs)

install(TARGETS
  publisher_imu_node
  DESTINATION lib/${PROJECT_NAME})


if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>imu_get_cpp</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="330406269@qq.com">m</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>std_msgs</depend>
  <depend>serial</depend>
  <depend>sensor_msgs</depend>
  <depend>nav_msgs</depend>
  <depend>tf2_ros</depend>
  <depend>tf2_msgs</depend>
  <depend>tf2_geometry_msgs</depend>
  <depend>geometry_msgs</depend>


  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

复制上面的代码到对应的文件/

编译:

cd ~/ros2_ws                                 //进入工作空间
colcon build --packages-select imu_get_cpp   //编译

source ~/ros2_ws/install/setup.bash          //source环境变量
ros2 run imu_get_cpp publisher_imu_node      //运行节点

输出

 看到以上输出说明程序运行成功。

查看话题

ros2 topic list    //查看话题

/clicked_point
/goal_pose
/imu_data
/initialpose
/parameter_events
/rosout
/tf
/tf_static

ros2 topic echo /imu_data     //显示话题详细信息

header:
  stamp:
    sec: 1688645970
    nanosec: 614702066
  frame_id: map
orientation:
  x: 1.3034
  y: -0.2712
  z: -0.1872
  w: 0.9363
orientation_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
angular_velocity:
  x: -314.4512195121951
  y: 48.91463414634146
  z: 0.0
angular_velocity_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
linear_acceleration:
  x: -0.07177734375
  y: -3.9046875
  z: 9.168359375000001
linear_acceleration_covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0

rviz2可视化数据

安装rviz2可视化插件:

sudo apt install ros-$ROS_DISTRO-imu-tools

add  By topic  imu

 可以看到图像随imu在转动,程序运行正常。

感谢大佬的程序分享,程序参考修改于:

【ROS2】获取imu数据并可视化保姆级教程(C++)_ros2 可视化_Glow_raw的博客-CSDN博客

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

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

相关文章

Cocos2dx学习笔记:浅谈游戏内的适配方案

前言 本篇在讲什么 Cocos2dx中的适配方案 本篇适合什么 适合初学Cocos的小白 本篇需要什么 对Lua语法有简单认知 依赖Cocos2dx3.15环境 依赖Sublime Text编辑器 依赖VS 2015编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手…

vue基于SpringBoot的智慧城市社区生活分类信息管理系统的设计与实现_2p760

表名&#xff1a;dongwuzhonglei 功能&#xff1a;动物种类 字段名称 类型 长度 字段说明 主键 默认值 id bigint 主键 主键 addtime timestamp 创建时间 CURRENT_TIMESTAMP dongwuzhonglei varchar 200 动物种类 …

防止video视频被下载的几种处理办法

1&#xff0c;video禁用下载功能 <video controlslist"nodownload"></video>2&#xff0c;隐藏鼠标右键&#xff0c;禁止复制链接 document.oncontextmenu function () {return false; }3&#xff0c;使用云点播等第三方播放控件&#xff0c;最好的话…

图像增强算法Retinex原理与实现详解

文章目录 1. 引言2. Retinex算法原理2.1 单尺度Retinex示例代码 2.2 多尺度Retinex示例代码 2.3 颜色恢复示例代码 2.4 最终图像处理代码示例 3. Retinex算法的Python实现4. 完结 1. 引言 图像增强是图像处理中的重要技术之一&#xff0c;它可以改善图像的亮度、对比度和颜色等…

微信开发者工具模拟器中不显示鼠标问题

前言 在使用微信开发者工具开发微信小程序时&#xff0c;使用到了第二屏幕&#xff0c;在第一屏幕上&#xff0c;微信开发者工具模拟器中&#xff0c;可以正常显示鼠标&#xff0c;而在第二屏幕上不显示鼠标。 解决方案&#xff1a; 方案1&#xff1a;设置指针轨迹&#xff…

【JMeter分布式压测连接Jenkins生成测试报告报错:Data exporter “html“ is unable to export data】

An error occurred: Data exporter “html” is unable to export data. Build step “Execute shell” marked build as failure 发生了一个错误:数据导出器“html”无法导出数据。 构建步骤“执行shell”将构建标记为失败 查看JMeter-master日志jmeter.log 发现是由于没有r…

基于springboot+vue的文物收藏系统(源代码+数据库+13000字论文)082

基于springbootvue的文物收藏系统(源代码数据库13000字论文)082 一、系统介绍 本项目前后端分离(本项目有ssmvue版本) 本系统分为管理员、用户两种角色 用户角色包含以下功能&#xff1a; 登录、文物查看、文物资料下载、文物收藏管理、文物维护管理、文物封存管理、个人中…

赛效:电子书可以转换成TXT吗

1&#xff1a;在“其他功能”菜单里点击“电子书转TXT”。 2&#xff1a;点击页面中间的号或者拖拽电子书上传。常规格式的电子书&#xff0c;都可以上传。 3&#xff1a;文件添加成功后&#xff0c;点击右下角的“开始转换”。 4&#xff1a;文件转换成功后&#xff0c;点击下…

Vue element admin git安装失败-2023年7月6日

Vue element admin-2023年7月6日 Vue element admin官网安装失败&#xff0c;是由于依赖包&#xff0c;所nodejs要求版本很低&#xff0c;导致和新版的18、16版本不兼容&#xff0c;git下安装失败。解决办法 Vue element admin官网 https://panjiachen.gitee.io/vue-element-a…

大数据的薪资怎么样?是真的很高么

既然提到了数据的问题&#xff0c;其实不妨看一下各大招聘平台在不同城市给出的薪资&#xff0c;百闻不如一见&#xff0c;自己真正看到了就知道能拿多少了。当然&#xff0c;是否能高薪&#xff0c;很大一部分还是取决于自身的能力的 猎聘大数据研究院发布了《2022未来人才就…

【yolov5】训练自己的数据集-实践笔记

【yolov5】训练自己的数据集-实践笔记 使用yolov5训练自己的数据集&#xff0c;以RSOD数据集为例&#xff0c;图像数量976&#xff0c;一共四类。 yolov5源码&#xff1a;https://github.com/ultralytics/yolov5 官网的代码会一直更新&#xff0c;相关依赖环境也会变&#xf…

嵌套和递归使用模板类

嵌套和递归使用模板类 模板栈模板数组栈中嵌套数组数组中嵌套栈数组中嵌套数组 模板栈 #pragma once #include <iostream> // 包含头文件。 using namespace std; // 指定缺省的命名空间。template<class DataType> class mystack2 { private:Data…

Java面向对象程序开发——文件与流

文章目录 前言File类IO字符流与字节流字符流字节流打印流缓冲流 前言 File类 是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 方法有三类&#xff1a;1获取、2判断、3创建或删除 public String getAbsolutePath() &#xff1a;返回…

ELK部署安装

目录 一、环境准备 1.准备三台服务器&#xff08;带图形化的linuxCentOS7&#xff0c;最小化缺少很多环境&#xff09; 2.修改主机名 3.关闭防火墙 4.elk-node1、elk-node2 用系统自带的java 5.上传软件包到node1和node2 二、部署elasticsearch 1、node1、node2操作 2.no…

《华尔街幽灵》的三大交易规则

规则1&#xff1a;只持有正确的仓位 如果你下单后经过一段时间&#xff0c;市场没有证明你的交易是正确的&#xff0c;那么应该立即平仓。交易者在每次建仓后&#xff0c;首先应关注保护本金&#xff0c;及早平掉不正确的仓位&#xff0c;而不是过多考虑盈利金额。 如何判断交…

生命在于学习——风险评估

风险评估的目录 一、网络安全风险评估概述1、概念2、意义3、步骤4、基本原则5、评估要素6、网络安全风险评估方法 二、网络安全风险评估方法三、网络安全风险评估方案1、确定评估范围和目标2、收集信息3、评估威胁和漏洞4、评估安全控制5、评估风险和制定建议6、报告和沟通 四、…

匿名苏丹的网络攻击仍在继续: 继微软之后拳头游戏成为最新目标

黑客组织 "匿名苏丹 "声称&#xff0c;它对美国视频游戏开发商和出版商Riot Games发起了分布式拒绝服务&#xff08;DDoS&#xff09;攻击。 据称匿名苏丹的目标是Riot Games的登录门户&#xff0c;该组织在Telegram帖子中宣布&#xff0c;这次攻击持续了30分钟至1小…

《随便测测》做UI测试

目录 前排提示 使用playwright录制ui操作 创建UI模板 运行用例 查看报告 再次编辑代码 再次查看报告 selenoid服务搭建 配置selenoid服务地址 总结 前排提示 1.使用playwright[selenoid]&#xff0c;可选的远程浏览器执行用例 2.没有采用 PageObjectModule&#xff0…

展示与处理复杂JSON数据——gradio库的JSON模块详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

从小白到大神之路之学习运维第54天--------ELK技术堆栈---

第三阶段基础 时 间&#xff1a;2023年7月6日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; ELK技术堆栈 目录 服务器设置&#xff1a; 部署elasticsearch集群&#xff1a; 配置elasticsearch集群&#xff…