ROS进阶:使用URDF和Xacro构建差速轮式机器人模型

前言

本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。

差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。

此次建模,不引入算法,只是把机器人模型的样子做出来,所以只使用 rivz 进行可视化显示。

机器人的定义和构成

  1. 机器人定义:机器人是一种自动化的机器,所不同的是这种机器具备一些与人或生物相似的智能能力,如感知能力、规划能力、动作能力和协同能力,是一种具有高级灵活性的自动化机器。目前,自动驾驶汽车也被认为是一种机器人。

  2. 机器人构成:机器人通常分为四大部分,即执行机构,驱动系统,传感系统和控制系统。以自动驾驶汽车为例,执行机构就是油门,转向和刹车;驱动系统就是电动机;传感系统就是各种传感器:lidar,radar,camera,uss,imu,GNSS;控制系统就是智驾算法系统:感知,定位,规划和控制。

  3. 机器人四大部分的控制回路,大致如图:

URDF建模套路

  1. URDF:Unified Robot Description Format,统一的机器人描述文件格式。urdf 文件使用 xml 格式。

  2. 用 urdf 描述机器人,套路如下:每个机器人都是由多个 link(连杆) 和 joint(关节)组成。这里的 link 和joint 很宽泛,形状不一定是杆和轴。比如桌子,桌面和腿都是link,连接处是固定的 joint。

<?xml version="1.0" ?>
<robot name="name of robot">
	<link> ... </link>
	<joint> ... </joint>
	...
</robot>

  1. link:描述机器人某个刚体部分的外观和物理属性。外观包括:尺寸,颜色,形状。物理属性包括:惯性矩阵(inertial matrix)和碰撞参数(collision properties)。在机器人建模中,每个link 都是一个坐标系。下面是差速轮式机器人底盘的建模,底盘一般称为 base。

  <link name="base_link">
  	// visual 标签就是外观
    <visual>
      // base_link本身是个坐标系,这也是差速轮式机器人各组成部分的根坐标系,一般会把他的坐标原点设置在rviz的中心处
      // origin表示底盘在其base_link坐标系下的原始位置和旋转状态
      // xyz表示底盘质心在base_link坐标系的偏移位置,rpy(roll,pitch,yaw)是底盘绕base_link的x,y,z三个轴的旋转值
      <origin xyz="0 0 0" rpy="0 0 0"/>
      // geometry是物体几何外形
      <geometry>
      	// 这里的底盘,用圆柱体表示,length值为高度,radius是半径值
        <cylinder length="0.16" radius="0.2"/>
      </geometry>
      // material是材料,这里指定底盘颜色为红色,rgba是三色+透明度表示法,三色的范围是0~1,而不是0-255
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
  </link>

这里我们只进行外观建模,因此暂不涉及物理属性配置。

  1. joint:描述两个 link 之间的关系,包括运动学和动力学属性,这里暂时只关注运动学属性。通常情况下,两个 link 的关系一般分为六种:

continuous:旋转关节,可以围绕单轴360度无限旋转,比如轮子的轴

revolute:旋转关节,但是有旋转角度的范围限制,比如钟摆

prismatic:滑动关节,也叫活塞关节,沿某一轴线移动的关节,有位置限制,强调一维,比如打气筒

planar:平面关节,允许在平面正交方向上平移或旋转,强调平面,比如抽屉内外滑动

floating:浮动关节,允许进行平移和旋转运动,比如人体的肩关节

fixed:固定关节,比如桌子腿和桌面

下面是差速轮式机器人主动轮与底盘的 joint 样例:

  // joint标签就是关节,type表示链接关系
  <joint name="left_wheel_joint" type="continuous">
    // origin表示轮子在base_link坐标系下的偏移和旋转
    <origin xyz="0 0.19 -0.05" rpy="0 0 0" />
    // 根link是底盘,子link是轮子
    <parent link="base_link" />
    <child link="left_wheel_link" />
    // axis描述的轮子相对于其自身坐标系的 y 轴旋转,=
    <axis xyz="0 1 0" />
  </joint>
  
  // 这是轮子link
  <link name="left_wheel_link">
    <visual>
      // 轮子相当于其x轴,旋转90度,也就是立起来
      <origin xyz="0 0 0" rpy="1.5707 0 0"/>
      <geometry>
        <cylinder length="0.06" radius="0.06"/>
      </geometry>
      <material name="white">
        <color rgba="1 1 1 0.9"/>
      </material>
    </visual>
  </link>

