11.机器人系统仿真搭建gazebo环境、仿真深度相机、雷达、RGB相机

目录

1 gazebo仿真环境搭建

1.1  直接添加内置组件创建仿真环境

1.2 urdf、gazebo、rviz的综合应用

2 ROS_control

2.1 运动控制实现流程(Gazebo)

2.1.1 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

2.1.2 将此文件集成进xacro文件

2.1.3 修改launch文件

2.1.3  启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

2.3.4 里程计查看

3 雷达仿真信息以及显示

3.1 实现流程

3.2 为机器人模型添加雷达配置

3.3 集成进xacro文件

3.4 启动 Gazebo,使用 Rviz 显示雷达信息

4 摄像头仿真

4.1 为机器人模型添加摄像头配置

4.2 为机器人模型添加相机配置

5 深度相机Kinect仿真

5.1 为机器人模型添加深度相机配置

5.2 kinect点云数据显示


1 gazebo仿真环境搭建

        到目前为止,我们已经可以将机器人模型显示在 Gazebo 之中了,但是当前默认情况下,在 Gazebo 中机器人模型是在 empty world 中,并没有类似于房间、家具、道路、树木... 之类的仿真物,如何在 Gazebo 中创建仿真环境呢?

Gazebo 中创建仿真实现方式有两种:

  • 方式1: 直接添加内置组件创建仿真环境

  • 方式2: 手动绘制仿真环境(更为灵活)

也还可以直接下载使用官方或第三方提高的仿真环境插件。

1.1  直接添加内置组件创建仿真环境

        启动roscore之后:

rosrun gazebo_ros gazebo

        是一个空的世界,我们设置一些障碍物。

        点击保存(save world as)即可。生成一个.world文件。

        选择Editor --> Building Editor

        可以添加门添加窗户等。

1.2 urdf、gazebo、rviz的综合应用

        关于URDF(Xacro)、Rviz 和 Gazebo 三者的关系,前面已有阐述: URDF 用于创建机器人模型、Rviz 可以显示机器人感知到的环境信息,Gazebo 用于仿真,可以模拟外界环境,以及机器人的一些传感器,如何在 Gazebo 中运行这些传感器,并显示这些传感器的数据(机器人的视角)呢?本节主要介绍的重点就是将三者结合:通过 Gazebo 模拟机器人的传感器,然后在 Rviz 中显示这些传感器感知到的数据。主要内容包括:

  • 运动控制以及里程计信息显示

  • 雷达信息仿真以及显示

  • 摄像头信息仿真以及显示

  • kinect 信息仿真以及显示

2 ROS_control

        gazebo 中已经可以正常显示机器人模型了,那么如何像在 rviz 中一样控制机器人运动呢?在此,需要涉及到ros中的组件: ros_control。

        场景:同一套 ROS 程序,如何部署在不同的机器人系统上,比如:开发阶段为了提高效率是在仿真平台上测试的,部署时又有不同的实体机器人平台,不同平台的实现是有差异的,如何保证 ROS 程序的可移植性?ROS 内置的解决方式是 ros_control。

        ros_control:是一组软件包,它包含了控制器接口,控制器管理器,传输和硬件接口。ros_control 是一套机器人控制的中间件,是一套规范,不同的机器人平台只要按照这套规范实现,那么就可以保证 与ROS 程序兼容,通过这套规范,实现了一种可插拔的架构设计,大大提高了程序设计的效率与灵活性。

        gazebo 已经实现了 ros_control 的相关接口,如果需要在 gazebo 中控制机器人运动,直接调用相关接口即可。

        承上,运动控制基本流程:

  1. 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

  2. 将此文件集成进xacro文件

  3. 启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

2.1 运动控制实现流程(Gazebo)

2.1.1 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器

        我们建立一个文件夹gazebo,存放传动装置以及控制器相关文件:move.xacro

        把这个传动装置以及控制器相关文件集成进总的xacro文件中:

        官方文档复制下来即可,无需自己写:

<robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">

    <!-- 传动实现:用于连接控制器与关节 -->
    <xacro:macro name="joint_trans" params="joint_name">
        <!-- Transmission is important to link the joints and the controller -->
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <!-- 每一个驱动轮都需要配置传动装置 -->
    <xacro:joint_trans joint_name="left_wheel2base_link" />
    <xacro:joint_trans joint_name="right_wheel2base_link" />

    <!-- 控制器 -->
    <gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>left_wheel2base_link</leftJoint> <!-- 左轮 -->
            <rightJoint>right_wheel2base_link</rightJoint> <!-- 右轮 -->
            <wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 车轮间距 -->
            <wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 车轮直径 -->
            <broadcastTF>1</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 -->
            <odometryFrame>odom</odometryFrame> 
            <odometryTopic>odom</odometryTopic> <!-- 里程计话题 -->
            <robotBaseFrame>base_footprint</robotBaseFrame> <!-- 根坐标系 -->
        </plugin>
    </gazebo>

</robot>

        解释一下怎么适配自己的场景:

        第一部分是传动实现:用于连接控制器与关节

        这里要改成我们自己的关节。

        我们的驱动轮关节名叫做base_link2_${wheel_name},传入参数是left和right,因此move.xacro改为:

    <xacro:joint_trans joint_name="base_link2_left" />
    <xacro:joint_trans joint_name="base_link2_right" />

        后面是差速控制器:

        整体来看是这样!

<robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">

    <xacro:macro name="joint_trans" params="joint_name">
        <!-- Transmission is important to link the joints and the controller -->
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <xacro:joint_trans joint_name="base_link2_left" />
    <xacro:joint_trans joint_name="base_link2_right" />

    <gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>base_link2_left</leftJoint>
            <rightJoint>base_link2_right</rightJoint>
            <wheelSeparation>${base_radius * 2}</wheelSeparation>
            <wheelDiameter>${wheel_radius * 2}</wheelDiameter>
            <broadcastTF>1</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic>
            <odometryFrame>odom</odometryFrame>
            <odometryTopic>odom</odometryTopic>
            <robotBaseFrame>base_footprint</robotBaseFrame>
        </plugin>
    </gazebo>

</robot>

2.1.2 将此文件集成进xacro文件

<robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">


    <xacro:include filename="interial.xacro" />

    <xacro:include filename="demo05carbase.xacro" />
    <xacro:include filename="cam.xacro" />
    <xacro:include filename="lidar.xacro" />

    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>
    
    
</robot>

        就把刚刚加入就好。

2.1.3 修改launch文件

         不需要修改:

<launch>

    <param name="robot_description" command="$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_gazebo.xacro" />

    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/world/box_house.world" />
    </include>

    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>

        roslaunch test gazebo_car.launch

2.1.3  启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

        机器人运动了!

        或者安装控制节点:

sudo apt install ros-melodic-teleop-twist-keyboard

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

        当然,线速度、角速度比较快.....

        我们可以通过传参降低速度:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.3  _turn:=0.5

        现在运动幅度就小多了。

2.3.4 里程计查看

        我们要启动关节和机器人运动发布状态节点:multisensor.launch

<launch>
    <node pkg="rviz" type="rviz" name="rviz" args="-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz"/>


    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>

        我们再打开之前的节点:

<launch>

    <param name="robot_description" command="$(find xacro)/xacro /home/liuhongwei/Desktop/final/catkin_studyrobot/src/urdf/xacro/car_gazebo.xacro" />

    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/world/box_house.world" />
    </include>

    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>

        设置Fix Frame为odom。

        我们打开键盘控制节点:

        都动啦!

3 雷达仿真信息以及显示

3.1 实现流程

实现流程:

雷达仿真基本流程:

  1. 已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加雷达配置;

  2. 将此文件集成进xacro文件;

  3. 启动 Gazebo,使用 Rviz 显示雷达信息。

