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

Chapter6:机器人SLAM与自主导航

ROS1{\rm ROS1}ROS1的基础及应用,基于古月的课,各位可以去看,基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。
ROS{\rm ROS}ROS版本:ROS1{\rm ROS1}ROS1Melodic{\rm Melodic}Melodic;实际机器人:Hawkbot{\rm Hawkbot}Hawkbot



1.机器人必备条件

  1. 硬件要求

    • 差分轮式机器人,使用Twist{\rm Twist}Twist速度指令控制
      • linear{\rm linear}linearXYZ{\rm XYZ}XYZ方向上的线速度,单位:m/s{\rm m/s}m/s
      • angular{\rm angular}angularXYZ{\rm XYZ}XYZ方向上的角速度,单位:rad/s{\rm rad/s}rad/s
    • 机器人必须安装激光雷达等测距设备,可以获取环境深度信息;
    • 最好使用正方形和圆形的机器人,其他外形的机器人效果可能不佳;
  2. 深度信息

    rosmsg show sensor_msgs/LaserScan===========================================================================
    angle_min:可检测范围的起始角度;
    angle_max:可检测范围的终止角度,与angle_min组成激光雷达可检测范围;
    angle_increment:相邻数据帧之间的角度步长;
    time_increment:采集到相邻数据帧之间的时间步长,当传感器处于相对运动状态时进行补偿使用;
    scan_time:采集一帧数据所需要的时间;
    range_min:最近可检测深度的阈值;
    range_max:最远可检测深度的阈值;
    ranges:一帧深度数据的存储数组;
    ===========================================================================
    
  3. 里程计信息

    • pose{\rm pose}pose:机器人当前位置坐标,包括机器人的XYZ{\rm XYZ}XYZ三轴位置与方向参数,及用于校正误差的协方差矩阵;
    • twist{\rm twist}twist:机器人当前的运动状态,包括XYZ{\rm XYZ}XYZ三轴的线速度与角速度,及用于校正误差的协方差矩阵;
  4. 仿真环境

    # 创建仿真环境
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    

2.ROS SLAM功能包应用方法

  1. gmapping{\rm gmapping}gmapping功能包概述

    • 基于激光雷达;
    • Rao−Blackwellized{\rm Rao-Blackwellized}RaoBlackwellized粒子滤波算法;
    • 二维栅格地图;
    • 需要机器人提供里程计信息;
    • OpenSlam{\rm OpenSlam}OpenSlam开源算法;
    • 输出地图话题:nav_msgs/OccupancyGrid{\rm nav\_msgs/OccupancyGrid}nav_msgs/OccupancyGrid
  2. gmapping{\rm gmapping}gmapping功能包总体框架

    1

  3. 安装gmapping{\rm gmapping}gmapping功能包

    # 安装gmapping
    sudo apt-get install ros-melodic-gmapping
    

    2

  4. 栅格地图取值原理

    3

    • 致命障碍:栅格值为254254254,障碍物与机器人中心重合,此时机器人必然与障碍物发生碰撞;
    • 内切障碍:栅格值为253253253,障碍物处于机器人轮廓的内切圆内,此时机器人也必然与障碍物发生碰撞;
    • 外切障碍:栅格值为252~128252~128252128,障碍物处于机器人轮廓的外切圆内,此时机器人与障碍物临界接触,不一定发生碰撞;
    • 非自由空间:栅格值为128~0128~01280,障碍物附近区域,一旦机器人进入该区域,将有较大概率发生碰撞,属于危险警戒区,机器人应该尽量避免进入;
    • 自由区域:栅格值为000,此处没有障碍物,机器人可以自由通过;
    • 未知区域:栅格值为255255255,此处还没有探知是否有障碍物,机器人可以前往继续建图;
  5. 配置gmapping{\rm gmapping}gmapping功能包

    # gmapping.launch文件内容<launch><arg name="scan_topic" default="scan" /><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen" clear_params="true"><param name="odom_frame" value="odom"/><param name="map_update_interval" value="5.0"/><!-- Set maxUrange < actual maximum range of the Laser --><param name="maxRange" value="5.0"/><param name="maxUrange" value="4.5"/><param name="sigma" value="0.05"/><param name="kernelSize" value="1"/><param name="lstep" value="0.05"/><param name="astep" value="0.05"/><param name="iterations" value="5"/><param name="lsigma" value="0.075"/><param name="ogain" value="3.0"/><param name="lskip" value="0"/><param name="srr" value="0.01"/><param name="srt" value="0.02"/><param name="str" value="0.01"/><param name="stt" value="0.02"/><param name="linearUpdate" value="0.5"/><param name="angularUpdate" value="0.436"/><param name="temporalUpdate" value="-1.0"/><param name="resampleThreshold" value="0.5"/><param name="particles" value="80"/><param name="xmin" value="-1.0"/><param name="ymin" value="-1.0"/><param name="xmax" value="1.0"/><param name="ymax" value="1.0"/><param name="delta" value="0.05"/><param name="llsamplerange" value="0.01"/><param name="llsamplestep" value="0.01"/><param name="lasamplerange" value="0.005"/><param name="lasamplestep" value="0.005"/><remap from="scan" to="$(arg scan_topic)"/></node>
    </launch>
    
  6. 运行激光雷达建图例程

    # 1.启动gmapping演示
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigaztion gmapping_demo.launch
    roslaunch mbot_teleop mbot_teleop.launch# 2.切换到地图保存目录,保存地图
    roscd mbot_navigation/maps/# rosrun map_server map_saver -f 地图名
    rosrun map_server map_saver -f simulink_maps# 注:
    # 建图效果好坏和很多因素有关,如硬件、算法本身、可调参数等;
    # 硬件条件不好,建图过程中可能发生移位,导致建图失败;
    

    建图效果:

    4

    地图的.pgm{\rm .pgm}.pgm文和.yaml{\rm .yaml}.yaml信息:

    5

  7. 运行kinect{\rm kinect}kinect建图例程

    # 1.启动建图演示
    roslaunch mbot_gazebo mbot_kinect_nav_gazebo.launch
    roslaunch mbot_navigation gmapping_demo.launch
    roslaunch mbot_teleop mbot_teleop.launch# 2.若运行kinect抛出如下错误
    cannot launch node of type [depthimage_to_laserscan/depthimage_to_laserscan]:depthimage_to_laserscan# 解决方案
    sudo apt-get install ros-melodic-depthimage-to-laserscan# 注:
    # 使用摄像头建模,效果好坏和硬件配置很大关系;
    # 如下图所示,使用虚拟机建图十分卡顿,很容易发生移位;
    # 如果笔记本的配置不是很好,建议了解建图过程即可;
    # 如果笔记本配置不是很好,建图过程会直接卡死,想退出也难;
    

    没有完全建好的图效果(发生了移位):

    6

  8. 实际机器人建图实例

    # Hawkbot机器人的实际建图过程
    # 1.时间同步
    # 远程登录移动机器人端,并进行时间同步
    ssh ...
    sudo ntpdate 虚拟机IP# 2.启动建图节点
    roslaunch hawbot bringup.launch(机器人端)
    roslaunch hawkbot teleop_key.launch(机器人或虚拟机端)
    roslaunch hawkbot gmapping_slam.launch(虚拟机端)# 3.保存地图
    roscd hawkbot/maps/ 
    rosrun map_server map_saver -f 地图名称
    

    7

