move_base

        move_base 官方介绍:http://wiki.ros.org/move_base

        如果在仿真环境下, sensor source、odometry source 和 sensor transforms 都已提供好,我们只需要完成以下部分:

一、编写导航程序

        ①创建 ROS 工作空间 和 pkg 包

mkdir -p catkin_ws/src
cd catkin_ws/src
catkin_create_pkg nav_pkg roscpp rospy move_base_msgs actionlib

        ②在 pkg 中创建 nav.launch 文件,其中包含了上面介绍的3个节点。

<launch>
    <!--- Run move_base -->
    <node pkg="move_base" type="move_base" name="move_base">
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />
        <param name="base_global_planner" value="global_planner/GlobalPlanner" /> 
        <param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
    </node>

    <!-- Run map server -->
    <node pkg="map_server" type="map_server" name="map_server" args="$(find wpr_simulation)/maps/map.yaml"/>

    <!--- Run AMCL -->
    <node pkg="amcl" type="amcl" name="amcl"/>

    <!--- Run rviz -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find wpr_simulation)/rviz/nav.rviz"/>
</launch>

        ③编译工作空间 

二、 运行导航程序

        ①运行仿真环境

roslaunch wpr_simulation wpb_stage_robocup.launch

        ②运行 nav.launch 文件

roslaunch nav_pkg nav.launch

        ③打开 rviz

        ④添加 Map(话题: /map);Path(话题:/move_base/GlobalPlanner/plan)

        其中运行 nav.launch 文件产生的话题如下:

1、map_server 产生的话题


/map

  • 说明:发布静态地图数据,通常为 nav_msgs/OccupancyGrid 类型。
  • 来源:由 map_server 节点生成,用于全局路径规划。

/map_metadata

  • 说明:发布地图的元数据信息,如地图的分辨率、宽度、高度和原点位置。通常为 nav_msgs/MapMetaData 类型
  • 来源:由 map_server 节点生成,辅助其他节点理解地图的结构和坐标系

2、amcl 产生的话题


/amcl_pose

  • 说明:发布 amcl 计算出的机器人在地图中的位姿,通常为geometry_msgs/PoseWithCovarianceStamped 类型。
  • 来源:由 amcl 节点生成,用于定位和导航。

/initialpose

  • 说明:用于设置机器人的初始位姿,通常通过 rviz 手动发布该话题。通常为 geometry_msgs/PoseWithCovarianceStamped 类型
  • 来源:由用户或 rviz 发布,用于 amcl 节点初始化机器人位置。

/diagnostics

  • 说明:发布系统诊断信息,包括节点状态、传感器健康状况等,通常为 diagnostic_msgs/DiagnosticArray 类型。
  • 来源:由 amcl 节点生成,用于监控和调试系统状态

/particlecloud

  • 说明:发布粒子滤波器的粒子分布,可以在 rviz 中可视化。通常为 geometry_msgs/PoseArray 类型。
  • 来源:由 amcl 节点生成,用于可视化粒子滤波器的状态。


/amcl/parameter_descriptions 和 /amcl/parameter_updates

  • 说明:用于动态参数调整(dynamic reconfigure),允许在运行时修改 amcl 的参数。前者通常为 dynamic_reconfigure/ConfigDescription 类型;后者为 dynamic_reconfigure/Config 类型。
  • 来源:由 amcl 节点生成,支持参数的动态管理。

3、move_base 产生的话题

3.1 move_base 的总体控制和状态


/move_base/current_goal

  • 说明:发布当前的导航目标,通常为 geometry_msgs/PoseStamped 类型。
  • 来源:由 move_base 节点生成,表示当前正在执行的目标。

/move_base/goal 和 /move_base_simple/goal

  • 说明
    • /move_base/goal:用于接收复杂的导航目标,通常为 move_base_msgs/MoveBaseActionGoal 类型。
    • /move_base_simple/goal:用于接收简化的导航目标,通常通过 rviz 发布,类型为 geometry_msgs/PoseStamped
  • 来源:由用户通过 rviz 或其他工具发布,用于设置导航目标。

