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

ROS实践(二)构建Gazebo机器人模型文件urdf

目录

一、基础语法

1. urdf文件组成

2. robot根标签

3. link 和 joint标签

 4. sensor标签

二、 实验:使用launch文件启动rviz查看机器人模型

 1. 编写机器人模型的urdf文件。

2. 编写launch文件。

3. 运行launch,查看效果。


     

   URDF(Unified Robot Description Format)是一种基于XML的格式,用于描述机器人模型的结构、关节、连杆和传感器信息,并可以与Gazebo、RViz等仿真环境结合使用。

一、基础语法

1. urdf文件组成

URDF 主要由以下几个核心元素(标签)组成:

(1)一级标签(根标签)

<robot> <!--根标签-->

(2)二级标签

        根标签是 robot,而二级标签通常是在 robot 标签内定义的具体组件和元素。以下是一些常见的二级标签:

<link>        <!-- 定义一个刚体部分 -->
<joint>       <!-- 定义两个链接之间的连接及其运动方式 -->
<sensor>      <!-- 定义传感器 -->
<transmission> <!-- 定义传动方式,主要用于控制器与电机连接 -->
<material>    <!-- 定义材质属性 -->
<geometry>    <!-- 定义几何形状,用于可视化 -->
<visual>      <!-- 定义视觉表示,用于渲染和模拟 -->
<collision>   <!-- 定义碰撞体积,用于物理引擎 -->
<inertial>    <!-- 定义惯性矩阵,用于物理仿真 -->
<frame>       <!-- 定义坐标系 -->

(3)三级标签

        在 URDF 中,三级标签通常是用于具体配置和描述某个二级标签的更多详细信息。以下是一些常见的三级标签,它们一般位于二级标签内部。

<geometry>       <!-- 用于定义物体的几何形状 --><box>         <!-- 定义立方体的几何形状 --><cylinder>    <!-- 定义圆柱体的几何形状 --><sphere>      <!-- 定义球形几何形状 --><mesh>        <!-- 定义网格形状 -->
</geometry><visual>         <!-- 定义可视化表示 --><material>    <!-- 定义可视化的材质 --><ambient> <!-- 环境光 --><diffuse> <!-- 漫反射光 --><specular> <!-- 高光反射 --></material>
</visual><collision>      <!-- 定义碰撞体积 --><geometry>    <!-- 定义碰撞体积的几何形状 --><box>     <!-- 立方体 --><cylinder><!-- 圆柱体 --><sphere>  <!-- 球体 --></geometry>
</collision><inertial>       <!-- 定义惯性属性 --><mass>        <!-- 质量 --><inertia>     <!-- 惯性矩阵 -->
</inertial><origin>         <!-- 定义元素在坐标系中的位置和姿态 --><xyz>         <!-- 定义位置 --><rpy>         <!-- 定义旋转角度 -->
</origin><transmission>   <!-- 定义传动系统 --><actuator>    <!-- 定义执行器 --><hardwareInterface> <!-- 定义硬件接口 --></actuator>
</transmission>

2. robot根标签

        URDF 中为了保证 XML 语法的完整性,使用 <robot> 标签作为根标签,所有的 <link><joint> 以及其他标签都必须包含在 <robot> 标签内。在该标签内,可以通过 name 属性设置机器人模型的名称。所有其他标签(如 <link><joint><material><transmission> 等)都是 <robot> 的子级标签。

<?xml version="1.0"?>
<robot name="simple_robot">  <!-- 名称自定 --><!-- 这里是机器人模型的内容 -->
</robot>

3. link 和 joint标签

简述:在机器人模型中,link1link2 分别代表类似于人的大臂和小臂的刚体部分,而 joint 则类似于肘关节,负责连接这两个部件并允许它们相对运动(例如,肘部的弯曲)。

(1)<link>

  link 代表机器人中的一个刚性部件,例如机械臂的一个关节、轮式机器人的车轮等。link 主要包含以下元素:

  • <inertial>:描述 link 的惯性,包括质量、质心和惯性矩阵。
  • <visual>:定义 link 的外观(几何形状、颜色、材质)。
  • <collision>:定义物理仿真中 link 的碰撞形状(通常比 visual 简化)。
