[Gazebo] (2) - Gazebo World 구성, 사용자 정의 모델 생성 및 ROS와 Gazebo의 연동(ROS 패키지 구성)

2023. 7. 8. 17:08Ubuntu/Gazebo

이전 포스팅에서 이어집니다..

 

2023.07.01 - [Ubuntu/Gazebo] - [Gazebo] (1) - Gazebo Introduction

 

[Gazebo] (1) - Gazebo Introduction

이번 포스팅에서는 Gazebo 시뮬레이터에 대해 다뤄보고자 합니다. 제 지난 포스팅에서도 Gazebo와 ArduPilot SITL을 연동하여, Gazebo 내의 드론(iris)의 센서들의 정보를 받아오고, 드론에 제어 명령을 내

mkdrone.tistory.com

 

지난 포스팅에선 Gazebo의 개략적인 내용과 설치 및 실행 등을 다루었습니다.

이번 포스팅에서는 원하는 시뮬레이션 환경을 구성하기 위해 사용자 정의 모델을 추가하고, 이러한 모델들을 바탕으로 world를 구성하며, ROS와 Gazebo를 연동하기 위해 시뮬레이션 환경을 패키지화하는 방법에 대해 알아보고자 합니다. 

 

 

 


1. Create ROS Package 

 

우선 Gazebo 시뮬레이션 환경을 ROS 패키지화하여 관리하는 방법입니다. Package의 format을 제 Github에 올려놓았으니 참고 용으로 해당 패키지를 받아서 사용하셔도 됩니다.

 

https://github.com/dk5824/gazebo_ros_tutorial

 

GitHub - dk5824/gazebo_ros_tutorial: A example and tutorial package for using gazebo_ros package

A example and tutorial package for using gazebo_ros package - GitHub - dk5824/gazebo_ros_tutorial: A example and tutorial package for using gazebo_ros package

github.com

 

cd ~/catkin_ws/src
git clone https://github.com/dk5824/gazebo_ros_tutorial

cd ..
catkin_make

source devel/setup.bash

 


 

1-1.  패키지 생성 및 디렉토리 구성

 

우선 다음 명령어를 통해 ros package를 생성하고, 컴파일합니다.

 

cd ~/catkin_ws/src
catkin_create_pkg gazebo_ros_tutorial rospy roscpp std_msgs

cd ..
catkin_make

source devel/setup.bash

 

수행 결과

 

지난 포스팅에도 언급했듯이, Gazebo는 하나의 world 파일 내에 필요한 model, 물리 법칙, 조도 환경 등의 요소들로 구성되어 있는 구조입니다.

아래 사진은 gazebo library 디렉토리의 구성 요소를 캡처한 것입니다.

 

 

처음 패키지를 생성하고 나면, 노드 파일이 위치하는 소스 디렉토리(src)와 헤더 파일이 위치하는 include 디렉토리만 존재합니다.

 

따라서 위 구조와 유사하게, 패키지 내에 해당 구성 요소들을 관리할 디렉토리를 추가적으로 생성합니다.

 

mkdir launch worlds models

 

이로써 패키지 구성에 필요한 기초적인 디렉토리 생성은 끝났습니다.

 


2. Model 및 World 파일 구성

 

2-1. Model 추가

위에서 생성한 models 디렉토리에 모델을 추가합니다.

우선 Gazebo에서 library 형태로 제공하는 모델 중, 자동차(suv) 모델과 표지판, 우체통 모델을 추가하겠습니다.

위의 github repository를 clone 하셨다면 별도로 추가하실 것은 없습니다.

혹시 Github 사용이 익숙치 않으신 분들은 아래 zip 파일을 패키지 디렉토리에 그대로 압축 풀기 하시면 됩니다.

 

models.zip
1.64MB

 

다운 받아서 압축을 풀면, 다음과 같은 모델들이 보일 것입니다.

 

model list

 

여기서 ground_plane은 지면 모델, sun은 world의 광원 역할을 하는 모델이며, 나머지는 이름 그대로의 모델입니다.

 


model structure

 

suv 디렉토리로 이동하여 model 디렉토리의 구조를 살펴보겠습니다.

 

suv 모델의 하위 구성 요소

 

각 구성 요소는 다음과 같은 역할을 합니다.

 

파일(또는 디렉토리)명 역할
materials 모델의 외관에 해당하는 이미지 파일(png 등)을 포함
meshes 모델의 외형에 해당하는 3d 파일(obj, dae 등)을 포함
model.config 모델에 대한 설명, 제작자 등을 기술한 모델
model.sdf 위의 mesh, material 등을 바탕으로 모델의 특성을 기술한 sdf(Simulation Description Format) 파일

 

이러한 구조를 바탕으로 라이브러리가 아닌 Custom 모델을 만들 수도 있습니다. 여기서 heliport 모델의 경우 제가 직접 제작한 모델입니다.

 

더 복잡한 link와 joint를 고려한 모델의 생성(sdf 작성) 은 아래 블로그를 참고하시면 좋을 것 같습니다.

 

https://blog.naver.com/PostView.nhn?blogId=jerry1455&logNo=221710210977 

 

GAZEBO SDF(Simulation Description Format)

