본문 바로가기

drok/drok2 패키지

Drok2 3D 모델을 gazebo와 연동하기

솔리드 웍스에서 만든 3d모델을 urdf파일로 변환하는 방법(생략)

urdf파일을 sdf파일로 변환하는 방법(생략)

urdf와 sdf의 차이점(생략)

참고 : https://github.com/modulabs/gazebo-tutorial/wiki/Model-structure-and-requirements

 

modulabs/gazebo-tutorial

Contribute to modulabs/gazebo-tutorial development by creating an account on GitHub.

github.com

https://opentutorials.org/course/2845/16602

 

Gazebo 3D World 생성 - 이타인클럽

토픽 결과물: 이번 토픽을 따라하면 로봇이 돌아다닐 환경이 만들어 집니다. 이번 토픽은 Gazebo를 이용하여 Mobile Robot Simulation 환경을 꾸미는 부분입니다. Gazebo의 Building Editor를 이용하여 간단한 3D 환경 모델을 생성합니다. 설명 동영상 3D World 생성 먼저 아래와 같이 패키지 root 디렉터리 밑에 worlds라는 디렉터리를 만듭니다. $ roscd mobile_robot_sim $ mkdir worl

opentutorials.org

http://gazebosim.org/tutorials

 

Gazebo : Tutorials

Plugins allow you to control models, sensors, world prope...

gazebosim.org


*아래 글은 틀린 내용이 포함되어 있을 수도 있음

 

Gazebo에서 로봇 불러오기

 

SDF파일로 변환하였다면, 이제 로봇을 가제보 상에서 불러올  수 있도록 해보자

 

우분투의 파일 탐색기를 열어 home에서 ctrl+H를 하면 숨겨진 폴더들이 나타난다.

여기서 .gazebo폴더로 들어간다.

gazebo폴더 안에

client-11345

server-11345

diagnotics

models

폴더가 있는 것을 볼 수 있는데

이 중 model 폴더 안에 로봇 모델을 추가해 줄 것이다.

model 폴더에 들어가 추가할 로봇 모델의 폴더를 만들어준다. 로봇 이름이 drok2이므로 drok2_description 폴더를 만들어 주었다.

이 폴더 안에, 이전에 만들어 두었던 model.config 파일과 model.sdf파일을 넣어준다.

그리고  meshes 폴더도 이 위치에 넣어준다. mesh파일은 보통 3D모델을 urdf로 변환할 때 자동으로 만들어진다.

meshes폴더에는 3D모델링으로 만든 부품들의 STL파일이 있다.

 

model.sdf파일을 열어보면 <uri>model://drok2_description/meshes/~~.STL으로 되어 있는데, 이 경로를 맞춰주어야 한다.  이 때문에 drok2_description폴더 안에 meshes 폴더를 위치시켜 준 것이다.

 

home/.gazebo/model 경로에 로봇모델 폴더(drok2_description)를 만들고 model.config파일과 model.sdf 파일을 넣은 뒤, model.sdf파일의 <uri>의 경로를 맞춰 STL파일들이 담긴 meshes폴더를 만들었더면,

이제 gazebo상에서 로봇을 불러올 수 있다,

터미널에

~$ gazebo

를 입력해서 가제보를 띄운다.

 

가제보가 실행되면 왼쪽 상단에 Insert 탭이 있다. 여기에 Drok2 로봇 모델이 추가되어있는 것을 볼 수 있다.

이 Drok2를 클릭하고 맵으로 마우스를 가져가면 다음과 같이 맵에 로봇을 추가할 수 있다.

로봇의 이름이 Drok2로 되어 있는데, 이름을 변경하려면 model.config 파일에서 <name>Drok2</name> 부분에서 Drok2를 다른 이름으로 변경한다.

이렇게 가제보에서 로봇을 불러오는 것이 가능하다. 또, 한 개뿐만 아니라 여러 개의 로봇을 맵 이곳저곳에 가져다 놓을 수 있다

 

그러나 이것은 로봇의 가제보 상에서 로봇의 형상을 불러온 것일 뿐, 로봇에 명령을 보내서 움직이는 등의 시뮬레이션을 전혀 할 수 없다.

이를 위해서는 ros와 gazebo를 연동하는 것이 필요하다.   


Connect to ROS

가제보로 로봇을 가져와, ROS로 제어하기 위한 최소한의 파일은 다음과 같다.

.gazebo아래에 있는 파일들은 로봇 모델을 기술하는 것이고, catkin_ws아래의 파일들은 ROS패키지를 구성하는 것이다.

.gazebo에서 로봇 모델을 만들어, gazebo로 불러오는 것은 이미 다 했으므로, catkin에서 이를 제어하기 위한 패키지를 만들어야 한다. drok2 로봇은 drok2_simulator 패키지가 이것에 해당한다.

이미 만들어 놓은 drok2_simulator 패키지에 대해 설명하겠다.

 

앞서 본 것과 비슷하게 drok2_simulator 패키지는 launch, src, worlds, CmakeList, package 등으로 이루어져 있다.

 

launch

launch파일

먼저 launch 를 살펴보자. launch 폴더 안에는 drok2_gazebo.launch 와 drok2_gmapping.launch 파일이 있는데, 

drok2_gazebo.launch 파일이 가제보-로스 연동을 위한 것이다. 런치파일 내부는 다음과 같다.

