机器人入门(四)—— 创建你的第一个虚拟小车

news2024/11/27 10:39:39

机器人入门(四)—— 创建你的第一个虚拟小车

  • 一、小车建立过程
    • 1.1 dd_robot.urdf —— 建立身体
    • 1.2 dd_robot2.urdf —— 添加轮子
    • 1.3 dd_robot3.urdf —— 添加万向轮
    • 1.4 dd_robot4.urdf —— 添加颜色
    • 1.5 dd_robot5.urdf —— 添加碰撞检测(Collision Detection)
    • 1.6 使用gui模式转动小车车轮
    • 1.7 dd_robot6.urdf —— 添加惯性属性
  • 二、Gazebo仿真实验
    • 2.1 环境预备与问题处理
    • 2.2 dd_robot.gazebo
  • 三、其它仿真手段
    • 3.1 Matlab
    • 3.2 Stage
    • 3.3 Virtual Robot Experimentation Platform (V-REP)
  • 四、六大关节种类
      • 无限旋转关节(continous)
      • 固定关节(fixed)
      • 有限旋转关节(revolute)
      • 滑动关节(prismatic)
      • 浮动关节(floating)
      • 平面关节(planar)
      • 总结

参考书籍为:ROS Robotics By Example (Second Edition) —— Carol Fairchild Dr.Thomas L.Harman,微信读书可免费阅读。

一、小车建立过程

首先,在catkin_ws工作空间下,使用catking_create_pkg建立package目录ros_robotics

programmer@ubuntu:~/catkin_ws/src$ catkin_create_pkg ros_robotics
Created file ros_robotics/package.xml
Created file ros_robotics/CMakeLists.txt
Successfully created files in /home/programmer/catkin_ws/src/ros_robotics. Please adjust the values in package.xml.

然后,使用catkin_make进行编译

programmer@ubuntu:~/catkin_ws/src$ cd ~/catkin_ws
programmer@ubuntu:~$ catkin_make

再建立urdf目录,用来存放描述机器人的文件

programmer@ubuntu:~/catkin_ws/src/ros_robotics$ cd ~/catkin_ws/src/ros_robotics
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ mkdir urdf
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ cd urdf

本节的代码文件都可以直接从github下载,不想阅读源码可通过该链接下载 ROS-Robotics-By-Example-2nd-Edition/Chapter2_code/ros_robotics/urdf/,,如果不想下载全部,只下载指定的文件内容,看这篇文章《如何从 GitHub 上下载指定项目的单个文件或文件夹》

1.1 dd_robot.urdf —— 建立身体

并在urdf目录下,建立一份dd_robot.urdf文件,但记得拷贝进去时,内容里不要有中文,经实践,中文不在其支持的字符范围内,解析会出错,内容为:

<?xml version='1.0'?>
<robot name="dd_robot">

  <!-- Base Link -->
  <link name="base_link">
    <visual>
      <!--放置的位置在(x,y,z) = (0,0,0)处,摆放方式有roll(滚动), pitch(俯仰), yaw(偏向)-->
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
      <!--形状是box,长宽高是0.5 0.5 0.25,单位m-->
        <box size="0.5 0.5 0.25"/>
      </geometry>
    </visual>
  </link>

</robot>

然后前往ros_robotics目录下,建立一个子目录launch,并在此目录下建立一份ddrobot_rviz.launch文件

programmer@ubuntu:~/catkin_ws/src/ros_robotics/urdf$ cd ..
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ mkdir launch
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ vim ddrobot_rviz.launch
<!--ddrobot_rviz.launch-->
<launch>
  <!-- values passed by command line input -->
  <arg name="model" />
  <arg name="gui" default="False" />

  <!-- set these parameters on Parameter Server -->
  <param name="robot_description" 
         textfile="$(find ros_robotics)/urdf/$(arg model)"
  />
  <param name="use_gui" value="$(arg gui)"/>

  <!-- Start 3 nodes: joint_state_publisher,
         robot_state_publisher and rviz -->

  <node name="joint_state_publisher"
        pkg="joint_state_publisher"
        type="joint_state_publisher" />

  <node name="robot_state_publisher"
        pkg="robot_state_publisher"
        type="state_publisher" />

  <node name="rviz" pkg="rviz" type="rviz"
        args="-d $(find ros_robotics)/urdf.rviz"
        required="true" />