<?xml version="1.0"?>
<robot name="simple_robot"><!-- 定义一个 link --><link name="simple_link"><!-- 定义惯性属性 --><inertial><mass value="1.0"/> <!-- 质量 --><origin xyz="0 0 0"/> <!-- 相对坐标 --><inertia ixx="0.1" iyy="0.1" izz="0.1" ixy="0" ixz="0" iyz="0"/> <!-- 惯性矩阵 --></inertial><!-- 定义可视化属性 --><visual><geometry><box size="1 1 1"/> <!-- 立方体形状,尺寸为 1x1x1 --></geometry><material name="green"/> <!-- 绿色 --></visual><!-- 定义碰撞属性 --><collision><geometry><box size="1 1 1"/> <!-- 碰撞盒子,尺寸为 1x1x1 --></geometry></collision></link>
</robot>

(2)<joint>

  joint 用于连接两个 link,并定义它们的相对运动方式,例如固定连接、旋转或滑动等。joint 主要包含以下元素:

  • <parent>:定义 joint 连接的父 link
  • <child>:定义 joint 连接的子 link
  • <type>:定义 joint 的类型(fixedrevoluteprismaticcontinuous 等)。

  • <origin>:定义 joint 相对于 parent 的初始位置。
  • <axis>(可选):如果是 revoluteprismatic 关节,则定义运动轴。
  • <limit>(可选):定义 joint 的运动范围、速度和力矩限制。
<?xml version="1.0"?>
<robot name="simple_robot"><!-- 第一个 link --><link name="link1"><visual><geometry><box size="1 1 1"/></geometry></visual></link><!-- 第二个 link --><link name="link2"><visual><geometry><box size="1 1 1"/></geometry></visual></link><!-- 定义关节,连接 link1 和 link2 --><joint name="simple_joint" type="revolute"><parent link="link1"/><child link="link2"/><axis xyz="0 1 0"/>  <!-- 旋转轴:绕 y 轴旋转 --><limit lower="-1.57" upper="1.57" effort="10" velocity="1"/> <!-- 旋转范围限制 --></joint>
</robot>

 4. sensor标签

   <sensor> 标签在 URDF 中用于定义机器人上的传感器,例如激光雷达、相机、IMU(惯性测量单元)等。传感器用于模拟机器人感知环境的能力,在 Gazebo 等仿真环境中非常常见。传感器类型如下所示:

<sensor type="camera"/>  <!-- 相机传感器 -->
<sensor type="ray"/>     <!-- 激光雷达传感器 -->
<sensor type="proximity"/>  <!-- 接近传感器 -->
<sensor type="imu"/>     <!-- 惯性测量单元传感器 -->
<sensor type="force_torque"/>  <!-- 力与扭矩传感器 -->
<sensor type="gps"/>     <!-- 全球定位系统传感器 -->
<sensor type="contact"/> <!-- 接触传感器 -->
<sensor type="barometer"/>  <!-- 气压计传感器 -->
<sensor type="ultrasonic"/>  <!-- 超声波传感器 -->
<sensor type="range"/>   <!-- 距离传感器 -->

        不同类型的传感器(如相机、IMU、激光雷达等)会有不同的子标签和配置项,具体内容会根据传感器的类型而变化。这里将不太过多介绍标签,详细查看其他博客,这里主要是为了让读者了解其结构框架。激光雷达传感器如下所示:

<robot name="example_robot"><!-- 定义一个 Link --><link name="base_link"><visual><geometry><box size="1 1 1"/></geometry></visual></link><!-- 定义一个传感器 (激光雷达) --><sensor name="laser_sensor" type="ray"><origin xyz="0 0 1" rpy="0 0 0"/> <!-- 定义传感器相对于 link 的位置和姿态 --><ray><scan><horizontal><samples value="720"/>  <!-- 扫描样本数量 --><resolution value="1"/> <!-- 扫描分辨率 --><min_angle value="-1.5708"/> <!-- 最小扫描角度 (单位: 弧度) --><max_angle value="1.5708"/> <!-- 最大扫描角度 (单位: 弧度) --></horizontal></scan><range><min value="0.1"/>  <!-- 最小测距距离 --><max value="10.0"/> <!-- 最大测距距离 --><resolution value="0.01"/> <!-- 测距分辨率 --></range></ray></sensor>
</robot>
  • <sensor> 标签
    这是根标签,定义了一个传感器的相关信息。

    • name:传感器的名称(在本例中为 laser_sensor)。
    • type:传感器的类型(在本例中为 ray,表示激光雷达)。
  • <origin> 标签
    这个标签定义了传感器相对于父 link 的位置和姿态。

    • xyz="0 0 1":表示传感器在父 link 坐标系中的位置。xyz 表示位置的偏移量。
    • rpy="0 0 0":表示传感器的旋转姿态,rpy 表示滚转(roll)、俯仰(pitch)、偏航(yaw)的角度,这里都是 0,表示没有旋转。
  • <ray> 标签
    这个标签用于定义激光传感器的具体扫描行为。

    • <scan> 标签:定义扫描的相关参数。

      • <horizontal> 标签:定义水平扫描的参数。
    • <range> 标签:定义传感器的测距范围。

