如何在ROS与Gazebo中为SDF格式机器人使用URDF格式传感器
问题解决完整步骤
1. 解决URDF单独加载无网格、无响应问题
- 先配置资源路径:启动Gazebo前需要将teraranger_description本地仓库的
meshes文件夹路径加入GAZEBO_MODEL_PATH环境变量,URDF里引用的网格文件如果是相对路径,Gazebo找不到资源就会不显示模型,路径导出命令为:export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/path/to/your/teraranger_description,将命令里的路径替换为你本地仓库的实际存储路径即可。 - 补充Gazebo传感器插件配置:原版teraranger_description的URDF默认未绑定Gazebo测距传感器插件,需要在URDF文件中添加
libgazebo_ros_range.so插件,同时配置好对应传感器的发布话题名、更新频率、测距范围等参数,没有插件的情况下传感器不会输出任何数据。
2. 将传感器挂载到PX4 SDF机型上
可任选以下一种方法实现:
- 方法一:转换URDF为SDF后合并到机型文件。先用Gazebo自带命令将调试完成的Teraranger URDF转成SDF格式:
gz sdf -p teraranger_tower_evo.urdf > teraranger_tower_evo.sdf,再打开PX4对应机型的SDF文件(存储在Firmware/Tools/sitl_gazebo/models/对应机型文件夹下的model.sdf),在需要挂载的机体link下添加传感器SDF的引用,同时用<pose>标签配置好传感器相对机体的位置和姿态即可。 - 方法二:启动时分别加载两个模型并绑定坐标变换。不用修改原生PX4 SDF文件,在启动脚本中分别用
spawn_model命令加载无人机SDF和传感器URDF,再用static_transform_publisher发布传感器和无人机机体的静态坐标变换即可,适合临时测试场景。
3. 替代方案:用原生Gazebo传感器模拟
如果调不通原版传感器描述文件,可以直接在PX4机型的SDF中添加Gazebo自带的ray测距传感器,参数对齐Teraranger Tower Evo的硬件参数即可,参考配置如下:
<sensor type="ray" name="teraranger_evo"> <pose>0 0 0.1 0 0 0</pose> <!-- 调整为实际挂载位置 --> <ray> <scan> <horizontal> <samples>1</samples> <!-- 单头测距设为1,8头版本可对应调整扫描范围和采样数 --> <min_angle>-0.0288</min_angle> <!-- 对应3.3度视场角 --> <max_angle>0.0288</max_angle> </horizontal> </scan> <range> <min>0.1</min> <!-- 硬件最小测距0.1m --> <max>40.0</max> <!-- 硬件最大测距40m --> <resolution>0.01</resolution> </range> </ray> <plugin name="teraranger_plugin" filename="libgazebo_ros_range.so"> <topicName>/teraranger/range</topicName> <frameName>teraranger_link</frameName> </plugin> </sensor>
将以上代码段添加到SDF文件中对应挂载的link标签内部即可,参数可根据你使用的具体传感器型号灵活调整。
内容的提问来源于stack exchange,提问作者Paco Murso
相关产品推荐
相关产品推荐

