结论
下载模型到本地依然无法打开,多数是下载的模型文件包中的资源有缺失以及sdf文件中的URI路径不对造成的。
- 文件缺失的问题通过从Fuel中下载到缺失的文件用以补充解决
- URI路径不对的问题通过调整URI路径解决
背景
从Fuel下载模型后,本以为能避开网络差的问题愉快的玩耍了,结果发现通过gz sim model.sdf命令依然无法成功打开模型。经历过的伙伴应该会感到无奈。好在历经一番探索,根据失败的log,我找到了解决问题的方法。
具体的解决方案
我通过一个例子来详细说明问题的解决方法。
首先下载本文附带的文件。其中包含pallet_box_mobile.zip文件,下载后将其解压。解压后得到一个文件夹,其中有
- meshes文件夹 存放着模型mesh资源
- thumbnails文件夹 存放着模型缩略图
- model.config文件 这应该是模型的配置
- model.sdf文件 这是模型的描述文件
进入解压后的文件夹,在此路径下打开终端。在终端中执行
gz sim model.sdf
之后会弹出窗口,终端中会显示以下错误
[GUI] [Err] [SystemPaths.cc:432] URI [https://fuel.ignitionrobotics.org/1.0/MovAi/models/pallet/tip/files/meshes/pallet.dae] resolved to path [/home/ld/.gz/fuel/fuel.ignitionrobotics.org/movai/models/pallet/tip/meshes/pallet.dae] but the path does not exist
[GUI] [Err] [SystemPaths.cc:525] Could not resolve file [https://fuel.ignitionrobotics.org/1.0/MovAi/models/pallet/tip/files/meshes/pallet.dae]
[GUI] [Err] [MeshManager.cc:193] Unable to find file[https://fuel.ignitionrobotics.org/1.0/MovAi/models/pallet/tip/files/meshes/pallet.dae]
[GUI] [Err] [SceneManager.cc:425] Failed to load geometry for visual: pallet_visual
[GUI] [Err] [SystemPaths.cc:425] Unable to find file with URI [model://pallet_box_mobile/meshes/boxes.dae]
[GUI] [Err] [SystemPaths.cc:525] Could not resolve file [model://pallet_box_mobile/meshes/boxes.dae]
[GUI] [Err] [MeshManager.cc:193] Unable to find file[model://pallet_box_mobile/meshes/boxes.dae]
[GUI] [Err] [SceneManager.cc:425] Failed to load geometry for visual: boxes_visual
在第一行我能看到URI [https://fuel.ignitionrobotics.org/1.0/MovAi/models/pallet/tip/files/meshes/pallet.dae],这是一件很奇怪的事情,因为我们明明已经把所有资源下载下来了,为什么还和远程URI资源链接扯上关系呢。出现这种情况,说明模型的描述文件中可能有错误。
因此,我打开model.sdf文件查看。
在model.sdf文件的74行我看到了:
<uri>https://fuel.ignitionrobotics.org/1.0/MovAi/models/pallet/tip/files/meshes/pallet.dae</uri>
也就是描述文件中有uri依然指向的是远程资源,在网络条件差的情况下是可能会无法打开模型的。
根据log中的meshes/pallet.dae,我们判断是mesh资源有问题。于是打开解压得到的文件里面的meshes文件夹,发现里面的文件是这样的:
其中并没有包含pallet.dae文件。因此我们需要自己去找到这个文件。我们可以在Gazebo的资源库Fuel中去搜索这个模型。搜索栏中搜索pallet,结果如下:
出现了两个pallet模型,根据错误提示中的“MovAi”字样,我们判定这个是我们要找的文件:
点击进入,点击右边的下载按钮,等待下载完毕。
下载成功后我们会得到pallet.zip文件。解压文件,进入解压得到的文件夹后,我们会发现其中的文件结构和上面所说的是一样的。为了确保文件无误,我们也尝试打开这个模型。在当前目录下打开终端,运行gz sim model.sdf。我们会发现这个模型依然无法打开(是不是很无语,为什么这么多问题…),终端报错
[GUI] [Err] [SystemPaths.cc:425] Unable to find file with URI [model://pallet/meshes/pallet.dae]
[GUI] [Err] [SystemPaths.cc:525] Could not resolve file [model://pallet/meshes/pallet.dae]
[GUI] [Err] [MeshManager.cc:193] Unable to find file[model://pallet/meshes/pallet.dae]
[GUI] [Err] [SceneManager.cc:425] Failed to load geometry for visual: pallet_visual
根据log,我们发现URI指向的是本地文件,但是依然报错,说明可能是路径有问题。打开model.sdf,检查uri标签里面的资源路径,我们会在46行找到
<uri>model://pallet/meshes/pallet.dae</uri>
根据经验,我们猜测其中的pallet应该是多余的,因为meshes文件夹和model.sdf文件是在同一级目录。所以我们先把pallet删除再试,删除后这一行变成这样(注意,xml文件的内容需要严格对齐,我这里为了格式美观没有把空格加进来,但是实际修改文件的时候要注意保证对齐的正确性):
<uri>model://meshes/pallet.dae</uri>
随后重新运行gz sim model.sdf命令。这时候会弹出窗口,其中正确的显示了模型,这是一个木制的货物托盘:
至此我们已经解决了一种由资源路径出错导致的模型无法正常打开的问题,也确定了pallet.dae文件应该是没有问题的。 但是最初的问题还没有解决,所以我们继续。
进入pallet文件夹中的meshes文件夹,发现其中有两个文件。
pallet.dae肯定是我们需要的文件,为了确定另一个文件是否需要(有建模型相关经验的同学可能直接就知道这两个文件都需要了),我们用文本编辑器打开pallet.dae文件,搜索"Bois",发现第61行有
<init_from>Bois_palette.jpg</init_from>
因此确定这两个文件都是需要的,且pallet.dae依赖Bois_palette.jpg文件。
我们把这两个文件都复制到pallet_box_mobile文件夹中的meshes文件夹内。
打开pallet_box_mobile文件夹中的model.sdf文件,修改第74行的URI描述标签,修改为:
<uri>model://meshes/pallet.dae</uri>
修改后记得保存。这时候如果我们直接运行gz sim model.sdf命令,依然无法打开模型。检查一下sdf文件的其他内容,会发现第83行也存在本地文件的URI路径不对的问题,和上面我们解决过的那个问题一样。我们将其修改为:
<uri>model://meshes/boxes.dae</uri>
随后运行
gz sim model.sdf
弹出的窗口中显示的模型应该如:
至此,我们解决了问题。