실제 동작 환경을 꾸밀 수 있는 3D 시뮬레이터 GAZEBO 에서 사용하는 XML포맷인 SDF(Simulat...

blog.naver.com

 


 

2-2. world 추가

 

다음으로는 위의 모델들을 포함하는 world 파일을 추가합니다.

world 파일에는 각 모델들의 위치, 모델 간의 관계등을 기술하여 하나의 world를 구성할 수 있습니다.

worlds 디렉토리에 아래 파일을 추가합니다.

 

tutorial.world
0.00MB

 

world 파일 내에는 다음과 같이 models 디렉토리에 추가한 모델들을 불러와서 해당 위치에 배치하도록 XML 형식으로 스크립트가 작성되어 있습니다.

 

tutorial.world 파일 중 일부

 


 

3. launch 파일 구성

 

위에서 생성한 world를 ROS로 실행할 수 있는 launch 파일을 생성해 보겠습니다.

미리 만들어 둔 launch 디렉토리로 이동하여 launch 파일을 생성합니다.

 

roscd gazebo_ros_tutorial/launch
gedit tutorial.launch

 

여기서 launch 파일의 이름은 중요하지 않으며, 실행할 world를 나타내는 이름이면 좋습니다.

저는 헷갈리지 않기 위해 실행할 world 이름과 launch 파일 이름을 동일하게 구성합니다.

 

이후 아래와 같이 launch 파일을 구성합니다.

 

<launch>
  
  <!-- Add Models PATH for Gazebo -->
  <env name="GAZEBO_MODEL_PATH" value="$(find gazebo_ros_tutorial)/models"/>

  <!-- Arguments -->
  <arg name="paused" default="false"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>
  <arg name="extra_gazebo_args" default="--verbose"/>

  <!-- Gazebo with World File -->
  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find gazebo_ros_tutorial)/worlds/tutorial.world"/>
    <arg name="paused" value="$(arg paused)"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="gui" value="$(arg gui)" />
    <arg name="headless" value="$(arg headless)"/>
    <arg name="debug" value="$(arg debug)" />
    <arg name="extra_gazebo_args" value="$(arg extra_gazebo_args)"/>
  </include>
</launch>

 


3-1. 환경 변수 설정

 

우선 model directory를 지정하는 환경 변수를 설정합니다.

 

<!-- Add Models PATH for Gazebo -->
<env name="GAZEBO_MODEL_PATH" value="$(find gazebo_ros_tutorial)/models"/>

 

생성한 패키지인 gazebo_ros_tutorial 내의 models 디렉토리를 model 디렉토리로 설정하겠다는 의미입니다. 

 

해당 환경 변수 설정으로 인해, model.sdf 파일에서 다음과 같이 필요 파일들의 url을 지정할 때, model 디렉토리를 패키지 내의 models 디렉토리로 인식하게 되고, 따라서 하위 texture 파일들을 인식하여 모델을 불러올 수 있는 것입니다. 

 

환경 변수 설정의 효과

 


 

3-2. include gazebo_ros launch file

 

다음으로 gazebo_ros 패키지의 empty.launch 파일을 가져와 해당 launch파일로 위에서 작성한 tutorial.world를 실행할 수 있는 스크립트를 작성합니다.

gazebo_ros 패키지는 Gazebo를 ROS로 실행할 수 있도록 하는 패키지이며, 해당 패키지로 Gazebo를 실행 시 다음 두 가지 노드가 실행됩니다.

 

rqt_graph

 

이중, gazebo 노드는 시뮬레이션 내의 센서 데이터를 메시지 형태로 발행하는 역할을 수행합니다.

 

 

이러한 gazebo_ros 패키지의 empty.launch 파일은 다음과 같이 여러 argument를 가지고 있습니다. 해당 파일의 구조를 보기 위해 다음 명령어를 사용할 수 있습니다.

 

roscd gazebo_ros/launch
gedit empty_world.launch

 

arguments of empty.launch

 

이 중, world_name 은 실행할 world 이름을 나타내며, empty_world.launch이므로 기본적으로 empty_world, 즉 아무것도 없는 world를 수행하도록 설정되어 있습니다.

 

empty.world가 아닌 자체적으로 만든 tutorial.world를 실행하기 위해, 아래와 같이 argument를 수정합니다.

 

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

 

 


 

4. 수행 결과

 

위의 과정들을 거쳐 패키지를 구성하고, 컴파일 후 roslaunch를 이용하여 Gazebo를 실행합니다.

 

 cd ~/catkin_ws
 catkin_make
 
 # update setup.bash file
 source devel/setup.bash
 
 # launch tutorial.launch
 roslaunch gazebo_ros_tutorial tutorial.launch

 

수행 결과, world 스크립트를 작성한 대로 정상적으로 모델들이 배치되어 있음을 확인할 수 있습니다.

 

수행 결과

 


혼자서 공부하면서 작성하다 보니, 간소화된 부분이 있고 누락된 내용이 있을 수 있습니다.

읽어보시고 궁금한 점이나 잘못된 점이 있으면 댓글 남겨주시면 감사하겠습니다.

 

다음 포스팅에서는 Gazebo 좌표계 구성, world 편집 등에 대해 다뤄보고자 합니다.

 

긴 글 읽어주셔서 감사합니다.

'Ubuntu > Gazebo' 카테고리의 다른 글

[Gazebo] (1) - Gazebo Introduction  (0) 2023.07.01