Costmap2DROS 类

Costmap2DROS类是2D Costmap的ROS封装类,处理订阅的话题,这些话题提供了对障碍物的观测,方式为点云或激光扫描消息。 costmap_2d::Costmap2DROS给用户提供了纯2D的接口,这意味着查询障碍只能在列上进行。例如,在XY平面上位于同一位置的桌子和鞋,虽然在Z方向上有差异但是它们在costmap_2d::Costmap2DROS对象代价地图中对应的cell上拥有相同的代价值。

A ROS wrapper for a 2D Costmap. Handles subscribing to topics that provide observations about obstacles in either the form of PointCloud or LaserScan messages.

  • Costmap2D * getCostmap ()

实际是return layered_costmap_->getCostmap();,跟getLayeredCostmap()->getCostmap()一样. Return a pointer to the “master” costmap which receives updates from all the layers.

1
costmap_2d::Costmap2D* global_costmap = planner_costmap_ros_->getCostmap();

  • bool getRobotPose(tf::Stamped& global_pose) const;

获取机器人在代价地图的global frame中的位姿,成功获取则返回true

1
2
3
4
5
6
7
8
9
10
11
// 这个返回类型很不方便
tf::Stamped<tf::Pose> pose;
if(!costmap->getRobotPose(pose))
{
ROS_ERROR("Cannot clear map because pose cannot be retrieved");
return;
}
double x = pose.getOrigin().x();
double y = pose.getOrigin().y();
double yaw = tf::getYaw(pose.getRotation());
double yaw_norm = angles::normalize_angle(tf::getYaw(pose.getRotation() ) );

对于全局代价地图,一般是返回在map坐标系下的位姿,对于局部代价地图,一般是在odom或者map下的位姿。
Costmap2DROS::getRobotPose函数调用分析

  • std::string getGlobalFrameID() 和 std::string getBaseFrameID()

这两个返回的就是代价地图yaml里配置的全局和局部坐标系

  • LayeredCostmap* getLayeredCostmap()

  • std::vector<geometry_msgs::Point> getRobotFootprint() 获取机器人边界(在机器人坐标系下,包含padding),返回的是vector<geometry_msgs::Point>,索引顺序就是yaml中设置的顺序

  • std::vector<geometry_msgs::Point>getUnpaddedRobotFootprint() 获取机器人边界(在机器人坐标系下,不包含padding)

  • geometry_msgs::Polygon getRobotFootprintPolygon() 获取机器人边界(在机器人坐标系下,包含padding)