当前位置: 首页 > news >正文

ROS实践(三)机器人描述文件xacro(urdf扩展)

目录

一、定义

二、xacro 文件常见组成部分

1. 命名空间声明

2. 定义宏

3. 调用宏

4. 定义参数

5. 条件语句 

6. 转换 xacro 文件为 urdf

7. gazebo标签

三、代码示例

 1. gazebo标签使用(仿真参数配置)

 2. 引用仿真配置并定义机器人模型(结构)

 四、加载仿真模型(含传感器的机器人)

1. 编写launch文件。

2. 实际效果。


一、定义

        通俗来说,xacro 就是 urdf 文件的一种“进阶版”,它是用来简化和优化机器人的描述文件,使得多个机器人可以共享同样的部件和结构,避免重复编写相同的代码。

        假设你有很多机器人,它们的结构相似,比如都有轮子、传感器、臂部等部件。每次你需要为这些机器人写 urdf 文件时,都要重复描述每个部件(比如轮子、关节、传感器等)。这样写非常繁琐且容易出错。

   xacro 的作用 :就是通过封装和参数化这些部件,使得你可以更方便地重用已有的结构,只需要少量的修改就可以生成不同机器人的 urdf 文件。类似C语言中函数的封装。

二、xacro 文件常见组成部分

1. 命名空间声明

        该命名空间的定义使得文件中的 xacro 特性能够正常工作,让你在模型中使用宏和其他 xacro 相关的功能。

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

2. 定义宏

        宏用于封装可复用的结构,例如机器人关节、链接等。你可以定义一个宏并在多个地方调用它,宏可以带有参数,这样就可以创建不同配置的部件。

<xacro:macro name="wheel" params="name x_offset y_offset"><!-- 定义轮子的link和joint -->
</xacro:macro>

3. 调用宏

        宏定义完成后,可以在 xacro 文件的任意位置调用宏来生成相应的部件。调用时,可以传递参数值来定制生成的部件。

<xacro:wheel name="right_wheel" x_offset="0.1" y_offset="-0.09"/>
<xacro:wheel name="left_wheel" x_offset="0.1" y_offset="0.09"/>

4. 定义参数

        你可以在 xacro 文件中定义变量(参数),这些变量可以在宏中使用,也可以传递给其它部分。这使得配置变得更加灵活和动态。

        在这个例子中,wheel_radius 是一个参数,表示轮子的半径。在后续的代码中,可以直接使用这个参数。

<xacro:property name="wheel_radius" value="0.025"/>

5. 条件语句 

  xacro 支持条件语句,你可以根据不同的条件生成不同的机器人模型或某些部件。例如,如果你希望某个部件只有在某个参数为 true 时才创建,你可以使用 xacro:ifxacro:else

<xacro:if value="${robot_type == 'mobile'}"><!-- 如果是移动机器人,添加特定部件 -->
</xacro:if>

6. 转换 xacro 文件为 urdf

        你可以使用 ROS 提供的工具来将 xacro 文件转换为 URDF 文件,生成的 URDF 文件可以直接用于机器人仿真、控制等。

rosrun xacro xacro mybot.xacro > mybot.urdf

7. gazebo标签

        在 XACRO 文件中,<gazebo> 标签用于定义与 Gazebo 仿真环境 相关的设置和插件。Gazebo 是一个强大的仿真工具,用于模拟机器人、传感器以及与环境的交互。当你在 XACRO 中使用 gazebo 标签时,通常是为了控制仿真中的物理属性、传感器和控制插件。这里将不再过多介绍该标签的用法,详细请查看其他博客。

三、代码示例

 1. gazebo标签使用(仿真参数配置)

        功能:用于描述一些物体以及传感器在gazebo仿真中的一些数据,例如摩擦系数、速度等等。

mybot_gazebo.xacro

