This will walk you through using MapProxy in a docker container to proxy Google Maps satellite view into a WMTS tile service so that it can be viewed by ROS's MapViz Tile Map plugin. Support for offline maps after loading once, maps stay cached. For outdoor robotics and vehicles.
tldr:
$ sudo docker run -p 8080:8080 -d -t -v ~/mapproxy:/mapproxy danielsnider/mapproxy
Then put this URL into the MapViz option "Custom WMTS Source..." http://localhost:8080/wmts/gm_layer/gm_grid/{level}/{x}/{y}.png
Result:
MapViz documentation: http://wiki.ros.org/mapviz
sudo apt-get install ros-kinetic-mapviz ros-kinetic-mapviz-plugins ros-kinetic-tile-map
1.1. Create the MapProxy configuration folder. The cached map tiles will be written to ~/mapproxy/cache_data
.
mkdir ~/mapproxy
1.2 (Optionally) add your own mapproxy.yaml
configuration file to override the default of proxying Google Maps satellite view over WMTS protocol.
cp mapproxy.yaml ~/mapproxy/mapproxy.yaml
1.3. Start the MapProxy server with ~/mapproxy
as a shared volume.
sudo docker run -p 8080:8080 -d -t -v ~/mapproxy:/mapproxy danielsnider/mapproxy
1.4. Confirm MapProxy is working by browsing to http://127.0.0.1:8080/demo/. You will see the MapProxy logo and if you click on "Image-format png" you will get an interactive map in your browser.
You can also see the first map tile by browsing to http://localhost:8080/wmts/gm_layer/gm_grid/0/0/0.png.
2.1. Open MapViz using ROS
roslaunch mapviz mapviz.launch
2.2. Click the "Add" button.
2.3. Choose to add a new map_tile
display component.
2.4. In the "Source" dropdown select "Custom WMTS Source...".
2.5. In the "Base URL:" field enter the following:
http://localhost:8080/wmts/gm_layer/gm_grid/{level}/{x}/{y}.png
2.6. In the "Max Zoom:" field enter 19
2.7. Click "Save..."
Congrats! You should now see Google Maps load in MapViz.
Any maps that you load will be cached to ~/mapproxy/cache_data
and will be available offline.
~/mapproxy/cache_data
$ vim ~/.mapviz_config
# edit the following
offset_x: 1181506
offset_y: -992564.2
OR using ROS parameters:
$ roscd mapviz
$ vim launch/mapviz.launch
<launch>
<node pkg="tf" type="static_transform_publisher" name="swri_transform" args="0 0 0 0 0 0 /map /check 100" />
<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="swri"/>
<rosparam param="local_xy_origins">
[{ name: swri,
latitude: 37.9879772, <!-- change this -->
longitude: 23.9078602, <!-- change this -->
altitude: 129.69,
heading: 0.0}]
</rosparam>
</node>
<node pkg="mapviz" type="mapviz" name="mapviz"/>
</launch>
rostopic pub /novatel/fix sensor_msgs/NavSatFix "{latitude: 38.406222, longitude: -110.792027}"
In 2013 there was some discussion about Google's Terms & Conditions stating that you are only allowed to access the tiles through Google's API (ie. not MapProxy).
Built for competing in the University Rover Competition by Ryerson University's http://teamr3.ca/ robot club.