ROS——SLAM实时更新显示栅格地图之nav_msgs::GridCells


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);

结束语

至此已经可以在Rviz中显示栅格地图,快去实现你自己的SLAM吧~

猜你喜欢

转载自blog.csdn.net/qq_16775293/article/details/84881595
今日推荐