Merokes 2024-12-24 14:36 采纳率: 0%
浏览 80

代价地图显示不全,路径贯穿障碍物

我使用常见的navigation-noetic-level功能包,在gazebo中仿真,使用cartographer建图定位。
但打开rviz发现costmap显示不全,甚至全局规划都会直接穿过障碍物,我以前从没碰到过这种事情,请问有谁了解这种事情?
项目地址:https://gitee.com/mmeroke/dm_ws
https://gitee.com/mmeroke/dm_ws/tree/master/src/turn_on_robot/param

img

img

img

costmap_common_params.yaml

#机器人几何参,如果机器人是圆形,设置 robot_radius,如果是其他形状设置 footprint
robot_radius: 0.22 #圆形
# footprint: [[-0.15, -0.15], [-0.15, 0.15], [0.15, 0.15], [0.15, -0.15]] #其他形状

obstacle_range: 2.5 # 用于障碍物探测,比如: 值为 3.0,意味着检测到距离小于 3 米的障碍物时,就会引入代价地图
raytrace_range: 3 # 用于清除障碍物,比如:值为 3.5,意味着清除代价地图中 3.5 米以外的障碍物

# 默认被全局代价地图使用
#膨胀半径,扩展在碰撞区域以外的代价区域,使得机器人规划路径避开障碍物
inflation_radius: 0.10
#代价比例系数,越大则代价值越小
cost_scaling_factor: 5.0 # dafault 5.0
track_unknown_space: true
#导航包所需要的传感器
observation_sources: scan
#对传感器的坐标系和数据进行配置。这个也会用于代价地图添加和清除障碍物。例如,你可以用激光雷达传感器用于在代价地图添加障碍物,再添加kinect用于导航和清除障碍物。
scan: {sensor_frame: laser, data_type: LaserScan, topic: scan, marking: true, clearing: true}

global_costmap_params.yaml

global_costmap:
  global_frame: map #地图坐标系
  robot_base_frame: base_footprint #机器人坐标系
  # 以此实现坐标变换

  update_frequency: 1.0 #默认1.0 代价地图更新频率
  publish_frequency: 1.0 #默认1.0 代价地图的发布频率
  transform_tolerance: 0.5 #等待坐标变换发布信息的超时时间

  plugins:
    - {name: static_layer,            type: "costmap_2d::StaticLayer"} # 静态地图层 
    - {name: obstacle_layer,          type: "costmap_2d::VoxelLayer"} # 障碍地图层
    - {name: inflation_layer,         type: "costmap_2d::InflationLayer"} # 膨胀地图层,用于留出足够的安全距离

local_costmap_params.yaml

local_costmap:
  global_frame: map #里程计坐标系,不要设置成odam(Extrapolation Error)
  robot_base_frame: base_footprint #机器人坐标系

  update_frequency: 4.0 # 默认10.0 代价地图更新频率
  publish_frequency: 3.0 #默认10.0 代价地图的发布频率
  transform_tolerance: 0.5 #等待坐标变换发布信息的超时时间

  #膨胀半径,扩展在碰撞区域以外的代价区域,使得机器人规划路径避开障碍物,local可以设置的比global小
  inflation_radius: 0.07
  #代价比例系数,越大则代价值越小
  cost_scaling_factor: 5.0 # default 5.0

  rolling_window: true #是否使用动态窗口,默认为false,在静态的全局地图中,地图不会变化
  width: 2 # 默认3,局部地图宽度 单位是 m
  height: 2 # 默认3,局部地图高度 单位是 m
  resolution: 0.05  # deafault 0.05 局部地图分辨率 单位是 m,一般与静态地图分辨率(map/nav.yaml)保持一致
  plugins:
    - {name: obstacle_layer,      type: "costmap_2d::ObstacleLayer"}
    - {name: inflation_layer,     type: "costmap_2d::InflationLayer"}

move_base_params.yaml

shutdown_costmaps: false  #当move_base在不活动状态时,是否关掉costmap.

controller_frequency: 5.0  #向底盘控制移动话题cmd_vel发送命令的频率.
controller_patience: 3.0 # 3.0 在空间清理操作执行前,控制器花多长时间等有效控制下发
 
planner_frequency: 0.0  #全局规划操作的执行频率.如果设置为0.0,则全局规划器仅
#       在接收到新的目标点或者局部规划器报告路径堵塞时才会重新执行规划操作.
planner_patience: 3.0  # default 3.0 在空间清理操作执行前,留给规划器多长时间来找出一条有效规划.