使用URDF做一个差速轮式机器人模型

  1. 创建 mbot_description 软件包及相关文件

cd ~/catkin_ws/src
catkin_create_pkg mbot_description urdf xacro

cd mbot_description 
mkdir -p config doc launch meshes urdf/sensor
touch launch/display_mbot_urdf.launch launch/display_mbot_xacro.launch
touch urdf/mbot_base.urdf urdf/mbot_base.xacro
touch urdf/sensor/camera.xacro urdf/sensor/kinect.xacro urdf/sensor/laser.xacro
  1. mbot_base.urdf :这是整个mbot建模的文件,包括底盘,两个动力伦,两个万向轮,一个camera,一个kinect(深度相机),一个lidar。

<?xml version="1.0" ?>
<robot name="mbot">

  <link name="base_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder length="0.16" radius="0.2"/>
      </geometry>
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="left_wheel_joint" type="continuous">
    <origin xyz="0 0.19 -0.05" rpy="0 0 0" />
    <parent link="base_link" />
    <child link="left_wheel_link" />
    <axis xyz="0 1 0" />
  </joint>

  <link name="left_wheel_link">
    <visual>
      <origin xyz="0 0 0" rpy="1.5707 0 0"/>
      <geometry>
        <cylinder length="0.06" radius="0.06"/>
      </geometry>
      <material name="white">
        <color rgba="1 1 1 0.9"/>
      </material>
    </visual>
  </link>

  <joint name="right_wheel_joint" type="continuous">
    <origin xyz="0 -0.19 -0.05" rpy="0 0 0" />
    <parent link="base_link" />
    <child link="right_wheel_link" />
    <axis xyz="0 1 0" />
  </joint>

  <link name="right_wheel_link">
    <visual>
      <origin xyz="0 0 0" rpy="1.5707 0 0"/>
      <geometry>
        <cylinder length="0.025" radius="0.06" />
      </geometry>
      <material name="white">
        <color rgba="1 1 1 0.9"/>
      </material>
    </visual>
  </link>

  <joint name="front_caster_joint" type="continuous">
    <origin xyz="0.18 0 -0.095" rpy="0 0 0" />
    <parent link="base_link"/>
    <child link="front_caster_link" />
    <axis xyz="0 1 0" />
  </joint>

  <link name="front_caster_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <sphere radius="0.015" />
      </geometry>
      <material name="white">
        <color rgba="1 1 1 0.9"/>
      </material>
    </visual>
  </link>

  <joint name="back_caster_joint" type="continuous">
    <origin xyz="-0.18 0 -0.095" rpy="0 0 0" />
    <parent link="base_link"/>
    <child link="back_caster_link" />
    <axis xyz="0 1 0" />
  </joint>

  <link name="back_caster_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <sphere radius="0.015" />
      </geometry>
      <material name="white">
        <color rgba="1 1 1 0.9"/>
      </material>
    </visual>
  </link>

  <joint name="camera_joint" type="fixed">
    <origin xyz="-0.17 0 0.1" rpy="0 0 0" />
    <parent link="base_link"/>
    <child link="camera_link" />    
  </joint>

  <link name="camera_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <box size="0.03 0.04 0.04" />
      </geometry>
      <material name="grey">
        <color rgba="0.5 0.5 0.5 1"/>
      </material>
    </visual>
  </link>

  <joint name="stage_joint" type="fixed">
    <origin xyz="0 0 0.14" rpy="0 0 0" />
    <parent link="base_link"/>
    <child link="stage_link" />    
  </joint>

  <link name="stage_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder length="0.12" radius="0.1"/>
      </geometry>
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="laser_joint" type="fixed">
    <origin xyz="0 0 0.085" rpy="0 0 0" />
    <parent link="stage_link"/>
    <child link="laser_link" />    
  </joint>

  <link name="laser_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0" />
      <geometry>
        <cylinder length="0.05" radius="0.05"/>
      </geometry>
      <material name="grey">
        <color rgba="0.5 0.5 0.5 1"/>
      </material>
    </visual>
  </link>

  <joint name="kinect_joint" type="fixed">
    <origin xyz="0.15 0 0.11" rpy="0 0 0" />
    <parent link="base_link"/>
    <child link="kinect_link" />    
  </joint>

  <link name="kinect_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 1.5708" />
      <geometry>
        // 使用三维软件导出的模型文件
        <mesh filename="package://mbot_description/meshes/kinect.dae" />
      </geometry>
    </visual>
  </link>