</launch>

然后在终端执行以下命令,就会弹出一个rviz窗口

$ roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot.urdf

在这里插入图片描述点击Displays工具栏右下角的Add,添加组件,并编辑Fixed Frame为base_link

在这里插入图片描述
然后就有

在这里插入图片描述

1.2 dd_robot2.urdf —— 添加轮子

然后添加轮子,仿照dd_robot.urdf,在相同目录下建立第二份文件dd_robot2.urdf,在dd_robot.urdf文件的基础上,加了两个轮子,具体内容为:

<?xml version='1.0'?>
<!--dd_robot2.urdf-->
<robot name="dd_robot">

  <!-- Old Content -->
  <!-- Base Link -->
  <link name="base_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <box size="0.5 0.5 0.25"/>
      </geometry>
    </visual>
  </link>

  <!-- New Content -->
  <!-- Right Wheel -->
  <link name="right_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
        <cylinder length="0.1" radius="0.2" />
      </geometry>
    </visual>
  </link>
  <joint name="joint_right_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <origin xyz="0 -0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

  <!-- Left Wheel -->
  <link name="left_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
        <cylinder length="0.1" radius="0.2" />
      </geometry>
    </visual>
  </link>
  <joint name="joint_left_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

</robot>

保存好后,关闭上一个rviz窗口,执行

$ roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot2.urdf

就会看到,红色轴是X轴,绿色轴是Y轴,蓝色轴是Z轴。TF - ROS Wiki
在这里插入图片描述

1.3 dd_robot3.urdf —— 添加万向轮

再建一份dd_robot3.urdf文件,在底部添加一个万向轮

<?xml version='1.0'?>
<!--dd_robot3.urdf-->
<robot name="dd_robot">

  <!-- Base Link -->
  <link name="base_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <box size="0.5 0.5 0.25"/>
      </geometry>
    </visual>
  
    <!-- New Content -->
    <!-- Caster -->
    <visual name="caster">
      <origin xyz="0.2 0 -0.125" rpy="0 0 0" />
      <geometry>
		<sphere radius="0.05" />
      </geometry>
    </visual>

  </link>


  <!-- Right Wheel -->
  <link name="right_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
        <cylinder length="0.1" radius="0.2" />
      </geometry>
    </visual>
  </link>
  <joint name="joint_right_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <origin xyz="0 -0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

  <!-- Left Wheel -->
  <link name="left_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
        <cylinder length="0.1" radius="0.2" />
      </geometry>
    </visual>
  </link>
  <joint name="joint_left_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

</robot>

dd_robot3.urdf效果图
在这里插入图片描述

1.4 dd_robot4.urdf —— 添加颜色

新建一份dd_robot4.urdf,修改各模块颜色,可以看到left wheel只简单引用了一个<material>标签也产生了效果,所以这个标签可以一次定义,全局起效,定义位置不影响其生效的先后关系,定义在文件末尾也一样,rgba属性值里的a代表alpha,表示透明度,1不透明,0透明。

<?xml version='1.0'?>
<!--dd_robot4.urdf-->
<robot name="dd_robot">

  <!-- Base Link -->
  <link name="base_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <box size="0.5 0.5 0.25"/>
      </geometry>
      <!-- New Content -->
      <material name="blue">
        <color rgba="0 0.5 1 1"/>
      </material>
    </visual>

    <!-- Caster -->
    <visual name="caster">
      <origin xyz="0.2 0 -0.125" rpy="0 0 0" />
      <geometry>
		<sphere radius="0.05" />
      </geometry>
    </visual>

  </link>


  <!-- Right Wheel -->
  <link name="right_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
        <cylinder length="0.1" radius="0.2" />
      </geometry>
      <!-- New Content -->
      <material name="black">
        <color rgba="0.05 0.05 0.05 1"/>
      </material>
    </visual>
  </link>
  <joint name="joint_right_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <origin xyz="0 -0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

  <!-- Left Wheel -->
  <link name="left_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
        <cylinder length="0.1" radius="0.2" />
      </geometry>
      <!-- New Content -->
      <material name="black"/>
    </visual>
  </link>
  <joint name="joint_left_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

