0321-ROS-带地图导航

带语义模型地图静态的导航

前言

  • 背景模型是语义地图,但是ROS-NAV需要一张栅格地图,所以想办法转换一下
  • 此外还需要做一张符合P3AT自带地图格式的ArMap地图
  • 重新设置ROS-Nav的全局代价地图配置

参考

ros-mapserver
ArMap Map file format
Resize the static map
setup map yaml file
Aria Docs: Maps
ArMap file formats

学习内容

ROS-MapServer

地图格式

  • 多种文件共同决定地图数据,YAML文件描述地图的元数据meta-data,图形文件与YAML文件同名,图形文件描述栅格数据

图像格式

  • 一般用灰度图像来制作地图,纯黑色为致命障碍物,纯白色为自由控件,中间灰度值为不确定,但是可以由一个阈值来决定是否将其识别为障碍物,阈值处理由MapServer内部处理
  • 判断灰度像素是否有较高风险使用了如下概率计算公式:occ = (255 - color_avg) / 255.0, where color_avg is the 8-bit value that results from averaging over all channels
  • 图像是通过SDL_Image库读入的,该库支持的文件就是支持的地图图像数据,包括bmp, git, jpg, png, tif等

yaml格式

  • yaml是一些技术参数
image: testmap.png
# 使用相对或绝对路径
resolution: 0.1
# 分辨率 0.1m/pixel
origin: [0.0, 0.0, 0.0]
# 图像的左下角(边界)在地图中的坐标
occupied_thresh: 0.65
# 判断像素格是否为障碍的阈值
free_thresh: 0.196
# 判断是否为自由空间的阈值
negate: 0
# 一般情况下,黑色为障碍物,白色为自由空间
  20  # m   Don't forget to create a file with 2000 pixel width
height: 20  # m   Don't forget to create a file with 2000 pixel height

global_costmap.yaml

global_costmap:
   global_frame: /map
   robot_base_frame: /base_link
   update_frequency: 3.0
   publish_frequency: 0.0  # For a static global map, there is generally no need to continually publish it
   static_map: true        # This parameter and the next are always set to opposite values. The global map is usually static so we set static_map to true
   rolling_window: false   # The global map is generally not updated as the robot moves to we set this parameter to false
   resolution: 0.01
   transform_tolerance: 1.0
   map_type: costmap
     20 # m   Don't forget to create a file with 2000 pixel width
   height: 20 # m   Don't forget to create a file with 2000 pixel width

命令行

rosrun map_server map_server mymap.yaml
<!-- Run the map server -->
      <node name="map_server" pkg="map_server" type="map_server" args="/tmp/my_map_waalre.yaml" />

ArMap

格式

  • 因为临时想到不用将语义模型转化为ArMap了,所以此处省略

使用Mapper3修改地图

  • 添加forbidden line, forbidden area, home point, home area

ROS-Map 生成

新图

  • CAD显示,整个环境为 148876mmX117600mm,即148.876mX117.6m
  • 则width=148.876; height=117.600
  • 建议修正为整数:
  • 设置resolution=0.05m/pixel
  • 2977.52: 2352
  • 图片像素为2978:2352
  • 修正尺寸为: 148.9; height: 117.6

新图分辨率增大

  • 设置resolution = 0.1m/pixel
  • 1488.76: 1176
  • 像素为:1489:1176

老图sim

  • 1417.4cmX1187.9cm; 141.74mX118.79m
  • width=141.74; height=118.79
  • 修为整数:
  • 设置resolution=0.05m/pixel
  • 2834.8: 2375.8
  • 图片像素为2835:2376
  • 修正尺寸为: 141.75 height: 118.8

老图yaml

image: 4F-sim.png
resolution: 0.050000
origin: [0, 0, 0]
negate: 0
occupied_thresh: 0.65 # 无关紧要
free_thresh: 0.196 # # 无关紧要

 141.75
height: 118.8

PS修图

  • LV绘制的语义地图像素较低,用PS将其放大到指定分辨率
  • 工具栏-图像-图像大小-指定像素-重定图像像素:两次立方较平滑(适用于扩大)

    注意:Windows自带画图程序,也可以修改图片分辨率,但是并没有将已有像素图形放大,而是简单扩展了图片边界,使得图形外围全部是白色像素

重新配置ROS

global costmap

tf和消息设计

  • 为了方便控制map->odom的关系,即进行机器人全局定位,决定不使用fake amcl或者amcl
  • 如果要使用amcl或者fake amcl,则需要对ROSARIA进行修改,为其添加move_to接口。
    • 使用amcl对于语义绘制的地图没有意义,因为其几何要素过于简单,使用配准算法还是有问题的,SLAM算法生成的地图比较起来就好得多,包含的细节都是激光传感器生成的。
  • 最后决定修改ARIA中的publisher,把原来的zs_worldframe改成/map。
    • 后来想了想,如果改成/map的话,proxy也有很多有关坐标系的东西也需要改变,应该这么做,把mapserver发送的主题名称改了,直接改成zsworld_frame.解决OK!
  • 先看看fake_amcl在RViz中定位方不方便,暂时把zs_worldframe与odom之间的tf给禁用了,如果定位不方便然后再进行大改代码。
原文地址:https://www.cnblogs.com/lizhensheng/p/11117543.html