</robot>
  1. display_mbot_urdf.launch

<launch>
  // 设置ros的全局参数robot_description,指定机器人模型文件
  <param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />

	<!-- 设置GUI参数,显示关节控制插件 -->
	// 用这个可以控制机器人关节,但本文的demo没看到这个,有点遗憾
	<param name="use_gui" value="true"/>

	<!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

	<!-- 运行robot_state_publisher节点,发布tf  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

	// robot_state_publisher结合joint_state_publisher可以实时把机器人各关节和各坐标系关系发布出来,让rviz显示。如果不设置,rviz无法完整加载机器人模型。
	// rviz显示后会生成配置文件,保存后再打开,就不用频繁设置了。
	<!-- 运行rviz可视化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />

</launch>
  1. 使用 urdf_to_graphiz 命令行工具可以把 urdf 文件的内容,以树的样子dump出来,格式是pdf。使用这个可以快速读取 urdf 的 link 和 joint,下图是上面例子的节点树状图。

cd ~/catkin_ws/
urdf_to_graphiz src/mbot_description/urdf/mbot_base.urdf

  1. 编译和运行

cd ~/catkin_ws/
catkin_make --source src/mbot_description
source devel/setup.bash
roslaunch mbot_description display_mbot_urdf.launch

使用xacro优化差速轮式机器人模型

  1. 原始的urdf语法比较简单,导致机器人模型文件比较冗长啰嗦,比如两个动力轮,两个万向轮的编写就非常重复。ROS 提出了xacro语法,让机器人模型文件具有可编程能力,比如设置参数,定义宏函数并调用,文件包含等。下面进行分类举例:设置并调用参数:

   // xacro:property设置参数
  <xacro:property name="M_PI" value="3.1415926" />
  // 引用参数用${}
  <origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>

设置宏函数并调用:

  // xacro:macro设置宏函数,名字是wheel,参数是prefix 和 reflect
  <xacro:macro name="wheel" params="prefix reflect">
    <joint name="${prefix}_wheel_joint" type="continuous">
      <origin xyz="${wheel_joint_x} ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0" />
      <parent link="base_link" />
      <child link="${prefix}_wheel_link" />
      <axis xyz="0 1 0" />
    </joint>

    <link name="${prefix}_wheel_link">
      <visual>
        <origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>
        <geometry>
          <cylinder length="${wheel_length}" radius="${wheel_radius}"/>
        </geometry>
        <material name="white" />
      </visual>
    </link>
  </xacro:macro>
  // 调用wheel宏函数
  <xacro:wheel prefix="left"  reflect="1"/>  
  <xacro:wheel prefix="right"  reflect="-1"/>  