</robot>

在这里插入图片描述

1.5 dd_robot5.urdf —— 添加碰撞检测(Collision Detection)

给各个link添加<collision>属性,用来之后在Gazebo中进行碰撞检测

<?xml version='1.0'?>
<!--dd_robot5.urdf-->
<robot name="dd_robot">

  <!-- Base Link -->
  <link name="base_link">
    <visual>
      <!-- Base collision -->
      <collision>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <geometry>
          <box size="0.5 0.5 0.25"/>
        </geometry>
      </collision>
      <material name="blue">
        <color rgba="0 0.5 1 1"/>
      </material>
    </visual>

    <!-- Caster -->
    <visual name="caster">
    <!-- Caster collision -->
      <collision>
        <origin xyz="0.2 0 -0.125" rpy="0 0 0" />
        <geometry>
          <sphere radius="0.05" />
        </geometry>
      </collision>
    </visual>

  </link>


  <!-- Right Wheel -->
  <link name="right_wheel">
    <visual>
      <collision>
        <origin xyz="0 0 0" rpy="1.570795 0 0" />
        <geometry>
          <cylinder length="0.1" radius="0.2" />
        </geometry>
      </collision>
      <material name="black">
        <color rgba="0.05 0.05 0.05 1"/>
      </material>
    </visual>
  </link>
  <joint name="joint_right_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <origin xyz="0 -0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

  <!-- Left Wheel -->
  <link name="left_wheel">
    <visual>
      <collision>
        <origin xyz="0 0 0" rpy="1.570795 0 0" />
        <geometry>
          <cylinder length="0.1" radius="0.2" />
        </geometry>
      </collision>
      <material name="black"/>
    </visual>
  </link>
  <joint name="joint_left_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.30 0" rpy="0 0 0" />
    <axis xyz="0 1 0" />
  </joint>

</robot>

1.6 使用gui模式转动小车车轮

提前安装gui相关ros包

sudo apt update
#sudo apt install ros-<your_ros_version>-joint-state-publisher-gui,我的ros_version是kinetic,根据版本决定
sudo apt install ros-kinetic-joint-state-publisher-gui

然后执行

roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot5.urdf gui:=True

效果如图,random随机赋予旋转角度,center是位置归零按键
robot wheel rotation

1.7 dd_robot6.urdf —— 添加惯性属性

给物体添加了inertia惯性属性