二、 实验:使用launch文件启动rviz查看机器人模型

注意:什么类型的文件就要放在功能包的什么目录下,没有则手动创建该目录。

 1. 编写机器人模型的urdf文件。

my_car.urdf

<?xml version="1.0"?>  
<robot name="mybot">  <!-- 定义机器人名称为mybot --><link name="base_footprint"/>  <!-- 基础脚印链接,用于表示机器人基座的参考框架 --><joint name="base_joint" type="fixed">  <!-- 固定关节,连接base_footprint和base_link --><parent link="base_footprint"/>  <!-- 父链接,表示基座 --><child link="base_link"/>  <!-- 子链接,表示机器人主体 --><origin rpy="0 0 0" xyz="0 0 0"/>  <!-- 定义关节的相对位置与姿态 --></joint>  <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"/>  <!-- 旋转轴,垂直于地面 --><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"/>  <!-- 旋转轴,垂直于地面 --><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>  </robot>

2. 编写launch文件。

mycar_rviz.launch

<launch><!-- 传入参数,决定是否启用图形界面 --><arg name="gui" default="true" /><!-- 加载 URDF 机器人模型 --><param name="robot_description" command="$(find xacro)/xacro $(find my_package)/urdf/my_car.urdf"/><!-- 机器人状态发布器 --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"><param name="use_sim_time" value="false"/></node><!-- 关节状态发布器(如果机器人有 Revolute/Prismatic 关节) --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"><param name="use_gui" value="false"/> <!-- 这里设置为 false,避免重复图形化界面 --></node><!-- 关节状态发布器图形界面(可选,基于 "gui" 参数) --><node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" if="$(arg gui)" /><!-- 启动 RViz --><node name="rviz" pkg="rviz" type="rviz" required="true"><param name="config" value="$(find my_package)/rviz/robot.rviz"/></node>
</launch>

3. 运行launch,查看效果。

运行完后,界面中没有机器人模型,我们需要先添加模型。

注意:如果没有下面base_link的选项,则关闭重新启动一下launch文件。

相关文章:

ROS实践(二)构建Gazebo机器人模型文件urdf

目录 一、基础语法 1. urdf文件组成 2. robot根标签 3. link 和 joint标签 4. sensor标签 二、 实验&#xff1a;使用launch文件启动rviz查看机器人模型 1. 编写机器人模型的urdf文件。 2. 编写launch文件。 3. 运行launch&#xff0c;查看效果。 URDF&#xff08;Unifi…...

Linux 入门:常用命令速查手册

目录 一.指令 1.pwd&#xff08;显示所在路径&#xff09; 2.ls&#xff08;列出所有子目录与文件&#xff09; 3.touch&#xff08;创建文件&#xff09; 4.mkdir&#xff08;创建目录&#xff09; 5.cd&#xff08;改变所处位置&#xff09; 6.rm&#xff08;删除&…...

kali linux web扫描工具

Kali Linux是一款专为网络安全领域而打造的操作系统&#xff0c;提供了众多优秀的安全工具&#xff0c;其中就包括了强大的web扫描工具。Web扫描是网络安全检测的一个重要环节&#xff0c;它可以帮助安全专家检测网站的漏洞&#xff0c;提升网站的安全性。 Kali Linux中集成了…...

2路模拟量同步输出卡、任意波形发生器卡—PCIe9100数据采集卡

品牌&#xff1a;阿尔泰科技 型号&#xff1a; PCIe9100、PCIe9101、PXIe9100、PXIe9101 产品系列&#xff1a;任意波形发生器 支持操作系统&#xff1a;XP、Win7、Win8、Win10 简要介绍&#xff1a; 910X 系列是阿尔泰科技公司推出的 PCIe、PXIe 总线的任意波形发生器&…...

Facebook 隐私保护技术的发展与未来趋势

Facebook 隐私保护技术的发展与未来趋势 在这个数字化时代&#xff0c;个人隐私保护已成为全球关注的焦点。Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;其在隐私保护技术的发展上扮演着重要角色。本文将探讨 Facebook 在隐私保护技术方面的进展&#xff…...

Android TCP封装工具类

TCP通信的封装&#xff0c;我们可以从以下几个方面进行改进&#xff1a; 线程池优化&#xff1a;使用更高效的线程池配置&#xff0c;避免频繁创建和销毁线程。 连接重试机制&#xff1a;在网络不稳定时&#xff0c;自动重试连接。 心跳机制&#xff1a;保持长连接&#xff…...

