基础知识
- 地图的数据按照行优先的顺序,从栅格矩阵的(0,0)位置开始排列
- 栅格里的障碍物占据值范围是从0到100,如果栅格里的障碍物状况位置,则栅格数值为-1
发布自定义地图
注意事项
- 依赖项里添加nav_msgs
代码示例
C++
#include <ros/ros.h>
#include <nav_msgs/OccupancyGrid.h>int main(int argc, char *argv[])
{ros::init(argc, argv, "map_pub_node");ros::NodeHandle nh;ros::Publisher pub = nh.advertise<nav_msgs::OccupancyGrid>("/map",10);ros::Rate r(1);while (ros::ok()){nav_msgs::OccupancyGrid msg;msg.header.frame_id = "map";msg.header.stamp = ros::Time::now();msg.info.origin.position.x = 1;msg.info.origin.position.y = 1;msg.info.resolution = 1.0;msg.info.width = 4;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);r.sleep();}return 0;
}
Python
#!/usr/bin/env python3
#coding=utf-8import rospy
from nav_msgs.msg import OccupancyGridif __name__ == "__main__":rospy.init_node("map_pub_node")pub = rospy.Publisher("/map", OccupancyGrid, queue_size=10)rate = rospy.Rate(1)while not rospy.is_shutdown():msg = OccupancyGrid()msg.header.frame_id = "map"msg.header.stamp = rospy.Time.now()msg.info.origin.position.x = 0msg.info.origin.position.y = 0msg.info.resolution = 1.0msg.info.width = 4 msg.info.height = 2msg.data = [0]*4*2msg.data[0] = 100msg.data[1] = 100msg.data[2] = 0msg.data[3] = -1pub.publish(msg)rate.sleep()
map_server
保存地图
rosrun map_server map_saver [--occ <threshold_occupied>] [--free <threshold_free>] [-f <mapname>] map:=/your/costmap/topic
rosrun map_sever map_saver -f 文件名
加载地图
rosrun rosrun map_server map_server mymap.yaml