<?xml version='1.0'?>
<robot name="dd_robot">

  <!-- Base Link -->
  <link name="base_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
          <box size="0.5 0.5 0.25"/>
      </geometry>
      <material name="blue">
        <color rgba="0 0.5 1 1"/>
      </material>
    </visual>
    <!-- Base collision, mass and inertia -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
          <box size="0.5 0.5 0.25"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="5"/>
      <inertia ixx="0.13" ixy="0.0" ixz="0.0" iyy="0.21" iyz="0.0" izz="0.13"/>
    </inertial>

    <!-- Caster -->
    <visual name="caster">
      <origin xyz="0.2 0 -0.125" rpy="0 0 0" />
      <geometry>
        <sphere radius="0.05" />
      </geometry>
    </visual>
    <!-- Caster collision, mass and inertia -->
    <collision>
      <origin xyz="0.2 0 -0.125" rpy="0 0 0" />
      <geometry>
        <sphere radius="0.05" />
      </geometry>
    </collision>
    <inertial>
      <mass value="0.5"/>
      <inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/>
    </inertial>

  </link>

  <!-- Right Wheel -->
  <link name="right_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
          <cylinder length="0.1" radius="0.2" />
      </geometry>
      <material name="darkgray">
        <color rgba=".2 .2 .2 1"/>
      </material>
    </visual>
    <!-- Right Wheel collision, mass and inertia -->
    <collision>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
          <cylinder length="0.1" radius="0.2" />
      </geometry>
    </collision>
    <inertial>
      <mass value="0.5"/>
      <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.005" iyz="0.0" izz="0.005"/>
    </inertial>

  </link>

  <!-- Right Wheel joint -->
  <joint name="joint_right_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <origin xyz="0 -0.30 0" rpy="0 0 0" /> 
    <axis xyz="0 1 0" />
  </joint>

  <!-- Left Wheel -->
  <link name="left_wheel">
    <visual>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
          <cylinder length="0.1" radius="0.2" />
      </geometry>
      <material name="darkgray">
        <color rgba=".2 .2 .2 1"/>
      </material>
    </visual>
    <!-- Left Wheel collision, mass and inertia -->
    <collision>
      <origin xyz="0 0 0" rpy="1.570795 0 0" />
      <geometry>
          <cylinder length="0.1" radius="0.2" />
      </geometry>
    </collision>
    <inertial>
      <mass value="0.5"/>
      <inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.005" iyz="0.0" izz="0.005"/>
    </inertial>
  </link>

  <!-- Left Wheel joint -->
  <joint name="joint_left_wheel" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.30 0" rpy="0 0 0" /> 
    <axis xyz="0 1 0" />
  </joint>

</robot>

二、Gazebo仿真实验

2.1 环境预备与问题处理

在使用下面的命令运行gazebo时,我遇到了一个错误,可能你也会遇到,一个什么都没有的empty_world也还是需要阳光和大地,就像我的世界初始化一样。