文件包含

  // xacro:include是文件包含,camera.xacro里面定义了一个宏函数
  <xacro:include filename="$(find mbot_description)/urdf/sensor/camera.xacro" />
  // 调用camera.xacro里面的宏函数
  <xacro:usb_camera joint_x="${camera_joint_x}" joint_y="${camera_joint_y}" joint_z="${camera_joint_z}"/>  
  1. 这里的几个文件是对上面的mbot_base.urdf的重写,使用xacro,具体语法看上面的解释。mbot_base.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
  <xacro:property name="M_PI" value="3.1415926" />

  <xacro:property name="wheel_joint_x" value="0" />
  <xacro:property name="wheel_joint_y" value="0.19" />
  <xacro:property name="wheel_joint_z" value="0.05" />

  <xacro:property name="wheel_length" value="0.06" />
  <xacro:property name="wheel_radius" value="0.06" />

  <xacro:property name="caster_joint_x" value="0.18" />
  <xacro:property name="caster_joint_y" value="0" />
  <xacro:property name="caster_joint_z" value="0.095" />  

  <xacro:property name="caster_radius" value="0.015" />

  <xacro:property name="base_length" value="0.16" />
  <xacro:property name="base_radius" value="0.2" />

  <xacro:property name="stage_length" value="0.12" />
  <xacro:property name="stage_radius" value="0.1" />

  <xacro:property name="camera_joint_x" value="0.17" />
  <xacro:property name="camera_joint_y" value="0" />
  <xacro:property name="camera_joint_z" value="0.1" />  

  <xacro:property name="kinect_joint_x" value="0.15" />
  <xacro:property name="kinect_joint_y" value="0" />
  <xacro:property name="kinect_joint_z" value="0.11" />  

  <xacro:property name="laser_joint_x" value="0" />
  <xacro:property name="laser_joint_y" value="0" />
  <xacro:property name="laser_joint_z" value="0.085" />  

  <material name="white">
    <color rgba="1 1 1 0.9"/>
  </material>
  <material name="red">
    <color rgba="1 0 0 1"/>
  </material>

  <material name="grey">
    <color rgba="0.5 0.5 0.5 1"/>
  </material>

  <xacro:macro name="base_stage">
    <link name="base_link">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 0"/>
        <geometry>
          <cylinder length="${base_length}" radius="${base_radius}"/>
        </geometry>
        <material name="red" />
      </visual>
    </link>

    <joint name="stage_joint" type="fixed">
      <origin xyz="0 0 ${(base_length + stage_length)/2}" rpy="0 0 0" />
      <parent link="base_link"/>
      <child link="stage_link" />    
    </joint>

    <link name="stage_link">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 0"/>
        <geometry>
          <cylinder length="${stage_length}" radius="${stage_radius}"/>
        </geometry>
        <material name="red" />
      </visual>
    </link>
  </xacro:macro>

  <xacro:macro name="wheel" params="prefix reflect">
    <joint name="${prefix}_wheel_joint" type="continuous">
      <origin xyz="${wheel_joint_x} ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0" />
      <parent link="base_link" />
      <child link="${prefix}_wheel_link" />
      <axis xyz="0 1 0" />
    </joint>

    <link name="${prefix}_wheel_link">
      <visual>
        <origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>
        <geometry>
          <cylinder length="${wheel_length}" radius="${wheel_radius}"/>
        </geometry>
        <material name="white" />
      </visual>
    </link>
  </xacro:macro>

  <xacro:macro name="caster" params="prefix reflect">
    <joint name="${prefix}_caster_joint" type="continuous">
      <origin xyz="${reflect*caster_joint_x} ${caster_joint_y} ${-caster_joint_z}" rpy="0 0 0" />
      <parent link="base_link"/>
      <child link="${prefix}_caster_link" />
      <axis xyz="0 1 0" />
    </joint>

    <link name="${prefix}_caster_link">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <geometry>
          <sphere radius="${caster_radius}" />
        </geometry>
        <material name="white" />
      </visual>
    </link>
  </xacro:macro>

  <xacro:base_stage />  
  <xacro:wheel prefix="left"  reflect="1"/>  
  <xacro:wheel prefix="right"  reflect="-1"/>  

  <xacro:caster prefix="front"  reflect="1"/>  
  <xacro:caster prefix="back"  reflect="-1"/>  

  <xacro:include filename="$(find mbot_description)/urdf/sensor/camera.xacro" />
  <xacro:usb_camera joint_x="${camera_joint_x}" joint_y="${camera_joint_y}" joint_z="${camera_joint_z}"/>  

  <xacro:include filename="$(find mbot_description)/urdf/sensor/kinect.xacro" />
  <xacro:kinect joint_x="${kinect_joint_x}" joint_y="${kinect_joint_y}" joint_z="${kinect_joint_z}"/>  

  <xacro:include filename="$(find mbot_description)/urdf/sensor/laser.xacro" />
  <xacro:laser joint_x="${laser_joint_x}" joint_y="${laser_joint_y}" joint_z="${laser_joint_z}"/>  

</robot>

camera.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">
  <xacro:macro name="usb_camera" params="joint_x joint_y joint_z">
    <joint name="camera_joint" type="fixed">
      <origin xyz="${-joint_x} ${joint_y} ${joint_z}" rpy="0 0 0" />
      <parent link="base_link"/>
      <child link="camera_link" />    
    </joint>

    <link name="camera_link">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <geometry>
          <box size="0.03 0.04 0.04" />
        </geometry>
        <material name="grey" />
      </visual>
    </link>
  </xacro:macro>
