map_server
1.map_server
- map_server包提供了一个map_server ROS 节点, 该节点通过ROS 服务器方式提供地图数据。
- 该包还提供了map_saver命令行utility, 使用该工具可将动态创建的地图保存成文件。
地图格式:
- 该包中的工具使用过的地图会被存储在两个文件中。一个是YAML格式的文件描述地图meta-data并命名image文件。另一个image文件用来编码occupancy data。
安装:
sudo apt-get install ros-kinetic-map-server
1.1 地图的保存
//threshold_free [0,100] 默认 int threshold_occupied = 60; int threshold_free = 19;
#define USAGE "Usage: \n" \
" map_saver -h\n"\
" map_saver [--occ <threshold_occupied>] [--free <threshold_free>] [-f <mapname>] [ROS remapping args]"
roslaunch启动map_server
<launch>
<node pkg="map_server" type="map_saver" name="map_saver" args="-f PATH" output="screen">
<remap from="map" to="/< Map Topic >" />
</node>
</launch>
命令行启动map_server
rosrun map_server map_saver map:=/<Map Topic> -f <PATH>
//eg:
rosrun map_server map_saver map:=/map -f map_1
其中C++参数使用这块可以借鉴:
#define USAGE "Usage: \n" \
" map_saver -h\n"\
" map_saver [--occ <threshold_occupied>] [--free <threshold_free>] [-f <mapname>] [ROS remapping args]"
int main(int argc, char** argv)
{
ros::init(argc, argv, "map_saver");
std::string mapname = "map";
int threshold_occupied = 60;
int threshold_free = 19;
for(int i=1; i<argc; i++)
{
if(!strcmp(argv[i], "-h"))
{
puts(USAGE);
return 0;
}
else if(!strcmp(argv[i], "-f"))
{
if(++i < argc)
mapname = argv[i];
else
{
puts(USAGE);
return 1;
}
}
else if (!strcmp(argv[i], "--occ"))
{
if (++i < argc)
{
threshold_occupied = std::atoi(argv[i]);
if (threshold_occupied < 1 || threshold_occupied > 100)
{
ROS_ERROR("threshold_occupied must be between 1 and 100");
return 1;
}
}
else
{
puts(USAGE);
return 1;
}
}
else if (!strcmp(argv[i], "--free"))
{
if (++i < argc)
{
threshold_free = std::atoi(argv[i]);
if (threshold_free < 0 || threshold_free > 100)
{
ROS_ERROR("threshold_free must be between 0 and 100");
return 1;
}
}
else
{
puts(USAGE);
return 1;
}
}
else
{
puts(USAGE);
return 1;
}
}
1.2 地图加载
#define USAGE "\nUSAGE: map_server <map.yaml>\n" \
" map.yaml: map description file\n" \
"DEPRECATED USAGE: map_server <map> <resolution>\n" \
" map: image file to load\n"\
" resolution: map resolution [meters/pixel]"
加载案例:
rosrun map_server map_server map_1.yaml