$ roslaunch gazebo_ros empty_world.launch
Error [parser.cc:581] Unable to find uri[model://sun]
Error [parser.cc:581] Unable to find uri[model://ground_plane]

解决方案:Unable to find uri[model://sun]、uri[model://ground_plane] 错误解决,只要下载好对应的model包并放到指定位置即可,这里有两个下载源:gazebo_models - giteegazebo_models - github,使用DownGit工具,从github上下载指定内容会比全部下载更快些,我这里暂时只需要下载这两个。另外,如果遇到Gazebo闪退,请看控制台打印的信息,是否与该文章说明内容相同:《VMware: vmw_ioctl_command error Invalid argument解决办法》,若不同请找其它解决方案,记得source文件起效。

2.2 dd_robot.gazebo

文件后缀从.urdf变成了.gazebo,文件内容不贴了,以免文章过于冗长,请从github上下载,下载地址请往上翻阅,有些属性被替换成了gazebo中特有的。
书本上使用以下命令,判断是否能从urdf格式转换成sdf格式

$ gzsdf –p dd_robot.gazebo

但我的机器上出现了以下错误,查看专栏《ROS采坑记录》下的文章,原因是 gzsdf 在 gazebo3后的版本取消了,啊,妸荷甘与神农同学于老龙吉。

gzsdf: command not found

用以下命令替代,执行后会打印出很长的一段内容,没报错就先不管它。

gz sdf -p dd_robot.gazebo 

在launch目录下建立一份ddrobot_gazebo.launch文件,内容为

<launch>
  <!-- We resume the logic in gazebo_ros package
        empty_world.launch,
        changing only the name of the
        world to be launched -->
  <include file="$(find
          gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name"
        value="$(find ros_robotics)/worlds/ddrobot.world"/>

    <arg name="paused" default="false"/>
    <arg name="use_sim_time" default="true"/>
    <arg name="gui" default="true"/>
    <arg name="headless" default="false"/>
    <arg name="debug" default="false"/>
  </include>

  <!-- Spawn dd_robot into Gazebo -->
  <node name="spawn_urdf" pkg="gazebo_ros"
       type="spawn_model" output="screen"
       args="-file
       $(find ros_robotics)/urdf/dd_robot.gazebo
              -urdf -model ddrobot" />

</launch>

在launch的同级目录下,建立一个worlds目录,不清楚具体目录和文件结构,可以看书本发布在github上的源码。并在worlds目录下,建立一份ddrobot.world文件,内容为

<?xml version="1.0" ?>
<sdf version="1.4">
  <world name="default">
    <include>
      <uri>model://ground_plane</uri>
    </include>
    <include>
      <uri>model://sun</uri>
    </include>
    <include>
      <uri>model://construction_cone</uri>
      <name>construction_cone</name>
      <pose>-3.0 0 0 0 0 0</pose>
    </include>
    <include>
      <uri>model://construction_cone</uri>
      <name>construction_cone</name>
      <pose>3.0 0 0 0 0 0</pose>
    </include>
  </world>
</sdf>

然后执行以下命令,效果如下。有model少的话,按之前的方法去下载。

$ roslaunch ros_robotics ddrobot_gazebo.launch

在这里插入图片描述在这里插入图片描述

三、其它仿真手段

3.1 Matlab

除了Gazebo,Matlab Simulink通过 Robotics System Toolbox的加持,也支持对ROS进行仿真,见 Robot Operating System (ROS) Support from ROS Toolbox,Matlab也提供了例子,见 Get Started with ROS - MathWorks

3.2 Stage

Stage是一个针对移动机器人与传感器的开源2D仿真器,见 The Player Project - Free Software tools for robot and sensor applications

3.3 Virtual Robot Experimentation Platform (V-REP)

虚拟机器人实验平台,商用,由Coppelia Robotics公司开发,V-REP官网。

四、六大关节种类

在上面的例子中,只用到了一种Continous的连接关节,但这不是所有,还有其它5种,将以代码+动图形式,分别展示效果。
【ROS URDF模型中的6种joint类型】

无限旋转关节(continous)

首先,是我们在上文已经见过的continous关节
robot wheel rotation

固定关节(fixed)

配图,配上关节的动图

有限旋转关节(revolute)

找到之前的dd_robot5.urdf文件,并复制一份命名为dd_robot5_revolute.urdf,并做出如下修改

	...
  <joint name="joint_right_wheel" type="revolute">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <origin xyz="0 -0.30 0" rpy="0 0 0" />
    <!--New content-->
    <limit effort="30" velocity="1.0" lower="-1.00" upper="1.00" />
    <axis xyz="0 1 0" />
  </joint>
	...
  <joint name="joint_left_wheel" type="revolute">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.30 0" rpy="0 0 0" />
    <!--New content-->
    <limit effort="30" velocity="1.0" lower="-1.00" upper="1.00" />
    <axis xyz="0 1 0" />
  </joint>
    ...

然后执行

roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot5_revolute.urdf gui:=True

效果如下
在这里插入图片描述

滑动关节(prismatic)

也称平移关节,找到之前的dd_robot5.urdf文件,并复制一份命名为dd_robot5_prismatic.urdf,并做出如下修改,看上去和revolute关节一样,但它们的lower和upper的单位一个是角度,一个是距离。

	...
  <joint name="joint_right_wheel" type="revolute">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <origin xyz="0 -0.30 0" rpy="0 0 0" />
    <!--New content-->
    <limit effort="30" velocity="1.0" lower="-3" upper="3" />
    <axis xyz="0 1 0" />
  </joint>
	...
  <joint name="joint_left_wheel" type="revolute">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <origin xyz="0 0.30 0" rpy="0 0 0" />
    <!--New content-->
    <limit effort="30" velocity="1.0" lower="-3" upper="3" />
    <axis xyz="0 1 0" />
  </joint>
    ...

然后执行

roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot5_prismatic.urdf gui:=True

效果如下,看上去有些不伦不类,但只是效果演示,但你要真说它是不伦不类还有点牵强,谁规定汽车轮子不能横移的呢?
在这里插入图片描述
在这里插入图片描述

浮动关节(floating)

//@TODO

平面关节(planar)

//@TODO

总结

名称说明
固定关节(Fixed)//@TODO
有限旋转关节(Revolute)//@TODO
无限旋转关节(Continous)//@TODO
滑动关节(Prismatic)//@TODO
浮动关节(Float)//@TODO
平面关节(Planar)//@TODO

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

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

相关文章

印度财团欲代工iPhone,路虎是前车之鉴,印度制造仍在梦中

随着印度财团塔塔收购纬创即将落寞&#xff0c;印度电子与科技国务部长强德拉谢克&#xff08;Rajeev Chandrasekhar&#xff09;为塔塔站台&#xff0c;表示两年内塔塔将制造iPhone并出口海外市场&#xff0c;印度制造将由此起飞。 一、印度制造在路虎上梦破 塔塔集团收购路虎…

手把手教你:如何用Java多线程模拟银行叫号服务

大家好&#xff0c;我是小米&#xff01;今天&#xff0c;我将和大家一起探讨一个非常有趣的话题——Java多线程模拟银行叫号服务。这不仅是一个有趣的编程练习&#xff0c;还可以帮助我们更好地理解多线程编程和并发控制。在这篇文章中&#xff0c;我将带领大家一步步实现一个…

cmd基本命令

一、cmd黑框是什么 cmd 是 Windows 命令提示符&#xff08;cmd.exe&#xff09;是 Windows NT 及以后的 Windows 系统下的一个用于运行 Windows 控制面板程序或某些 DOS 程序的shell程序&#xff1b;或在 Windows CE 下只用于运行控制面板程序的外壳程序。 二、打开步骤 wind…

Tornado downloadable工程和Tornado bootable工程

目录 Tornado downloadable工程Tornado bootable工程 Tornado downloadable工程和Tornado bootable工程是两个不同类型的Tornado项目。 Tornado downloadable工程 Tornado downloadable工程是指可以通过下载安装程序来安装的Tornado项目,通常用于Web应用程序。这种工程通常包…

相亲APP哪个好用?找对象的相亲软件哪个能脱单?

现在市面上的相亲APP非常多&#xff0c;质量也参差不齐&#xff0c;需要我们自己去辨别才能找到靠谱的&#xff0c;但是这很浪费时间。所以今天就分享几个我用过靠谱的相亲APP给大家参考&#xff0c;也算是提供一点经验。 1、一伴婚恋 这款相亲软件的优势在于&#xff0c;每个…

IOC课程整理-19 Spring Environment 抽象

1. 理解 Spring Environment 抽象 2. Spring Environment 接口使用场景 3. Environment 占位符处理 4. 理解条件配置 Spring Profiles 5. Spring 4 重构 Profile 6. 依赖注入 Environment 7. 依赖查找 Environment 8. 依赖注入 Value 9. Spring 类型转换在 Environment 中的运用…

使用dirhunt无需暴力破解即可扫描Web目录

Dirhunt 是一个针对搜索和分析目录进行优化的网络爬虫。如果服务器启用了“index of”模式&#xff0c;则该工具可以找到有趣的东西。如果未启用目录列表&#xff0c;Dirhunt 也很有用。它可以检测带有虚假 404 错误的目录、创建空索引文件以隐藏内容的目录等等。 Dirhunt 不使…

万字解析设计模式之工厂方法模式与简单工厂模式

一、概述 1.1简介 在java中&#xff0c;万物皆对象&#xff0c;这些对象都需要创建&#xff0c;如果创建的时候直接new该对象&#xff0c;就会对该对象耦合严重&#xff0c;假如我们要更换对象&#xff0c;所有new对象的地方都需要修改一遍&#xff0c;这显然违背了软件设计的…

麒麟KYLINOS2303版本上使用KDE桌面共享软件

原文链接&#xff1a;麒麟KYLINOS2303版本上使用KDE桌面共享软件 hello&#xff0c;大家好啊&#xff0c;今天给大家推荐一个在麒麟KYLINOS桌面操作系统2303版本上使用KDE桌面共享软件的文章&#xff0c;通过安装KDE桌面共享软件&#xff0c;可以让远程vnc客户端连接访问本机桌…

飞鼠异地组网工具基本使用教程

飞飞鼠异地组网工具基本使用教程 一、飞鼠工具介绍1.1 飞鼠工具简介1.2 飞鼠工具特点1.3 飞鼠工具使用场景1.4 飞鼠工具官网1.5 飞鼠工具版本介绍1.6 飞鼠工具节点类型 二、本次实践介绍2.1 本次实践简介2.2 本次环境规划 三、Docker环境安装工作3.1 master节点安装Docker3.2 子…

2023年【湖南省安全员-C证】新版试题及湖南省安全员-C证证考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 湖南省安全员-C证新版试题是安全生产模拟考试一点通总题库中生成的一套湖南省安全员-C证证考试&#xff0c;安全生产模拟考试一点通上湖南省安全员-C证作业手机同步练习。2023年【湖南省安全员-C证】新版试题及湖南省…

简历:了解常见的设计模式

一、请讲一讲设计模式的好处 在Java中应用设计模式有以下好处&#xff1a; 1. 提高代码的可维护性和可读性&#xff1a; 设计模式提供了一种结构化的方式来组织代码&#xff0c;使得代码更易于理解和修改。通过使用设计模式&#xff0c;开发人员可以遵循一致的设计原则和最佳…

BUUCTF rar 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 这个是一个rar文件&#xff0c;里面好像隐藏着什么秘密&#xff0c;但是压缩包被加密了&#xff0c;毫无保留的告诉你&#xff0c;rar的密码是4位纯数字。 密文&#xff1a; 下载附件&#xff0c;解压得到一个rar压…

保护自己免受AI诈骗的方法

前言 在21世纪&#xff0c;人工智能已经成为我们日常生活的一部分。不仅在聊天、写作、绘画和编程领域展现了巨大的潜力&#xff0c;还改变了我们的生活方式&#xff0c;提供了便捷和创新。然而&#xff0c;随着这一技术的迅速发展&#xff0c;我们也不得不面对新的威胁&#…

sql--索引使用

最左前缀法则&#xff08;联合索引&#xff09; 联合索引 位置不影响&#xff0c;但是所有索引必须连续使用&#xff0c;才会走索引 中间跳过则会造成后面索引则会失效 索引失效 规避方法---尽量使用> 或 < Explain需要重点关注的字段 Type key_leng possibl…

让AI成为你的编程助手——DevChat AI插件在VSCode中的应用

文章目录 1. 前言2. DevChat注册3. DevChat安装依赖安装插件安装 4. DevChat体验写代码5. 总结 1. 前言 随着人工智能技术的飞速发展&#xff0c;ChatGPT已经成为了这个领域的一股强大力量。它的出现&#xff0c;让我们看到了人工智能在自然语言处理方面的惊人能力&#xff0c…

业务设计——透明化实现用户敏感数据加解密和历史数据洗数

文章以 敏感数据安全性存储 为背景&#xff0c;讲述 ShardingSphere 完成数据加密上线&#xff0c;以及后续的业务系统加密改造的过程。 以下如无特殊说明&#xff0c;ShardingSphere-JDBC Starter 版本为 4.1.1。 业务背景 事情的起因是集团对于敏感数据安全的重视&#xff…

【LeetCode:274. H 指数 | 二分 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

《算法通关村—计算器|逆波兰问题解析》

《算法通关村—计算器|逆波兰问题解析》 计算器问题 描述 LeetCode227.给你一个字符串表达式 s &#xff0c;请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。 输入&#xff1a;s "32*2" 输出&#xff1a;7基本思路&#xff1a;理解题目&a…

1.1 计算机安全概念

思维导图&#xff1a; 前言&#xff1a; 第1章: 计算机与网络安全概念笔记 1. 学习目标 了解保密性、完整性和可用性的关键安全需求。了解OSI的X.800安全架构。识别和举例说明不同的安全威胁和攻击。掌握安全设计的基本准则。熟悉攻击面和攻击树的使用。了解与密码标准相关的…