<?xml version="1.0"?>
<robot name="mybot" xmlns:xacro="http://ros.org/wiki/xacro"><!-- 定义了3个参数:激光、相机和IMU的可视化开关 --><xacro:arg name="laser_visual" default="false"/><xacro:arg name="camera_visual" default="false"/><xacro:arg name="imu_visual"   default="false"/><!-- Gazebo仿真环境中为 base_link 设置物理材质 --><gazebo reference="base_link"><material>Gazebo/DarkGrey</material>  <!-- 使用 DarkGrey 材质 --></gazebo><!-- 为左轮设置物理属性,包括摩擦系数、刚度等 --><gazebo reference="left_wheel_link"><mu1>0.5</mu1>   <!-- 摩擦系数 --><mu2>0.5</mu2>   <!-- 摩擦系数 --><kp>500000.0</kp> <!-- 刚度 --><kd>10.0</kd>    <!-- 阻尼 --><minDepth>0.001</minDepth>  <!-- 最小深度 --><maxVel>1.0</maxVel>  <!-- 最大速度 --><fdir1>1 0 0</fdir1> <!-- 摩擦方向 --><material>Gazebo/DarkGrey</material>  <!-- 使用 DarkGrey 材质 --></gazebo><!-- 为右轮设置物理属性 --><gazebo reference="right_wheel_link"><mu1>0.5</mu1>   <!-- 摩擦系数 --><mu2>0.5</mu2>   <!-- 摩擦系数 --><kp>500000.0</kp> <!-- 刚度 --><kd>10.0</kd>    <!-- 阻尼 --><minDepth>0.001</minDepth>  <!-- 最小深度 --><maxVel>1.0</maxVel>  <!-- 最大速度 --><fdir1>1 0 0</fdir1> <!-- 摩擦方向 --><material>Gazebo/FlatBlack</material>  <!-- 使用 FlatBlack 材质 --></gazebo><!-- 为球形支撑轮设置物理属性 --><gazebo reference="ball_wheel_link"><mu1>0.1</mu1>   <!-- 摩擦系数 --><mu2>0.1</mu2>   <!-- 摩擦系数 --><kp>500000.0</kp> <!-- 刚度 --><kd>100.0</kd>   <!-- 阻尼 --><minDepth>0.001</minDepth>  <!-- 最小深度 --><maxVel>1.0</maxVel>  <!-- 最大速度 --><material>Gazebo/FlatBlack</material>  <!-- 使用 FlatBlack 材质 --></gazebo><!-- 定义 IMU 传感器的Gazebo设置 --><gazebo reference="imu"><sensor type="imu" name="imu"><always_on>true</always_on> <!-- IMU 始终开启 --><visualize>$(arg imu_visual)</visualize> <!-- 根据 imu_visual 参数来显示/隐藏 IMU --></sensor><material>Gazebo/FlatBlack</material>  <!-- 使用 FlatBlack 材质 --></gazebo><!-- 定义机器人控制插件,用于ROS控制 --><gazebo><plugin name="mybot_controller" filename="libgazebo_ros_diff_drive.so"><commandTopic>cmd_vel</commandTopic>   <!-- 控制命令话题 --><odometryTopic>odom</odometryTopic>   <!-- 里程计话题 --><odometryFrame>odom</odometryFrame>   <!-- 里程计坐标系 --><odometrySource>world</odometrySource> <!-- 里程计数据来源 --><publishOdomTF>true</publishOdomTF>   <!-- 是否发布里程计TF --><robotBaseFrame>base_footprint</robotBaseFrame> <!-- 机器人基座坐标系 --><publishWheelTF>false</publishWheelTF> <!-- 是否发布轮子坐标系 --><publishTf>true</publishTf>   <!-- 是否发布TF --><publishWheelJointState>true</publishWheelJointState> <!-- 是否发布轮子的关节状态 --><legacyMode>false</legacyMode> <!-- 是否使用旧版控制模式 --><updateRate>30</updateRate>   <!-- 控制更新率(30Hz) --><leftJoint>left_wheel_joint</leftJoint>  <!-- 左轮的关节 --><rightJoint>right_wheel_joint</rightJoint> <!-- 右轮的关节 --><wheelSeparation>0.180</wheelSeparation> <!-- 轮子间距 --><wheelDiameter>0.05</wheelDiameter>   <!-- 轮子直径 --><wheelAcceleration>10</wheelAcceleration> <!-- 轮子的加速度 --><wheelTorque>100</wheelTorque>   <!-- 轮子的最大扭矩 --><rosDebugLevel>na</rosDebugLevel>  <!-- 不使用ROS调试 --></plugin></gazebo><!-- 定义IMU插件 --><gazebo><plugin name="imu_plugin" filename="libgazebo_ros_imu.so"><alwaysOn>true</alwaysOn>  <!-- 始终开启 --><bodyName>imu</bodyName>   <!-- 传感器所在的身体名称 --><frameName>imu</frameName>  <!-- 传感器的框架名称 --><topicName>imu</topicName>  <!-- 传感器数据发布话题 --><serviceName>imu_service</serviceName> <!-- 服务名称 --><gaussianNoise>0.0</gaussianNoise>  <!-- 高斯噪声 --><updateRate>0</updateRate>  <!-- 更新频率 --><imu><noise><type>gaussian</type>  <!-- 噪声类型:高斯噪声 --><rate><mean>0.0</mean>   <!-- 速率噪声均值 --><stddev>2e-4</stddev> <!-- 速率噪声标准差 --><bias_mean>0.0000075</bias_mean>  <!-- 偏置均值 --><bias_stddev>0.0000008</bias_stddev> <!-- 偏置标准差 --></rate><accel><mean>0.0</mean>   <!-- 加速度噪声均值 --><stddev>1.7e-2</stddev> <!-- 加速度噪声标准差 --><bias_mean>0.1</bias_mean>  <!-- 加速度偏置均值 --><bias_stddev>0.001</bias_stddev>  <!-- 加速度偏置标准差 --></accel></noise></imu></plugin></gazebo><!-- 激光传感器设置 --><gazebo reference="base_laser_link"><material>Gazebo/FlatBlack</material>  <!-- 使用 FlatBlack 材质 --><sensor type="ray" name="rplidar_sensor"><pose>0 0 0 0 0 0</pose> <!-- 激光传感器的姿态 --><visualize>$(arg laser_visual)</visualize>  <!-- 根据 laser_visual 参数来显示/隐藏激光传感器 --><update_rate>7</update_rate>  <!-- 更新频率(7Hz) --><ray><scan><horizontal><samples>720</samples>  <!-- 扫描样本数 --><resolution>0.5</resolution>  <!-- 扫描分辨率 --><min_angle>0.0</min_angle>  <!-- 最小角度 --><max_angle>6.28319</max_angle> <!-- 最大角度 --></horizontal></scan><range><min>0.120</min>  <!-- 最小测距 --><max>12.0</max>   <!-- 最大测距 --><resolution>0.015</resolution> <!-- 距离分辨率 --></range><noise><type>gaussian</type>  <!-- 噪声类型:高斯噪声 --><mean>0.0</mean>   <!-- 噪声均值 --><stddev>0.01</stddev> <!-- 噪声标准差 --></noise></ray><!-- 激光控制插件 --><plugin name="gazebo_ros_rplidar_controller" filename="libgazebo_ros_laser.so"><topicName>scan</topicName>  <!-- 激光扫描数据话题 --><frameName>base_laser_link</frameName> <!-- 激光传感器的坐标框架 --></plugin></sensor></gazebo><!-- 摄像头传感器设置 --><gazebo reference="base_camera_link"><sensor type="camera" name="csi Camera"><always_on>true</always_on>  <!-- 摄像头始终开启 --><visualize>$(arg camera_visual)</visualize>  <!-- 根据 camera_visual 参数来显示/隐藏相机 --><camera><horizontal_fov>1.085595</horizontal_fov> <!-- 水平视场角 --><image><width>640</width>  <!-- 图像宽度 --><height>480</height> <!-- 图像高度 --><format>R8G8B8</format> <!-- 图像格式 --></image><clip><near>0.03</near>  <!-- 最近剪裁距离 --><far>100</far>  <!-- 最远剪裁距离 --></clip></camera><!-- 摄像头控制插件 --><plugin name="camera_controller" filename="libgazebo_ros_camera.so"><alwaysOn>true</alwaysOn>  <!-- 始终开启 --><updateRate>30.0</updateRate>  <!-- 更新频率(30Hz) --><cameraName>/</cameraName>  <!-- 摄像头名称 --><frameName>base_camera_link</frameName>  <!-- 相机坐标框架 --><imageTopicName>image_raw</imageTopicName>  <!-- 图像话题 --><cameraInfoTopicName>camera_info</cameraInfoTopicName>  <!-- 相机信息话题 --><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>

 2. 引用仿真配置并定义机器人模型(结构)

        功能:这段代码描述了一个机器人(mybot)的 物理模型和结构,代码通过定义多个链接(link)和关节(joint)来描述机器人的组成部分,包括主体、轮子、支撑轮、激光雷达等。当我们构建不同的机器人模型时,都可以引用之前的仿真配置。

        注意:这两个文件中的 <robot name="mybot" xmlns:xacro="http://ros.org/wiki/xacro"> 中的 name 字段应该一致。

