ROS中栅格地图
一、ROS中栅格地图格式
发布节点是:map_server
发布的数据包是:OccupancyGrid.msg
发布的话题名是:/map
栅格尺寸 = 栅格边长=地图分辨率,体现地图的精细程度,ros中默认是0.05米
包含三个成员
第一个数据类型是另一个数据包Header,包含frame_id和stamp
第二个数据类型是另一个数据包
第三个数据类型是数组
二、发布地图数据
发布地图数据的实现,确定地图数据的规划
实现步骤:
- 构建一个软件包map_pkg,依赖项里加上nav_msgs
- 在map_pkg里创建一个节点map_pub_node2
- 在节点中发布话题/map,消息类型为nav_msgs::OccupancyGridY
- 构建一个nav_msgs::OccupancyGrid地图消息包,并对其进行赋值
- 将地图消息包发送到话题/map。
- 编译并运行节点
- 启动RViz,订阅话题/map,显示地图
编写发布地图数据案例,编写map_pub_node.cpp
# include <ros/ros.h>
# include <nav_msgs/OccupancyGrid.h>
int main(int argc, char** argv)
{
ros::init(argc, argv, "demo_map_pub");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<nav_msgs::OccupancyGrid>("/map", 10);
ros::Rate loop_rate(1);
while (ros::ok())
{
nav_msgs::OccupancyGrid msg;
// header
msg.header.frame_id = "map";
msg.header.stamp = ros::Time::now();
// 地图描述信息
msg.info.origin.position.x = 0;
msg.info.origin.position.y = 0;
msg.info.resolution = 1.0; // 1M
msg.info.width = 4;// 482
msg.info.height = 2;
// 地图数据
msg.data.resize(4*2);
msg.data[0] = 100;
msg.data[1] = 100;
msg.data[2] = 0;
msg.data[3] = -1;
// 发送
pub.publish(msg);
loop_rate.sleep();
}
return 0;
}
修改CMakeLists.txt
add_executable(map_pub_node src/map_pub_node.cpp)
target_link_libraries(map_pub_node
${catkin_LIBRARIES}
)
终端分别运行
roscore
rosrun map_pkg map_pub_node
rviz
添加坐标系和地图标识,修改话题名称为/map,结果如图所示