Python基于Django的医用耗材网上申领系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

Java虚拟机之垃圾收集(一)

目录 一、如何判定对象“生死”&#xff1f; 1. 引用计数算法&#xff08;理论参考&#xff09; 2. 可达性分析算法&#xff08;JVM 实际使用&#xff09; 3. 对象的“缓刑”机制 二、引用类型与回收策略 三、何时触发垃圾回收&#xff1f; 1. 分代回收策略 2. 手动触发…...

【mysql】mysql数据库,权限授予,账号设置

创建一个可用的数据库&#xff0c;名字为gitea&#xff0c;支持中文utf8mb4 CREATE DATABASE gitea CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 设置东八区时区 SET GLOBAL time_zone 08:00; FLUSH PRIVILEGES; # 查询当前时间 SELECT NOW();给【普通用户】授予查…...

Html5学习教程,从入门到精通, HTML5超链接应用的详细语法知识点和案例代码(18)

HTML5超链接应用的详细语法知识点和案例代码 超链接&#xff08;Hyperlink&#xff09;&#xff0c;也称为跃点链接&#xff0c;是互联网和文档编辑中的一种重要概念。 超链接的定义 超链接是指从一个网页指向一个目标的连接关系&#xff0c;这个目标可以是另一个网页&#…...

⭐LeetCode(数学分类) 48. 旋转图像——优美的数学法转圈(原地修改)⭐

⭐LeetCode(数学分类) 48. 旋转图像——优美的数学法转圈(原地修改)⭐ 示例 1&#xff1a; 输入&#xff1a;root [5,3,6,2,4,null,8,1,null,null,null,7,9] 输出&#xff1a;[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9] 示例 2&#xff1a; 输入&#xff1…...

深度学习PyTorch之13种模型精度评估公式及调用方法

深度学习pytorch之22种损失函数数学公式和代码定义 深度学习pytorch之19种优化算法&#xff08;optimizer&#xff09;解析 深度学习pytorch之4种归一化方法&#xff08;Normalization&#xff09;原理公式解析和参数使用 深度学习pytorch之简单方法自定义9类卷积即插即用 实时…...

tomcat单机多实例部署

一、部署方法 多实例可以运行多个不同的应用&#xff0c;也可以运行相同的应用&#xff0c;类似于虚拟主机&#xff0c;但是他可以做负载均衡。 方式一&#xff1a; 把tomcat的主目录挨个复制&#xff0c;然后把每台主机的端口给改掉就行了。 优点是最简单最直接&#xff0c;…...

Java开发者如何接入并使用DeepSeek

目录 一、准备工作 二、添加DeepSeek SDK依赖 三、初始化DeepSeek客户端 四、数据上传与查询 五、数据处理与分析 六、实际应用案例 七、总结 【博主推荐】&#xff1a;最近发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;风格风趣幽默&#xff…...

win10电脑鼠标速度突然变的很慢?

电脑鼠标突然变很慢&#xff0c;杀毒检测后没问题&#xff0c;鼠标设置也没变&#xff0c;最后发现可能是误触鼠标的“DPI”调节键。 DPI调节键在鼠标滚轮下方&#xff0c;再次点击即可恢复正常鼠标速度。 如果有和-的按键&#xff0c;速度变快&#xff0c;-速度变慢。 图源&…...

第四次CCF-CSP认证(含C++源码)

第四次CCF-CSP认证 第一道&#xff08;easy&#xff09;思路及AC代码 第二道&#xff08;easy&#xff09;思路及AC代码遇到的问题 第三道&#xff08;mid&#xff09;思路及AC代码 第一道&#xff08;easy&#xff09; 题目链接 思路及AC代码 这题就是将这个矩阵旋转之后输出…...

Netty基础—1.网络编程基础一

大纲 1.什么是OSI开放系统互连 2.OSI七层模型各层的作用 3.TCP/IP协议的简介 4.TCP和UDP的简介 5.TCP连接的三次握手 6.TCP连接的四次挥手 7.TCP/IP中的数据包 8.TCP通过确认应答与序列号提高可靠性 9.HTTP请求的传输过程 10.HTTP协议报文结构 11.Socket、短连接、长…...

【理想解法学习笔记】

目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是&#xff1a;首先建立初始化决策矩阵&#xff0c;而后基于规范化后的初…...

98.在 Vue3 中使用 OpenLayers 根据 Resolution 的不同显示不同的地图