/move_base/recovery_status

  • 说明:发布导航恢复行为的状态信息,如避障操作的执行情况。通常为 move_base_msgs/RecoveryStatus 类型。
  • 来源:由 move_base 节点生成,用于监控恢复行为。

/move_base/cancel

  • 说明:用于取消当前的导航目标,通常为 actionlib_msgs/GoalID 类型。
  • 来源:由用户或其他节点发布,用于终止当前导航任务。

/move_base/feedback

  • 说明:发布导航过程中的实时反馈信息,通常为 move_base_msgs/MoveBaseActionFeedback 类型。
  • 来源:由 move_base 节点生成,用于监控导航进展。

/move_base/result 和 /move_base/status

  • 说明
    • /move_base/result:发布导航结果,通常为 move_base_msgs/MoveBaseActionResult 类型。
    • /move_base/status:发布当前导航的状态,通常为 actionlib_msgs/GoalStatusArray 类型。
  • 来源:由 move_base 节点生成,用于反馈导航任务的完成情况和状态。

/move_base/parameter_descriptions 和 /move_base/parameter_updates

  • 说明:用于动态调整 move_base 节点的整体参数。
  • 来源:由 move_base 节点生成,支持参数的动态管理。

3.2全局规划器(Global Planner)


/move_base/GlobalPlanner/parameter_descriptions 和 /move_base/GlobalPlanner/parameter_updates

  • 说明:用于动态调整全局规划器的参数。
  • 来源:由 move_base 的全局规划器(如 GlobalPlanner)生成,支持参数的动态管理。前者通常为 dynamic_reconfigure/ConfigDescription 类型;后者为 dynamic_reconfigure/Config 类型。

/move_base/GlobalPlanner/plan

  • 说明:发布全局规划路径的坐标点,通常为 nav_msgs/Path 类型。
  • 来源:由 GlobalPlanner 生成,用于展示全局路径。

/move_base/GlobalPlanner/potential

  • 说明:发布潜在场(potential field)地图,用于全局路径规划的成本计算。通常为 nav_msgs/OccupancyGrid 类型。
  • 来源:由 GlobalPlanner 生成,辅助路径规划。

3.3局部规划器(Local Planner)


/move_base/WpbhLocalPlanner/local_planner_target

  • 说明:发布局部规划的目标点,通常为 geometry_msgs/PoseStamped 类型。
  • 来源:由 WpbhLocalPlanner 生成,用于局部路径调整。

3.4全局代价地图(Global Costmap)


/move_base/global_costmap/costmap 和 /move_base/global_costmap/costmap_updates

  • 说明:发布全局代价地图及其更新数据,通常为 nav_msgs/OccupancyGridmap_msgs/OccupancyGridUpdate 类型。
  • 来源:由 move_base 的全局代价地图生成,辅助全局路径规划。

/move_base/global_costmap/footprint

  • 说明:发布机器人轮廓信息,通常为 geometry_msgs/PolygonStamped 类型。
  • 来源:由 move_base 全局代价地图生成,用于计算安全代价区域。

/move_base/global_costmap/inflation_layer/parameter_descriptions 和 /move_base/global_costmap/inflation_layer/parameter_updates

  • 说明:用于膨胀层的动态调参,用于障碍物周围的安全缓冲区设置。
  • 来源:由 move_base 的膨胀层生成,增加障碍物周围的安全缓冲区。

/move_base/global_costmap/obstacle_layer/parameter_descriptions 和 /move_base/global_costmap/obstacle_layer/parameter_updates

  • 说明:用于动态障碍物图层的动态调参。
  • 来源:由 move_base 的障碍物层生成,处理动态障碍物信息。

/move_base/global_costmap/static_layer/parameter_descriptions 和 /move_base/global_costmap/static_layer/parameter_updates

  • 说明:用于静态图层的动态调参。
  • 来源:由 move_base 的静态层生成,处理静态障碍物和背景地图。