3.ROS中的导航框架

  1. ROS{\rm ROS}ROS的导航框架

    8

  2. move_base{\rm move\_base}move_base

    9

    • 全局路径规划(globalplanner)({\rm global\ planner})(global planner)
      • 全局最优路径规划;
      • Dijkstra{\rm Dijkstra}DijkstraA∗A^*A算法;
    • 本地实时规划(localplanner)({\rm local\ planner})(local planner)
      • 规划机器人每个周期内的线速度、角速度,使之尽量符合全局最优路径;
      • 实时避障;
      • TrajectoryRollout{\rm Trajectory\ Rollout}Trajectory RolloutDynamicWindowApproaches{\rm Dynamic\ Window\ Approaches}Dynamic Window Approaches算法;
      • 搜索躲避和行进的多条路径,综合各评价标准选取最优路径;
  3. move_base{\rm move\_base}move_base功能包的话题和服务

    10

  4. 配置move_base{\rm move\_base}move_base节点

    # move_base.launch文件内容
    <launch><node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true"><rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="global_costmap" /><rosparam file="$(find mbot_navigation)/config/mbot/costmap_common_params.yaml" command="load" ns="local_costmap" /><rosparam file="$(find mbot_navigation)/config/mbot/local_costmap_params.yaml" command="load" /><rosparam file="$(find mbot_navigation)/config/mbot/global_costmap_params.yaml" command="load" /><rosparam file="$(find mbot_navigation)/config/mbot/base_local_planner_params.yaml" command="load" /></node></launch>
    
  5. amcl{\rm amcl}amcl

    • 蒙特卡罗定位方法;
    • 二维环境定位;
    • 针对已有地图使用粒子滤波器跟踪一个机器人的姿态;
  6. amcl{\rm amcl}amcl功能包的话题和服务

    11

  7. amcl{\rm amcl}amcl定位

    12

    • 里程计定位:只通过里程计的数据来处理/base{\rm /base}/base/odom{\rm /odom}/odom间的TF{\rm TF}TF变换;
    • amcl{\rm amcl}amcl定位:估算机器人在地图坐标系/map{\rm /map}/map下的位姿信息,提供/base、/odom、/map{\rm /base、/odom、/map}/base/odom/map间的TF{\rm TF}TF变换;
  8. 配置amcl{\rm amcl}amcl节点

    # amcl.launch文件内容
    <launch><arg name="use_map_topic" default="false"/><arg name="scan_topic" default="scan"/><node pkg="amcl" type="amcl" name="amcl" clear_params="true"><param name="use_map_topic" value="$(arg use_map_topic)"/><!-- Publish scans from best pose at a max of 10 Hz --><param name="odom_model_type" value="diff"/><param name="odom_alpha5" value="0.1"/><param name="gui_publish_rate" value="10.0"/><param name="laser_max_beams" value="60"/><param name="laser_max_range" value="12.0"/><param name="min_particles" value="500"/><param name="max_particles" value="2000"/><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.2"/><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_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.25"/><param name="update_min_a" value="0.2"/><param name="odom_frame_id" value="odom"/><param name="resample_interval" value="1"/><!-- Increase tolerance because the computer can get quite busy --><param name="transform_tolerance" value="1.0"/><param name="recovery_alpha_slow" value="0.0"/><param name="recovery_alpha_fast" value="0.0"/><remap from="scan" to="$(arg scan_topic)"/></node>
    </launch>