mybot1.xacro 

<?xml version="1.0"?>  
<!-- 定义机器人模型文件 -->
<robot name="mybot" xmlns:xacro="http://ros.org/wiki/xacro">  <!-- 引入外部Xacro文件,包含 Gazebo 模拟器的配置 --><xacro:include filename="$(find my_package)/xacro/mybot_gazebo.xacro" /> <!-- 定义 base_footprint 链接,通常用于表示机器人的地面接触点 --><link name="base_footprint"/><!-- 定义机器人基座的固定关节,连接 base_footprint 和 base_link --><joint name="base_joint" type="fixed">  <parent link="base_footprint"/>  <child link="base_link"/>  <origin rpy="0 0 0" xyz="0 0 0"/>  <!-- 关节的位置和方向 --></joint>  <!-- 定义 base_link 链接,表示机器人的基座部分 --><link name="base_link">  <inertial>  <!-- 惯性属性 --><origin xyz="0 0 0" rpy="0 0 0"/>  <!-- 惯性坐标原点 --><mass value="0.1"/>  <!-- 质量 --><inertia ixx="0.0001"  ixy="0"  ixz="0" iyy="0.0001" iyz="0" izz="0.001" /> <!-- 惯性矩阵 --></inertial><visual>  <!-- 可视化属性 --><geometry>  <box size="0.25 0.16 0.05"/>  <!-- 形状为长方体,定义机器人的基座大小 --></geometry>  <!-- 几何形状 --><origin rpy="0 0 0" xyz="0 0 0"/> <!-- 可视化原点 --><material name="blue">  <color rgba="0 0 0.8 1"/>  <!-- 设置颜色为蓝色 --></material>  </visual>  <collision>  <!-- 碰撞检测属性 --><origin xyz="0 0 0" rpy="0 0 0"/>  <!-- 碰撞检测的原点 --><geometry>  <!-- 几何形状 --><box size="0.25 0.16 0.05"/>  <!-- 碰撞体形状为长方体,大小与可视化相同 --></geometry></collision></link>  <!-- 定义右侧车轮的链接 --><link name="right_wheel_link">  <inertial>  <!-- 惯性属性 --><origin xyz="0 0 0" rpy="0 0 0"/>  <!-- 惯性坐标原点 --><mass value="0.1"/>  <!-- 质量 --><inertia ixx="0.0001"  ixy="0"  ixz="0" iyy="0.0001" iyz="0" izz="0.0001" />  <!-- 惯性矩阵 --></inertial><visual>  <!-- 可视化属性 --><geometry>  <!-- 几何形状 --> <cylinder length="0.02" radius="0.025"/>  <!-- 车轮的形状为圆柱 --></geometry>  <material name="black">  <color rgba="0 0 0 1"/>  <!-- 设置车轮颜色为黑色 --></material>  </visual>  <collision><origin xyz="0 0 0" rpy="0 0 0"/>  <!-- 碰撞检测的原点 --><geometry><cylinder length="0.02" radius="0.025"/>  <!-- 碰撞体为圆柱 --></geometry></collision></link>  <!-- 定义右车轮的旋转关节,允许车轮持续旋转 --><joint name="right_wheel_joint" type="continuous">  <axis xyz="0 0 -1"/>  <!-- 旋转轴是 Z 轴负方向 --><parent link="base_link"/>  <!-- 父链接是基座链接 --><child link="right_wheel_link"/>  <!-- 子链接是右车轮链接 --><origin rpy="1.5707 0 0" xyz=" 0.1 -0.09 -0.03"/>  <!-- 关节的位置和方向 --></joint>  <!-- 定义左侧车轮的链接 --><link name="left_wheel_link">  <inertial>  <!-- 惯性属性 --><origin xyz="0 0 0" rpy="0 0 0"/>  <!-- 惯性坐标原点 --><mass value="0.1"/>  <!-- 质量 --><inertia ixx="0.0001"  ixy="0"  ixz="0" iyy="0.0001" iyz="0" izz="0.0001" />  <!-- 惯性矩阵 --></inertial><visual>  <!-- 可视化属性 --><geometry>  <!-- 几何形状 --><cylinder length="0.02" radius="0.025"/>  <!-- 车轮的形状为圆柱 --></geometry>  <material name="black">  <color rgba="0 0 0 1"/>  <!-- 设置车轮颜色为黑色 --></material>  </visual>  <collision><origin xyz="0 0 0" rpy="0 0 0"/><geometry><cylinder length="0.02" radius="0.025"/>  <!-- 碰撞体为圆柱 --></geometry></collision>   </link>  <!-- 定义左车轮的旋转关节 --><joint name="left_wheel_joint" type="continuous">  <axis xyz="0 0 -1"/>  <!-- 旋转轴是 Z 轴负方向 --><parent link="base_link"/>  <!-- 父链接是基座链接 --><child link="left_wheel_link"/>  <!-- 子链接是左车轮链接 --><origin rpy="1.5707 0 0" xyz="0.1 0.09 -0.03"/>  <!-- 关节的位置和方向 --></joint>  <!-- 定义一个球形支撑轮 --><link name="ball_wheel_link">  <inertial>  <!-- 惯性属性 --><origin xyz="0 0 0" rpy="0 0 0"/>  <!-- 惯性坐标原点 --><mass value="0.1"/>  <!-- 质量 --><inertia ixx="0"  ixy="0"  ixz="0" iyy="0" iyz="0" izz="0" />  <!-- 惯性矩阵 --></inertial><visual>  <!-- 可视化属性 --><geometry>  <!-- 几何形状 --><sphere radius="0.025"/>  <!-- 球形轮子 --></geometry>  <material name="black">  <color rgba="0 0 0 1"/>  <!-- 设置轮子颜色为黑色 --></material>  </visual>  <collision><origin xyz="0 0 0" rpy="0 0 0"/>  <!-- 碰撞检测的原点 --><geometry><sphere radius="0.025"/>  <!-- 碰撞体为球形 --></geometry></collision>   </link>  <!-- 定义球形支撑轮的固定关节 --><joint name="ball_wheel_joint" type="fixed">  <axis xyz="0 0 1"/>  <!-- 旋转轴是 Z 轴 --><parent link="base_link"/>  <child link="ball_wheel_link"/>  <origin rpy="0 0 0" xyz="-0.10 0 -0.03"/>  <!-- 关节的位置和方向 --></joint>  <!-- 定义IMU传感器 --><link name="imu">  <visual>  <geometry>  <box size="0.01 0.01 0.01"/>  <!-- 小方块表示IMU传感器 --></geometry>  <material name="white">  <color rgba="1 1 1 1"/>  <!-- 设置颜色为白色 --></material>  </visual>  </link>  <!-- 定义IMU传感器的固定关节 --><joint name="imu_joint" type="fixed">  <parent link="base_link"/>  <child link="imu"/>  <origin xyz="0.08 0 0.025"/>  <!-- 关节的位置和方向 --></joint> <!-- 定义摄像头 --><link name="base_camera_link">  <visual>  <!-- 可视化属性 --><geometry>  <!-- 几何形状 --><box size="0.02 0.03 0.03"/>  <!-- 以方块形式表示摄像头 --></geometry>  <material name="white">  <color rgba="1 1 1 1"/>  <!-- 设置颜色为白色 --></material>  </visual>  </link>  <!-- 定义摄像头的固定关节 --><joint name="camera_joint" type="fixed">  <parent link="base_link"/>  <child link="base_camera_link"/>  <origin xyz="0.1 0 0.025"/>  <!-- 关节的位置和方向 --></joint> <!-- 定义激光雷达 --><link name="base_laser_link">  <visual>  <!-- 可视化属性 --><geometry>  <!-- 几何形状 -->     <cylinder length="0.06" radius="0.04"/>  <!-- 激光雷达为圆柱形状 --></geometry>  <material name="white">  <color rgba="1 1 1 1"/>  <!-- 设置颜色为白色 --></material>  </visual>  </link>  <!-- 定义激光雷达的固定关节 --><joint name="laser_joint" type="fixed">  <parent link="base_link"/>  <child link="base_laser_link"/>  <origin xyz="0 0.0 0.06"/>  <!-- 位置在机器人顶部 --></joint> </robot>  

 四、加载仿真模型(含传感器的机器人)

