从零开始将高德地图(卫星图+路网)接入 RViz 与 Mapviz 的保姆级教程 (C++,python,ros,自动驾驶)


ROS笔记:

前言

在机器人户外导航开发中,拥有一个直观的卫星地图背景是刚需。虽然 ROS 社区有 rviz_satellitemapviz 等工具,但在国内网络环境下,直接使用 Google Maps 或 Stamen 地图源往往会遇到 "Bad Gateway" 或 "Forbidden" 的问题。

本文将总结一套在 ROS Noetic 环境下,稳定接入 高德地图(高清卫星图+中文路网标注) 的完整技术路线。涵盖了在线直连离线瓦片制作(QGIS方案)以及 RViz/Mapviz 的详细配置避坑指南。


一、 最简单有效的方法:RViz 直连与配置

如果你只需要快速在 RViz 中看一眼地图,并且网络环境允许,使用 rviz_satellite 插件是最简单的方法。

1. 安装插件

首先安装适用于 ROS Noetic 的卫星图插件:

sudo apt install ros-noetic-rviz-satellite

2. 获取高德地图 URL

高德地图的 XYZ 瓦片服务非常稳定,且无需申请 Key。为了获得“卫星底图+路网标注”的效果,我们通常使用以下两个链接:

  • 卫星底图 (style=6): http://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}

  • 路网标注 (style=8): http://webst01.is.autonavi.com/appmaptile?style=8&x={x}&y={y}&z={z}

3. RViz 配置核心参数

启动 RViz 后,点击 Add -> AerialMapDisplay。重点配置以下参数,否则地图不会显示:

  • Topic (关键): 必须填入你的 GPS 话题(如 /fix/gps/fix)。插件需要根据 GPS 定位来决定加载哪里的地图。

  • Map URL: 填入上面的高德 URL。

  • Zoom: 设置为 1819

    • 注意:高德卫星图的高清层级通常在 18-19 级,设置过小(如 0-10)可能导致加载为空白。

  • Blocks: 建议设为 34,表示加载机器人周围多少块瓦片。

避坑提示rviz_satellite 对本地文件路径 (file://) 的支持极其挑剔,容易报 Invalid Object URI。如果你想加载离线地图到 RViz,请看下文的“本地服务器”大法。


二、 进阶方案:制作高清离线瓦片地图 (QGIS + GDAL)

为了彻底摆脱对网络的依赖(例如在无网的户外调试),我们需要将地图“下载”到本地。

1. QGIS 配置地图源

在 Ubuntu 或 Windows 上安装 QGIS,在左侧 XYZ Tiles 右键新建连接:

  • 名称: Amap Satellite

  • URL: http://webst01.is.autonavi.com/appmaptile?style=6&x={x}&y={y}&z={z}

  • 同理添加 style=8 的路网图层,并将两者叠加。

2. 导出高清 GeoTIFF (关键步骤)

不要直接保存工程,而是使用 导出为图像 (Export Map to Image) 功能:

  • 范围: 选择你需要下载的区域(如大学校区)。

  • 分辨率 (Resolution): 这是最高清的关键! 手动将水平/垂直分辨率改为 0.000005 (约 0.5m/px) 或 0.000002 (约 0.2m/px)。

    • 检查: 确保 Output Width 在 5000-8000 像素左右。

  • 格式: 选择 .tif 格式,并勾选“附加地理参考信息”。

3. 瓦片切割 (gdal2tiles)

在终端中使用 GDAL 工具将巨大的 TIF 图片切割为 Mapviz/RViz 可用的瓦片。

情况 A:你的 GDAL 版本较新 (支持 --xyz)

gdal2tiles.py --xyz -z 15-19 my_map.tif output_tiles/

情况 B:你的 GDAL 版本较旧 (Ubuntu 20.04 默认情况)

旧版生成的是 TMS 格式(Y轴翻转),会导致地图上下颠倒。需要先生成 TMS,再用 Python 脚本转为 XYZ:

# 1. 生成 TMS 瓦片
gdal2tiles.py -z 15-19 my_map.tif output_temp/

# 2. 运行脚本进行翻转 (脚本逻辑:y_new = 2^z - 1 - y_old)
# (此处省略具体脚本代码,核心是重命名文件)

三、 Mapviz 的使用与参数细节

Mapviz 相比 RViz,天生更适合做 2D 平面导航仪表盘,它对离线瓦片的支持更加友好。

1. 配置坐标原点 (Initialize Origin)

Mapviz 必须知道 WGS84 (经纬度) 与 ROS /map 坐标系的转换关系。需要在 launch 文件中配置 swri_transform_util

<node pkg="swri_transform_util" type="initialize_origin.py" name="initialize_origin">
    <param name="local_xy_frame" value="/map"/>
    <param name="local_xy_origin" value="auto"/> </node>

2. 加载离线地图 (tile_map)

在 Mapviz 中添加 tile_map 插件:

  • Source: 选择 Custom WMTS Source(不要选默认的 Stamen 或 Tianditu)。

  • Base URL (重点):

    Mapviz 的 URL 格式支持占位符。如果你使用的是本地路径:

    file:///home/user/map_data/{level}/{x}/{y}.png
    

    或者

    file:///home/user/map_data/{z}/{x}/{y}.png
    

    技术细节:虽然大部分工具通用 {z} 代表缩放等级,但在某些版本的 Mapviz 配置文件中,参数名明确写作 level。如果发现加载不出图片,请尝试将 URL 中的 {z} 修改为 {level},这往往是解决“路径正确但无图”的最后一把钥匙。

3. 在 RViz 中使用离线地图的“绝招”

前面提到 RViz 对 file:// 支持不好。要在 RViz 中用这套离线瓦片,只需在瓦片目录下运行一行 Python 命令,开启一个微型 HTTP 服务器:

Bash

cd /path/to/output_tiles
python3 -m http.server 8000

然后在 RViz 的 Map URL 中填入:

http://127.0.0.1:8000/{z}/{x}/{y}.png

这样,RViz 会以为自己在访问网络地图,从而完美加载你的离线数据!


总结

  1. 想省事:直接用 rviz_satellite + 高德在线 URL。

  2. 要素全:用 QGIS 叠加“卫星+路网”,导出高清 TIF。

  3. 兼容性:GDAL 切片时注意 XYZ 格式,旧版本需脚本翻转 Y 轴。

  4. 调试:Mapviz 中注意 {z}{level} 的切换;RViz 中推荐用 python http.server 挂载本地地图。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值