4.ROS机器人自主导航

  1. 导航仿真

    # 1.启动导航仿真包
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigation nav_cloister_demo.launch# 2.导航步骤
    # 2.1 若机器人不在建图坐标系原点,先点击"2D Pose Estimate",将地图和雷达数据对上;
    # 2.2 匹配好机器人初始位置后,点击"2D Nav Goal"发布机器人目标点;

    13

  2. 导航SLAM{\rm SLAM}SLAM仿真

    # 1.启动相应.launch文件
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigation exploring_slam_demo.launch# 2.通过点击"2D Nav Goal"发布机器人目标点进行建图;# 自主探索SLAM仿真
    # 启动相应的.launch文件
    roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch
    roslaunch mbot_navigation exploring_slam_demo.launch
    rosrun mbot_navigation exploring_slam.py

    15

相关文章:

Chapter6:机器人SLAM与自主导航

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…...

Sass的使用要点

Sass 是一个 CSS 预处理器&#xff0c;完全兼容所有版本的 CSS。实际上&#xff0c;Sass 并没有真正为 CSS 语言添加任何新功能。只是在许多情况下可以可以帮助我们减少 CSS 重复的代码&#xff0c;节省开发时间。 一、注释 方式一&#xff1a;双斜线 // 方式二&#xff1a;…...

计算机启动过程,从按下电源按钮到登录界面的详细步骤

1、背景 自接触计算机以来&#xff0c;一直困扰着我一个问题。当我们按下电脑的开机键后&#xff0c;具体发生了哪些过程呢&#xff1f;计算机启动的具体步骤是什么&#xff1f; 计算机启动过程通常分为五个步骤&#xff1a;电源自检、BIOS自检、引导设备选择、引导程序加载和…...

LeetCode 刷题之 BFS 广度优先搜索【Python实现】

1. BFS 算法框架 BFS&#xff1a;用来搜索 最短路径 比较合适&#xff0c;如&#xff1a;求二叉树最小深度、最少步数、最少交换次数&#xff0c;一般与 队列 搭配使用&#xff0c;空间复杂度比 DFS 大很多DFS&#xff1a;适合搜索全部的解&#xff0c;如&#xff1a;寻找最短…...

Hadoop01【尚硅谷】

大数据学习笔记 大数据概念 大数据&#xff1a;指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 主要解决&#xff0c;海量数据的存储…...

Echarts 配置横轴竖轴指示线,更换颜色、线型和大小

第018个点击查看专栏目录本示例是描述如何在Echarts上配置横轴竖轴指示线&#xff0c;更换颜色、线型和大小。方法很简单&#xff0c;参考示例源代码。 文章目录示例效果示例源代码&#xff08;共85行&#xff09;相关资料参考专栏介绍示例效果 示例源代码&#xff08;共85行&a…...

OpenAI 官方API Java版SDK,两行代码即可调用。包含GhatGPT问答接口。

声明&#xff1a;这是一个非官方的社区维护的库。 已经支持OpenAI官方的全部api&#xff0c;有bug欢迎朋友们指出&#xff0c;互相学习。 注意&#xff1a;由于这个接口&#xff1a; https://platform.openai.com/docs/api-reference/files/retrieve-content 免费用户无法使…...

SpringBoot 日志文件