</robot>

kinect.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">

  <xacro:macro name="kinect" params="joint_x joint_y joint_z">
    <joint name="kinect_joint" type="fixed">
      <origin xyz="${joint_x} ${joint_y} ${joint_z}" rpy="0 0 0" />
      <parent link="base_link"/>
      <child link="kinect_link" />    
    </joint>

    <link name="kinect_link">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 1.5708" />
        <geometry>
          <mesh filename="package://mbot_description/meshes/kinect.dae" />
        </geometry>
      </visual>
    </link>
  </xacro:macro>

</robot>

laser.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro">

  <xacro:macro name="laser" params="joint_x joint_y joint_z">
    <joint name="laser_joint" type="fixed">
      <origin xyz="${joint_x} ${joint_y} ${joint_z}" rpy="0 0 0" />
      <parent link="stage_link"/>
      <child link="laser_link" />    
    </joint>

    <link name="laser_link">
      <visual>
        <origin xyz="0 0 0" rpy="0 0 0" />
        <geometry>
          <cylinder length="0.05" radius="0.05"/>
        </geometry>
        <material name="grey"/>
      </visual>
    </link>
  </xacro:macro>
</robot>
  1. display_mbot_xacro.launch

<launch>
	// 引入xacro的解释器,不然无法读取 .xacro文件
	<arg name="model" default="$(find xacro)/xacro '$(find mbot_description)/urdf/mbot_base.xacro'" />

	<param name="robot_description" command="$(arg model)" />

	<!-- 设置GUI参数,显示关节控制插件 -->
	<param name="use_gui" value="true"/>

	<!-- 运行joint_state_publisher节点,发布机器人的关节状态  -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

	<!-- 运行robot_state_publisher节点,发布tf  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />

	<!-- 运行rviz可视化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_xacro.rviz" required="true" />

</launch>
  1. 运行效果如下,这里显示了坐标系轴

部分配置代码

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

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

相关文章

Java 网络编程(二)—— TCP流套接字编程

TCP 和 UDP 的区别 在传输层&#xff0c;TCP 协议是有连接的&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工 而UDP 协议是无连接的&#xff0c;不可靠传输&#xff0c;面向数据报&#xff0c;全双工 有连接和无连接的区别是在进行网络通信的时候&#xff0c;…

YOLOv8改进,YOLOv8通过RFAConv卷积创新空间注意力和标准卷积,包括RFCAConv, RFCBAMConv,二次创新C2f结构,助力涨点

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…

Python调用API翻译Excel中的英语句子并回填数据

一、问题描述 最近遇到一个把Excel表中两列单元格中的文本读取&#xff0c;然后翻译&#xff0c;再重新回填到单元格中的案例。大约有700多行&#xff0c;1400多个句子&#xff0c;一个个手动复制粘贴要花费不少时间&#xff0c;而且极易出错。这时&#xff0c;我们就可以请出…

虚拟化数据恢复—ESX SERVER共享的STORAGE中分区表被清零的数据恢复案例

虚拟化数据恢复环境&故障&#xff1a; 某单位信息管理平台&#xff0c;数台VMware ESX SERVER共享一台某品牌DS4100存储。 vc报告虚拟磁盘丢失&#xff0c;管理员ssh到ESX中执行fdisk -l查看磁盘&#xff0c;发现STORAGE中的分区表不见了。重启所有设备后&#xff0c;ESX S…

无效的目标发行版17和无法连接Maven进程问题

起因&#xff1a;我clean了一个模块的Maven想要重新下&#xff0c;他就开始报错。两次了都是这样。如果和我一样一开始都是好好的&#xff0c;直接找Maven的设置&#xff0c;在运行程序改&#xff0c;jre变成了11.它自己变成了我其他的jdk

在Docker环境下为Nginx配置HTTPS

前言 配置HTTPS已经成为网站部署的必要步骤。本教程将详细介绍如何在Docker环境下为Nginx配置HTTPS&#xff0c;使用自签名证书来实现加密通信。虽然在生产环境中建议使用权威CA机构颁发的证书&#xff0c;但在开发测试或内网环境中&#xff0c;自签名证书是一个很好的选择。 …

英伟达基于Mistral 7B开发新一代Embedding模型——NV-Embed-v2

