elevation mapping学习笔记2之高程图输入、输出、服务和参数配置的定义和说明

文章目录

  • 0 引言
  • 1 话题Topics
    • 1.1 订阅subscribe
    • 1.2 发布publish
  • 2 服务Services
  • 3 参数Parameters

0 引言

elevation mapping学习笔记1已经成功编译安装elevation mapping高程图工程,并运行示例turtlesim3_waffle_demo,在仿真环境下,控制带有传感器的机器人生成高程图,简单熟悉了高程图的实际应用。本文主要熟悉了该工程一些输入、输出、功能服务和参数配置的定义和说明。

👉 elevation mapping github:https://github.com/ANYbotics/elevation_mapping

本文系统环境:

  • Ubuntu18.04
  • ROS-melodic
  • elevation mapping

1 话题Topics

ros类工程肯定需要订阅话题和发布话题,elevation mapping高程图工程主要有三种需要订阅的话题类型,支持两种发布的话题。

1.1 订阅subscribe

elevation mapping高程图工程主要的输入数据有三部分,topic类型分别是:点云(相机,雷达等)、协方差位姿(机器人,里程计等)和tf关系,其中点云和tf关系是必需的,协方差位姿是非必需的。

  • /points( sensor_msgs/PointCloud2 )

  • /pose( geometry_msgs/PoseWithCovarianceStamped )

  • /tf(tf/tf消息)

比如运行TurtleBot3 Waffle示例,可分别echo这三种数据:

点云数据: rostopic echo /camera/depth/points

  frame_id: "camera_rgb_optical_frame"
height: 1080
width: 1920
fields: 
  - 
    name: "x"
    offset: 0
    datatype: 7
    count: 1
  - 
    name: "y"
    offset: 4
    datatype: 7
    count: 1
  - 
    name: "z"
    offset: 8
    datatype: 7
    count: 1
  - 
    name: "rgb"
    offset: 16
    datatype: 7
    count: 1
is_bigendian: False
point_step: 32
row_step: 61440

协方差位姿数据:rostopic echo /base_footprint_pose

  frame_id: "odom"
pose: 
  pose: 
    position: 
      x: -2.99972175706
      y: 1.00078679455
      z: -0.00100739962037
    orientation: 
      x: -5.58514904452e-06
      y: 0.00158964306941
      z: 0.00246946885279
      w: 0.999995687354
  covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

tf关系树:rostopic echo /tf

transforms: 
  - 
    header: 
      seq: 0
      stamp: 
        secs: 1318
        nsecs: 164000000
      frame_id: "odom"
    child_frame_id: "base_footprint"
    transform: 
      translation: 
        x: -2.99971786734
        y: 1.00079767969
        z: -0.0010073996308
      rotation: 
        x: -5.63941461375e-06
        y: 0.00158964291266
        z: 0.00250363158562
        w: 0.999995602407

1.2 发布publish

elevation mapping高程图工程主要的输出数据有两部分:原始高程图elevation_map_raw和经过后处理的高程图elevation_map

  • elevation_map( grid_map_msgs/GridMap )

  • elevation_map_raw( grid_map_msgs/GridMap )

  1. elevation_map_raw(原始高程图):
  • elevation_map_raw是一种原始的高程图表示,通常以一个二维栅格(grid)的形式呈现。
  • 它直接从传感器(如激光雷达或深度相机)获取原始测量数据,没有进行额外的滤波或处理。
  • 每个栅格单元格(cell)存储了一个原始高度值,通常以为单位。
  • elevation_map_raw提供了对地面高度的基本估计,但可能包含传感器噪音、遮挡物等不完整或不准确的数据。
  1. elevation_map(修正高程图):
  • elevation_map是在elevation_map_raw基础上进行处理和滤波后的高程图表示。
  • 它通过使用滤波算法(如高斯滤波、中值滤波等)来平滑和修正原始数据,以减少噪音和不准确性。
  • elevation_map通常会对原始高度数据进行插值,使得在栅格之间的位置也具有高度估计值,从而提供更连续和均匀的地面高度表示。
  • 由于经过处理和滤波,elevation_map通常比elevation_map_raw更适合用于高级算法和导航任务。