/move_base/global_costmap/parameter_descriptions 和 /move_base/global_costmap/parameter_updates

  • 说明:用于调整全局代价地图的整体参数。
  • 来源:由 move_base 全局代价地图生成,支持参数的动态管理。

3.5局部代价地图(Local Costmap)


/move_base/local_costmap/costmap 和 /move_base/local_costmap/costmap_updates

  • 说明:发布局部代价地图及其更新数据,通常为 nav_msgs/OccupancyGridmap_msgs/OccupancyGridUpdate 类型。
  • 来源:由 move_base 的局部代价地图生成,辅助局部路径规划。

/move_base/local_costmap/footprint

  • 说明:发布机器人轮廓信息,通常为 geometry_msgs/PolygonStamped 类型。
  • 来源:由 move_base 局部代价地图生成,用于计算安全代价区域。

/move_base/local_costmap/inflation_layer/parameter_descriptions 和 /move_base/local_costmap/inflation_layer/parameter_updates

  • 说明:用于膨胀层的动态调参,用于障碍物周围的安全缓冲区设置。
  • 来源:由 move_base 的膨胀层生成,增加障碍物周围的安全缓冲区。

/move_base/local_costmap/obstacle_layer/parameter_descriptions 和 /move_base/local_costmap/obstacle_layer/parameter_updates

  • 说明:用于动态障碍物图层的动态调参。
  • 来源:由 move_base 的障碍物层生成,处理动态障碍物信息。

/move_base/local_costmap/parameter_descriptions 和 /move_base/local_costmap/parameter_updates

  • 说明:用于调整局部代价地图的整体参数。
  • 来源:由 move_base 局部代价地图生成,支持参数的动态管理。

三、move_bose 节点参数解析

    <!--- Run move_base -->
    <node pkg="move_base" type="move_base" name="move_base">
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
        <rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />

        <param name="base_global_planner" value="global_planner/GlobalPlanner" /> 
        <param name="base_local_planner" value="wpbh_local_planner/WpbhLocalPlanner" />
    </node>

1、全局规划器

        官方介绍:global_planner - ROS Wiki

        1.1 广度优先算法 BFS(Dijkstra算法)

        1.2 深度优先算法 DFS(A*)

        1.3 move_base 中的全局规划器 

        move_base 共有 3 个全局规划器,默认使用 Navfn规划器。其中前两个规划器中均包含 Dijkstra算法 和 A*算法,都默认使用 Dijkstra算法,但 Navfn规划器中的 A*算法存在 Bug。

        若想使用 Global_planner规划器 中的 A*算法,需要加上如下代码:

<!-- 使用 GlobalPlanner规划器 中的 A*算法 -->
<param name="GlobalPlanner/use_dijkstra" value="false" />
<param name="GlobalPlanner/use_grid_path" value="true" />

        Carrot_planner规划器:从起始点到目标点延伸一条路径,遇到障碍物就停止。代码简单,经常被用来作为自定义规划器的模版进行修改。

1.4 自定义规划器

        move_base  支持自己编写自定义全局规划器,提供了一种 Plugin 插件接口,只要按照特定的格式,就能把自己的路径规划算法编写成新的规划器,加载到 move_base 节点中使用。

2、AMCL (Adaptive Mentcarto Localization)自适应蒙特卡罗定位算法 

        官方介绍:amcl - ROS Wiki

        AMCL:使用粒子滤波在已知地图中进行定位的算法。同时使用了 里程计 和 激光雷达数据,具有较强的自我纠错功能。rviz 中添加 PoseArray 订阅话题 /particlecloud 可查看 AMCL 产生的粒子。

        AMCL参数:

<launch>
<node pkg="amcl" type="amcl" name="amcl" output="screen">
  <!-- Publish scans from best pose at a max of 10 Hz -->
  <!-- 机器人的运动模型为差动驱动模型,即机器人只能前后运动和原地旋转,无法侧向移动。 -->
  <param name="odom_model_type" value="diff"/>
  <!-- 机器人的运动模型为全向运动模型,允许机器人在平面上向任何方向移动。 -->
  <param name="odom_model_type" value="omni"/>
  <param name="odom_alpha5" value="0.1"/>
  <param name="transform_tolerance" value="0.2" />
  <param name="gui_publish_rate" value="10.0"/>
  <param name="laser_max_beams" value="30"/>
  <!-- 粒子滤波的粒子数 -->
  <param name="min_particles" value="50"/>
  <param name="max_particles" value="500"/>
  <param name="kld_err" value="0.05"/>
  <param name="kld_z" value="0.99"/>
  <param name="odom_alpha1" value="0.2"/>
  <param name="odom_alpha2" value="0.2"/>
  <!-- translation std dev, m -->
  <param name="odom_alpha3" value="0.8"/>
  <param name="odom_alpha4" value="0.2"/>
  <param name="laser_z_hit" value="0.5"/>
  <param name="laser_z_short" value="0.05"/>
  <param name="laser_z_max" value="0.05"/>
  <param name="laser_z_rand" value="0.5"/>
  <param name="laser_sigma_hit" value="0.2"/>
  <param name="laser_lambda_short" value="0.1"/>
  <param name="laser_lambda_short" value="0.1"/>
  <param name="laser_model_type" value="likelihood_field"/>
  <!-- <param name="laser_model_type" value="beam"/> -->
  <param name="laser_likelihood_max_dist" value="2.0"/>
  <param name="update_min_d" value="0.2"/>
  <param name="update_min_a" value="0.5"/>
  <param name="odom_frame_id" value="odom"/>
  <param name="resample_interval" value="1"/>
  <param name="transform_tolerance" value="0.1"/>
  <param name="recovery_alpha_slow" value="0.0"/>
  <param name="recovery_alpha_fast" value="0.0"/>
</node>
</launch>

         其中 AMCL 负责输出 map 到 odom 的 tf ;里程计负责输出 odom 到 base_frame 的 tf 。从而形成完整的 map 到 base_frame 的 tf。

        注意:AMCL 切换本体和分身是在 map 到 odom 这段的 tf 上产生跳跃突变来实现的,所以在导航过程中会看到机器人位置跳变,这就是 AMCL 输出的这段 tf 突变产生的结果;而里程计输出的 odom 到 base_frame 这段 tf 通常是保持连续变化的,不会突然跳变(这个特征在生成代价地图时会用到)。

3、代价地图

        官方介绍:costmap_2d - ROS Wiki

<!-- 代价地图参数 -->
<!-- 通过 命名空间 ns 实现了用一个文件给全局和局部两个代价地图设置一样的参数,参数是关于代价地图的形状的 -->
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="global_costmap" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/costmap_common_params.yaml" command="load" ns="local_costmap" />
<!-- 代价地图的计算范围和频率 -->
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/global_costmap_params.yaml" command="load" />
<rosparam file="$(find wpb_home_tutorials)/nav_lidar/local_costmap_params.yaml" command="load" />

        3.1 代价地图的形状参数

robot_radius: 0.25              # 机器人底盘半径
inflation_radius: 0.5           # 膨胀区域的半径
obstacle_range: 6.0             # 激光雷达障碍物检测距离,单位 m
raytrace_range: 6.0             # 清除动态障碍物的残留影子
observation_sources: base_lidar # 障碍物的观测来源,与下文保持一致

# 观测来源的数据参数
base_lidar: {
    data_type: LaserScan, # 消息的类型
    topic: /scan,         # 话题名称
    marking: true,        # 是否将扫描到的障碍物添加到代价地图
    clearing: true        # 是否清除扫描范围内的障碍物残影
    }

 

 

        3.2 全局代价地图的计算范围和频率参数

global_costmap:
  global_frame: map                 # 地图坐标系名称
  robot_base_frame: base_footprint  # 底盘坐标系名称
  static_map: true                  # 是否将 map_server 发来的地图数据作为初始代价地图
  update_frequency: 1.0             # 地图更新频率,单位 hz
  publish_frequency: 1.0            # 地图发布频率,单位 hz
  transform_tolerance: 1.0          # transform 延迟容忍值,单位 s。如出现 tf 的 timeout 错误,调大该值。

        其中 transform 指的是 传感器 到 map 的 tf ,包含 3 段

 

        3.3局部代价地图的计算范围和频率参数 

