본문 바로가기
정나우/ROS

Gazebo에 stl 파일 모델 불러오기

by 정_나우 2022. 7. 22.

stl 파일 모델을 Gazebo에 불러와 장애물을 만들어보겠다.

이런 식으로 해볼 거다

rviz에서는 scene object를 통해 stl파일 모델을 쉽게 불러올 수 있지만

그렇게 불러온다고 Gazebo 상에 물체가 나타나는 것이 안 될뿐만 아니라,

뎁스 카메라가 감지하지 못 하기 때문에 Gazebo에 불러올 줄 알아야 한다.


1. stl 파일을 dae파일 형식으로 변환한다.

Blender 프로그램을 다운 받아서 (https://www.blender.org/download/)

불러오기 (import)로 stl파일을 불러온 뒤

내보내기 (expoert)로 내보낼 때 확장자명을 dae로 저장한다.

사진 오른쪽처럼 위치나 회전 축적을 본인의 입맛에 맞게 바꾸면 된다.


2. Home/.gazebo/models/obstacle/meshes 경로에 dae파일을 넣어준다.

터미널로는 그냥 cd 명령어로 이동가능하고

GUI를 이용하여 파일들을 클릭하며 이동하려고 하면 Home에서 Crtl+H를 누르면 .gazebo 파일이 보인다.

그 뒤에 models/obstacle/meshes 경로는 직접 만들면 된다.


3. sdf파일을 작성한다.

Home/.gazebo/models/obstacle 경로에 model.sdf 파일을 만들고 다음 내용을 넣어준다.

<?xml version='1.0'?>
<sdf version='1.6'>
  <model name="obstacle">
    <static>true</static>
    <link name="link">
      <collision name="collision">
        <geometry>
          <mesh>
            <uri>model://obstacle/meshes/my_wheel.dae</uri>
          </mesh> 
        </geometry>
      </collision>
      <visual name="visual">
        <geometry>
          <mesh>
            <uri>model://obstacle/meshes/my_wheel.dae</uri>
          </mesh> 
        </geometry>
      </visual>
    </link>
  </model>
</sdf>

uri 부분에 dae파일 경로를 넣어주는데 자신의 것에 맞게 수정해준다.


4. config파일을 작성한다.

sdf파일과 동일한 경로에 model.config 파일을 만들고 다음 내용을 입력한다.

<?xml version="1.0" ?>
<model>
    <name>obstacle</name>
    <version>1.0</version>
    <sdf version="1.6">model.sdf</sdf>

    <author>
        <name></name>
        <email></email>
    </author>
    
    <description></description>
</model>

여기서는 따로 변경할 내용은 없다.


5. world파일을 작성한다.

catkin_ws/src/자신이 사용 중인 패키지 에 world폴더를 만들고 (launch 파일과 config 파일이 있는 곳)

empty.world 파일을 만들고 다음 내용을 넣어준다.

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

    <scene>
      <ambient>0.4 0.4 0.4 1</ambient>
      <background>0.7 0.7 0.7 1</background>
      <shadows>true</shadows>
    </scene>

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

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

    <include>
      <pose> 2.0 -2.0 0.0 0.0 0.0 0.0 </pose> 
      <uri>model://obstacle</uri>
    </include>

    <physics type="ode">
      <real_time_update_rate>1000.0</real_time_update_rate>
      <max_step_size>0.001</max_step_size>
      <real_time_factor>1</real_time_factor>
      <ode>
        <solver>
          <type>quick</type>
          <iters>150</iters>
          <precon_iters>0</precon_iters>
          <sor>1.400000</sor>
          <use_dynamic_moi_rescaling>1</use_dynamic_moi_rescaling>
        </solver>
        <constraints>
          <cfm>0.00001</cfm>
          <erp>0.2</erp>
          <contact_max_correcting_vel>2000.000000</contact_max_correcting_vel>
          <contact_surface_layer>0.01000</contact_surface_layer>
        </constraints>
      </ode>
    </physics>
  </world>
</sdf>

include uri model://obstacle 경로를 자신이 설정한 경로에 맞게 입력해준다.

그리고 위에 pose로 불러오는 모델의 xyz위치 rpy회전을 변경할 수 있다.


6. gazebo.launch 파일을 수정한다.

launch/gazebo.launch 파일을 열어서

  <!-- startup simulated world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" default="worlds/empty.world"/>
    <arg name="paused" value="$(arg paused)"/>
    <arg name="gui" value="$(arg gazebo_gui)"/>
  </include>

다음 내용에서 default로 설정되어 있는 world 경로를

  <!-- startup simulated world -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find dyros_ex)/world/empty.world"/>
    <arg name="paused" value="$(arg paused)"/>
    <arg name="gui" value="$(arg gazebo_gui)"/>
  </include>

좀 전에 만든 world경로로 바꿔준다.

 

그리고 실행하면 된다!

댓글