3.2 为机器人模型添加雷达配置

        我们需要把雷达贴到一个模块上:

        之前我们设置过lidar:

        如下:

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">

    <gazebo reference="laser">
        <sensor type="ray" name="rplidar">
            <pose>0 0 0 0 0 0</pose>
            <visualize>true</visualize>
            <update_rate>5.5</update_rate>
            <ray>
                <scan>
                    <horizontal>
                        <samples>360</samples>
                        <resolution>1</resolution>
                        <min_angle>-3</min_angle>
                        <max_angle>3</max_angle>
                    </horizontal>
                </scan>
                <range>
                    <min>0.10</min>
                    <max>30.0</max>
                    <resolution>0.01</resolution>
                </range>
                <noise>
                    <type>gaussian</type>
                    <mean>0.0</mean>
                    <stddev>0.01</stddev>
                </noise>
            </ray>
            <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
                <topicName>/scan</topicName>
                <frameName>laser</frameName>
            </plugin>
        </sensor>
    </gazebo>

</robot>

        完成!

3.3 集成进xacro文件

<robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">


    <xacro:include filename="interial.xacro" />

    <xacro:include filename="demo05carbase.xacro" />
    <xacro:include filename="cam.xacro" />
    <xacro:include filename="lidar.xacro" />

    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>

    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/laser.xacro"/>

</robot>

        把雷达传感器集成进xacro。

3.4 启动 Gazebo,使用 Rviz 显示雷达信息

        启动双launch节点:

        /scan话题就是雷达话题。

        gazebo中也有显示了。这是雷达的不可见扫描光束。

4 摄像头仿真

4.1 为机器人模型添加摄像头配置

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
    <gazebo reference="camera">
        <sensor type="camera" name="camera_node">
            <update_rate>30.0</update_rate>
            <camera name="head">
                <horizontal_fov>1.3962634</horizontal_fov>
                <image>
                    <width>1280</width>
                    <height>720</height>
                    <format>R8G8B8</format>
                </image>
                <clip>
                    <near>0.02</near>
                    <far>300</far>
                </clip>
                <noise>
                    <type>gaussian</type>
                    <mean>0.0</mean>
                    <stddev>0.007</stddev>
                </noise>
            </camera>
            <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
                <alwaysOn>true</alwaysOn>
                <updateRate>0.0</updateRate>
                <cameraName>/camera</cameraName>
                <imageTopicName>image_raw</imageTopicName>
                <cameraInfoTopicName>camera_info</cameraInfoTopicName>
                <frameName>camera</frameName>
                <hackBaseline>0.07</hackBaseline>
                <distortionK1>0.0</distortionK1>
                <distortionK2>0.0</distortionK2>
                <distortionK3>0.0</distortionK3>
                <distortionT1>0.0</distortionT1>
                <distortionT2>0.0</distortionT2>
            </plugin>
        </sensor>
    </gazebo>
</robot>

4.2 为机器人模型添加相机配置

<robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">


    <xacro:include filename="interial.xacro" />

    <xacro:include filename="demo05carbase.xacro" />
    <xacro:include filename="cam.xacro" />
    <xacro:include filename="lidar.xacro" />

    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>

    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/laser.xacro"/>
    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/camera.xacro"/>


</robot>

        成功!

5 深度相机Kinect仿真

5.1 为机器人模型添加深度相机配置

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
    <gazebo reference="support">  
      <sensor type="depth" name="camera">
        <always_on>true</always_on>
        <update_rate>20.0</update_rate>
        <camera>
          <horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
          <image>
            <format>R8G8B8</format>
            <width>640</width>
            <height>480</height>
          </image>
          <clip>
            <near>0.05</near>
            <far>8.0</far>
          </clip>
        </camera>
        <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
          <cameraName>camera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <imageTopicName>rgb/image_raw</imageTopicName>
          <depthImageTopicName>depth/image_raw</depthImageTopicName>
          <pointCloudTopicName>depth/points</pointCloudTopicName>
          <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
          <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
          <frameName>support</frameName>
          <baseline>0.1</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
          <pointCloudCutoff>0.4</pointCloudCutoff>
        </plugin>
      </sensor>
    </gazebo>

