• 【Gazebo入门教程】第三讲 SDF文件的静/动态编程建模


    【Gazebo入门教程】第三讲 SDF文件的静/动态编程建模

    在这里插入图片描述

    一、自定义模型并导入Gazebo

    • 内容简介:本节内容以一个两轮移动机器人为例,使用差动驱动机构运动,从无到有,使用SDF完成建模并在Gazebo中完成仿真,重点在于通过建模的细致流程掌握如何使用SDF文件和Gazebo软件完成机器人仿真。

    1. 基础操作准备

    • 注意:Gazebo的模型文件有着严格的要求,具体规则可见SDF格式

    \qquad ① 创建模型目录

    mkdir -p ~/.gazebo/models/my_robot
    
    • 1

    \qquad ② 创建模型配置文件

    gedit ~/.gazebo/models/my_robot/model.config
    
    • 1

    \qquad 元数据(config)内容如下:

    	
    	<model>
    	  <name>My Robotname>
    	  <version>1.0version>
    	  <sdf version='1.4'>model.sdfsdf>
    	
    	  <author>
    	   <name>My Namename>
    	   <email>me@my.emailemail>
    	  author>
    	
    	  <description>
    	    My awesome robot.
    	  description>
    	model>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    \qquad ② 创建模型配置文件

    gedit ~/.gazebo/models/my_robot/model.sdf
    
    • 1

    \qquad 必要标记(sdf)内容如下:

    	
    	<sdf version='1.4'>
    	  <model name="my_robot">
    	  model>
    	sdf>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 建立模型基础部件(静态)

    • 基本要求:本节内容主要是单独创建机器人的各部件,例如底座、轮子等,不涉及相关关节连杆等链接内容,重点在于对齐组件,故模型为静态,忽略物理效果。

    \qquad ① 令机器人模型静态

    注意:在static标签后将会在link标签下生成对应部件,通过collision的name隔开,故在后代码展示中则会忽略一部分,请自行补充

    	
    	<sdf version='1.4'>
    	  <model name="my_robot">
    	  <static>truestatic>
    	  model>
    	sdf>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    \qquad ② 创建长方体的底座

    代码解释:

    1. box 标签,用于产生对应尺寸的长方体
    2. collision 标签,指定碰撞尺寸
    3. visual 标签,指定视觉尺寸,常见情况下与collision相同
    
    <sdf version='1.4'>
      <model name="my_robot">
      <static>truestatic>
        <link name='chassis'>
          <pose>0 0 .1 0 0 0pose>
    
          <collision name='collision'>
            <geometry>
              <box>
                <size>.4 .2 .1size>
              box>
            geometry>
          collision>
    
          <visual name='visual'>
            <geometry>
              <box>
                <size>.4 .2 .1size>
              box>
            geometry>
          visual>
        link>
      model>
    sdf>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    \qquad ③ 创建脚轮(万向轮)

    注意:脚轮固定在底座上,故二者同属一个link

    <collision name='caster_collision'>
            <pose>-0.15 0 -0.05 0 0 0pose>
            <geometry>
                <sphere>
                <radius>.05radius>
              sphere>
            geometry>
    
            <surface>
              <friction>
                <ode>
                  <mu>0mu>
                  <mu2>0mu2>
                  <slip1>1.0slip1>
                  <slip2>1.0slip2>
                ode>
              friction>
            surface>
          collision>
    
          <visual name='caster_visual'>
            <pose>-0.15 0 -0.05 0 0 0pose>
            <geometry>
              <sphere>
                <radius>.05radius>
              sphere>
            geometry>
          visual>
        link>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    \qquad ④ 创建前轮和后轮

    注意:前轮和后轮分别创建了新的link

    	  <link name="left_wheel">
          <pose>0.1 0.13 0.1 0 1.5707 1.5707pose>
    
          <collision name="collision">
            <geometry>
              <cylinder>
                <radius>.1radius>
                <length>.05length>
              cylinder>
            geometry>
          collision>
    
          <visual name="visual">
            <geometry>
              <cylinder>
                <radius>.1radius>
                <length>.05length>
              cylinder>
            geometry>
          visual>
        link>
    
        <link name="right_wheel">
          <pose>0.1 -0.13 0.1 0 1.5707 1.5707pose>
    
          <collision name="collision">
            <geometry>
              <cylinder>
                <radius>.1radius>
                <length>.05length>
              cylinder>
            geometry>
          collision>
    
          <visual name="visual">
            <geometry>
              <cylinder>
                <radius>.1radius>
                <length>.05length>
              cylinder>
            geometry>
          visual>
        link>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    \qquad ⑤ 导入Gazebo可视化模型

    • 使用INSERT导入对应文件夹的模型,可看到模型如下:

    在这里插入图片描述

    注意:修改SDF文件后,只需要删除原有模型重新插入就会更新模型

    3. 创建关节连接部件(动态)

    • 基本要求:将static设为false,为左右车轮添加铰链关节,关节绕Y轴旋转,将各车轮连接到底盘
    	<static>falsestatic>
    
    • 1
    	<joint type="revolute" name="left_wheel_hinge">
          <pose>0 0 -0.03 0 0 0pose>
          <child>left_wheelchild>
          <parent>chassisparent>
          <axis>
            <xyz>0 1 0xyz>
          axis>
        joint>
    
        <joint type="revolute" name="right_wheel_hinge">
          <pose>0 0 0.03 0 0 0pose>
          <child>right_wheelchild>
          <parent>chassisparent>
          <axis>
            <xyz>0 1 0xyz>
          axis>
        joint>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    4. Gazebo基本仿真

    • 基本操作:启动Gazebo,插入最新模型,打开隐藏的右面板,选择好要控制的模型,如下图给Force下的各关节力进行修改,机器人就会发生移动:

    在这里插入图片描述

    二、创建Velodyne HDL-32 LiDAR传感器

    • 内容简介:本节内容以一个两轮移动机器人为例,使用差动驱动机构运动,从无到有,使用SDF完成建模并在Gazebo中完成仿真,重点在于通过建模的细致流程掌握如何使用SDF文件和Gazebo软件完成机器人仿真。

    1. 创建基本世界

    • 创建新的.world文件:
    	gedit velodyne.world
    
    • 1
    • 创建世界的环境:地面与光线
    
    <sdf version="1.5">
      <world name="default">
    
        
        <include>
          <uri>model://sunuri>
        include>
    
        
        <include>
          <uri>model://ground_planeuri>
        include>
      world>
    sdf>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2. 创建传感器静态模型

    • 传感器基础部分2D绘图如下:

    在这里插入图片描述

    • 对应代码如下:位于< world >的内部
    <model name="velodyne_hdl-32">
      
      <link name="base">
    
        
        <pose>0 0 0.029335 0 0 0pose>
        <collision name="base_collision">
          <geometry>
            <cylinder>
              
              <radius>.04267radius>
              <length>.05867length>
            cylinder>
          geometry>
        collision>
    
        
        <visual name="base_visual">
          <geometry>
            <cylinder>
              <radius>.04267radius>
              <length>.05867length>
            cylinder>
          geometry>
        visual>
      link>
    
      
      <link name="top">
    
        
        <pose>0 0 0.095455 0 0 0pose>
        <collision name="top_collision">
          <geometry>
            <cylinder>
              
              <radius>0.04267radius>
              <length>0.07357length>
            cylinder>
          geometry>
        collision>
    
        
        <visual name="top_visual">
          <geometry>
            <cylinder>
              <radius>0.04267radius>
              <length>0.07357length>
            cylinder>
          geometry>
        visual>
      link>
    model>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 启动Gazebo查看模型:(先cd到文件路径下)
    	cd ~/
    	gazebo velodyne.world -u  
    
    • 1
    • 2

    在这里插入图片描述

    • 查看碰撞属性:右键点击模型,view→Collisions

    在这里插入图片描述

    3. 添加模型惯性

    • 3.1 查看当前惯性值:右键单击模型,选择View->Inertia

    在这里插入图片描述

    注意:紫色框对应关联的链接大小,此时模型没有惯性信息,故尺寸过大

    • 3.2 添加惯性信息:质量设为1.3kg,添加对应质量和惯性矩阵

    在< link name=“base” >块中添加以下内容:

      <link name="base">
        <pose>0 0 0.029335 0 0 0pose>
        <inertial>
          <mass>1.2mass>
          <inertia>
            <ixx>0.001087473ixx>
            <iyy>0.001087473iyy>
            <izz>0.001092437izz>
            <ixy>0ixy>
            <ixz>0ixz>
            <iyz>0iyz>
          inertia>
        inertial>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在< link name=“top” >块中添加以下内容:

     <link name="top">
       <pose>0 0 0.095455 0 0 0pose>
       <inertial>
         <mass>0.1mass>
         <inertia>
           <ixx>0.000090623ixx>
           <iyy>0.000090623iyy>
           <izz>0.000091036izz>
           <ixy>0ixy>
           <ixz>0ixz>
           <iyz>0iyz>
         inertia>
       inertial>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    最终效果如下:

    在这里插入图片描述

    4. 添加关节

    • 4.1 定义顶部围绕底部旋转关节,在< world >最后添加内容如下:
    
    <joint type="revolute" name="joint">
    
      
      <pose>0 0 -0.036785 0 0 0pose>
    
      
      <parent>baseparent>
    
      
      <child>topchild>
    
      
      <axis>
    
        
        <xyz>0 0 1xyz>
    
        
        <limit>
    
          
          <lower>-10000000000000000lower>
          <upper>10000000000000000upper>
        limit>
      axis>
    joint>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 4.2 检验效果:

    1. 启动Gazebo,右键单击模型,选择View->Joints,View->Transparent

    在这里插入图片描述

    2. 打开右面板,选择Velodyne模型。使用Force选项卡向关节施加较小的,可看到关节旋转即可

    在这里插入图片描述

    5. 添加传感器

    • 传感器基本信息:

    激光传感器,可以发出一个或多个光束,光束产生距离和强度数据,对应SDF文件中的< scan >和< range >,分别对应波束的布局、数量和限定束的性质,其中< scan >中包含< horizontal >和< vertical >两个块。< horizontal >组件定义在水平平面中发出的光线,该< vertical >组件定义在垂直平面中发出的光线,Velodyne传感器需要垂直射线,然后旋转。我们将其模拟为旋转的水平扇面。

    • 添加并设置传感器:(在的最后部分添加以下内容)
    
    <sensor type="ray" name="sensor">
    
      
      <pose>0 0 -0.004645 1.5707 0 0pose>
    
      
      <visualize>truevisualize>
    
      
      <update_rate>30update_rate>
      <ray>
    
      
      <scan>
    
        
        <horizontal>
          
          <samples>32samples>
    
          
          <resolution>1resolution>
    
          
          <min_angle>-0.53529248min_angle>
    
          
          <max_angle>0.18622663max_angle>
        horizontal>
      scan>
    
      
      <range>
    
        
        <min>0.05min>
    
        
        <max>70max>
    
        
        <resolution>0.02resolution>
      range>
    ray>
    sensor>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 查看仿真效果:

    在这里插入图片描述

    • 添加高斯噪声:

    在< sensor >的子标签< ray >中添加如下代码:

    <noise>
         
         <type>gaussiantype>
         <mean>0.0mean>
         <stddev>0.1stddev>
    noise>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    效果如下:

    在这里插入图片描述

    • 通过Ctrl+T打开topic visualization查看:

    在这里插入图片描述



    总结

    • 内容分析:本篇博客主要介绍了在Gazebo中如何使用SDF进行手动的编程建模,通过编写SDF文件,实现对于机器人从无到有的一步步建造,体会SDF文件的语法使用,并在文章整体使用两个具体实例,分别是轮式小车和Velodyne HDL-32 LiDAR传感器模型进行了深入研究。

    在这里插入图片描述

    • 注意:本文参考了Gazebo官方网站以及古月居中的Gazebo有关教程,主要目的是方便自行查询知识,巩固学习经验,无任何商业用途。
  • 相关阅读:
    Python 人工智能 Machine Learning 机器学习基础知识点详细教程(更新中)
    限制input框只能输入数字和小数点,并且保留小数点后两位
    STM8的C语言编程(6)--8位定时器应用之二
    交叉编译中常见错误解决方法
    【生日快乐】SpringBoot SpringBoot 提高篇(第二篇) 第5章 SpringBoot 日志 5.3 SpringBoot 的日志使用
    新电脑验机步骤(1)
    Guava入门~Guava caches
    四、Go中的条件判断和for循环
    官方教程 Redshift 09 Camera
    Windows RDP远程桌面优化
  • 原文地址:https://blog.csdn.net/lc1852109/article/details/126157030