我们介绍的 NV-Embed-v2 是一种通用嵌入模型&#xff0c;它在大规模文本嵌入基准&#xff08;MTEB 基准&#xff09;&#xff08;截至 2024 年 8 月 30 日&#xff09;的 56 项文本嵌入任务中以 72.31 的高分排名第一。此外&#xff0c;它还在检索子类别中排名第一&#xff08;…

24 年第十届数维杯国际数模竞赛赛题浅析

本次万众瞩目的数维杯国际大学生数学建模赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是数模届的独一档&#xff0c;含金量极高&#xff0c;可以用于综测加分、保研、简历添彩等各方面。考虑到大家解题实属不易&#xff0c;为了帮助大家取得好成绩…

SOP搭建:企业标准化操作程序构建与实施指南

一、引言 在当今充满竞争的商业领域&#xff0c;实现企业运营的标准化、高效化和高质量化是提升企业市场竞争力的关键所在。标准操作程序&#xff08;SOP&#xff09;作为一种至关重要的管理工具&#xff0c;能够清晰地阐述业务流程&#xff0c;规范操作行为&#xff0c;并促进…

【每日刷题】Day156

【每日刷题】Day156 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1020. 飞地的数量 - 力扣(LeetCode) 2. 1765. 地图中的最高点 - 力扣(LeetCode) 3. 1162. 地图分…

J.U.C - 深入解读Condition条件变量原理源码

文章目录 Pre概述Condition 主要方法Condition案例Condition的源码解析1. 等待&#xff1a;condition. await2. 唤醒Condition. signal Condition总结 Pre J.U.C - 深入解析ReentrantLock原理&源码 概述 配合synchronized同步锁在同步代码块中调用加锁对象notify和wait方…

c++ 类和对象(中)

前言 我们看看下面的代码以及代码运行结果 代码1 我们可以看到在我们的类Data中的函数成员print中&#xff0c;我们并没有设置形参&#xff0c;在调用此函数时&#xff0c;也并没有多余传参&#xff0c;但是我们调用它时&#xff0c;却能准确打印出我们的_year、_month、_day…

python:用 sklearn 构建 K-Means 聚类模型

pip install scikit-learn 或者 直接用 Anaconda3 sklearn 提供了 preprocessing 数据预处理模块、cluster 聚类模型、manifold.TSNE 数据降维模块。 编写 test_sklearn_3.py 如下 # -*- coding: utf-8 -*- """ 使用 sklearn 构建 K-Means 聚类模型 "&…

使用python编写工具:快速生成chrome插件相关文件结构

本文将详细分析一段用 wxPython 编写的 Python 应用程序代码。该程序允许用户创建一些特定文件并将它们保存在指定的文件夹中&#xff0c;同时也能够启动 Google Chrome 浏览器并打开扩展页面&#xff0c;自动执行一些操作。 C:\pythoncode\new\crxiterationtaburl.py 全部代码…

使用Web Components构建模块化Web应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 使用Web Components构建模块化Web应用 引言 Web Co…

谷歌浏览器的自动翻译功能如何开启

在当今全球化的网络环境中&#xff0c;能够流畅地浏览不同语言的网页是至关重要的。谷歌浏览器&#xff08;Google Chrome&#xff09;提供了一项强大的自动翻译功能&#xff0c;可以帮助用户轻松跨越语言障碍。本文将详细介绍如何开启和使用谷歌浏览器的自动翻译功能&#xff…

算法---解决“汉诺塔”问题

# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…

uniapp对接极光推送,实现消息推送功能

通过集成JG-JPush和JG-JCore插件&#xff0c;可以在应用中添加消息推送功能&#xff0c;向用户发送通知、消息等。这对于提升用户体验、增加用户粘性非常有帮助‌。 效果图&#xff1a; 一、登录极光官网 进入【服务中心】-【开发者平台】 创建应用&#xff1a;【概览】- 【创…

redis高性能键值数据库技术简介

什么是redis redis是远程字典服务&#xff08;Remote Dictionary Server &#xff09;的简写&#xff0c;是一个完全开源的高性能的Key-Value数据库&#xff0c;提供了丰富的数据结构如string、Hash、List、SetSortedset等等。数据是存在内存中的&#xff0c;同时Redis支持事务…

进程信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 Core Dump 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异…