gazebo仿真ros2两轮差速小车没有控制的情况下缓慢移动后退

news2024/11/22 10:23:19

最近在做一款2轮差速的机器人小车,在做gazebo仿真的时候,发现小车一直在缓慢的后退,一边后退一边缓慢拐弯。

环境:ros2  foxy   gazebo-11

小车xacro模型代码

<?xml version="1.0"?>
<robot name="jtbot"
  xmlns:xacro="http://ros.org/wiki/xacro">
<!-- =================================================================================== -->
<!-- |    xacro文件转urdf文件方法:                                                       | -->
<!-- |    在当前文件夹打开终端,输入xacro jtbot_base.urdf.xacro > jtbot_base.urdf           | -->
<!-- |    在当前文件夹生成jtbot_base.urdf纯urdf文件                                        | -->
<!-- =================================================================================== -->
  <!-- 定义机器人常量 -->
  <!-- 底盘 长 宽 高 -->
  <xacro:property name="base_width" value="0.46"/>
  <xacro:property name="base_length" value="0.46"/>
  <xacro:property name="base_height" value="0.11"/>
  <!-- 轮子半径 -->
  <xacro:property name="wheel_radius" value="0.0775"/>
  <!-- 轮子宽度 -->
  <xacro:property name="wheel_width" value="0.06"/>
  <!-- 轮子和底盘的间距 -->
  <xacro:property name="wheel_ygap" value="0.01"/>
  <!-- 轮子z轴偏移量 -->
  <xacro:property name="wheel_zoff" value="0.055"/>
  <!-- 轮子x轴偏移量 -->
  <xacro:property name="wheel_xoff" value="0.15"/>
  <!-- 支撑轮x轴偏移量 -->
  <xacro:property name="caster_xoff" value="0.205"/>

  <!-- 定义长方形惯性属性宏  -->
  <xacro:macro name="box_inertia" params="m w h d">
    <inertial>
      <!-- <origin xyz="0 0 0" rpy="${pi/2} 0 ${pi/2}"/> -->
      <mass value="${m}"/>
      <inertia ixx="${(m/12) * (h*h + d*d)}" ixy="0.0" ixz="0.0" iyy="${(m/12) * (w*w + d*d)}" iyz="0.0" izz="${(m/12) * (w*w + h*h)}"/>
    </inertial>
  </xacro:macro>
  <!-- 定义圆柱惯性属性宏  -->
  <xacro:macro name="cylinder_inertia" params="m r h">
    <inertial>
      <!-- <origin xyz="0 0 0" rpy="${pi/2} 0 0" /> -->
      <mass value="${m}"/>
      <inertia ixx="${(m/12) * (3*r*r + h*h)}" ixy = "0" ixz = "0" iyy="${(m/12) * (3*r*r + h*h)}" iyz = "0" izz="${(m/2) * (r*r)}"/>
    </inertial>
  </xacro:macro>
  <!-- 定义球体惯性属性宏  -->
  <xacro:macro name="sphere_inertia" params="m r">
    <inertial>
      <mass value="${m}"/>
      <inertia ixx="${(2/5) * m * (r*r)}" ixy="0.0" ixz="0.0" iyy="${(2/5) * m * (r*r)}" iyz="0.0" izz="${(2/5) * m * (r*r)}"/>
    </inertial>
  </xacro:macro>

  <!-- 机器人底盘 -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="${base_length} ${base_width} ${base_height}"/>
      </geometry>
      <material name="Cyan">
        <color rgba="0 1.0 1.0 1.0"/>
      </material>
    </visual>
    <!-- 碰撞区域 -->
    <collision>
      <geometry>
        <box size="${base_length} ${base_width} ${base_height}"/>
      </geometry>
    </collision>
    <!-- 惯性特性 -->
    <xacro:box_inertia m="0.2" w="${base_width}" d="${base_length}" h="${base_height}"/>
  </link>

  <!-- 机器人 Footprint -->
  <link name="base_footprint"/>
  <!-- 底盘关节 -->
  <joint name="base_joint" type="fixed">
    <parent link="base_link"/>
    <child link="base_footprint"/>
    <origin xyz="0.0 0.0 ${-(wheel_radius+wheel_zoff)}" rpy="0 0 0"/>
  </joint>

  <!-- 创建轮子宏函数 -->
  <xacro:macro name="wheel" params="prefix x_reflect y_reflect">
    <link name="${prefix}_link">
      <visual>
        <origin xyz="0 0 0" rpy="${pi/2} 0 0"/>
        <geometry>
          <cylinder radius="${wheel_radius}" length="${wheel_width}"/>
        </geometry>
        <material name="Gray">
          <color rgba="0.5 0.5 0.5 1.0"/>
        </material>
      </visual>
      <!-- 碰撞区域 -->
      <collision>
        <origin xyz="0 0 0" rpy="${pi/2} 0 0"/>
        <geometry>
          <cylinder radius="${wheel_radius}" length="${wheel_width}"/>
        </geometry>
      </collision>
      <!-- 惯性属性 -->
      <xacro:cylinder_inertia m="0.2" r="${wheel_radius}" h="${wheel_width}"/>
    </link>
    <!-- 轮子关节 -->
    <joint name="${prefix}_joint" type="continuous">
      <parent link="base_link"/>
      <child link="${prefix}_link"/>
      <origin xyz="${x_reflect*wheel_xoff} ${y_reflect*(base_width/2+wheel_width/2+wheel_ygap)} ${-wheel_zoff}" rpy="0 0 0"/>
      <axis xyz="0 1 0"/>
    </joint>
  </xacro:macro>
  <!-- 根据上面的宏函数实例化左右轮 -->
  <xacro:wheel prefix="left_wheel" x_reflect="1" y_reflect="1" />
  <xacro:wheel prefix="right_wheel" x_reflect="1" y_reflect="-1" />

    <!-- 差速驱动仿真插件 -->
  <gazebo>
    <plugin name='diff_drive' filename='libgazebo_ros_diff_drive.so'>
      <ros>
        <!-- 命名空间 -->
        <!-- <namespace>/demo</namespace> -->
      </ros>

      <!-- 左右轮子 -->
      <left_joint>left_wheel_joint</left_joint>
      <right_joint>right_wheel_joint</right_joint>

      <!-- 轮距 轮子直径 -->
      <wheel_separation>${base_width+wheel_width}</wheel_separation>
      <!-- <wheel_separation>0.52</wheel_separation> -->
      <wheel_diameter>${wheel_radius*2}</wheel_diameter>
      <!-- <wheel_diameter>0.155</wheel_diameter> -->

      <!-- 最大扭矩 最大加速度 -->
      <max_wheel_torque>20</max_wheel_torque>
      <max_wheel_acceleration>1.0</max_wheel_acceleration>

      <!-- 输出 -->
      <!-- 是否发布里程计 -->
      <publish_odom>true</publish_odom>
      <!-- 是否发布里程计的tf开关 -->
      <publish_odom_tf>true</publish_odom_tf>
      <!-- 是否发布轮子的tf数据开关 -->
      <publish_wheel_tf>true</publish_wheel_tf>

      <!-- 里程计的framed ID,最终体现在话题和TF上 -->
      <odometry_frame>odom</odometry_frame>
      <!-- 机器人的基础frame的ID -->
      <robot_base_frame>base_link</robot_base_frame>
    </plugin>
  </gazebo>

  <!-- 支撑轮 -->
  <link name="caster_link">
    <visual>
      <geometry>
        <!-- <sphere radius="${(wheel_radius/2)}"/> -->
        <sphere radius="${(wheel_radius)}"/>
      </geometry>
      <material name="Cyan">
        <color rgba="0 1.0 1.0 1.0"/>
      </material>
    </visual>
    <!-- 碰撞区域 -->
    <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <sphere radius="${(wheel_radius/2)}"/>
      </geometry>
    </collision>
    <!-- 惯性属性 -->
    <xacro:sphere_inertia m="0.2" r="${(wheel_radius/2)}"/>
  </link>
  <!-- 支撑轮gazebo颜色 -->
  <gazebo reference="caster_link">
    <material>Gazebo/Black</material>
  </gazebo>
  <!-- 支撑轮gazebo摩擦力 -->
  <gazebo reference="caster_link">
    <mu1 value="0"/>
    <mu2 value="0"/>
    <kp value="1000000.0" />
    <kd value="10.0" />
  </gazebo>
  <!-- 支撑轮关节 -->
  <joint name="caster_joint" type="fixed">
    <parent link="base_link"/>
    <child link="caster_link"/>
    <origin xyz="${-caster_xoff} 0.0 ${-(base_height+wheel_radius)/2}" rpy="0 0 0"/>
  </joint>
  <!-- imu -->
  <link name="imu_link">
    <visual>
      <geometry>
        <box size="0.06 0.03 0.03"/>
      </geometry>
    </visual>
    <!-- 碰撞区域 -->
    <collision>
      <geometry>
        <box size="0.06 0.03 0.03"/>
      </geometry>
    </collision>
    <!-- 惯性属性 -->
    <xacro:box_inertia m="0.1" w="0.1" d="0.1" h="0.1"/>
  </link>
  <!-- imu关节 -->
  <joint name="imu_joint" type="fixed">
    <parent link="base_link"/>
    <child link="imu_link"/>
    <origin xyz="-0.05 0 -0.055"/>
  </joint>
  <!-- imu仿真插件 -->
  <gazebo reference="imu_link">
    <sensor name="imu_sensor" type="imu">
      <plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin">
        <ros>
          <!-- 命名空间 -->
          <!-- <namespace>/demo</namespace> -->
          <remapping>~/out:=imu</remapping>
        </ros>
        <!-- 初始方位_参考 -->
        <initial_orientation_as_reference>true</initial_orientation_as_reference>
      </plugin>
      <always_on>true</always_on>
      <!-- 更新频率 -->
      <update_rate>100</update_rate>
      <visualize>true</visualize>
      <imu>
        <!-- 角速度 -->
        <angular_velocity>
          <x>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </x>
          <y>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </y>
          <z>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>2e-4</stddev>
              <bias_mean>0.0000075</bias_mean>
              <bias_stddev>0.0000008</bias_stddev>
            </noise>
          </z>
        </angular_velocity>
        <!-- 线性加速度 -->
        <linear_acceleration>
          <x>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </x>
          <y>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </y>
          <z>
            <noise type="gaussian">
              <mean>0.0</mean>
              <stddev>1.7e-2</stddev>
              <bias_mean>0.1</bias_mean>
              <bias_stddev>0.001</bias_stddev>
            </noise>
          </z>
        </linear_acceleration>
      </imu>
    </sensor>
  </gazebo>

  <!-- 雷达 -->
  <link name="laser">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder radius="0.04" length="0.04"/>
      </geometry>
    </visual>
    <!-- 惯性属性 -->
    <!-- <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="0.125"/>
      <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001" />
    </inertial> -->
    <!-- 碰撞区域 -->
    <!-- <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <cylinder radius="0.04" length="0.04"/>
      </geometry>
    </collision> -->
  </link>
  <!-- 雷达关节 -->
  <joint name="laser_joint" type="fixed">
    <parent link="base_link"/>
    <child link="laser"/>
    <origin xyz="0.16 0 0.078" rpy="0 0 0"/>
  </joint>

  <gazebo reference="laser">
    <sensor name="laser" type="ray">
      <always_on>true</always_on>
      <visualize>false</visualize>
      <update_rate>5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1.000000</resolution>
            <min_angle>0.000000</min_angle>
            <max_angle>6.280000</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.120000</min>
          <max>3.5</max>
          <resolution>0.015000</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="scan" filename="libgazebo_ros_ray_sensor.so">
        <ros>
          <remapping>~/out:=scan</remapping>
        </ros>
        <output_type>sensor_msgs/LaserScan</output_type>
        <frame_name>laser</frame_name>
      </plugin>
    </sensor>
  </gazebo>
  <!-- 相机 -->
  <link name="camera_link">
    <visual>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.015 0.130 0.022"/>
      </geometry>
    </visual>
    <!-- 碰撞区域 -->
    <!-- <collision>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <geometry>
        <box size="0.015 0.130 0.022"/>
      </geometry>
    </collision> -->
    <!-- 惯性属性 -->
    <!-- <inertial>
      <origin xyz="0 0 0" rpy="0 0 0"/>
      <mass value="0.035"/>
      <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001" />
    </inertial> -->
  </link>
  <!-- 相机关节 -->
  <joint name="camera_joint" type="fixed">
    <parent link="base_link"/>
    <child link="camera_link"/>
    <origin xyz="0.16 0 0.11" rpy="0 0 0"/>
  </joint>
  <!-- 深度相机 -->
  <!-- <link name="camera_depth_frame"/>

  <joint name="camera_depth_joint" type="fixed">
    <origin xyz="0 0 0" rpy="0 0 0"/>
    <parent link="camera_link"/>
    <child link="camera_depth_frame"/>
  </joint> -->
  <!-- 相机仿真 -->
  <!-- <gazebo reference="camera_depth_link">
    <sensor name="depth_camera" type="depth">
      <visualize>true</visualize>
      <update_rate>30.0</update_rate>
      <camera name="camera">
        <horizontal_fov>1.047198</horizontal_fov>
        <image>
          <width>640</width>
          <height>480</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.05</near>
          <far>3</far>
        </clip>
      </camera>
      <plugin name="depth_camera_controller" filename="libgazebo_ros_camera.so">
        <baseline>0.2</baseline>
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <frame_name>camera_depth_frame</frame_name>
        <pointCloudCutoff>0.5</pointCloudCutoff>
        <pointCloudCutoffMax>3.0</pointCloudCutoffMax>
        <distortionK1>0</distortionK1>
        <distortionK2>0</distortionK2>
        <distortionK3>0</distortionK3>
        <distortionT1>0</distortionT1>
        <distortionT2>0</distortionT2>
        <CxPrime>0</CxPrime>
        <Cx>0</Cx>
        <Cy>0</Cy>
        <focalLength>0</focalLength>
        <hackBaseline>0</hackBaseline>
      </plugin>
    </sensor>
  </gazebo> -->

</robot>

gazebo仿真launch启动程序

# 此launch文件是机器人仿真程序,包含 gazebo启动,机器人仿真生成,机器人模型状态发布
import os
from launch import LaunchDescription
from launch.actions import ExecuteProcess
from launch_ros.actions import Node
from launch_ros.substitutions import FindPackageShare
from launch.substitutions import LaunchConfiguration
import xacro

def generate_launch_description():
    robot_name_in_model = 'jtbot'         #机器人模型名字
    package_name = 'jtbot_description'    #模型包名

    remappings = [('/tf', 'tf'),
                  ('/tf_static', 'tf_static')]

    ld = LaunchDescription()
    use_sim_time = LaunchConfiguration('use_sim_time', default='true')
    pkg_share = FindPackageShare(package=package_name).find(package_name) 
    gazebo_world_path = os.path.join(pkg_share, 'world/jt.world')        #世界仿真文件路径
    default_rviz_config_path = os.path.join(pkg_share, 'rviz/mrviz2.rviz')  #rviz配置文件路径
    urdf_xacro_file = os.path.join(pkg_share, 'urdf/jtbot_base.urdf.xacro') #xacro模型文件路径
    #解析xacro模型文件
    doc = xacro.parse(open(urdf_xacro_file))
    xacro.process_doc(doc)
    params = {'robot_description': doc.toxml()}

    # 开启ros Gazebo server
    start_gazebo_cmd = ExecuteProcess(
        cmd=['gazebo',
        '--verbose', 
        gazebo_world_path,
        #初始化gazebo-ros
         '-s', 'libgazebo_ros_init.so', 
        #gazebo产卵程序启动  
         '-s', 'libgazebo_ros_factory.so',    
         ],
        output='screen')
 

    # gazebo内生成机器人
    spawn_entity_cmd = Node(
        package='gazebo_ros', 
        executable='spawn_entity.py',
        arguments=['-entity', robot_name_in_model,  '-topic', 'robot_description'], 
        output='screen',
        parameters=[{'use_sim_time': use_sim_time}]
        )
	
       # Start Robot State publisher
    start_robot_state_publisher_cmd = Node(
        package='robot_state_publisher',
        executable='robot_state_publisher',
        output='screen',
        remappings=remappings,
        parameters=[params,{'use_sim_time': use_sim_time}]
    )   

    ## Launch RViz
    # start_rviz_cmd = Node(
    #     package='rviz2',
    #     executable='rviz2',
    #     name='rviz2',
    #     output='screen',
    #     arguments=['-d', default_rviz_config_path]
    #     )

    ld.add_action(start_gazebo_cmd)
    ld.add_action(spawn_entity_cmd)
    ld.add_action(start_robot_state_publisher_cmd)
    # ld.add_action(start_rviz_cmd)


    return ld

