文章目录 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);