1. 编写launch文件。

        最终我们运行的mybot1.xacro ,里面包含了机器人的模型和仿真配置文件。编写launch文件来启动仿真模型。代码中的gazebo_world.launch文件在下面文章中有介绍。ROS实践-虚拟仿真平台Stage/Gazebo(虚实结合)https://blog.csdn.net/qq_48361010/article/details/146096746?sharetype=blogdetail&sharerId=146096746&sharerefer=PC&sharesource=qq_48361010&spm=1011.2480.3001.8118

simulation_robot.launch

<launch><!-- 定义机器人模型位置的参数:x_pos、y_pos 和 z_pos,默认值为0 --><arg name="x_pos" default="0.0"/>  <!-- 机器人在 x 轴上的位置 --><arg name="y_pos" default="0.0"/>  <!-- 机器人在 y 轴上的位置 --><arg name="z_pos" default="0.0"/>  <!-- 机器人在 z 轴上的位置 --><!-- 设置仿真时间使用真实时间(/use_sim_time 为 true),通常用于 Gazebo 仿真 --><param name="/use_sim_time" value="true" />  <!-- 引入 Gazebo 仿真世界启动文件 (gazebo_world.launch),该文件定义了Gazebo世界环境 --><include file="$(find my_package)/launch/gazebo_world.launch"/><!-- 通过 xacro 文件生成机器人的 URDF 描述,并加载到 ROS 参数服务器中 --><param name="robot_description" command="$(find xacro)/xacro --inorder $(find my_package)/xacro/mybot1.xacro" /><!-- 启动 Gazebo 插件,将机器人模型(URDF)添加到 Gazebo 仿真环境中 --><node pkg="gazebo_ros" type="spawn_model" name="spawn_urdf" args="-urdf -model mybot.xacro -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos) -param robot_description" /><!-- 启动 robot_state_publisher 节点,用于发布机器人状态(例如各个关节的位置) --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
</launch>

