ROS——SLAM實時更新顯示柵格地圖之nav_msgs::GridCells
阿新 • • 發佈:2018-12-09
文章目錄
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吧~