ROS2与Gazebo11入门教程-在Gazebo中使用数字高程模型DEM
说明:
- 介绍在Gazebo中如何使用数字高程模型DEM
概述
数字高程模型(DEM)是不包括建筑物或植被等任何物体的一种地形表面3D表示。常常通过组合使用诸如LIDAR、雷达或摄像机之类的传感器来创建DEM。在DEM中,地面的地形高程以规则间隔在水平面上间隔采样。Wikipedia是获取有关DEM更多详细信息的好去处
术语DEM只是一个通用名称,而不是一种具体格式。实际上,DEM可以表示为高程网格(栅格)或基于矢量的不规则三角网(TIN)。目前,Gazebo仅支持GDAL中可用格式的栅格数据
在Gazebo中支持DEM的主要目的在于可以对现实世界地形进行仿真。救援或农业应用可能会对使用与真实世界相同的仿真地形来测试其机器人行为感兴趣
让Gazebo支持DEM
- 为了在Gazebo中使用DEM文件,需要安装GDAL库,命令为:
$ sudo apt-get install gdal-bin libgdal-dev python3-gdal
DEM文件及其在SDF格式中的定义
有多个组织可以提供高程数据。例如,让我们下载圣海伦斯火山在上世纪80年代喷发前或喷发后的DEM文件。这些文件是公共的,由USGS分发。
解压缩下载的DEM文件,并将其重命名为mtsthelens.dem,命令如下所示:
cd ~/Downloads
wget https://github.com/osrf/gazebo_tutorials/raw/master/dem/files/mtsthelens_before.zip
unzip ~/Downloads/mtsthelens_before.zip -d /tmp
mv /tmp/30.1.1.1282760.dem /tmp/mtsthelens.dem
如果安装的是汉化版的Ubuntu 20.04系统,则需要将第一个命令更改为“cd ~/下载”,否则会提示出错“找不到~/Doanloads目录”。
通常,DEM文件具有很高的分辨率,而Gazebo无法处理,因此最好调低DEM的分辨率。下一个命令会将地形缩小到129×129的格网,并将其复制到/tmp/media/dem/目录中。
$ mkdir -p /tmp/media/dem/
$ gdalwarp -ts 129 129 /tmp/mtsthelens.dem /tmp/media/dem/mtsthelens_129.dem
不知道因何原因,运行上面第二条命令时会出错,提示“USGSDEM”文件格式不是支持的格式,需要修改成其它支持的栅格格式,编者将缩小后的DEM文件输出成GeoTiff格式(后缀为*.tif),即第2条命令更改为“gdalwarp -ts 129 129 /tmp/mtsthelens.dem /tmp/media/dem/mtsthelens_129.tif”
Gazebo中的DEM文件的加载方式与高程图图像的加载方式相同。Gazebo会自动检测该文件是平面图像还是DEM文件。创建世界文件volcano.world并将以下内容复制到该文件中。将该世界文件保存在任何您想要的位置,例如/tmp目录中
<?xml version="1.0" ?>
<sdf version="1.4">
<world name="default">
<!-- A global light source -->
<include>
<uri>model://sun</uri>
</include>
<model name="heightmap">
<static>true</static>
<link name="link">
<collision name="collision">
<geometry>
<heightmap>
<uri>file://media/dem/mtsthelens_129.tif</uri>
<size>150 150 50</size>
<pos>0 0 -685</pos>
</heightmap>
</geometry>
</collision>
<visual name="visual_abcedf">
<geometry>
<heightmap>
<texture>
<diffuse>file://media/materials/textures/dirt_diffusespecular.png</diffuse>
<normal>file://media/materials/textures/flat_normal.png</normal>
<size>1</size>
</texture>
<texture>
<diffuse>file://media/materials/textures/grass_diffusespecular.png</diffuse>
<normal>file://media/materials/textures/flat_normal.png</normal>
<size>1</size>
</texture>
<texture>
<diffuse>file://media/materials/textures/fungus_diffusespecular.png</diffuse>
<normal>file://media/materials/textures/flat_normal.png</normal>
<size>1</size>
</texture>
<blend>
<min_height>2</min_height>
<fade_dist>5</fade_dist>
</blend>
<blend>
<min_height>4</min_height>
<fade_dist>5</fade_dist>
</blend>
<uri>file://media/dem/mtsthelens_129.tif</uri>
<size>150 150 50</size>
<pos>0 0 -685</pos>
</heightmap>
</geometry>
</visual>
</link>
</model>
</world>
</sdf>
上面代码中的
元素告诉Gazebo是加载原始尺寸(没有 元素时)的DEM还是对其进行缩放(有 元素时)。如果您希望缩放DEM, 元素会告诉Gazebo仿真中地形或DEM将会具有的尺寸(以米为单位)。 如果要保持正确的长宽比,请确保正确计算出所有三个维度上的尺寸。在本示例中,DEM将会缩放成150×150米的正方形和50米的高程。这个具体DEM文件的最小高程为685米,因此在
元素中,我们沿负z轴方向平移整个DEM,以使它在仿真世界中位于z = 0处 用包含DEM文件的仿真世界启动Gazebo,这样就应该会看到该火山。在本示例中,DEM文件位于/tmp目录中。
# Be sure of sourcing gazebo setup.sh in your own installation path
$ source /usr/share/gazebo/setup.sh
$ GAZEBO_RESOURCE_PATH="$GAZEBO_RESOURCE_PATH:/tmp" gazebo /tmp/volcano.world
- 尝试对喷发后圣海伦火山的DEM文件进行同样的处理。您应该会在Gazebo中得到一个类似于下图的高程图:
如何获得感兴趣区域的DEM文件
接下来,将介绍获取某个具体感兴趣区域DEM文件的一种方法。
“全球土地覆盖地图集(Global Land Cover Facility)”网站维护着一个高分辨率的地球数字地形数据库。在该网站中找到并打开“搜索和预览(Search and Preview)”工具,您将会看到与下图类似的内容。每个地形区块都有一个唯一的行列号,这是您在使用该工具之前需要知道的。这里将会用QGIS软件来找到我们感兴趣区域的行列号。
QGIS是一个跨平台的开源地理信息系统软件,可以提供数据浏览、编辑和分析功能。
按照QGIS网站上的详述说明下载安装QGIS。
打开QGIS,单击标记为WMS/WMTS图层的左列图标,单击“添加默认服务器(Add default servers)”,选择“Lizardtech server”,然后按下“连接(connect)”按钮。选择“MODIS”并按下“添加(Add)”按钮。关闭弹出的窗口。
下一步是添加所有可用不同区块的另一个图层。下载这个shapefile文件并将其解压缩到任何文件夹中。返回到QGIS,然后按下“添加矢量图层(Add Vector Layer)”(左列图标)。
按下“浏览(Browse)”按钮,然后选择前面未压缩的wrs2descending.shp文件。在打开的窗口中按下“打开(Open)”按钮。
现在,您将会在主窗口中看到这两个图层。让我们来更改wrs2descending图层的透明度,以便能够同时看到这两个图层。
双击wrs2_descending图层,然后将其透明度值修改为85%左右。
使用滚动块和鼠标左按钮导航到您感兴趣的区域。然后单击顶部工具栏中标有“识别要素(Identify Features)”的图标。
单击您感兴趣的区域,这样该区域周围的所有地形区块就都会高亮显示。一个新的弹出窗口将会显示每个高亮显示区块的行列号。
在下图中,您会看到包含Las Palmas(西班牙加那利群岛的天堂景区之一)的DEM区块的行列号。
返回到具有GLCF搜索工具的浏览器网页,并在标有“起始列(Start Path)”和“起始行(Start Row)”的列中写入正确的列号/行号。 然后单击“提交查询(Submit Query)”;按下“预览和下载(Preview and Download)”按钮以查看结果。
选择您需要的地形文件并按下“下载(Download)”按钮。
最后,选择扩展名为.gz的文件,并将其解压缩到您喜欢的文件夹中。
全球土地覆盖地图集的文件采用GeoTiff格式,这是可用的DEM文件最常见的格式之一。
经过多次尝试,发现目前已经无法连接到“全球土地覆盖地图集(Global Land Cover Facility)”网站下载其DEM数据。因此,编者只好改为从美国地质调查局USGS的EarthExplorer网站(https://earthexplorer.usgs.gov/)下载DEM数据,该网站提供了多个DEM数据集,包括SRTM、GTOPO30、GMTED2010等,编者是从SRTM 1 Arc-Second Global数据集下载的示例区域Las Palmas(西班牙加那利群岛的天堂景区之一)的DEM数据,共下载了行号27和28、列号-16至-19这8幅DEM数据,发布时间均为2014年9月,文件格式为GeoTiff,每幅数据大小约为25M
对用于Gazebo中的DEM数据进行相关准备工作
- DEM数据通常会以很高分辨率创建。在Gazebo中使用DEM数据之前,用gdalwarp将其分辨率降低到更易于管理的大小,命令为:
$ gdalwarp -ts <width> <height> <srcDEM> <targetDEM>
DEM数据常常包含“孔洞”或“空白”区域。这些对应于创建DEM时无法收集到数据的区域。对于数据中的“孔洞”,会为其赋予DEM所用数据类型的最小值或最大值。
应始终尝试下载那些“孔洞”已被填充的“完成”版DEM数据集。如果您的DEM地形数据中包含孔洞(也称为NODATA值),请尝试使用gdal工具(例如gdal_fillnodata.py)进行手动修复。
在Gazebo中使用多个DEM
尽管Gazebo不直接支持多个DEM,但是GDAL中有一些实用工具可以将一组DEM合并为一个DEM。第一步是下载要合并的DEM数据集合。请注意,这些DEM区块甚至可能会相互重叠。
GDAL将会无缝地合并它们。假设您的当前目录含有一组准备合并的Geotiff文件,请运行以下命令:
$ gdal_merge.py *.tif -o dem_merged.tif
现在,您只需在世界文件中使用dem_merged.tif,Gazebo就会加载合并了所有区块的地形数据。
在下面这个屏幕截图中,您可以看到合并了加那利群岛周围四个地形区块的结果。
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号