文章目录 GridCells概述 OccupancyGrid使用注意事项 创建工程 在Rviz中实时现实栅格地图 结束语

GridCells概述

  GridCells是另外一种创建栅格地图的方法,与nav_msgs::OccupancyGrid栅格地图不同的是:   1.GridCells栅格地图使用(x,y,z)表示被占用的栅格,可用构建多层栅格。OccupancyGrid栅格地图只能构建2D栅格地图,使用(x,y)表示被占用的栅格。   2.GridCells栅格地图每个格子只有被占用和未被占用两种状态。OccupancyGrid栅格地图每个格子使用占用率表示,颜色从白到黑,用范围在[0,100]的概率表示占用率,-1代表未知区域。   官方数据类型解释如下: 消息定义格式如下:
std_msgs/Header header
float32 cell_width
float32 cell_height
geometry_msgs/Point[] cells

OccupancyGrid使用注意事项

1.向Rviz发送的数据中一定要包含frame_id
map.header.frame_id="cell";
  2.栅格地图中每个小格对应的宽和高为
cells.cell_height=1;          // 长
cells.cell_width=1;           // 宽
  3.栅格地图中每个小格有两种状态,占有和未占有,使用GridCell的时候若向Rviz发送某栅格的坐标(x,y,z),则证明该栅格被占用;若未被占用则不用发送,占用即有障碍物。   4.地图中栅格的坐标(x,y,z)由以下格式表示,高可用不为0,这是栅格呈现分层现象。
geometry_msgs::Point obstacle; 
obstacle.x = 1;
obstacle.y = 1;
obstacle.z = 1;
cells.cells.push_back(obstacle);

创建工程

1.创建工程所在文件夹
mkdir grid
cd grid
mkdir src
  2.创建ROS工程的grid包
catkin_create_pkg grid std_msgs rospy roscpp
  3.在创建好的ROS工程内建立新的gridCell.cpp文件,并添加如下程序
#include <iostream>
#include <ros/ros.h>
#include <nav_msgs/GridCells.h>
int main(int argc,char **argv)
{
    ros::init(argc,argv,"gridCell");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<nav_msgs::GridCells>("/gridCell", 1);;
    nav_msgs::GridCells cells;
    cells.header.frame_id="cell";
    cells.cell_height=1;
    cells.cell_width=1;
    cells.cells.resize(3);
    cells.cells[0].x=1;
    cells.cells[0].y=1;
    cells.cells[0].z=0;
    geometry_msgs::Point obstacle; 
    obstacle.x = 1;
    obstacle.y = 1;
    obstacle.z = 1;
    cells.cells.push_back(obstacle);
    obstacle.x = 2;
    obstacle.y = 2;
    obstacle.z = 1;
    cells.cells.push_back(obstacle);
    obstacle.x = 2;
    obstacle.y = 3;
    obstacle.z = 1;
    cells.cells.push_back(obstacle);
    obstacle.x = 2;
    obstacle.y = 4;
    obstacle.z = 1;
    cells.cells.push_back(obstacle);
    while (ros::ok())
    {
        pub.publish(cells);
    }
}
  4.修改CMakeLists.txt文件,在文件中添加如下程序
add_executable(gridCell
  src/gridCell.cpp
)
add_dependencies(gridCell ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(gridCell
  ${catkin_LIBRARIES}
)
5.编译工程
catkin_make
  6.运行工程   6.1.首先运行
roscore
  6.2.运行新建的结点
source devel/setup.bash
rosrun grid gridCell

在Rviz中实时现实栅格地图

  1.打开Rviz
rosrun rviz rviz
    2.创建栅格地图 点击左下角添加按钮Add,在打开的Create visualization栏中选择GridCell,并点击OK键确认。 3.打开Map下拉列表中的属性信息,在Topic话题后面输入/选择/gridMap话题,即可看到删咯地图在Rviz中现实的结果。此时虽然会现实栅格地图,但是会出现Error提示,因此修改Global Option属性中的Fixed Frame对应程序中的cell,这时错误提示消失,正常显示删咯地图。   注释 Global Option属性中的Fixed Frame对应程序中向Rviz发布消息的消息头中的frame_id,即
map.header.frame_id="cell";
  Map属性中的Topic对应程序中向Rviz发布消息的话题名,即
ros::Publisher pub = nh.advertise<nav_msgs::OccupancyGrid>("/gridCell", 1);