gazebo教程(三)创建 Velodyne HDL-32 LiDAR传感器模型

csdn同步更新,主页

本教程基于ubuntu系统

创建新模型时的第一步是收集相关模型信息。Velodyne LiDAR公司已在其网站上提供了有关其传感器的文档 。如果没有有关模型的详细信息,则可以测量物理版本,向制造商询问规格,或者在最坏的情况下进行猜测。

根据Velodyne文档,我们将创建具有以下功能的传感器:

  • 基础圆柱体和顶部圆柱体,顶部圆柱体在能够旋转
  • 创建垂直圆柱体的一组定向激光。

Step 1 建立基本的sdf模型

1、创建新的.world文件

gedit velodyne.world

界面如下,大家也可以选择自己习惯的文本编辑器,这里只是示范。


在这里插入图片描述

2、添加地面和光线

<?xml version="1.0" ?>
<sdf version="1.5">
  <world name="default">

    <!-- A global light source -->
    <include>
      <uri>model://sun</uri>
    </include>

    <!-- A ground plane -->
    <include>
      <uri>model://ground_plane</uri>
    </include>
  </world>
</sdf>

3、添加基础部件

接下来,我们将Velodyne LiDAR的基础部分添加到SDF world文件中。我们将使用Velodyne传感器尺寸来构造基础圆柱体和顶部圆柱体。下面是Velodyne 2D绘图的屏幕截图。

image

<world></world>块中添加以下内容

<model name="velodyne_hdl-32">
  <!-- Give the base link a unique name -->
  <link name="base">

    <!-- Offset the base by half the lenght of the cylinder -->
    <pose>0 0 0.029335 0 0 0</pose>
    <collision name="base_collision">
      <geometry>
        <cylinder>
          <!-- Radius and length provided by Velodyne -->
          <radius>.04267</radius>
          <length>.05867</length>
        </cylinder>
      </geometry>
    </collision>

    <!-- The visual is mostly a copy of the collision -->
    <visual name="base_visual">
      <geometry>
        <cylinder>
          <radius>.04267</radius>
          <length>.05867</length>
        </cylinder>
      </geometry>
    </visual>
  </link>

  <!-- Give the base link a unique name -->
  <link name="top">

    <!-- Vertically offset the top cylinder by the length of the bottom
        cylinder and half the length of this cylinder. -->
    <pose>0 0 0.095455 0 0 0</pose>
    <collision name="top_collision">
      <geometry>
        <cylinder>
          <!-- Radius and length provided by Velodyne -->
          <radius>0.04267</radius>
          <length>0.07357</length>
        </cylinder>
      </geometry>
    </collision>

    <!-- The visual is mostly a copy of the collision -->
    <visual name="top_visual">
      <geometry>
        <cylinder>
          <radius>0.04267</radius>
          <length>0.07357</length>
        </cylinder>
      </geometry>
    </visual>
  </link>
</model>

以暂停仿真的状态启动gazebo,看下模型效果,cd到文件所在路径,在命令行中输入gazebo velodyne.world -u

image

默认情况下,<visual>标签定义了模型的外观。<collision>标签定义与其他模型碰撞时的表现。要查看和调试模型上的<collision>属性,右键,然后选择viewCollisions。您将看到两个圆柱体(由于靠近而看起来像一个圆柱体)。
image

Step2 添加惯性

我们有了一个Velodyne模型,但是该模型缺乏诸如惯性矩阵之类的动态属性。物理引擎使用惯性信息来计算模型在受力作用时的行为。如果没有或错误惯性值,模型在进行物理仿真的时候会表现得很奇怪。

1、查看当前的惯性值。

在gazebo运行的情况下,右键单击Velodyne模型,然后选择View->Inertia。然后会出现以下画面。

image

通常,每个紫色框应大致匹配与其关联的链接的大小。由于我们的模型缺少惯性信息,当前的惯性盒尺寸过大。

2、添加惯性信息

我们可以通过同时指定质量矩阵和惯性矩阵来向链接添加惯性。我们将Velodyne的质量设定为1.3kg,使用相关公式来计算惯性矩矩阵 。

<link name="base">块中添加以下内容:

<model name="velodyne_hdl-32">
  <link name="base">
    <pose>0 0 0.029335 0 0 0</pose>
    <inertial>
      <mass>1.2</mass>
      <inertia>
        <ixx>0.001087473</ixx>
        <iyy>0.001087473</iyy>
        <izz>0.001092437</izz>
        <ixy>0</ixy>
        <ixz>0</ixz>
        <iyz>0</iyz>
      </inertia>
    </inertial>

<link name="top">块中添加以下内容:

 <link name="top">
   <pose>0 0 0.095455 0 0 0</pose>
   <inertial>
     <mass>0.1</mass>
     <inertia>
       <ixx>0.000090623</ixx>
       <iyy>0.000090623</iyy>
       <izz>0.000091036</izz>
       <ixy>0</ixy>
       <ixz>0</ixz>
       <iyz>0</iyz>
     </inertia>
   </inertial>