</robot>
<robot name="mycarwithlidarandcamera" xmlns:xacro="http://wiki.ros.org/xacro">


    <xacro:include filename="interial.xacro" />

    <xacro:include filename="demo05carbase.xacro" />
    <xacro:include filename="cam.xacro" />
    <xacro:include filename="lidar.xacro" />

    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/move.xacro"/>

    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/laser.xacro"/>
    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/camera.xacro"/>
    <xacro:include filename="/home/liuhongwei/Desktop/final/catkin_studyrobot/src/gazebo/kinect.xacro"/>


</robot>

        启动!

5.2 kinect点云数据显示

        在kinect中也可以以点云的方式显示感知周围环境,在 rviz 中操作如下:

        添加PointCloud2点云,但是显示错位了。

        原因:在kinect中图像数据与点云数据使用了两套坐标系统,且两套坐标系统位姿并不一致。

        怎么解决呢??

        在插件中为kinect设置坐标系,修改配置文件的<frameName>标签内容:

        发布新设置的坐标系到kinect连杆的坐标变换关系,在启动rviz的launch中,添加:

<launch>

    <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /support /support_depth" />
    <node pkg="rviz" type="rviz" name="rviz" args="-d /home/liuhongwei/Desktop/final/catkin_studyrobot/src/config/qidong.rviz"/>


    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>

        OK!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

阿里大佬讲解的接口自动化测试框架pytest系列——pluggy插件源码解读:hook钩子函数调用执行过程分析

经过pluggy源码解读系列1-4的分析&#xff0c;已经完成插件定义、spec定义&#xff0c;插件注册等环节&#xff0c;下面就到了调用插件执行了&#xff0c;即hook钩子函数是如何被调用执行的&#xff0c;下面还是先把pluggy使用的代码放下面&#xff1a; import pluggy# Hooksp…

Esxi6.0 安装web管理界面

安装6.0之后默认是vSphere Client进行远程连接&#xff0c;需要安装客户端&#xff0c;不是太方便。搜索发现还真可以实现web管理&#xff0c;步骤如下&#xff1a; 1、开启esxi的ssh&#xff0c;步骤如下图&#xff1a; 2、下载升级包esxui-signed-7119706.vib&#xff0c;上…

Linux 环境下,jdbc连接mysql问题

1. 下载MySQL的JDBC驱动&#xff1a; 从MySQL官网下载最新的MySQL Connector/J&#xff0c;并将其解压到某个目录&#xff0c;比如/usr/local/mysql/。 2. 将JDBC驱动添加到类路径&#xff1a; 将JDBC驱动添加到类路径&#xff0c;可以使用以下命令&#xff1a; export CLA…

gmid方法设计五管OTA二级远放

首先给出第一级是OTA&#xff0c;第二级是CS的二级运放电路图&#xff1a; gmid的设计方法可以根据GBW、Av、CL来进行电路设计&#xff0c;因此在设计电路之前需要以上的参数要求。 1、为了满足电路的相位裕度至少60&#xff0c;需要对GBW、主极点、零点进行分析。 首先给出其…

解决npm install时报:gyp ERR! configure error

报错内容&#xff1a; npm ERR! gyp ERR! cwd C:\Users\zccbbg\code\my\examvue\node_modules\node-sass npm ERR! gyp ERR! node -v v16.13.1 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok npm ERR! Build failed with error code: 1 解决办法&#xff1a;…

Jmeter接口测试 —— jmeter对图片验证码的处理

jmeter对图片验证码的处理 在web端的登录接口经常会有图片验证码的输入&#xff0c;而且每次登录时图片验证码都是随机的&#xff1b;当通过jmeter做接口登录的时候要对图片验证码进行识别出图片中的字段&#xff0c;然后再登录接口中使用&#xff1b; 通过jmeter对图片验证码…

一对一聊天

1.创建包 1.服务界面 package yiduiy;import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.uti…

OkGo导入失败解决办法

jcenter()maven { url "https://jitpack.io" }再同步就可以了

LeetCode Hot100 207.课程表

题目&#xff1a; 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习…

docker:安装mysql以及最佳实践