local_costmap:
  global_frame: odom                # 地图坐标系名称
  robot_base_frame: base_footprint  # 底盘坐标系名称
  static_map: false                 # 是否将 map_server 发来的地图数据作为初始代价地图
  rolling_window: true              # 局部代价地图是否和底盘一起移动
  width: 3.0                        # 代价地图的宽度,单位 m
  height: 3.0
  update_frequency: 10.0            # 局部代价地图的更新频率,一般和激光雷达的扫描频率保持一致
  publish_frequency: 10.0           # 局部代价地图的发布频率
  transform_tolerance: 1.0

        这里的 global_frame 设置为 odom 而不是 map,原因是 AMCL 是通过 map 到 odom 这段的 tf 的跳变来切换机器人和分身的位置的,如果以 map 为基准坐标系,当机器人的位置跳变时,传感器检测到的障碍物位置也会跳变,这对于全局路径规划来说问题不大,但对于局部路径规划来说,会使机器人运动变得不平稳。所以局部代价地图的 global_frame 通常会设置为 odom。

         

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

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

相关文章

探索开放资源上指令微调语言模型的现状

人工智能咨询培训老师叶梓 转载标明出处 开放模型在经过适当的指令调整后&#xff0c;性能可以与最先进的专有模型相媲美。但目前缺乏全面的评估&#xff0c;使得跨模型比较变得困难。来自Allen Institute for AI和华盛顿大学的研究人员们进行了一项全面的研究&#xff0c;探索…

微信小程序uniapp基于Android的流浪动物管理系统 70c3u

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 以往流浪猫狗的救助网站相关信息的管理&#xff0c;都是工作人员手工统计。这种方式不但时效性低&#xff0c;而且需要查…

MiniWord