注意:

2. 实际效果。

相关文章:

ROS实践(三)机器人描述文件xacro(urdf扩展)

目录 一、定义 二、xacro 文件常见组成部分 1. 命名空间声明 2. 定义宏 3. 调用宏 4. 定义参数 5. 条件语句 6. 转换 xacro 文件为 urdf 7. gazebo标签 三、代码示例 1. gazebo标签使用&#xff08;仿真参数配置&#xff09; 2. 引用仿真配置并定义机器人模型&#x…...

微信小程序从右向左无限滚动组件封装(类似公告)

组件代码 wxml代码 <view class"container"><view class"text-wrapper"><!-- 这两个都不能删除,用来放无限滚动的,第一个滚完第二个接上,第二个滚完第一个又接上了 --><text class"scroll-text text1" style"left: …...

前端面试:axios 请求的底层依赖是什么?

在前端开发中&#xff0c;Axios 是一个流行的 JavaScript 库&#xff0c;用于发送 HTTP 请求。它简化了与 RESTful APIs 的交互&#xff0c;并提供了许多便利的方法与配置选项。要理解 Axios 的底层依赖&#xff0c;需要从以下几个方面进行分析&#xff1a; 1. Axios 基于 XML…...

【小白向】Ubuntu|VMware 新建虚拟机后打开 SSH 服务、在主机上安装vscode并连接、配置 git 的 ssh

常常有人问VMware-Tools装了也复制粘贴不了怎么办&#xff0c;这个东西影响因素太多了&#xff0c;具体解决办法你们可以参考一下&#xff1a;【经验】VMware&#xff5c;虚拟机只能使用鼠标无法使用键盘、装不了或装了VMware-Tools无法复制粘贴的可能解决办法_增强型键盘驱动程…...

UVC摄像头命令推流,推到rv1126里面去

ffmpeg命令查询UVC设备 .\ffmpeg.exe -list_devices true -f dshow -i dummy 上图是查询UVC设备的效果图&#xff0c;画红框的部分是UVC设备的设备名称"USB2.0 PC CAMERA"和设备号 "device_pnp_\\?\usb#vid_1908&pid_2310&mi_00#8&39abfe5&0&a…...

Node.js 与 MongoDB:高效的企业级应用开发

Node.js 与 MongoDB:高效的企业级应用开发 引言 随着互联网技术的飞速发展,企业级应用开发的需求日益增长。作为现代Web开发的重要工具,Node.js凭借其高性能、轻量级的特点,已经成为构建高效、可扩展后端服务的首选技术之一。而MongoDB作为一种流行的NoSQL数据库,以其灵…...

【大模型学习】第十九章 什么是迁移学习

目录 1. 迁移学习的起源背景 1.1 传统机器学习的问题 1.2 迁移学习的提出背景 2. 什么是迁移学习 2.1 迁移学习的定义 2.2 生活实例解释 3. 技术要点与原理 3.1 迁移学习方法分类 3.1.1 基于特征的迁移学习(Feature-based Transfer) 案例说明 代码示例 3.1.2 基于…...

sql-labs less-1-5wp

目录标题 less-1判断列数查找数据库和版本信息查找数据库中的表爆破users表的列爆破xx表xx列的数据 Less-2判断类型判断注释符和回显点爆破数据库和版本信息爆破security数据库的表爆破users表的列名爆破表中数据 Less-3判断类型判断注释符和回显点爆破爆破版本号和数据库爆数据…...

Unity开发的抖音小游戏接入抖音开放平台中的流量主(抖音小游戏接入广告)

前言:作者在进行小游戏审核版本的过程中,碰到了下列问题,所以对这个抖音小游戏接入广告研究了下。 还有就是作者的TTSDK版本号是6.2.6,使用的Unity版本是Unity2022.3.29f1,最好和作者的两个版本号保持一致,因为我发现TTSDK旧版的很多函数在新版中就已经无法正常使用了,必…...

在Simulink中将Excel数据导入可变负载模块的方法介绍

