1. 程式人生 > >ROS——SLAM實時更新顯示柵格地圖之nav_msgs::GridCells

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吧~