GAZEBO构建室外环境地图之加载山地地形

GAZEBO构建室外环境地图之加载山地地形

前言

  上篇介绍了如何获取png格式的高度图heightmap,这篇讲述如何在gazebo中加载出来,同样参考链接可以轻松获取全球任意位置高度图的方案链接,我的环境是ubuntu18.04+melodic+gazebo9,链接里说16.04+gazebo7就可以了,我没尝试。

构建model

  前言中的链接中也描述了如何创建model,借助现有的一些model文件进行修改,visual里面的纹理什么的也不好看,但是看完可以了解一下model的结构、描述等等,有好处的。这里介绍一个全自动的,超级方便的工具https://github.com/Sarath18/terrain_generator,把代码克隆下来先。
  这是一个自动生成autogen_terrain模型到你的~/.gazebo/models下的,生成后gazebo直接可以使用的,同时还生成一个world文件,里面直接就加载autogen_terrain这个模型,方便测试和查看。github上有好几个自动创建model的,但这个自带island.png,area.png可以测试,同时其textures里面的grass.jpg,sand.jpg,water.jpg可以直接用于模型渲染,模型好看多了,以后找到更好看的,会继续推荐出来。
GAZEBO构建室外环境地图之加载山地地形_第1张图片  大家也可以先用代码自带的island.png,area.png跑跑试试,看看效果,这里就略过了。代码是全部缩小到129*129的,我这里用的是1025*1025,所以要稍作修改:

  1. wizard.py文件中imageResizer函数中的cv2.resize(hm,(129,129))修改成cv2.resize(hm, (1025, 1025));
  2. model_gen.py中的modelGenerator函数53行和128行的129 129 12修改为1025 1025 12

  运行wizard.py,先会问你:

    Do you have a heightmap?(y/n):

回答:y

  接下来问高度图的位置:

    Enter the location of the heightmap:

回答:
/home/sx/gazebo_dem/terrain_generator/images/yunlanHeightMap.png
上面的回答,选择你实际生成的高度图的实际位置填进去,没有规定图必须放在哪里,只要程序能在你填进去的位置找到该高度图就行。

  接下来问生成的world文件存在哪里:

    World file destination:

回答:/home/sx/gazebo_dem/terrain_generator/world
上面的回答,选择你实际放world文件的位置即可,可以随便放在哪里,无所谓的。

  程序会自动打开gazebo加载生成的world,但我这边每次都报错,没事,单独启动即可。找到你刚刚填进去的world文件存放位置,然后:

   gazebo ./terrain.world

第一次加载会比较慢,以后开启就快了,gazebo会生成一些文件放在~/.gazebo/paging 中的,后面如果修改该模型的sdf文件,替换一些渲染图片,需要把~/.gazebo/paging文件夹中的文件清空,让其重新生成,否则修改sdf文件后,看不到什么变化的。下面是加载出来的效果图:
  建议大家研究一下model_gen.py生成的model.sdf文件,默认是选择草、沙、水来渲染山地的,后续可以换成别的。有了地形图,后面就是添加一些树、桥梁、建筑等等构成可以仿真的world了。
  上图后续研究发现太平了,不像山峰,然后尝试了使用下载下来的zip的(ASTER 30m)的图,然后gimp在修改尺寸时,对像素和插值进行了修改,如下:
GAZEBO构建室外环境地图之加载山地地形_第2张图片然后model_gen.py中将1025 1025 12改成1025 1025 100增加高度,修改水、草、沙高度如下:

#Blending Textures 1 and 2
    blend = ET.SubElement(heightmap_visual,"blend")
    min_height = ET.SubElement(blend,"min_height")
    min_height.text = "4"  #0
    fade_dist = ET.SubElement(blend,"fade_dist")
    fade_dist.text = "0.8"  #0.8

    #Blending Textures 2 and 3
    blend = ET.SubElement(heightmap_visual,"blend")
    min_height = ET.SubElement(blend,"min_height")
    min_height.text = "4.1" #0.1
    fade_dist = ET.SubElement(blend,"fade_dist")
    fade_dist.text = "1.5"

    #Blending Textures 3 and 4
    blend = ET.SubElement(heightmap_visual,"blend")
    min_height = ET.SubElement(blend,"min_height")
    min_height.text = "50"
    fade_dist = ET.SubElement(blend,"fade_dist")
    fade_dist.text = "50"

最后结果如下:
山的效果好了很多,上面的修改仅供参考,最好能拿到当地的更准确的地理信息,大家摸索出来更好的方法,请麻烦留言告知,谢谢。

你可能感兴趣的:(GAZEBO构建室外环境地图之加载山地地形)