文章目录 1、拉取镜像2、运行容器3、进入容器方式一方式二方式三容器进入后连接mysql和在宿主机连接mysql的区别 持久化数据持久化数据最佳实践 1、拉取镜像 docker pull mysql2、运行容器 docker run -d -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD123456 …

antdesign前端一直加载不出来

antdesign前端一直加载不出来 报错&#xff1a;Module “./querystring” does not exist in container. while loading “./querystring” from webpack/container/reference/mf at mf-va_remoteEntry.js:751:11 解决方案&#xff1a;Error: Module “xxx“ does not exist …

分布式锁常见实现方案

分布式锁常见实现方案 基于 Redis 实现分布式锁 如何基于 Redis 实现一个最简易的分布式锁&#xff1f; 不论是本地锁还是分布式锁&#xff0c;核心都在于“互斥”。 在 Redis 中&#xff0c; SETNX 命令是可以帮助我们实现互斥。SETNX 即 SET if Not eXists (对应 Java 中…

【开源】基于Vue+SpringBoot的用户画像活动推荐系统

项目编号&#xff1a; S 061 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S061&#xff0c;文末获取源码。} 项目编号&#xff1a;S061&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活…

马尔科夫决策过程(Markov Decision Process)揭秘

RL基本框架、MDP概念 MDP是强化学习的基础。MDP能建模一系列真实世界的问题&#xff0c;它在形式上描述了强化学习的框架。RL的交互过程就是通过MDP表示的。RL中Agent对Environment做出一个动作&#xff08;Action&#xff09;&#xff0c;Environment给Agent一个反馈&#xff…

Ubuntu安装过程记录

软件准备 硬件 Acer电脑&#xff0c;AMD a6-440m芯片 64g优盘一个&#xff0c;实际就用了不到5g。 Ubuntu &#xff1a;官网 下载Ubuntu桌面系统 | Ubuntu 下载桌面版Ubuntu 22.04.3 LTS LTS属于稳定版 u盘系统盘制作软件 Rufus &#xff1a;Rufus - 轻松创建 USB 启动…

【编程基础心法】「创建模式系列」让我们一起来学编程界的“兵法”设计模式(工厂模式)

【编程基础心法】「创建模式系列」让我们一起来学编程界的“兵法”设计模式&#xff08;工厂模式&#xff09; 设计模式之间的千丝万缕工厂模式简单工厂方法简单工厂定义多方法模式多个静态方法模式简单工厂模式的问题 工厂方法模式定义工厂抽象接口工厂方法存在的问题 抽象工厂…

Python中字符串列表的相互转换详解

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python编程中&#xff0c;经常会遇到需要将字符串列表相互转换的情况。这涉及到将逗号分隔的字符串转换为列表&#xff0c;或者将列表中的元素连接成一个字符串。本文将深入讨论这些情景&#xff0c;并提供丰富…

高防CDN可以更好的防御网站被攻击

高防CDN是在原服务器的基础上配置了DDoS高防、 CC防护、CDN加速来确保线上业务安全快速地运行。使用高防CDN后网站服务器会被隐藏在后端&#xff0c;使攻击者无法攻击到网站服务器&#xff0c;只能攻击部署在前端的CDN节点&#xff0c;每当检测到是攻击流量的时候还会自动对其进…

对比分析:黑盒测试 VS 白盒测试

一、引言 在软件开发过程中&#xff0c;测试是确保产品质量的关键环节。其中&#xff0c;黑盒测试和白盒测试是两种常见的测试方法。本文将详细解析这两种测试方法的定义、特点&#xff0c;同时通过具体示例进行对比分析。 二、黑盒测试 黑盒测试&#xff0c;又称功能测试&…

SpaceSight、Echo 联合升级,打造更懂场景的 AI 「超级门店」

当各领域都在谈论「增长」&#xff0c;门店业务的增长又该从哪里开始着手…… 在日常运营中&#xff0c;「高效」和「细致」是否无法同时实现&#xff1f;「任务下达」和「任务执行」之间有多大偏差&#xff1f; 在客户洞察上&#xff0c;如何用「过去」的数据预测「未来」&…