让我们先看一个gazebo模型的sdf文件iris_depth_camera_down.sdf
<sdf version='1.5'>
<model name='iris_depth_camera_down'>
<include>
<uri>model://iris</uri>
</include>
<include>
<uri>model://depth_camera_new</uri>
<pose>0 0 -0.05 0 1.5708 0</pose>
</include>
<joint name="depth_camera_new_joint" type="fixed">
<child>depth_camera_new::link</child>
<parent>iris::base_link</parent>
<axis>
<xyz>0 0 1</xyz>
<limit>
<upper>0</upper>
<lower>0</lower>
</limit>
</axis>
</joint>
</model>
显然这里面用uri链接打开了iris和depth_camera_new两个模型。
问题是,这两个模型的文件路径是什么?
答案在https://answers.gazebosim.org/question/6568/uri-paths-to-packages-in-the-sdf-model-file/
简而言之,<uri>model://iris</uri>会去找gazebo_model_path路径,而这个路径的申明有几种方法。
1、默认路径
~/.gazebo/models是gazebo会去找的模型默认路径,gazebo中联机下载的模型也会放在这里,也可以把你的模型放在这里,那gazebo一定可以找到。
2、自制model包
也可在自己写的一些ros包的package.xml文件里export这个包里的models文件夹,这个文件夹里的模型也会成为gazebo_model_path。给个参考:
<?xml version="1.0"?>
<package format="2">
<name>uavros_gazebo</name>
<version>0.0.0</version>
<description>The iris_gazebo package</description>
<license>BSD</license>
<author>colin</author>
<maintainer email="lcyfly1@163.com">colin</maintainer>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>message_generation</build_depend>
<depend>message_runtime</depend>
<depend>std_msgs</depend>
<depend>gazebo_ros</depend>
<depend>roscpp</depend>
<depend>rospy</depend>
<depend>camera_info_manager</depend>
<depend>geometry_msgs</depend>
<exec_depend>depth_image_proc</exec_depend>
<test_depend>rostest</test_depend>
<exec_depend>urdf</exec_depend>
<exec_depend>xacro</exec_depend>
<export>
<gazebo_ros
plugin_path="${prefix}/lib"
gazebo_media_path="${prefix}"
gazebo_model_path="${prefix}/models"
/>
</export>
</package>
下面的命令可以查看gazebo_ros的model path:
rospack plugins --attrib=gazebo_model_path gazebo_ros
3、声明路径
最后,可以在终端或者.bashrc里声明GAZEBO_MODEL_PATH的路径,之后再打开相应的模型就会找到路径了,比较麻烦不推荐。
exprot GAZEBO_MODEL_PATH=${GAZEBO_MODEL_PATH}:path-to-model
如果多个路径下面都有同名的model,那么会用到哪个我还不知道,可能有个先后顺序。如果都找不到那就会联网去下载。
最好还是不要用同名的model。
下面是搬运: