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
# 一般情况下,黑色为障碍物,白色为自由空间
width: 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
width: 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
- 修正尺寸为:width: 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
- 修正尺寸为:width: 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 # # 无关紧要
width: 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给禁用了,如果定位不方便然后再进行大改代码。