仿真效果:

 小车实际重量在20公斤左右。

经测试,小车缓慢移动只和urdf文件惯性参数有关,就是下面这段代码:

<!-- 惯性特性,m后面是base_link重量 -->

<xacro:box_inertia m="0.2" w="${base_width}" d="${base_length}" h="${base_height}"/>

当我们把m=20,这里是国际单位公斤。以真实重量测试仿真小车。2-3秒钟后已经离开了出生的中心,并且后他的速度肉眼可见。

 当我们把m=5,后退的速度明显减慢。当我们把base_link重量设到1公斤以下,小车不再移动。

 我也找了小鱼讲课的代码,把base_link重量加到10,也会发生移动,说明这基本是普遍现象,只要把重量设小一点就不会影响实验效果了。

总结

gazebo仿真是理想状态下仿真,在现实情况下车轴是有摩擦力的,所以真实的小车是不会动的,要想不动,应该也要给车轴加上摩擦力,但是我给支撑轮加上了摩擦力,效果也不是很明显,这也许是gazebo的bug,不过这超出了我们仿真的范围了 。

注意事项

xacro写的模型文件简化了代码复用,但不能在gazeo和rviz2下直接运行,需要转换成urdf格式,转换方法看我xazro模型的备注,如果不转换按我的launch文件在启动前转换也能正常启动。

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

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