示例elevation_map_rawelevation_map
TurtleBot3 Waffle请添加图片描述请添加图片描述

2 服务Services

elevation mapping高程图工程还提供了一些服务,这些服务能方便查询高程图的信息,重载、保存高程图等功能。

  • trigger_fusion (std_srvs/Empty)

    触发整个高程图的融合过程并发布:

rosservice call /elevation_mapping/trigger_fusion
  • get_submap (grid_map_msgs/GetGridMap)

    获取所需位置和大小的融合高程子图。例如,您可以获取 odom 框架中描述的位置 (-0.5, 0.0) 和大小 (0.5, 1.2) 处的融合高程子图,并将其从控制台保存到文本文件中:

rosservice call -- /elevation_mapping/get_submap odom -0.5 0.0 0.5 1.2 []
  • get_raw_submap (grid_map_msgs/GetGridMap)

    获取请求位置和大小的原始高程子图。例如,您可以获取 odom 框架中描述的位置 (-0.5, 0.0) 和大小 (0.5, 1.2) 处的原始高程子图,并将其从控制台保存到文本文件中:

rosservice call -- /elevation_mapping/get_raw_submap odom -0.5 0.0 0.5 1.2 []
  • clear_map (std_srvs/Empty)

    出于重置目的开始清理整个地图。触发地图清理:

rosservice call /elevation_mapping/clear_map
  • masked_replace (grid_map_msgs/SetGridMap)

    允许通过服务调用设置高程图的各个图层。mask层只能用于设置某些单元格,而不是整个地图。mask中包含NAN 的单元格未设置,所有其他单元格均已设置。如果未提供mask层,则整个地图将设置在两个地图的交集中。所提供的地图的大小和位置可以与将要更改的地图不同。将高程图层中标有mask的一些单元格设置为 0.5 的服务调用示例如下:

  rosservice call /elevation_mapping/masked_replace "map:
    info:
      header:
        seq: 3
        stamp: {secs: 3, nsecs: 80000000}
        frame_id: 'odom'
      resolution: 0.1
      length_x: 0.3
      length_y: 0.3
      pose:
        position: {x: 5.0, y: 0.0, z: 0.0}
        orientation: {x: 0.0, y: 0.0, z: 0.0, w: 0.0}
    layers: [elevation,mask]
    basic_layers: [elevation]
    data:
    - layout:
        dim:
        - {label: 'column_index', size: 3, stride: 9}
        - {label: 'row_index', size: 3, stride: 3}
        data_offset: 0
      data: [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]
    - layout:
        dim:
        - {label: 'column_index', size: 3, stride: 9}
        - {label: 'row_index', size: 3, stride: 3}
        data_offset: 0
      data: [0, 0, 0, .NAN, .NAN, .NAN, 0, 0, 0]
    outer_start_index: 0
    inner_start_index: 0"
  • save_map (grid_map_msgs/ProcessFile)

    将当前融合网格图和原始网格图保存到 rosbag 文件。字段topic_name必须是基本名称,即没有前导斜杠字符 (/)。如果字段topic_name为空,则elevation_map默认使用。使用默认主题名称的示例:

rosservice call /elevation_mapping/save_map "file_path: '/home/integration/elevation_map.bag' topic_name: ''"
  • load_map (grid_map_msgs/ProcessFile)

    rosbag 文件加载融合网格图和原始网格图。字段topic_name必须是基本名称,即没有前导斜杠字符 (/)。如果字段topic_name为空,则elevation_map默认使用。使用默认主题名称的示例:

rosservice call /elevation_mapping/load_map "file_path: '/home/integration/elevation_map.bag' topic_name: ''"
  • reload_parameters (std_srvs/Trigger)

    触发所有高程测绘参数的重新加载,可用于在线重新配置参数。用法示例:

rosservice call /elevation_mapping/reload_parameters {}
  • disable_updates (std_srvs/Empty)

    停止使用传感器输入更新高程图。触发更新停止:

rosservice call /elevation_mapping/disable_updates {}
  • enable_updates (std_srvs/Empty)

    开始使用传感器输入更新高程图。触发更新开始:

rosservice call /elevation_mapping/enable_updates {}

3 参数Parameters

elevation mapping高程图工程的配置文件主要在elevation_mapping/config/sensor_processors/**.yamlelevation_mapping/elevation_mapping_demos/config/elevation_maps/**.yamlelevation_mapping/elevation_mapping_demos/config/postprocessing/**.yaml和、elevation_mapping/elevation_mapping_demos/config/robots/**.yaml,分别对应传感器的参数设置、高程图的参数设置、后处理的参数设置和机器人的参数设置。

  • input_sources(输入点云参数)
    首先是机器人中的参数配置,目前已不建议使用point_cloud_topic字段,建议改用input_sources,详细可参考如下对输入点云的参数设置:
input_sources:
    front: # A name to identify the input source
      type: pointcloud # Supported types: pointcloud
      topic: /lidar_front/depth/points
      queue_size: 1
      publish_on_update: true # Wheter to publish the elevation map after a callback from this source. 
    rear:
      type: pointcloud
      topic: /lidar_rear/depth/points
      queue_size: 5
      publish_on_update: false
  • robot_pose_topic(字符串,默认:/robot_state/pose

    机器人位姿和协方差主题的名称。

  • base_frame_id(字符串,默认:/robot

    机器人基础 tfid

  • map_frame_id(字符串,默认值:/map

    高程图tf的id。

  • track_point_frame_id(字符串,默认:/robot

    高程图随着机器人沿着_轨迹点_移动。这是定义跟踪点的 tf 帧的 id

  • track_point_x, track_point_y, track_point_z(双精度,默认值:0.0, 0.0, 0.0

    高程图随着机器人沿着_轨迹点_移动。这是轨迹点在 中的位置track_point_frame_id

  • robot_pose_cache_size(整数,默认值:200,最小值:0

    机器人姿态缓存的大小。

  • min_update_rate(双精度,默认值:2.0

    根据新测量值或机器人姿态估计更新高程图的最小更新率(以 Hz 为单位)。

  • fused_map_publishing_rate(双精度,默认值:1.0

    发布整个(融合)高程地图的帧率。

  • relocate_rate(双精度,默认值:3.0

    检查高程图是否遵循跟踪点进行重定位的速率(以 Hz 为单位)。

  • length_in_x, length_in_y(双精度,默认值:1.5,最小值:0.0

    高程图的大小(以米为单位)。

  • position_x, position_y(双精度,默认值:0.0

    高程图框架中高程图中心的位置。此参数设置生成的高程图与发布它的框架 ( map_frame_id) 之间的平面位置偏移。track_point_frame_id仅当不使用参数时才有用。

  • resolution(双精度,默认值:0.01,最小值:0.0

    高程图的分辨率(像元大小,以米/像元为单位)。

  • min_variance, max_variance(双精度,默认值:9.0e-6, 0.01

    高程地图方差数据的最小值和最大值。

  • mahalanobis_distance_threshold(双精度,默认值:2.5

    高程图中的每个像元的高度值都具有不确定性。根据现有高度分布的马氏距离和新测量值,传入数据将与现有估计融合、覆盖或忽略。该参数确定马哈拉诺比斯距离的阈值,该阈值决定如何处理传入的测量值。

  • sensor_processor/ignore_points_above(双精度,默认值:inf

    深度传感器引入的点高度的硬阈值。在数据收集步骤中,高度超过此阈值的点将被视为无效。

  • sensor_processor/ignore_points_below(双精度,默认值:-inf

    深度传感器引入的点高度的硬阈值。在数据收集步骤中,高度低于此阈值的点将不会被视为有效。

  • multi_height_noise(双精度,默认值:9.0e-7

    添加到高于该特定位置的当前高程图的测量值的噪声。仅当点超过马哈拉诺比斯距离阈值时,才会执行此噪声添加过程。较高的值有助于更快地适应动态环境(例如,移动的物体),但可能会导致高度估计中产生更多噪声。

  • min_horizontal_variance, max_horizontal_variance(双精度,默认:pow(分辨率 / 2.0, 2), 0.5)

    高程地图水平方差数据的最小值和最大值。

  • enable_visibility_cleanup(布尔值,默认值:true

    启用/禁用一个单独的线程,该线程通过源自传感器框架的光线追踪从地图中删除不再可见的元素。

  • visibility_cleanup_rate(双精度,默认值:1.0

    执行可见性清理的速率(以 Hz 为单位)。

  • enable_continuous_cleanup(布尔值,默认值: false

    启用/禁用高程图的连续清理。如果启用,在每个新传感器数据到达时,高程图将被清除并仅用来自传感器的最新数据填充。启用连续清理后,可见性清理将自动禁用,因为在这种情况下不需要。

  • num_callback_threads(整数,默认值:1,分钟:1

    用于处理回调的线程数。更多线程会导致更高的吞吐量,但代价是更多的资源使用。

  • postprocessor_pipeline_name(字符串,默认值:postprocessor_pipeline

    要执行后处理的管道的名称。它期望将管道配置加载到该名称下的节点的私有命名空间中。例如:

  <node pkg="elevation_mapping" type="elevation_mapping" name="elevation_mapping" output="screen">
      ...
      <rosparam command="load" file="$(find elevation_mapping_demos)/config/postprocessor_pipeline.yaml" />
  </node>
  • postprocessor_num_threads(整数,默认值:1,最小值:1

    用于异步后处理的线程数。更多线程会导致更高的吞吐量,但代价是更多的资源使用。

  • scanning_duration(双精度,默认值:1.0

    用于可见性清理的传感器扫描持续时间(以为单位)。将此粗略设置为两次连续完整扫描之间所需的持续时间(例如,对于 30 HzToF 相机为 0.033,对于旋转激光扫描仪为 3 s)。根据扫描的密集程度或稀疏程度,增加或减少扫描持续时间。较小的值会导致更快的动态对象删除,较大的值有助于减少错误的地图清理。

  • sensor_cutoff_min_depth, sensor_cutoff_max_depth(双精度,默认值:0.2、2.0)

    距离传感器测量长度的最小值和最大值。忽略此间隔之外的测量值。

  • sensor_model_normal_factor_a, sensor_model_normal_factor_b, sensor_model_normal_factor_c, sensor_model_lateral_factor(双精度)

    传感器噪声模型的数据。

  • initialize_elevation_map(布尔), initialization_method(整数), length_in_x_init_submap(双精度,m), length_in_y_init_submap(双精度,m), init_submap_height_offset(双精度,m), init_submap_variance(双精度), target_frame_init_submap(字符串)

    如果启用(prinistize_elevation_map:true),请在init_submap_height_offset的高度偏移围绕target_frame_init_submaporign_submap_height_offset的高度偏移量初始化sizeumpap_length_xsubmap_length_xsubmap_length_y)的平面(onimplization_method0)。该方差设置为init_submap_variance

  • increase_height_alpha(双精度,默认:0.0,最小值:0.0,最大值:0.99

    高程 = i n c r e a s e h e i g h t a l p h a ∗ p r e v i o u s z + ( 1.0 − i n c r e a s e h e i g h t a l p h a ) ∗ n e w m e a s u r e d z increase_height_alpha * previous_z + (1.0 -increase_height_alpha) * new_measured_z increaseheightalphapreviousz+(1.0increaseheightalpha)newmeasuredz 凸组合参数,用于针对分布点形成新的融合高度观测。对于尚未观察到的cell,高度高于马哈拉诺比斯上限的观察会scanning_duration 触发高度估计的重新初始化。重新初始化被参数化为先前高度估计和观测的凸组合:

    • 0.0:新的观察作为初始化新模式,先前的数据被丢弃。
    • 1.0:不考虑当前扫描中更高的、不符合分布的新观察点。先验保留为模式。
    • 介于两者之间:值越高,对现有的先前估计的偏差就越大。将形成估计和测量之间的高度和方差的凸组合以初始化新的高斯高度分布。

Reference:

  • https://github.com/ANYbotics/elevation_mapping



须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

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

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

相关文章

【Ubuntu】安装docker,docker compose 以及部署一个docker应用

大家好&#xff01;在过去&#xff0c;已经分享了很多有关通过Docker部署应用的内容。今天&#xff0c;我将为大家详细介绍如何在Ubuntu系统上部署最新的Docker平台。 Docker是什么 Docker是一个开源的容器化平台&#xff0c;它允许您将应用程序及其所有依赖项打包到称为容器…

恒运资本:2倍牛股突然闪崩,业绩创新高股出炉,最高日赚近2亿

上半年哪些公司净利润有望创前史新高&#xff1f; 2倍牛股单季成绩环比下滑&#xff0c;早盘股价大跳水 A股半年报进入发表高峰期&#xff0c;仅8月7日晚间&#xff0c;就有超30家公司发表半年报和成绩预告状况&#xff0c;超七成净利润同比增加。净利润增速最高的是翔港科技&…

责任链模式(Chain of Responsibility)

责任链模式是一种行为设计模式&#xff0c;允许将请求沿着处理者链进行发送。收到请求后&#xff0c;每个处理者均可对请求进行处理&#xff0c;或将其传递给链上的下个处理者。职责链模式使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。…

Activity启动过程详解(Android 12源码分析)

Activity的启动方式 启动一个Activity&#xff0c;通常有两种情况&#xff0c;一种是在应用内部启动Activity&#xff0c;另一种是Launcher启动 1、应用内启动 通过startActivity来启动Activity 启动流程&#xff1a; 一、Activity启动的发起 二、Activity的管理——ATMS 三、…

【AGC】付费下载上架下载后无法安装问题

【关键字】 AGC、付费下载、应用安装 【问题描述】 有开发者反馈用户下载后无法安装&#xff0c;采用未接入sdk&#xff0c;直接勾选付费-产品上架的方案&#xff0c;以前其他产品是能够正常安装的&#xff0c;现在不知道为啥。 报错信息&#xff1a;付费后显示“订单创建失…

Centos 从0搭建grafana和Prometheus 服务以及问题解决

下载 虚拟机下载 https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_player/17_0 cenos 镜像下载 https://www.centos.org/download/ grafana 服务下载 https://grafana.com/grafana/download/7.4.0?platformlinux …

SpringBoot 2.1.7.RELEASE + Activiti 5.18.0 喂饭级练习手册

环境准备 win10 eclipse 2023-03 eclipse Activiti插件 Mysql 5.x Activiti的作用等不再赘叙&#xff0c;直接上代码和细节 POM <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>…

Matplotlib引领数据图表绘制

Matplotlib引领数据图表绘制 前言图像得组成画图设置 figure设置标题设置坐标轴设置 label 和 legend添加注释使用子图中文乱码解决保存图形显示图形条形图直方图散点图饼状图 总结 前言 在数据科学领域&#xff0c;数据可视化是一种强大的工具&#xff0c;能够将复杂的数据转…

华为推出手机系统云翻新服务:什么是云翻新?如何使用?

华为手机系统云翻新是华为推出的一项功能&#xff0c;旨在通过云服务提供系统翻新的服务。它可以帮助用户对手机的系统进行优化和更新&#xff0c;以提高手机的性能和流畅度。具体而言&#xff0c;华为手机系统云翻新功能提供了免费的云空间&#xff0c;用户可以将手机中的系统…

【C++笔记】C++启航之为C语言填坑的语法

【C笔记】C启航之为C语言填坑的语法 一、命名空间1、为什么要引入命名空间&#xff1f;2、命名空间的基本用法3、展开命名空间4、命名空间的套娃5、命名空间的自动合并 二、缺省参数1、为什么要引入缺省参数&#xff1f;2、缺省参数的基本用法3、缺省的参数必须从右向左4、缺省…

用Python批量复制文件,方法有9种,方便快捷

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 当我们复制一个文件时用复制粘贴就可以了&#xff0c;如果是多个文件呢&#xff1f; 就会很麻烦了&#xff01; 今天给大家介绍一下用Python批量复制文件&#xff0c;方法有九种&#xff01;希望对你有帮助 1. Shutil Copy…

【音视频】vms布署说明

目录 外场布署场景&#xff08;99%&#xff09; 研发实验场景&#xff08;1%&#xff09; 高级玩法 证书安装方法 外场布署场景&#xff08;99%&#xff09; 下面两种场景&#xff0c;为本产品主要应用场景&#xff0c;2023-08-08日后&#xff08;统一所有证书&#xff09;…

macOS下Django环境搭建-docker运行Django

1. macOS升级pip /Library/Developer/CommandLineTools/usr/bin/python3 -m pip install --upgrade pip 2. 卸载Python3.9.5版本 $ sudo rm -rf /usr/local/bin/python3 $ sudo rm -rf /usr/local/bin/pip3 $ sudo rm -rf /Library/Frameworks/Python.framework 3. 安装P…

Vue3自定义简单的Swiper滑动组件-触控板滑动鼠标滑动左右箭头滑动-demo

代码实现了一个基本的滑动功能&#xff0c;通过鼠标按下、鼠标松开和鼠标移动事件来监听滑动操作。 具体实现逻辑如下&#xff1a; 在 onMounted 钩子函数中&#xff0c;我们为滚动容器添加了三个事件监听器&#xff1a;mousedown 事件&#xff1a;当鼠标按下时&#xff0c;设置…

TCP 三次握手,四次挥手

1、三次握手 第一次握手 SYN 等于1&#xff0c;SeqX 第二次握手 SYN等于1 ACK等于1&#xff0c;SeqY&#xff0c;AckX1 第三次SYN等于0 ACK等于1&#xff0c;SeqX1&#xff0c;AckY1 ackRow都是对应请求seqraw&#xff0c;三次握手后&#xff0c;Seq就是服务器前一个包中的ac…

Unity数字可视化学校_昼夜(三)

1、删除不需要的 UI using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class EnvControl : MonoBehaviour {//UIprivate Button btnTime;private Text txtTime; //材质public List<Material> matListnew Li…

解决word打字卡顿问题的方法

❤ 2023.8.5 ❤ 最近整理论文&#xff0c;本来我是wps死忠粉&#xff0c;奈何wps不支持latex公式。。。 无奈用起了word&#xff0c;但是谁想字数稍微多了一点&#xff0c;word就卡得欲仙欲死&#xff0c;打个字过去2s才显示出来&#xff0c;删除的时候都不知道自己删了几个字…

QGIS二次开发三:显示Shapefile

Shapefile 为 OGR 所支持的最重要的数据格式之一&#xff0c;自然可以被 QGIS 加载。那么该如何显示Shapefile呢&#xff1f; 一、先上代码 #include <qgsapplication.h> #include <qgsproviderregistry.h> #include <qgsmapcanvas.h> #include <qgsvec…

每天一道leetcode:剑指 Offer 50. 第一个只出现一次的字符(适合初学者)

今日份题目&#xff1a; 在字符串 s 中找出第一个只出现一次的字符。如果没有&#xff0c;返回一个单空格。 s 只包含小写字母。 示例1 输入&#xff1a;s "abaccdeff" 输出&#xff1a;b 示例2 输入&#xff1a;s "" 输出&#xff1a; 提示 0 …

MySQL流程控制(二十八)

二八佳人体似酥&#xff0c;腰悬利剑斩愚夫&#xff0c;虽然不见人头落,暗里教君骨髓枯。 上一章简单介绍了MySQL变量(二十七) ,如果没有看过,请观看上一章 一. 定义条件与处理程序 定义条件是事先定义程序执行过程中可能遇到的问题&#xff0c;处理程序定义了在遇到问题时应…