数字孪生之Gazebo导入自建场景(.obj文件)做仿真训练

Do not blindly trust anything I say, try to make your own judgement.


目录

1. 准备工作

2. 配置步骤

2.1 blender逐个导入.obj文件并导出.dae文件

2.2 用.dae文件创建gazebo加载的world文件

2.3 gazebo导出仿真需要的.world文件

2.4 launch文件中启动.world文件

3. 其他问题

4. Reference 


1. 准备工作

在现实场景中采集图像、雷达、imu数据,然后用重建算法重建出meshes文件,加载到仿真器中做仿真训练,实现数字孪生。由于自建场景不便公开,本文不展示操作效果图。

本文以新建一个example.world场景为例,所需的环境如下:

  • ubuntu
  • ROS
  • gazebo仿真器
  • 重建后的.obj文件(重建算法这里不做介绍)
  • blender软件:sudo apt-get install blender

首先确认启动blender和gazebo的时候是否自动使用了GPU(用nvidia-smi查看),如果不用GPU,则加载场景会非常慢,因此建议使用GPU。若未自动使用GPU,则说明nvidia driver版本不合适,需要重装driver。

2. 配置步骤

2.1 blender逐个导入.obj文件并导出为.dae文件

重建场景的mesh文件格式有很多,如.obj,.stl,.dae等,其中gazebo需要加载的场景文件格式是.dae,而我重建的mesh文件格式是.obj,因此需要先用blender将.obj格式转为.dae文件,其他格式的mesh也都可以用blender转成.dae格式。

首先有一些重建后的多个文件夹如下图所示,相当于对一个自建场景做了分块,每个文件夹里包含一个.obj文件及对应的纹理(贴图)。

数字孪生之Gazebo导入自建场景(.obj文件)做仿真训练_第1张图片

 每个文件夹里有如下文件,其中Tile_+000_+000.obj就是主要的obj文件,.mtl文件是纹理文件,对应的贴图是.jpg文件。

数字孪生之Gazebo导入自建场景(.obj文件)做仿真训练_第2张图片

在blender中的点击File-Import-Wavefront(.obj)选择加载每个文件夹里的.obj文件,它会把同级路径下的bbox.obj,.mtl文件,jpg文件都自动加载进来。并且新加载的obj的位置会自动与已加载的obj对齐。导入后的mesh不会直接显示纹理色彩,需要点击菜单栏中的texture paint才会显示出纹理。

全部obj文件加载完后,点击File-Export-Collada(.dae)导出.dae文件,就会把obj文件全部合并成一个.dae文件,并且把所有.jpeg文件跟.dae文件一起保存下来。

(注意,gazebo加载.dae文件大小极限一般在1.5GB,超过1.5GB之后加载场景会非常卡,难以做仿真,一般小于1GB的自建场景文件比较合适。如果场景文件过大,则需要在blender中使用场景压缩技术,降低mesh片数,这里不做介绍。)

2.2 用.dae文件创建可以加载到gazebo的world

首先创建一个world文件夹命名为example,文件夹下包含三个元素:meshes文件夹、model.sdf、model.config。

  • meshes文件夹里保存的就是blender里导出的.dae文件及自带的所有纹理文件.material,需要将上一步导出的.dae文件和.jpeg文件复制到meshes路径下,如下图所示:

数字孪生之Gazebo导入自建场景(.obj文件)做仿真训练_第3张图片

  • model.sdf是world文件的表述文件,定义了基本属性如碰撞、纹理等。其中sdf version="1.5"可以随意指定,只是给自己看的;static设成true可以把静态场景文件固定;model name和link name改成想要加载到gazebo中的场景名称;两个 中间的要改成.dae文件的路径;pose表示的是文件的初始位姿(x,y,z,yaw,pitch,yaw);friction摩擦力系数也很重要。



  
   true 
  
  
    
    0 0 0 0 0 0
    
      
        
          model://example/meshes/example.dae
        
      
        
          
            
            
              100 
              
              50
            
          
        
    
    
  
      
        
          model://example/meshes/example.dae
        
      
    
  


  • model.config文件如下:name:example表示world的名称,model.sdf加载的就是同级目录下的sdf文件。



  example
  1.0
  model.sdf

  
    Optional: YOUR NAME
    Optional: YOUR EMAIL
  

  
    example.
  

  • 配置完以上三个元素后,由于gazebo默认读取的world路径是.gazebo/models/,因此还要给创建好的example文件创建软连接,链接到.gazebo/models路径下,这样gazebo才能识别到该场景:
cd .gazebo/models/
ln -s path_to_example(e.g., ~/example/)

2.3 gazebo导出仿真所需的.world文件

打开gazebo,在左侧的Insert一栏中可以找到新建的场景example,点击该场景会将其加载进来。

加载到gazebo之后,在菜单栏点击File-Save World As,然后命名导出的文件后缀为.world,gazebo就会自动生成example.world文件,该文件是用来指定启动仿真时要加载的场景。

.world文件内容示例如下:


  
    
      1
      0 0 10 0 -0 0
      0.8 0.8 0.8 1
      0.2 0.2 0.2 1
      
        1000
        0.9
        0.01
        0.001
      
      -0.5 0.1 -0.9
    
    0 0 -9.8
    6e-06 2.3e-05 -4.2e-05
    
    
      0.001
      1
      1000
    
    
      0.4 0.4 0.4 1
      0.7 0.7 0.7 1
      1
    
    
    
      EARTH_WGS84
      0
      0
      0
      0
    
    
      1
      
        0 0 0 0 -0 0
        
          
            
              model://example/meshes/example.dae
            
          
          
            
              
                100
                50
              
              
                
              
            
            
              
            
            
          
          10
        
        
          
            
              model://example/meshes/example.dae
            
          
        
        0
        0
        0
      
      0.513522 2.28029 0 0 -0 0
    
    
      0
      0
      0
      0
      
        0.513522 2.28029 0 0 -0 0
        1 1 1
        
          0.513522 2.28029 0 0 -0 0
          0 0 0 0 -0 0
          0 0 0 0 -0 0
          0 0 0 0 -0 0
        
      
      
        0 0 10 0 -0 0
      
    
    
      
        4.6003 -4.3514 1.82182 0 0.275643 2.35619
        orbit
        perspective
      
    
  

2.4 编写launch文件以启动.world文件

用launch文件的方式启动仿真加载场景,这里只展示launch文件中启动仿真场景的代码。以turtlebot3仿真为例(roslaunch  turtlebot3_gazebo turtlebot3_world.launch),其中example.world是我们自己生成的仿真场景文件。




  
    
        
        
  

 

3. 其他问题

  • 启动launch文件时报错waitForService: Service [/gazebo_gui/set_physics_properties] has not been advertise:
    解决方案: 同时开多个gazebo会报这个错,一次只能开启一个gazebo。
  • 启动gazebo launch仿真时报错:spawn service failed:
    解决方案:1)将.world文件中的sim_time值改成0;
                      2)机器人模型出生点原点存在碰撞,无法加载进去。
  • 小车在场景中没重力,可以在空中行驶:
    解决方案:1)不是场景的重力问题,是小车xacro中的关节控制器配置有问题;
                      2)也可能是太卡了导致real time factor非常小,小车下落还没显示出来。
  • 键盘控制不了gazebo中的小车:
    解决方案:要先安装ros对应版本的gazebo-ros的通信软件包
    sudo apt install ros-melodic-gazebo-ros-pkgs  ros-melodic-gazebo-msgs  ros-melodic-gazebo-plugins  ros-melodic-gazebo-ros-control

4. Reference

【ROS-Gazebo】SDF机器人描述格式解析

你可能感兴趣的:(ROS机器人,人工智能)