(一)日志文件有什么用&#xff1f;除了发现和定位问题之外&#xff0c;我们还可以通过日志实现以下功能&#xff1a;记录用户登录日志&#xff0c;以便分析用户是正常登录还是恶意破解用户。记录系统的操作日志&#xff0c;以便数据恢复和定位操作 。记录程序的执行时间&#x…...

SQL71 检索供应商名称

描述Vendors表有字段供应商名称&#xff08;vend_name&#xff09;、供应商国家&#xff08;vend_country&#xff09;、供应商州&#xff08;vend_state&#xff09;vend_namevend_countryvend_stateappleUSACAvivoCNAshenzhenhuaweiCNAxian【问题】编写 SQL 语句&#xff0c;…...

02:入门篇 - 漫谈 CTK

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 十万个为什么 五千个在哪里?七千个怎么办?十万个为什么?。。。生活中,有很多奥秘在等着我们去思考、揭示! 同样地,在使用 CTK 时,很多小伙伴一定也存在诸多疑问: 为什么 CTK Plugin Framework 要借…...

SpringBoot常用注解

SpringBootApplication注解包含如下三个SpringBootConfigurationEnableAutoConfigurationComponentScanSpringBootConfiguration等同于Configuration&#xff0c;是属于spring的一个配置类这里的 Configuration 对我们来说并不陌生&#xff0c;它就是 JavaConfig 形式的 Spring…...

RBAC权限模型

什么是RBAC权限模型&#xff1f; RBAC是基于角色的访问控制&#xff0c;在RBAC中&#xff0c;权限与角色相关联&#xff0c;用户通过成为适当角色的成员而得到这些角色的权限。 1.0级 用户、角色、权限 2.0 权限分级 公司>部门>小组 2.1 权限继承 ps: 这个人是一个小组长…...

【郭东白架构课 模块一:生存法则】07|法则三:架构师如何找到自己的商业模式?

你好&#xff0c;我是郭东白&#xff0c;今天我们来聊聊架构活动中对商业价值的考量。 今天我们要讲的是架构师的第三个生存法则&#xff1a;作为一个架构师&#xff0c;必须要在有限的资源下最大化架构活动所带来的商业价值。对于任何一个架构活动而言&#xff0c;架构师的可…...

STM32 - 看门狗

独立看门狗 IWDG专业时钟LSI 低功耗仍可以运行对定时的控制比较松喂狗这些时间是按照40kHz时钟给出。实际上&#xff0c;MCU内部的RC频率会在30kHz到60kHz之间变化。此外&#xff0c;即使RC振荡器的频率是精确的&#xff0c;确切的时序仍然依赖于APB接口时钟与RC振荡器时钟之间…...

Redis集群搭建

一、哨兵模式 在 redis3.0之前&#xff0c;redis使用的哨兵架构&#xff0c;它借助 sentinel 工具来监控 master 节点的状态&#xff1b;如果 master 节点异常&#xff0c;则会做主从切换&#xff0c;将一台 slave 作为 master。 哨兵模式的缺点&#xff1a; &#xff08;1&…...

车载基础软件——AUTOSAR AP典型应用案例

我是穿拖鞋的汉子&#xff0c;魔都中一位坚持长期主义的工程师&#xff01; 最近不知道为何特别喜欢苏轼的一首词&#xff1a; 缺月挂疏桐&#xff0c;漏断人初静。谁见幽人独往来&#xff0c;缥缈孤鸿影。 惊起却回头&#xff0c;有恨无人省。拣尽寒枝不肯栖&#xff0c;寂寞…...

消息中间件----内存数据库 Redis7(第3章 Redis 命令)

Redis 根据命令所操作对象的不同&#xff0c;可以分为三大类&#xff1a;对 Redis 进行基础性操作的命令&#xff0c;对 Key 的操作命令&#xff0c;对 Value 的操作命令。3.1 Redis 基本命令首先通过 redis-cli 命令进入到 Redis 命令行客户端&#xff0c;然后再运行下面的命令…...

react-03-react-router-dom-路由

react-router-dom:react路由 印记中文:react-router-dom 1、路由原理 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>前端路由的基石_history</title> </head> <body><a hre…...

2自由度悬架LQR控制

目录 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 1.3 路面激励 2.仿真分析 2.1simulink模型 2.2 仿真结果 2.3 结论 3. 总结 1 悬架系统 1.1 悬架结构示意图 1.2 悬架数学模型 其中&#xff1a;x1为悬架动扰度&#xff0c;x2为车身加速度&#xff0c;x3为轮胎…...

C语言返回类型为指针的一些经典题目(下)

续上一篇文章&#xff0c;上一篇文章题目都很经典&#xff0c;这一篇也不例外。一.返回类型为指针经典题目(下)1.代码(第六题)char *GetMemory3(int num) {char *p (char *)malloc(sizeof(char) * num);return p; } void Test3(void) {char *str NULL;str GetMemory3(100…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...