在 Vue3 中使用 OpenLayers 根据 Resolution 的不同显示不同的地图 前言 在 Web GIS&#xff08;地理信息系统&#xff09;应用开发中&#xff0c;地图的 Resolution&#xff08;分辨率&#xff09;是一个重要的概念。不同的 Resolution 适用于不同的地图层级&#xff0c;有时…...

Docker 部署 Vaultwarden

一、前言 1. 官网 1.1 Vaultwarden https://github.com/dani-garcia/vaultwarden https://github.com/wcjxixi/Vaultwarden-Wiki-Chn https://hub.docker.com/r/vaultwarden/server https://rs.ppgg.in/ # Vaultwarden Wiki 中文版 https://geekdaxue.co/read/Vaultward…...

Smart contract -- 自毁合约

在区块链开发中&#xff0c;Solidity 语言提供了强大的功能&#xff0c;其中自毁合约是一个独特且重要的特性。今天&#xff0c;就让我们深入探讨一下 Solidity 中的自毁合约&#xff0c;以及如何使用 selfdestruct 函数。 注意&#xff1a;使用继承时请确保代码的正确性&#…...

unity学习64,第3个小游戏:一个2D跑酷游戏

目录 学习参考 素材资源导入 1 创建项目 1.1 创建1个2D项目 1.2 导入素材 2 背景图bg 2.0 bg素材 2.1 创建背景 2.2 修改素材&#xff0c;且修改摄像机等 2.2.1 修改导入的原始prefab素材 2.2.2 对应调整摄像机 2.2.3 弄好背景 2.3 背景相关脚本实现 2.3.1 错误…...

Python Flask 在网页应用程序中处理错误和异常

Python Flask 在网页应用程序中处理错误和异常 Python Flask 在网页应用程序中处理错误和异常 Python Flask 在网页应用程序中处理错误和异常 在我们所有的代码示例中&#xff0c;我们没有注意如何处理用户在浏览器中输入错误的URL或向我们的应用程序发送错误的参数集的情况。…...

模板方法模式的C++实现示例

核心思想 模板方法设计模式是一种行为设计模式&#xff0c;它定义了一个算法的框架&#xff0c;并将某些步骤的具体实现延迟到子类中。通过这种方式&#xff0c;模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法模式的核心在于&#xff1a; ​…...

水下机器人推进器PID参数整定与MATLAB仿真

水下机器人推进器PID参数整定与MATLAB仿真 1. PID控制原理 目标:通过调节比例(P)、积分(I)、微分(D)参数,使推进器输出力快速稳定跟踪期望值。传递函数(示例):推进器动力学模型可简化为: [ G(s) = \frac{K}{\tau s + 1} \cdot e^{-Ts} ] 其中:K为增益,τ为时间常…...

在本地部署DeepSeek等大模型时,需警惕的潜在安全风险

在本地部署DeepSeek等大模型时&#xff0c;尽管数据存储在本地环境&#xff08;而非云端&#xff09;&#xff0c;但仍需警惕以下潜在安全风险&#xff1a; 1. 模型与数据存储风险 未加密的存储介质&#xff1a;若训练数据、模型权重或日志以明文形式存储&#xff0c;可能被物…...

智能焊机监测系统:打造工业安全的数字化盾牌

在现代工业生产中&#xff0c;焊机作为核心设备之一&#xff0c;其稳定性和安全性直接关系到生产效率和产品质量。德州迪格特科技有限公司推出的智能焊机监测系统&#xff0c;通过先进的技术手段&#xff0c;为工业生产构筑了一道坚固的安全防线。 智能监测&#xff0c;保障焊…...

【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX

文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串&#xff0c;value 的类型是存在差异的 二进制存储 Redis 中的字符串&#xff0c;直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据&#xff0c;还可…...

GaussDB安全配置指南:从认证到防御的全方面防护

一、引言 随着企业数据规模的扩大和云端化进程加速&#xff0c;数据库安全性成为运维的核心挑战之一。GaussDB作为一款高性能分布式数据库&#xff0c;提供了丰富的安全功能。本文将从 ​认证机制、权限控制、数据加密、审计日志​ 等维度&#xff0c;系统性地讲解如何加固 Ga…...

总结学习课程

1. 数据加载与预处理 PyTorch工具加载和预处理数据&#xff08;如MNIST数据集&#xff09;。 2. 定义模型 - 使用nn.Module构建神经网络&#xff0c;定义各层和前向传播。 3. 损失函数与优化器&#xff1a; 选择损失函数&#xff08;如交叉熵损失&#xff09;和优化…...