设置好后,会有以下效果:


image

Step3 添加关节(joint)

joint定义了每个link之间的约束。在机器人领域,最常见的关节类型是revolute(旋转)。旋转关节定义了两个连杆之间的单个旋转自由度。完整的关节列表可以在SDF网站上找到。

1、定义关节

我们将定义一个顶部围绕底部旋转的关节,在</model>前添加以下内容

<!-- Each joint must have a unique name -->
<joint type="revolute" name="joint">

  <!-- Position the joint at the bottom of the top link -->
  <pose>0 0 -0.036785 0 0 0</pose>

  <!-- Use the base link as the parent of the joint -->
  <parent>base</parent>

  <!-- Use the top link as the child of the joint -->
  <child>top</child>

  <!-- The axis defines the joint's degree of freedom -->
  <axis>

    <!-- Revolve around the z-axis -->
    <xyz>0 0 1</xyz>

    <!-- Limit refers to the range of motion of the joint -->
    <limit>

      <!-- Use a very large number to indicate a continuous revolution -->
      <lower>-10000000000000000</lower>
      <upper>10000000000000000</upper>
    </limit>
  </axis>
</joint>

运行gazebo,点击模型,右键View->JointsView->Transparent我们能看到以下效果:

在这里插入图片描述

2、检验效果

我们可以使用“关节命令”图形工具来验证关节是否正确旋转。拖动右侧面板在主窗口上打开,然后选择Velodyne模型。使用Force部件中的选项卡向关节施加较小的力(0.01即可)。取消暂停世界,您应该看到可视化的关节开始围绕模型的Z轴旋转。

至此,我们有了一个具有有效惯性,碰撞和关节属性的Velodyne模型。接下来,我们将添加传感器。


image

Step4 添加传感器

传感器用于从环境或模型生成数据。在本节中,我们将为Velodyne模型添加一个激光传感器。gazebo中的激光传感器可以发出一个或多个光束,这些光束会产生距离以及可能的强度数据。

在sdf文件中,该传感器由<scan><range>两个部分组成,<scan>定义波束的布局和数量,<range>限定一个单独的束的性质

<scan>中包含<horizontal><vertical>两个块。<horizontal>组件定义在水平平面中发出的光线,该<vertical>组件定义在垂直平面中发出的光线。

Velodyne传感器需要垂直射线,然后旋转。我们将其模拟为旋转的水平扇面。我们之所以采用这种方法,是因为在gazebo中可视化数据会更容易一些。Velodyne规格表明HDL-32具有32束光线,垂直视场在+10.67到-30.67度之间。

1、添加传感器到顶部link

<link name="top">中添加以下内容

<!-- Add a ray sensor, and give it a name -->
<sensor type="ray" name="sensor">

  <!-- Position the ray sensor based on the specification. Also rotate
       it by 90 degrees around the X-axis so that the <horizontal> rays
       become vertical -->
  <pose>0 0 -0.004645 1.5707 0 0</pose>

  <!-- Enable visualization to see the rays in the GUI -->
  <visualize>true</visualize>

  <!-- Set the update rate of the sensor -->
  <update_rate>30</update_rate>
</sensor>

2、设置传感器

紧跟上面内容<update_rate>30</update_rate>,添加以下内容

<ray>

  <!-- The scan element contains the horizontal and vertical beams.
       We are leaving out the vertical beams for this tutorial. -->
  <scan>

    <!-- The horizontal beams -->
    <horizontal>
      <!-- The velodyne has 32 beams(samples) -->
      <samples>32</samples>

      <!-- Resolution is multiplied by samples to determine number of
           simulated beams vs interpolated beams. See:
           http://sdformat.org/spec?ver=1.6&elem=sensor#horizontal_resolution
           -->
      <resolution>1</resolution>

      <!-- Minimum angle in radians -->
      <min_angle>-0.53529248</min_angle>

      <!-- Maximum angle in radians -->
      <max_angle>0.18622663</max_angle>
    </horizontal>
  </scan>

  <!-- Range defines characteristics of an individual beam -->
  <range>

    <!-- Minimum distance of the beam -->
    <min>0.05</min>

    <!-- Maximum distance of the beam -->
    <max>70</max>

    <!-- Linear resolution of the beam -->
    <resolution>0.02</resolution>
  </range>
</ray>

3、开始仿真看下效果

image

下一篇

现在我们已经有了传感器模型,加下来将通过以下三个部分对模型进行改进:

  • 添加3D网格以改善视觉外观
  • 添加传感器噪声以改善数据真实性
  • 添加一个插件来控制传感器。

\color{#2d7dcd}{如果觉得ok}\color{#FFDEAD}{点个赞}\color{#FFDEAD}{点个关注}\color{#2d7dcd}{也欢迎给个} \color{#FFDEAD}{打赏} \color{#2d7dcd}{支持一下编者的工作}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容