Ubuntu20.04下mapviz的安装与使用
mapviz简介
Mapviz 是一款高度可定制的基于 ROS 的可视化工具,专注于大规模 2D 数据,并带有插件系统,具有极高的可扩展性。
mapviz安装
- 下载mapviz
git clone https://github.com/swri-robotics/mapviz.git
- 将功能包放在ros工作空间(catkin_ws为例)并安装依赖
cd catkin_ws/src
sudo apt-get install ros-$ROS_DISTRO-mapviz ros-$ROS_DISTRO-mapviz-plugins ros-$ROS_DISTRO-tile-map ros-$ROS_DISTRO-multires-image
- 使用rosdep安装依赖
rosdep install --from-paths src --ignore-src
- 编译
catkin_make
可能的报错及解决方法
- Qt相关报错 Cannot mix incompatible Qt library (version 0x50201) with this library (version 0x5060或者一堆除0、未定义变量之类的错误
报错原因:anaconda和ros自带的Qt版本冲突
查看当前Qt版本
qmake -v
QMake version 3.1
Using Qt version 5.9.7 in /home/wdy/anaconda3/lib
查看系统Qt版本
cd usr/lib/qt5/bin
./qmake -v
QMake version 3.1
Using Qt version 5.12.8 in /usr/lib/x86_64-linux-gnu
解决方法:在CMakeLists.txt中指定Qt相关库的导包路径
具体包括:
- catkin_ws/src/mapviz-master/mapviz/CMakeLists.txt
在
find_package(Qt5Concurrent REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5OpenGL REQUIRED)
find_package(Qt5Widgets REQUIRED)
前设定路径
路径为对应的 PackageNameConfig.cmake
输入命令 sudo find / -name Qt5CoreConfig.cmake 或者 直接使用文件搜索功能
set(Qt5Concurrent_DIR "/usr/lib/x86_64-linux-gnu/cmake/Qt5Concurrent")
set(Qt5Core_DIR "/usr/lib/x86_64-linux-gnu/cmake/Qt5Core")
set(Qt5Gui_DIR "/usr/lib/x86_64-linux-gnu/cmake/Qt5Gui")
set(Qt5OpenGL_DIR "/usr/lib/x86_64-linux-gnu/cmake/Qt5OpenGL")
set(Qt5Widgets_DIR "/usr/lib/x86_64-linux-gnu/cmake/Qt5Widgets")
注:我采用/usr下的Qt,因为我使用anaconda下的Qt在编译成功后无法加入tile_map
以下几个文件中类似操作,注意包名对应
catkin_ws/src/mapviz-master/mapviz_plugins/CMakeLists.txt
catkin_ws/src/mapviz-master/multires_image/CMakeLists.txt
catkin_ws/src/mapviz-master/tile_map/CMakeLists.txt
- OpenCV相关报错
与opencv发生冲突** opencv_imgcodecs3.so.3.3.1: undefined reference to `TIFFReadDirectory@LIBTIFF**
参考:
https://blog.csdn.net/hongge_smile/article/details/105656702
mapviz使用
- 修改配置文件
修改mapviz.launch文件中经纬度信息(修改后将加载该地理坐标为中心的地图)和GPS数据包话题名称(可以看到我的为/gps/fix)
- 启动
安装成功后启动roslaunch文件
roslaunch mapviz mapviz.launch
3. 申请地图的API key
以天地图为例,首次登录需要注册一个账号,然后在控制台创建应用并申请密钥。
获得密钥并填入下一步中。
4. 修改Target Frame名称为origin 并设置地图的base URL为:
http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={x}&TILECOL={y}&tk=密钥
根据需求可选择矢量图等各种地图类型
BUT
不知为何我申请的密钥显示出来会是这个亚子。。。
在网上搜索一番参考了这位大佬的密钥:
http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={y}&TILECOL={x}&tk=375f936acc7c22013f7b7b96559094a7
地图显示效果
5. 加入NavSat等话题订阅显示模块,并修改对应的话题名称和BufferSize,由于我录制的GPS数据的rosbag包含约5000条消息,所以我将BufferSize设置为6000。也可转为path、odometry等ros消息类型发布订阅。
6. 播放rosbag,获得最终显示结果
其中红色线为GPS轨迹
mapviz插件功能
tile_map(必备)
将地理参考的多分辨率图像图块地图投影到场景中。地图图块可以从必应地图或任何 WMTS 图块服务获取。提供访问Stamen设计的预定义地图服务,包括地形、水彩和碳粉地图,但国内都用不了。还可以指定自定义或本地 WMTS 地图服务器(比如本文使用的天地图,或者谷歌地图等)。将地图数据缓存到磁盘,从而离线使用部分应用。
坐标拾取器Coordinate Picker
获取地图点在不同坐标系下的坐标
画折线Draw Polygon
在地图上画折线,且可以发布相应话题
GPS
将 gps_common::GPSFix 类型的消息投影到地图上
GPS轨迹NavSat
将 sensor_msgs::NavSat 类型的消息投影到地图上(见前述结果图)
图像Image
在地图上显示sensor_msgs::Image类型的图像,这不就可以做SLAM同时展示场景图片、GPS轨迹了~
同时显示场景和GPS轨迹(红色曲线)
激光雷达点云LaserScan
将sensor_msgs::LaserScan类型点云投影到地图上,但常用的是sensor_msgs::PointCloud2,所以需要转换一下话题发布的消息类型
激光雷达点云Pointcloud2
将sensor_msgs::Pointcloud2 类型点云投影到地图上,加上tf变换后,激光SLAM的点云就可以投影到地图上了。
TODO
将激光SLAM构建的点云投影到地图上
数字、字符显示Float、String
将数字、字符串信息显示到地图上了。
路径、里程计、位姿显示path、odometry、pose
参考链接
https://blog.csdn.net/weixin_41281151/article/details/114046438