1.nuget 下载配置 2.引用 3. var value = new Dictionary<string, object>() { ["nianfen"] = nianfen, ["yuefen"] = yuefen, ["yuefenjian1"] = (int.Par…

【算法与数据结构】【链表篇】【题1-题5】

题1.从尾到头打印链表 题目&#xff1a;输入一个链表的头结点&#xff0c;从尾到头反过来打印出每个节点的值。链表的定义如下&#xff1a; struct ListNode {int mValue;ListNode *mNext;ListNode *mPrev; }; 1.1 方法一&#xff1a;栈 思路&#xff1a;要反过来打印&…

8.机器学习--决策树

(⊙﹏⊙)下周有要开组会&#xff0c;不知道该说啥&#xff0c;啊啊啊啊&#x1f62b; 目录 1.基本概念 2.ID3算法 3.C4.5算法 4.CART算法 5.连续与缺失值处理 5.1.连续值处理 5.2.缺失值处理 6.剪枝处理 6.1.预剪枝策略 6.2.后剪枝策略 7.实例代码 1.基本概念 提…

C#的6种常用集合类

一.先来说说数组的不足&#xff08;也可以说集合与数组的区别&#xff09;&#xff1a; 1.数组是固定大小的&#xff0c;不能伸缩。虽然System.Array.Resize这个泛型方法可以重置数组大小&#xff0c;但是该方法是重新创建新设置大小的数组&#xff0c;用的是旧数组的元素初始…

以太网交换安全:MAC地址漂移

一、什么是MAC地址漂移&#xff1f; MAC地址漂移是指设备上一个VLAN内有两个端口学习到同一个MAC地址&#xff0c;后学习到的MAC地址表项覆盖原MAC地址表项的现象。 MAC地址漂移的定义与现象 基本定义&#xff1a;MAC地址漂移发生在一个VLAN内的两个不同端口学习到相同的MAC地…

qt QHttpMultiPart详解

1. 概述 QHttpMultiPart是Qt框架中用于处理HTTP多部分请求的类。它类似于RFC 2046中描述的MIME multipart消息&#xff0c;允许在单个HTTP请求中包含多个数据部分&#xff0c;如文件、文本等。这种多部分请求在上传文件或发送带有附件的邮件等场景中非常有用。QHttpMultiPart类…

【SQL实验】高级查询(难点.三)含附加数据库操作

完整代码在文章末尾【代码是自己的解答&#xff0c;并非标准答案&#xff0c;也有可能写错&#xff0c;文中可能会有不准确或待完善之处&#xff0c;恳请各位读者不吝批评指正&#xff0c;共同促进学习交流】 将素材中的“学生管理”数据库附加到SQL SERVER中&#xff0c;完成以…

基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)

&#x1f388;系统亮点&#xff1a;协同过滤算法、节流算法、支付宝沙盒支付、图形化分析、实时聊天&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk1…

std::copy

std::copy 是 C 标准库中的一个算法&#xff0c;用于将一个序列中的元素复制到另一个位置。这个算法定义在 <algorithm> 头文件中。 --- 函数原型 std::copy 有几个不同的重载版本&#xff0c;但以下是最常用的两个&#xff1a; template <class InputIterator, c…

Linux之sed命令详解

文章目录 &#x1f34a;自我介绍&#x1f34a;sed概述&#x1f34a;sed语法讲解格式&#xff1a;options 命令选项{commmand}[flags] &#x1f34a;场景训练 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff…

现代Web开发:React Hooks深入解析

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hooks深入解析 现代Web开发&#xff1a;React Hook…

大语言模型(LLM)入门级选手初学教程 III

指令微调 一、指令数据的构建 包括任务描述&#xff08;也称为指令&#xff09;、任务输入-任务输出以及可选的示例。 Self-Instruct 指令数据生成&#xff1a;从任务池中随机选取少量指令数据作为示例&#xff0c;并针对Chat-GPT 设计精细指令来提示模型生成新的微调数据…

算法工程师重生之第四十六天(字符串接龙 有向图的完全可达性 岛屿的周长)

参考文献 代码随想录 一、字符串接龙 题目描述 字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序列&#xff1a; 1. 序列中第一个字符串是 beginStr。 2. 序列中最后一个字符串是 endStr。 3. 每次转换只能改变一个字符。 4. 转换过程…

魅力标签云,奇幻词云图 —— 数据可视化新境界

目录 目的原理详解建议 标签云&#xff1a;用于汇总生成的标签&#xff0c;一般是独立词汇运行前的准备代码示例 词云&#xff1a;对本文中出现频率较高的词&#xff0c;视觉上突出显示总结 目的 掌握文本与文档可视化&#xff1a;使用特定软件或编程语言&#xff08;如Python…

云计算答案

情境一习题练习 一、选择题 1、在虚拟机VMware软件中实现联网过程&#xff0c;图中箭头所指的网络连接方式与下列哪个相关&#xff08; C &#xff09;。 A.仅主机模式 B.桥接 C.NAT D.嫁接 2、请问下图这个虚拟化架构属于什么类型&#xff08; A …

【测试】【Debug】vscode pytest 找不到测试用例测试文件 行号部位没有绿色箭头

出现这种情况首先检查&#xff1a; 是否安装pytest点击vscode的这个图标如果其中都是空的&#xff0c;没有识别上&#xff0c;并且写好的.py测试文件的行号前面没有运行符号&#xff0c;要检查名称是否按照pytest的要求写&#xff0c;不然会识别不到。 命名规则注意&#xff1…

Echats柱状图的横坐标用图片显示

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片作为横坐标示例 - ECharts</title><!-…

D-ID 推出能模仿用户的头部动作以及实时互动的 AI 头像

D-ID 宣布推出两种新型 AI 头像 — — Express 和 Premium&#xff0c;旨在提升内容创作的灵活性和人性化。这些头像将为企业在营销、销售和客户支持等领域的视频制作提供便利。用户只需少量文本输入和视觉数据&#xff0c;即可生成更自然的商业视频。 Express 头像可以通过约一…