<launch>
 <include file="$(find gazebo_ros)/launch/empty_world.launch">
 <arg name="paused" default="true"/>
 <arg name="world_name" value="$(find drok2_simulator)/worlds/drok2_empty.world"/>

 </include>
</launch>

 

한 줄씩 살펴보면

<include file="$(find gazebo_ros)/launch/empty_world.launch">

gazebo_ros 패키지의 empty_world.launch 파일을 불러온다. empty_world.launch를 실행하면, 아무것도 존재하지 않는 빈 공간의 Gazebo가 실행된다.

 

<arg name="paused" default="true"/>

paused argument 의 디폴트 상태를 true로 설정한다. 이 경우 가제보를 실행했을 때 정지상태로 시작된다.

 

<arg name="world_name" value="$(find drok2_simulator)/worlds/drok2_empty.world"/>

world_name argument를 drok2_simulator 패키지의 /worlds/drok2_empty.world 로 한다 즉 drok2_empty.world 파일을 가제보에서 띄우겠다는 것이다.

 

다음으로 drok2_empty.world 에 대해 살펴보자.

 

worlds

world 파일

drok2_empty.world 파일은 크게 3 부분으로 볼 수 있다.

<?xml version="1.0" ?>
<sdf version="1.6">
  <world name="drok2_emptry_world">
     <physics name="default_physics" default="0" type="ode">
      <max_step_size>0.001</max_step_size>
      <real_time_factor>1</real_time_factor>
      <real_time_update_rate>1000</real_time_update_rate>
      <ode>
        <solver>
          <type>quick</type>
          <iters>100</iters>
          <sor>1.0</sor>
          <use_dynamic_moi_rescaling>false</use_dynamic_moi_rescaling>
        </solver>
      </ode>
    </physics>

    <include>
      <uri>model://ground_plane</uri>
    </include>

    <include>
      <uri>model://sun</uri>
    </include>

먼저 world 부분이다.

world name이 drok2_empty_world로 되어있다. 또 <include>부분을 보면 ground_plane과 sun을 불러오고 있다.

만약 drok2_empty.world 파일에서 위와 같은 world 부분이 없으면, ground_plane이 없기 때문에

gazebo의 Insert 탭에서 로봇을 불러왔을 때, 아래로 무한히 낙하하게 된다.

 

 

<model name='DROK2'>
    <link name='base_footprint'>
      <pose frame=''>0 0 0 0 -0 0</pose>
      <inertial>
        <pose frame=''>0.097025 0 0.056828 0 -0 0</pose>
        <mass>30.1</mass>
        <inertia>
          <ixx>2.10105</ixx>
          <ixy>0</ixy>
          <ixz>-0.143981</ixz>
          <iyy>1.14465</iyy>
          <iyz>0</iyz>
          <izz>2.9496</izz>
        </inertia>
      </inertial>
      <collision name='base_footprint_fixed_joint_lump__base_link_collision'>
        <pose frame=''>0 0 0.056168 0 -0 0</pose>
        .
        .
      (생략)
        .
        .
        <dynamics>
          <spring_reference>0</spring_reference>
          <spring_stiffness>0</spring_stiffness>
        </dynamics>
        <use_parent_model_frame>1</use_parent_model_frame>
      </axis>
    </joint>

두 번째는 model 부분이다. 가제보 월드에 로봇 모델을 넣어주기 위한 부분이다.

이 부분은 home/.gazebo/models/drok2_description/model.sdf 에 있는 sdf 파일의 내용과 같다.

 

 

<plugin name="plugin" filename="libdrok_simulator.so"/>


  <plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so">
    <updateRate>100.0</updateRate>
    <robotNamespace>/</robotNamespace>
    <leftFrontJoint>L2_wheel_Joint</leftFrontJoint>
    <rightFrontJoint>R2_wheel_Joint</rightFrontJoint>
    <leftRearJoint>L1_wheel_Joint</leftRearJoint>
    <rightRearJoint>R1_wheel_Joint</rightRearJoint>
    <wheelSeparation>0.386</wheelSeparation>
    <wheelDiameter>0.190</wheelDiameter>
    <robotBaseFrame>base_footprint</robotBaseFrame>
    <torque>20</torque>
    <topicName>cmd_vel</topicName>
    <broadcastTF>true</broadcastTF>
  </plugin>
  </model>
  </world>
</sdf>

마지막은 plugin 부분이다. ROS로 gazebo상의 drok2 로봇을 제어하기 위해 필요하다.

 

src/plugin.cc

src/plugin.cc

plugin.cc관련은 http://gazebosim.org/tutorials?tut=ros_plugins&cat=connect_ros참고

 

Gazebo : Tutorial : ROS plugin

Tutorial: Ros Plugins In this tutorial we'll walk through creating a very basic Gazebo plugin that is ROS-aware. Create a ROS Package Create a new ROS package in your catkin workspace: cd ~/catkin_ws/src catkin_create_pkg gazebo_tutorials gazebo_ros roscpp

gazebosim.org

 

 

CmakeList, package

- gazebo_ros 패키지를 의존한 것을 반영해 작성...


Drok2_simulator 실행

~$ roslaunch drok2_simulator drok2_gazebo.launch

 

drok2_simulator 실행 gazebo

cmd_vel 토픽을 보내주면 로봇이 gazebo상에서 움직이는 것을 확인할 수 있다.

'drok > drok2 패키지' 카테고리의 다른 글

depth camera 센서 plugin  (0) 2020.03.30
gazebo에서 3D맵 만들기  (7) 2020.03.26