环境:ububtu16.04 ros-kinetic gazebo7.16
问题来源:
做仿真时候,涉及相机方面的仿真,需要创建的一个在特定位置贴有指定图片,如二维码/AR码,的gazebo模型.具有一般gazebo模型的随意insert的特性.
下面是以带有图片标签的叉车托盘例子型创建的过程:
1)参考案例
创建这个模型可以参考gazebo里面的beer模型基本架构,个人也是参考那个模型获得灵感创建自己的模型的.
2)模型文件的几大部分创建及解析
创建文件夹forkboardbbb,包含整个模型的所有文件.其中:
a . model.config:
<?xml version="1.0"?>
<model>
<name>forkboardbbb</name>//定义gazebo模型插入时候目录显示的名称
<version>1.0</version>
<sdf version="1.5">model.sdf</sdf>
<author>
<name>ylh</name>
</author>
<description>
forkboardbbb
</description>
</model>
b. model.sdf:
<?xml version="1.0" ?>
<sdf version="1.5">
<model name="forkboardbbb">//定义的的是模型在gazebo插入后在model目录下显示的模型名称
<static>false</static>//false表示该模型在gazebo里面是可以移动的
<link name='baselink'>
<pose>0 0 0 0 0 0</pose>
<inertial>
<mass>104</mass>
<pose>0.5 0.6 0.4 0 0 0</pose>//定义该link的重心
<inertia>
<ixx>85.8</ixx>
<ixy>34.2</ixy>
<ixz>29.4</ixz>
<iyy>75.4</iyy>
<iyz>29.5</iyz>
<izz>89.7</izz>
</inertia>//定义该link的转动惯量
</inertial>
<collision name='collision'>
<geometry>
<mesh>
<scale>1 1 1</scale>
<uri>model://forkboardbbb/meshes/forkboard112.STL</uri>//启用模型的stl文件,注意stl的大小样式写一定一定要和实际名称一致,否则拿不到的;还有这个文件是要放到 .gazebo/models 目录下面的,方便自己使用(个人习惯)
</mesh>
</geometry>
<surface>
<friction>
<ode>
<mu>200</mu>
<mu2>200</mu2>
</ode>
</friction>
<contact>//该标签作用是解决因为添加了一个link来贴图片带来模型抖动问题,不添加的话,模型会一直在慢慢移动甚至更严重
<ode>
<min_depth>0.001</min_depth>
</ode>
</contact>
</surface>
</collision>
<visual name='visual'>
<geometry>
<mesh>
<scale>1 1 1</scale>
<uri>model://forkboardbbb/meshes/forkboard112.STL</uri>
</mesh>
</geometry>
//这里定义的是该link的颜色样式
<material>
<script>
<name>Gazebo/White</name>
<uri>file://media/materials/scripts/gazebo.material</uri>
</script>
</material>
</visual>
</link>
<!--picture_link-->//这里是添加图片的link
<joint type="fixed" name="link1joint">//一定要定义该joint,否则图片的位置无法准确定义,这是sdf编写的规则决定的
<pose>0 0 0 0 0 0</pose>
<child>link1</child>
<parent>baselink</parent>
</joint>
<link name="link1">
<pose>0.5 0.044 -0.062 0 0 0</pose>//定义该link的位置,就是决定贴图位置
<visual name="visual">
<pose>0 0 0 0 0 0</pose>
<geometry>
<box>
<size>0.09 0.09 0.09</size>//link的大小决定这图片显示大小
</box>
</geometry>
<material>
<script>
<uri>model://forkboardbbb/materials/scripts1</uri>//图片的配置信息
<uri>model://forkboardbbb/materials/textures1</uri>//图片位置路径
<name>box_beer/Diffuse</name>//这个一定要跟scripts1里面的box_beer.material里面的第一行名称一致.
</script>
</material>
</visual>
</link>
</model>
</sdf>
c.创建一个meshes文件夹,里面存放上面model所使用的 .STL 文件.
d.创建materials文件夹,内含(用于图片配置信息的脚本文件夹scripts1,以及存放图片材料的文件夹textures1)
文件夹scripts1:
box_beer.material:
material box_beer/Diffuse//这个名称会在模型的sdf文件用到
{
technique
{
pass
{
texture_unit
{
texture box_beer.png//和textures存放的图片名称要一致
filtering anistropic
max_anisotropy 16
}
}
}
}
文件夹textures1:
box_beer.png//这里表示的是一张png格式的图片
本案例使用的图片跟和beer里面使用的图片是一样的,可以使用ctrl+h打开 .gazebo/models/beer 来查看.这里的stl文件因为格式原因上传不了,有需要的自己创建或者私聊.
最后的弄成的效果图:
3)注意地方
(1)model.sdf model.config box_beer.material box_beer.png
几个文件的名称以及的路径在相应的地方匹配上,基本上带贴图的模型创建完毕了.
(2)这个方法可以延长很多的例子的,如多贴图样式,可调整贴图样式的gazebo模型都是适用的.
(3)这里补充说明,为什么选择一个正方形的link作为贴图link.原因是,这种方式贴上的图片属于均布到link各个面上的,个人还没有找到调整方法;此外,创建这个贴图模型,我只需要的是图片显示,所以贴图的link只是写<visual name="visual">
外观部分足够了.
(4)如果在gazebo插进来的模型 打开 gazebo窗口 左上角的 view-contacts
看见图中的绿色线条在闪动(不闪动表示模型处于静止状态)的话,表示该模型在缓慢移动,需要检查是否设置base_link
的contact
相关参数设置正确,这里在上面的model.sdf有说明了,不重复了.
##########################
好记性不如烂笔头
–20200719