oscillation_timeout: 3.0  #default 5.0执行修复机制前,允许振荡的时长.
oscillation_distance: 0.15  #来回运动在多大距离以上不会被认为是振荡.

# Planner selection 规划器选项
base_global_planner: "global_planner/GlobalPlanner" #指定用于move_base的全局规划器插件名称.
# base_local_planner: "base_local_planner/TrajectoryPlannerROS"
base_local_planner: "teb_local_planner/TebLocalPlannerROS" # 指定用于move_base的局部规划器插件名称.
# base_local_planner: "eband_local_planner/EBandPlannerROS" # 指定用于move_base的局部规划器插件名称.
max_planning_retries: 1  #

recovery_behavior_enabled: true  #
clearing_rotation_allowed: false  #

recovery_behaviors:  #
  # 无作用,旋转后依旧无法找到可行路径
  # - name: 'rotate_recovery'
  #   type: 'rotate_recovery/RotateRecovery'

  - name: 'conservative_reset'  #
    type: 'clear_costmap_recovery/ClearCostmapRecovery'  #
  - name: 'aggressive_reset'
    type: 'clear_costmap_recovery/ClearCostmapRecovery'
  - name: 'super_reset'
    type: 'clear_costmap_recovery/ClearCostmapRecovery'

  - name: 'move_slow_and_clear'
    type: 'move_slow_and_clear/MoveSlowAndClear'
    
# rotate_recovery:
#   sim_granularity: 0.017
#   frequency: 20.0
conservative_reset:  #
  reset_distance: 1.0  #
  #layer_names: [static_layer, obstacle_layer, inflation_layer]
  layer_names: [obstacle_layer]  #

aggressive_reset:  #
  reset_distance: 3.0  #
  #layer_names: [static_layer, obstacle_layer, inflation_layer]
  layer_names: [obstacle_layer]

super_reset:  #
  reset_distance: 5.0  #
  #layer_names: [static_layer, obstacle_layer, inflation_layer]
  layer_names: [obstacle_layer]

move_slow_and_clear:  #
  clearing_distance: 0.5  #
  limited_trans_speed: 0.1  #
  limited_rot_speed: 0.4  #
  limited_distance: 0.3  #


# # 是否是全向移动机器人
# holonomic_robot: false
# # Forward Simulation Parameters,前进模拟参数
# sim_time: 4.0 # default 0.8 ,提高此参数能有效提高运行轨迹的平滑,一般1~2
# vx_samples: 20 # default 18  在 x 方向上进行速度采样时平移部分的量
# vtheta_samples: 40 # default 20  控制速度采样中旋转部分的量,倾向于设置 vth_samples 的值大于平移部分的值
# sim_granularity: 0.05

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-12-24 20:12
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    根据您提供的信息,您在使用navigation-noetic-level功能包,在gazebo中仿真,使用cartographer建图定位时遇到了costmap显示不全的问题,甚至全局规划直接穿过障碍物的情况。下面是一些可能的解决方案和调试步骤:
    1. 检查costmap参数配置是否正确:首先,您可以检查您的costmap参数文件(如costmap_common_params.yaml、global_costmap_params.yaml、local_costmap_params.yaml)中的配置项,确保各个参数的设置是正确的。比如,确保机器人几何参数设置正确、代价地图更新频率和发布频率设置合理等。
    2. 调整代价地图参数:尝试调整代价地图的相关参数,如obstacle_range、raytrace_range、inflation_radius等,通过调整这些参数来查看是否对costmap显示和全局规划有改善。
    3. 检查传感器配置:检查传感器配置文件,确保传感器坐标系和数据类型配置正确,以及正确添加传感器用于在代价地图中添加和清除障碍物。
    4. 检查全局和局部代价地图配置:确保全局代价地图和局部代价地图的配置正确,并根据实际情况调整其中的参数,如膨胀半径、代价比例系数等。
    5. 调整move_base参数:检查move_base_params.yaml文件中的参数配置,确保控制频率、规划器频率等设置合理,以确保规划器能够在正确的频率下重新执行规划。 如果以上方法都无法解决问题,您可以尝试查看ROS节点的日志输出,以便更详细地了解问题发生的原因。您也可以尝试在RViz中查看相关的ROS Topics,以检查是否有数据传递异常或者需要调整的地方。 案例代码您可以参考您提供的参数配置文件中的示例代码,根据其中的配置来调整您的参数设置。 希望以上解答能够帮助您解决问题,如果您有其他疑问或需要进一步帮助,请随时告诉我。
    评论

报告相同问题?

问题事件

  • 修改了问题 12月24日
  • 创建了问题 12月24日