相关文章

华为OD机试 - 查找接口成功率最优时间段 - 回溯(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【图书推荐 | 测试】—《测试设计思想》

前言 随着科技的不断发展&#xff0c;互联网的不断进步&#xff0c;日益出现了一种趋势&#xff1a;测试设计将成为一种跨领域的综合性工作&#xff0c;测试者将成为一种跨领域的通用型人才。由此清华大学出版社推出了一本名为《测试设计思想》的书籍&#xff0c;由知名专家周…

分析Flink,源和算子并行度不一致时,运行一段时间后,看似不再继续消费的问题,提供解决思路。

文章目录 背景分析 问题来了比较一开始的情况解决方式 背景 之前有分析过一次类似问题&#xff0c;最终结论是在keyby之后&#xff0c;其中有一个key数量特别庞大&#xff0c;导致对应的subtask压力过大&#xff0c;进而使得整个job不再继续运作。在这个问题解决之后&#xff…

数据分析15——office中的Excel基础技术汇总

0、前言&#xff1a; 这部分总结就是总结每个基础技术的定义&#xff0c;在了解基础技术名称和定义后&#xff0c;方便对相关技术进行检索学习。笔记不会详细到所有操作都说明&#xff0c;但会把基础操作的名称及作用说明&#xff0c;可自行检索。本文对于大部分读者有以下作用…

火山引擎DataLeap:助力PICO落地数据流程规范,提升开发效率

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 作为目前中国市场领跑的头部XR品牌之一&#xff0c;字节跳动旗下的PICO已经拥有了超百万客户。 过去一年&#xff0c;PICO在XR场景中不断建设和发力&#xff0c;为运…

更好的 3D 网格,从重建到生成式 AI

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 这些生成的 3D 模型通常提取为标准三角形网格。网格表示提供了许多好处&#xff0c;包括支持现有软件包、高级硬件加速和支持物理仿真。但是&#xff0c;并非所有网格都是平等的&#xff0c;这些优势只…

在南非发现地球上最古老冰川的证据

古老的冰川暗示着太古代地球在某些方面可能与我们所处的时代相似。 29 亿年前的地球可能有像阿根廷南部冰川国家公园的佩里托莫雷诺冰川这样的冰川。图片来源&#xff1a; Martin St-Amant/维基百科 《地球化学展望快报》上发表的一项 新研究报告称&#xff0c;早在 30 亿年前…

离心机使用操作说明(记录备忘)

关于离心机的使用步骤做一简单记录 1.配准 2.装载&#xff08;对称性放置&#xff09; 3.确认&#xff08;装载完毕之后确认&#xff0c;轻轻转动&#xff09; 4.盖锅盖 5.关闭主盖 6.设置参数 7.运行 开始加速之后 转速会持续增加至设定值&#xff0c;离心结束后&#xff0c…

Python functools module 的介绍与应用

Python functools module 的介绍与应用 functools module lru_cache from functools import lru_cache import timelru_cache(maxsizeNone) # 设置缓存大小为无限制 def my_function(x):for i in range(1000):x xfor j in range(100):x xreturn x# 第一次调用函数&#xff…

概念解析 | 群像素激光雷达

群像素激光雷达技术解析 注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:群像素激光雷达技术。 1. 背景介绍 激光雷达作为一种主动式激光探测技术,通过发射脉冲激光并接收其反射回波信号,来获取目标距离和其他信息,在军事侦察…

收支明细高效管理,轻松查看和统计时间段内的开销收支明细!

亲爱的用户们&#xff0c;您是否经常需要查看某一时间段内的所有开销和收支明细&#xff0c;并进行自动统计和分析&#xff1f;现在&#xff0c;我们为您带来一款智能财务管家&#xff0c;让您轻松管理财务&#xff01; 首先&#xff0c;我们要进入晨曦记账本主页面&#xff0…

【c语言】通讯录(动态版+文件+背景音乐)含源码

开饭了&#xff0c;之前写的通讯录&#xff0c;是否会有人觉得申请1000人的空间是不是有点用不上呀&#xff0c;怎么才能做到要多少申请多少个呢&#xff1f;&#xff1f;我们学完动态内存管理&#xff0c;和文件的相关操作&#xff0c;终于可以继续完善我们的通讯录了 船新版本…

Python异常处理:优雅应对错误与异常

文章目录 &#x1f340;引言&#x1f340;异常的概念&#x1f340; try-except块&#x1f340;多个except块&#x1f340;else块&#x1f340;finally块&#x1f340;异常类型&#x1f340;抛出异常&#x1f340;异常处理的最佳实践&#x1f340;异常处理的现实应用&#x1f34…

设计模式之代理模式(Proxy)的C++实现

1、代理模式的提出 在组件的开发过程中&#xff0c;有些对象由于某种原因&#xff08;比如对象创建的开销很大&#xff0c;或者对象的一些操作需要做安全控制&#xff0c;或者需要进程外的访问等&#xff09;&#xff0c;会使Client使用者在操作这类对象时可能会存在问题&…

k8s ingress

一、浅谈ingress &#xff08;ingress 是与service配合使用的&#xff09; Ingress能把Service&#xff08;Kubernetes的服务&#xff09;配置成外网能够访问的URL&#xff0c;流量负载均衡&#xff0c;及SSL&#xff0c;并提供域名访问的虚拟主机等&#xff0c;客户通过访问UR…

【C++学习手札】一文带你认识C++虚函数(内层剖析)

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C初识继承 ♈️今日夜电波&#xff1a;No title —REOL 1:02 ━━━━━━️&#x1f49f;──────── 4:03 …

无涯教程-Perl - use函数

描述 此函数将MODULE导出的所有功能(或仅LIST引用的功能)导入当前包的名称空间。有效等效于- BEGIN { require "Module.pm"; Module->import(); }也用于在当前脚本上强加编译器指令(编译指示),尽管从本质上讲它们只是模块。 请注意,use语句在编译时进行判断。在…

【网络】网络层——IP协议

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《网络》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 网络层中&#xff0c;IP协议首部和有效载荷组成的完整数据称为数据报。 IP协议 &#x1f349;TCP和IP的…

文件批量管理,如何将文件进行一一复制备份并删除原文件里的文件

您是否经常需要对大量的文件进行复制备份和删除操作&#xff1f;是时候拥有一款高效的文件批量管理工具了&#xff01;我们的一键批量管理软件为您提供了简单而强大的解决方案&#xff0c;让您轻松地进行文件复制备份并删除原文件&#xff0c;让存储空间得到高效整理&#xff0…

为什么浙大MBA项目提前批面试要控制优秀人数比例?

大家好&#xff01;时间来到八月份&#xff0c;不知道今年浙大MBA项目的提前批面试你是否已经申请参加过&#xff1f;从剩余批次来看&#xff0c;留给考生做选择的时间确实不是很多了&#xff0c;仅剩的几个批次中&#xff0c;只有杭州第五批目前时间上还算充裕&#xff0c;其余…