文章目录 数据准备与格式要求Excel数据格式MATLAB预处理数据导入方法使用From Spreadsheet模块(直接导入Excel)通过MATLAB工作区中转(From Workspace模块)使用1-D Lookup Table模块(非线性负载映射)Signal Builder模块(变载工况导入)可变负载模块配置注意事项与调试在S…...

Html5记忆翻牌游戏开发经验分享

H5记忆翻牌游戏开发经验分享 这里写目录标题 H5记忆翻牌游戏开发经验分享前言项目概述技术要点解析1. 页面布局&#xff08;HTML CSS&#xff09;响应式设计 2. 翻牌动画效果3. 游戏逻辑实现状态管理卡片配对检测 开发技巧总结1. 模块化设计2. 性能优化3. 用户体验 踩坑经验扩…...

Centos离线安装openssl-devel

文章目录 Centos离线安装openssl-devel1. openssl-devel是什么&#xff1f;2. openssl-devel下载地址3. openssl-devel安装4. 安装结果验证 Centos离线安装openssl-devel 1. openssl-devel是什么&#xff1f; openssl-devel 是 Linux 系统中与 OpenSSL 加密库相关的开发包&…...

Spring Boot项目中集成sa-token实现认证授权和OAuth 2.0第三方登录

OAuth 2.0第三方登录 OAuth 2.0 是一种授权协议&#xff0c;允许第三方应用在不暴露用户密码的情况下访问用户的资源。它通常用于第三方登录场景&#xff0c;例如使用GitHub、Google等社交平台进行登录。 在sa-token框架中&#xff0c;OAuth 2.0第三方登录可以通过集成sa-tok…...

【机器学习】迁移学习(Transfer Learning)

迁移学习&#xff08;Transfer Learning&#xff09;作为一种机器学习方法&#xff0c;主要通过将源域中学到的知识迁移到目标域&#xff0c;解决目标域中数据不足或标注困难的问题&#xff0c;尤其在无监督学习如聚类任务中具有显著优势。迁移学习的关键思想包括领域适应、知识…...

接入手机后,DeepSeek难“转正”

2025开年之后&#xff0c;手机圈掀起了一场诡异的AI军备竞赛——争相接入DeepSeek。随着时间的推移&#xff0c;这股年初的狂热已然降温。 当潮水退去之后&#xff0c;暴露出手机AI领域的残酷真相&#xff1a;市面上手机自带的AI能力&#xff0c;没能像DeepSeek一样&#xff0c…...

全链条自研可控|江波龙汽车存储“双轮驱动”体系亮相MemoryS 2025

3月12日&#xff0c;MemoryS 2025在深圳盛大开幕&#xff0c;汇聚了存储行业的顶尖专家、企业领袖以及技术先锋&#xff0c;共同探讨存储技术的未来发展方向及其在商业领域的创新应用。江波龙董事长、总经理蔡华波先生受邀出席&#xff0c;并发表了题为《存储商业综合创新》的主…...

宇树ROS1开源模型在ROS2中Gazebo中仿真

以GO1为例 1. CMakelists.txt更新语法 cmake_minimum_required(VERSION 3.8) project(go1_description) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find…...

ubuntu 24 安装 python3.x 教程

目录 注意事项 一、安装不同 Python 版本 1. 安装依赖 2. 下载 Python 源码 3. 解压并编译安装 二、管理多个 Python 版本 1. 查看已安装的 Python 版本 2. 配置环境变量 3. 使用 update-alternatives​ 管理 Python 版本 三、使用虚拟环境为项目指定特定 Python 版本…...

Python数据类型进阶——详解

