ROS导航包之costmap_2d

4 篇文章 0 订阅

Costmap2DROS类

主要作用是完成对Costmap2D类的ROS接口包装,提供包括机器人在地图中的位置查询,机器人脚印(footprint)在地图中的位置查询; 地图的更新和停止接口; 提供Costmap2D的访问接口,通过它可以方便地访问地图数据信息。
关键函数接口:
Costmap2DROS(std::string name, tf::TransformListener& tf);
bool getRobotPose(tf::Stamped<tf::Pose>& global_pose) const;
Costmap2D* getCostmap()
std::vector<geometry_msgs::Point> getRobotFootprint()

LayeredCostmap类

该类是图层的管理类,负责管理图层插件的更新和并将信息汇总到根图层costmap上, 提供给Costmap2DROS的调用接口。

Costmap2D类

该类是删格地图的数据结构类,主要提供根据坐标或者索引设置和查询地图的值的方法。

Layer类

这是一个虚基类, 定义各种图层的公用接口。 
虚函数接口包括:
  virtual void onInitialize();
  virtual void activate();
  virtual void deactivate();
  virtual void reset();
  virtual void updateBounds(double robot_x, double robot_y, double robot_yaw, double* min_x, double* min_y,double* max_x, double* max_y);     
  virtual void updateCosts(costmap_2d::Costmap2D& master_grid, int min_i, int min_j, int max_i, int max_j);
  virtual void matchSize();

CostmapLayer类

顾名思义了,就是Layer和Costmap2D的结合类。 两个类功能的组合体。

插件类StaticLayer

继承自CostmapLayer类,实现了Layer类定义的虚函数。
其初始化函数中订阅了map消息,所以必须要有mapserver提供map给它才行,nh.param("map_topic", map_topic, std::string("map"));
nh.param("track_unknown_space", track_unknown_space_, true);
这个参数也尤其重要,它的意思是是否要将unknow认为是free的,若设置为false,那么所有的未知区域都将被认为是free的,这就是为什么有时候全局规划路径会穿过灰色的未知区域的原因,就是因为只是设置了nav_fn中的allow_unknown参数为false是不够的,还需要将这个地方设置成true。

关于该层数据的更新,如果不是滑动窗口类型,那么坐标框架就是和mapserver提供的map主题是一样的,只需要将订阅的数据copy过来更新自己的Costmap2D的数据成员就可以了, 如果是滑动窗口那么注意作者的注解如下:// If rolling window, the master_grid is unlikely to have same coordinates as this layer, Copy map data given proper transformations。 证明即使是滑动窗口也是会利用全局图map提供的数据的。

插件类ObstacleLayer

继承自CostmapLayer类,实现了Layer类定义的虚函数。
此外,还实现了对于传感器数据的监听与回调处理函数,支持类型包括sensor_msgs::LaserScan, sensor_msgs::PointCloud, sensor_msgs::PointCloud2三类,将它们压入observation_buffer中。
一个问题尚未弄清楚,为毛当局部动态图的frame设置成/map之后,就无法显示障碍物了。貌似必须是/odom才行,暂时没搞懂。验证后好像不是这样的QAQ

插件类InflationLayer

继承自Layer类,实现了其定义的虚函数接口。
总的来说,该类干了这样一件事情,读取父层LayeredCostmap上costmap的障碍物信息,并对范围内的每一个点更新其cost值,依据的是点离其最近障碍物点的距离来指定损失值。损失值确定方式如下:
   1. 若距离为0,则COST为LETHAL_OBSTACLE(254)
   2. 若距离小于机器人内半径,则COST为INSCRIBED_INFLATED_OBSTACLE(253)
   3. 若距离比内半径远, 则按照距离越远COST越低取值
   4. 距离障碍物越远应该cost越低,所以factor应该根据距离递减,weight_由外部的cost_scaling_factor决定,默认为10,所以要是想要离inflation近的损失更大,应该减小cost_scaling_factor的值252/(e^(dist*weight))。
inline unsigned char computeCost(double distance) const
  {
    unsigned char cost = 0;
    if (distance == 0)
      cost = LETHAL_OBSTACLE;
    else if (distance * resolution_ <= inscribed_radius_)
      cost = INSCRIBED_INFLATED_OBSTACLE;
    else
    {
      double euclidean_distance = distance * resolution_;
      double factor = exp(-1.0 * weight_ * (euclidean_distance - inscribed_radius_));
      cost = (unsigned char)((INSCRIBED_INFLATED_OBSTACLE - 1) * factor);
    }
    return cost;
  }

    参数配置说明:
    1.ObstacleLayer和VoxelLayer在进行障碍物更新时会根据最小障碍物高度和最大障碍物高度,最小障碍物距离进行过滤,所以一定要确保自己想要让图层关注到的传感器信息在合理的范围内,也就是特别要注意雷达数据的z值不能想当然的设置为0,因为默认空间是(0,0.8)的开区间。在这上面吃过大亏。
    2.配置时要留心命名空间的问题,有时为了保证参数在正确的命名空间下,可以使用rosparam get ...来查看设置的参数是否起了作用。
    3.调试时,可以进行动态参数调整,避免反复修改文件,效率低下,命令为:`rosrun rqt_gui rqt_gui -s reconfigure`
    4.在确定pdist,gdist,occdist的相对大小关系时,在base_local_planner的设置中将publish_cost_grid设置为true,这样在rviz当中就可以查看相应的热力图来确定是否正确了。
    5.base_local_planner中速度限制不要设置太小,尤其是角速度和角加速度,否则有时候转弯很可能没法及时转过来而撞上障碍物。
    6.局部地图的窗口应该视环境复杂度而定,如果太大,有时候在转弯时,很可能以gdist目标为优先而撞上障碍物一般由小往大调,控制在1-3之内,调节时配合4中所述方法重点观察转弯时的轨迹。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS机器人中使用障碍物检测功能包costmap_2d实现基于三维栅格图像的避障,可以分为以下几个步骤: 1. 创建一个ROS包,例如my_navigation,并在包中创建一个节点,例如navigation_node。 2. 在navigation_node节点中,创建一个ROS订阅器,用于接收机器人的传感器数据,例如激光雷达或RGB-D相机的数据。 3. 在navigation_node节点中,创建一个ROS服务,用于处理路径规划请求,例如接收目标点,规划避障路径。 4. 在navigation_node节点中,创建一个ROS发布器,用于发布机器人的控制命令,例如速度和角度。 5. 在navigation_node节点中,使用costmap_2d功能包创建一个代价地图,用于描述环境中的障碍物和可行走区域。 6. 在navigation_node节点中,使用move_base功能包的move_base节点,进行路径规划和避障控制。 7. 在move_base节点中,配置全局和局部规划器,例如使用A*算法进行全局规划,使用DWA算法进行局部规划。 8. 在move_base节点中,配置costmap_2d功能包的参数,例如设置地图分辨率、障碍物占据的代价值等。 9. 在move_base节点中,使用costmap_2d功能包提供的API,实现基于三维栅格地图的避障,例如使用膨胀算法进行障碍物膨胀,使用切比雪夫距离进行路径规划等。 10. 在RViz中添加相应的插件,如Map、RobotModel、Pose等,用于可视化导航过程。 以上是基于ROS机器人使用障碍物检测功能包costmap_2d实现基于三维栅格图像的避障的基本步骤。需要注意的是,具体的实现方法和参数设置需要根据具体的机器人和环境进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值