—— 小 峰 编 程 目录 1.整型 1.1 定义 1.2 独有功能 1.3 公共功能 1.4 转换 1.5 其他 1.5.1 长整型 1.5.2 地板除(除法&#xff09; 2. 布尔类型 2.1 定义 2.2 独有功能 2.3 公共功能 2.4 转换 2.5 其他 做条件自动转换 3.字符串类型 3.1 定义 3.2 独有功能…...

Flutter 按钮组件 TextButton 详解

目录 1. 引言 2. TextButton 的基本用法 3. 主要属性 4. 自定义按钮样式 4.1 修改文本颜色 4.2 添加背景色 4.3 修改按钮形状和边距 4.4 样式定制 5. 高级应用技巧 5.1 图标文本组合 5.2 主题统一配置 5.3 动态交互 6. 性能优化与注意事项 6.1 点击区域优化 6.…...

设置IDEA的内存

如何设置 IntelliJ IDEA 的内存以提升性能 一、引言 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于 Java、Kotlin、Scala 等多种编程语言的开发。它以其丰富的功能、智能的代码提示和高效的项目管理能力深受开发者喜爱。然而&…...

python编写的一个打砖块小游戏

游戏介绍 打砖块是一款经典的街机游戏&#xff0c;玩家控制底部的挡板&#xff0c;使球反弹以击碎上方的砖块。当球击中砖块时&#xff0c;砖块消失&#xff0c;球反弹&#xff1b;若球碰到挡板&#xff0c;则改变方向继续运动&#xff1b;若球掉出屏幕底部&#xff0c;玩家失…...

MySQL异常SQL排查

0、明确数据库异常SQL执行时间段&#xff0c;正常情况下耗时&#xff0c;当前耗时&#xff0c;如何感知到数据库慢的&#xff0c;是哪种类型的SQL&#xff0c;近期有做过相关的变更吗 1、检查数据库服务器的io iostat //查看延迟、读、写流量 sar -d /var/log/sa/sar日期 …...

AI智能代码疫苗技术,赋能数字化应用内生安全自免疫

“DevSecOps市占率持续领先&#xff0c;IAST探针覆盖率十倍增长&#xff0c;代码疫苗技术已成功帮助上千家行业用户成功抵御‘Log4j2.x’等重大未知漏洞的利用攻击。”子芽在腾讯专访中透露。 这是2021年悬镜安全交出的一张成绩单。悬镜安全是DevSecOps敏捷安全先行者&#xf…...

ASP.NET Webform和ASP.NET MVC 后台开发 大概80%常用技术

本文涉及ASP.NET Webform和ASP.NET MVC 后台开发大概80%技术 2019年以前对标 深圳22K左右 广州18K左右 武汉16K左右 那么有人问了2019年以后的呢&#xff1f; 答&#xff1a;吉祥三宝。。。 So 想继续看下文的 得有自己的独立判断能力。 C#.NET高级笔试题 架构 优化 性能提…...

计算机视觉领域开源数据集资源整理

1. 目标检测数据集 1.1 COCO2017 数据集 COCO2017 是 2017 年发布的 COCO 数据集的一个版本&#xff0c;主要用于 COCO 在 2017 年后持有的物体检测任务、关键点检测任务和全景分割任务。 1.2 火焰和烟雾图像数据集 数据集链接&#xff1a;http://m6z.cn/6fzn0f 该数据集由…...

idea更新git代码报错No Git Roots

idea更新git代码报错&#xff1a; No Git Roots None of configured Git roots are under Git. The configured directory must have ".git directory in it.但是本地项目里是存在.git文件的&#xff0c;就是突然间不能更新代码了 然后尝试重新拉新项目代码提示: Git i…...

flutter EventBus 的使用介绍

一、EventBus 初识 EventBus 是一个只有20多行的代码库, 通常用它来做事件分发。 EventBus 遵从 publish/subscribe 模式,即发布/订阅模式;简化了模块之间通信,对于项目的解耦很实用; 组件地址: https://github.com/marcojakob/dart-event-bus 源码: class EventBus…...

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器&#xff0c;以及如何使用 Spring Security OAuth2.0 将Spring Boot应用连接到 Keycloak 服务器。 2、Keycloak 是什么&#xff1f; Keycloak是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单点登…...

4-001:MySQL 中的索引数量是否越多越好?为什么?

MySQL 中的索引并不是越多越好&#xff0c;索引数量要合理控制&#xff01; &#x1f4cc; 过多索引的影响 增加存储开销 每个索引都会占用额外的磁盘空间&#xff0c;索引多了&#xff0c;存储成本增加。 降低 INSERT、UPDATE、DELETE 性能 任何涉及数据修改的操作&#xff…...

C++蓝桥杯皮亚诺曲线距离求解

C蓝桥杯皮亚诺曲线距离求解 一、题目概述二、解题分析2.1解题思路2.2k值范围限制 三、实现代码四、代码测试4.1蓝桥杯测试平台4.2直接传入原始输入的k值4.3限制k值大小4.4pow函数求整数高次幂存在误差4.5满分代码 附录error: ‘long long int y1’ redeclared as different kin…...

LabVIEW伺服阀高频振动测试

在伺服阀高频振动测试中&#xff0c;闭环控制系统的实时性与稳定性至关重要。针对用户提出的1kHz控制频率需求及Windows平台兼容性问题&#xff0c;本文重点分析NI PCIe-7842R实时扩展卡的功能与局限性&#xff0c;并提供其他替代方案的综合对比&#xff0c;以帮助用户选择适合…...

Linux 》》Ubuntu 18 LTS 之后的版本 修改IP地址 主机名

进入目录 /etc/netplan 修改 50-cloud-init.yaml 》保存文件后&#xff0c;执行以下命令应用更改&#xff1a; sudo netplan apply 》》 DHCP模式 修改主机名 hostnamectl set-hostname xxxx 修改cloud.cfg 防止重启主机名还原 但测试下来 不修改&#xff0c; 重启 也不会还…...

使用OpenCV和MediaPipe库——抽烟检测(姿态监控)

目录 抽烟检测的运用 1. 安全监控 (1) 公共场所禁烟监管 (2) 工业安全 2. 智能城市与执法 (1) 城市违章吸烟检测 (2) 无人值守管理 3. 健康管理与医疗 (1) 吸烟习惯分析 (2) 远程监护 4. AI 监控与商业分析 (1) 保险行业 (2) 商场营销 5. 技术实现 (1) 计算机视…...

为什么要使用前缀索引,以及建立前缀索引:sql示例

背景&#xff1a; 你想啊&#xff0c;数据库里有些字段&#xff0c;它老长了&#xff0c;就像那种 varchar(255) 的字段&#xff0c;这玩意儿要是整个字段都拿来建索引&#xff0c;那可太占地方了。打个比方&#xff0c;这就好比你要在一个超级大的笔记本上记东西&#xff0c;每…...

Android UDP广播与监听

在Android中&#xff0c;UDP广播和监听可以通过DatagramSocket和DatagramPacket来实现。UDP广播允许你将数据包发送到网络中的所有设备&#xff0c;而监听则允许你接收这些广播数据包。 1. 发送UDP广播 要发送UDP广播&#xff0c;你需要创建一个DatagramSocket&#xff0c;并使…...

谷粒商城:性能压测JVM堆区

目录 Kit Apache JMeter VisualVM 堆内存 jvm内存模型 垃圾回收&#xff08;Garbage Collection, GC&#xff09; 新对象分配内存 GC步骤 MinorGC 性能优化 影响因素 优化 nginx动静分离 优化三级分类获取 Jvm参数配置堆区 测试 Kit Apache JMeter 压力测试&…...

Redis项目_黑马点评

部署: 1. 导入sql 开发: Session登录: session的原理是cookie,每个session都有个唯一的sessionId, 在每次访问tomcat的时候sessionId就会自动的写在cookie当中, 携带着sessionId就能找到session, 所以不需要返回用户凭证 每一个进入tomcat的请求都是有一个独立的线程来处理…...

Golang Channel 使用详解、注意事项与死锁分析

#作者&#xff1a;西门吹雪 文章目录 一、引言&#xff1a;Channel 在 Go 并发编程中的关键地位二、Channel 基础概念深度剖析2.1 独特特性2.2 类型与分类细解 三、Channel 基本使用实操指南3.1 声明与初始化3.3 单向 Channel 的运用 四、Channel 典型使用场景实战案例4.1 协程…...

CSS 入门指南(一):基本概念 选择器 常用元素属性

一、初识 CSS 1, CSS 定义 层叠样式表(Cascading Style Sheets&#xff0c;缩写为 CSS)&#xff0c;是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现&#xff08;美化内容&#xff09; CSS 能够对网页中元素位置的排版进行 像素级 精确控制&#xff0c;实现美化页面…...

c_cpp_properties.json等三个文件解释

不建议太小白的人看啊 在 Visual Studio Code 中使用 C 语言进行编程时&#xff0c;通常会看到一些特定的配置文件。这些文件是用来帮助你配置开发环境、调试程序等 就是这三个文件 首先是c_cpp_properties.json&#xff1a; 这是 Visual Studio Code 配置 C/C 开发环境的文件。…...

G-Star 公益行起航,挥动开源技术点亮公益!

公益组织&#xff0c;一直是社会温暖的传递者&#xff0c;但在数字化浪潮中&#xff0c;也面临着诸多比大众想象中复杂的挑战&#xff1a;项目管理如何更高效&#xff1f;志愿者管理又该如何创新&#xff1f;宣传推广怎么才能更有影响力&#xff1f;内部管理和技术支持又该如何…...

Jetson Xavier NX安装CUDA加速的OpenCV

我们使用SDKManager刷机完成后&#xff0c;使用jtop查看&#xff0c;发现OpenCV 是不带CUDA加速的&#xff0c;因此&#xff0c;我们需要安装CUDA加速的OpenCV&#xff0c;这样后续在使用的时候速度会快很多。 首先我们先卸载默认OpenCV sudo apt purge libopencv* -y sudo …...

用android studio模拟器,模拟安卓手机访问网页,使用Chrome 开发者工具查看控制台信息

web 网页项目在安卓手机打开时出现问题&#xff0c;想要查看控制台调试信息。记录一下使用android studio 模拟器访问的方式。 步骤如下&#xff1a; 1.安装android studio&#xff0c;新增虚拟设备&#xff08;VDM- virtual device manager) 点击Virtual Device Manager后会…...

基于Transformer的医学文本分类:从BERT到BioBERT

随着自然语言处理(NLP)技术的快速发展,Transformer模型在文本分类、情感分析、机器翻译等任务中取得了显著成果。在医学领域,文本数据(如电子病历、医学文献、临床报告)具有高度的专业性和复杂性,传统的NLP方法往往难以处理。Transformer模型,尤其是BERT及其变体,通过…...

【Python】Django 中的算法应用与实现

Django 中的算法应用与实现 在 Django 开发中&#xff0c;算法的应用可以极大地扩展 Web 应用的功能和性能。从简单的数据处理到复杂的机器学习模型&#xff0c;Django 都可以作为一个强大的后端框架来支持这些算法的实现。本文将介绍几种常见的算法及其在 Django 中的使用方法…...

vs code配置 c/C++

1、下载VSCode Visual Studio Code - Code Editing. Redefined 安装目录可改 勾选创建桌面快捷方式 安装即可 2、汉化VSCode 点击确定 下载MinGW 由于vsCode 只是一个编辑器&#xff0c;他没有自带编译器&#xff0c;所以需要下载一个编译器"MinGW". https://…...

YOLO11 环境安装

1.安装Anaconda/Miniconda 在Ubuntu中安装Miniconda Anaconda/Miniconda pip 配置清华镜像源 Anaconda/Miniconda 基本操作命令 2.创建python虚拟环境 # 创建 conda create -n yolo11_env python3.12# 激活 conda activate yolo11_env 3.安装pytorch # Pytorch https://…...

BLEU评估指标

一、介绍 用于评估模型生成的句子和实际句子差异的指标&#xff0c;取值在[0,1]&#xff0c;匹配度高就距离1近&#xff0c;反之距离0近。这个指标计算代价小&#xff0c;容易理解&#xff0c;与语言无关&#xff0c;与人类评价结果高度相关。 BLEU主要基于n-gram匹配&#x…...

学习路之TP6 --重写vendor目录下的文件(新建命令)

[TOC](学习路之TP6 --重写vendor目录下的文件(新建命令)) 一、新建命令文件 php think make:command CustomWorker二、修改 复制vendor\topthink\think-worker\src\command\Server.php 内容到app\command\CustomWorker.php 修改继承类&#xff1a;class CustomWorker exten…...