# Gazebo 설치 및 기본 설정

#### Gazebo 설치

Gazebo는 로봇 시뮬레이션을 위한 강력한 도구로, 다양한 물리 엔진과 센서 플러그인을 지원한다. Gazebo를 설치하기 위해서는 다음 단계를 따른다.

**1. 시스템 업데이트**

먼저 시스템을 최신 상태로 업데이트한다. Ubuntu와 같은 리눅스 배포판을 기준으로 설명하겠다.

```bash
sudo apt-get update
sudo apt-get upgrade
```

**2. Gazebo 패키지 설치**

다음으로, Gazebo의 최신 버전을 설치하기 위해 `osrfoundation`의 패키지를 추가하고 설치한다.

```bash
sudo sh -c 'echo "deb http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -sc) main" > /etc/apt/sources.list.d/gazebo-stable.list'
wget https://packages.osrfoundation.org/gazebo.key -O - | sudo apt-key add -
sudo apt-get update
sudo apt-get install gazebo11
```

위 명령어에서 `gazebo11`은 Gazebo의 11번째 버전을 설치한다. 만약 특정 버전을 설치하고자 한다면, `gazebo9`, `gazebo10`과 같은 버전을 지정하여 설치할 수 있다.

**3. Gazebo 설치 확인**

설치가 완료되면 Gazebo가 제대로 설치되었는지 확인한다. 터미널에 다음 명령어를 입력한다.

```bash
gazebo
```

정상적으로 설치되었다면 Gazebo GUI가 열리며, 이를 통해 시뮬레이션 환경을 시각적으로 확인할 수 있다.

#### Gazebo 기본 설정

Gazebo가 설치된 후, 기본 설정을 통해 시뮬레이션 환경을 효율적으로 구성할 수 있다. 여기서는 사용자 정의 환경 설정과 기본적인 초기 구성 파일을 다룬다.

**1. 환경 변수 설정**

Gazebo는 다양한 환경 변수를 통해 시뮬레이션 경로, 플러그인 위치 등을 지정할 수 있다. 이러한 변수를 설정하여 보다 효율적인 시뮬레이션 환경을 구축할 수 있다.

```bash
export GAZEBO_MODEL_PATH=~/gazebo_models:$GAZEBO_MODEL_PATH
export GAZEBO_PLUGIN_PATH=~/gazebo_plugins:$GAZEBO_PLUGIN_PATH
```

`GAZEBO_MODEL_PATH`는 사용자 정의 모델이 저장된 경로를 지정하며, `GAZEBO_PLUGIN_PATH`는 플러그인 경로를 설정한다.

**2. SDF 및 URDF 파일 로드**

Gazebo는 URDF 또는 SDF 파일을 통해 로봇 모델을 로드한다. 기본적인 URDF 파일을 로드하는 방법을 설명하겠다. `roslaunch`를 이용하여 URDF 파일을 로드한다.

```bash
roslaunch <패키지 이름> <파일 이름>.launch
```

이 명령어는 `launch` 파일을 실행하여 Gazebo에서 로봇 시뮬레이션을 시작한다.

#### 3. Gazebo 물리 엔진 설정

Gazebo에서는 여러 물리 엔진을 지원하며, 이를 통해 현실감 있는 시뮬레이션을 구현할 수 있다. 대표적인 물리 엔진으로는 ODE(Open Dynamics Engine), Bullet, DART, Simbody 등이 있다. 기본적으로 Gazebo는 ODE 엔진을 사용하며, 물리 엔진의 파라미터를 통해 시뮬레이션의 정확도를 조정할 수 있다.

**물리 엔진 설정 파일**

Gazebo의 물리 엔진 설정은 `world` 파일 안에서 정의된다. 여기서는 ODE 물리 엔진을 사용하는 기본적인 설정 예시를 설명한다.

```xml
<physics 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>
</physics>
```

* `max_step_size`: 시뮬레이션의 시간 스텝 크기를 정의한다. 값이 작을수록 시뮬레이션의 정확도는 높아지지만, 계산 비용이 증가한다.
* `real_time_factor`: 시뮬레이션 속도를 실제 시간에 대비한 비율로 설정한다. 1은 실제 시간과 동일한 속도로 시뮬레이션이 진행됨을 의미한다.
* `real_time_update_rate`: 시뮬레이션의 업데이트 속도를 설정한다. 이 값은 실제 시간과 시뮬레이션 시간 간의 관계를 나타낸다.

#### 4. Gazebo 플러그인 설정

Gazebo는 다양한 플러그인을 통해 로봇의 동작을 제어하고 센서를 시뮬레이션할 수 있다. 플러그인은 URDF 또는 SDF 파일 내에서 설정할 수 있으며, 플러그인에 의해 시뮬레이션 내에서 로봇의 행동이나 센서 데이터가 변경된다.

**URDF에서 플러그인 설정**

```xml
<gazebo>
  <plugin name="my_robot_control" filename="libmy_robot_control.so">
    <robotNamespace>/my_robot</robotNamespace>
    <controlTopic>/cmd_vel</controlTopic>
  </plugin>
</gazebo>
```

* `plugin name`: 플러그인의 이름을 지정한다.
* `filename`: 플러그인의 파일 경로를 지정한다.
* `robotNamespace`: 로봇의 네임스페이스를 지정하여 여러 로봇이 있는 경우 각각을 구분할 수 있다.
* `controlTopic`: 로봇의 제어 명령을 받을 토픽을 지정한다.

플러그인은 로봇의 물리적 특성, 센서, 동작 제어 등 다양한 역할을 수행할 수 있으며, 이는 사용자가 작성한 커스텀 플러그인으로 확장 가능한다.

#### 5. Gazebo 월드 파일 설정

Gazebo에서 시뮬레이션 환경을 정의하는 `world` 파일은 로봇이 상호작용할 수 있는 지형, 빌딩, 조명, 카메라 등의 요소를 포함한다. 이 파일은 SDF 형식으로 작성되며, 다음과 같은 요소들이 포함될 수 있다.

**기본적인 `world` 파일 예시**

```xml
<world name="default">
  <include>
    <uri>model://ground_plane</uri>
  </include>
  <include>
    <uri>model://sun</uri>
  </include>
</world>
```

* `ground_plane`: 기본 바닥 면을 설정한다.
* `sun`: 시뮬레이션 환경에 태양 조명을 추가한다.

월드 파일을 통해 다양한 환경 설정이 가능하며, 로봇의 센서와 상호작용하는 복잡한 시뮬레이션 환경을 만들 수 있다.

#### 6. 시뮬레이션 환경 최적화

Gazebo 시뮬레이션은 복잡한 물리 엔진, 센서, 로봇 모델을 사용하기 때문에 컴퓨터 성능에 따라 성능 최적화가 필요할 수 있다. 시뮬레이션 성능을 최적화하기 위해 다음과 같은 설정을 조정할 수 있다.

**그래픽 설정**

Gazebo의 그래픽 설정을 낮추면 시뮬레이션이 보다 원활하게 실행될 수 있다. 다음은 그래픽 관련 설정이다.

```bash
gzclient --rendering-off
```

이 명령어를 사용하면 Gazebo의 GUI가 비활성화되며, 그래픽 렌더링 없이 시뮬레이션을 실행할 수 있어 성능이 향상된다.

**CPU 및 메모리 관리**

Gazebo는 CPU와 메모리 사용량이 많은 프로그램이다. 따라서 다중 코어 프로세서를 사용하는 시스템에서는 CPU 코어를 효율적으로 분배하여 Gazebo의 성능을 향상시킬 수 있다. 이를 위해 다음과 같은 리눅스 명령어를 사용할 수 있다.

```bash
taskset -c 0-3 gazebo
```

위 명령어는 Gazebo가 CPU의 0번부터 3번까지의 코어에서 실행되도록 설정한다. 이를 통해 나머지 코어는 다른 작업을 처리할 수 있다.

#### 7. Gazebo 시작 스크립트 작성

Gazebo를 실행할 때마다 여러 설정 파일과 명령어를 입력하는 것은 번거로울 수 있다. 이를 해결하기 위해, 시작 스크립트를 작성하여 여러 설정을 자동으로 로드할 수 있다.

**기본적인 Gazebo 시작 스크립트**

```bash
#!/bin/bash

export GAZEBO_MODEL_PATH=~/gazebo_models:$GAZEBO_MODEL_PATH
export GAZEBO_PLUGIN_PATH=~/gazebo_plugins:$GAZEBO_PLUGIN_PATH

gazebo --verbose
```

이 스크립트는 Gazebo 실행에 필요한 환경 변수를 설정하고 Gazebo를 실행한다. 이 파일을 `start_gazebo.sh`라는 이름으로 저장한 후, 다음 명령어로 실행 권한을 부여하고 실행할 수 있다.

```bash
chmod +x start_gazebo.sh
./start_gazebo.sh
```

**자동으로 URDF 파일 로드하기**

이제 `start_gazebo.sh` 스크립트에 로봇 모델을 자동으로 불러오는 코드를 추가해보겠다. 이를 통해 Gazebo 실행과 동시에 로봇 모델이 시뮬레이션 환경에 로드된다.

```bash
#!/bin/bash

export GAZEBO_MODEL_PATH=~/gazebo_models:$GAZEBO_MODEL_PATH
export GAZEBO_PLUGIN_PATH=~/gazebo_plugins:$GAZEBO_PLUGIN_PATH

roslaunch <패키지 이름> <파일 이름>.launch
```

`roslaunch` 명령어를 사용하면 URDF 파일을 자동으로 로드하고, 로봇 모델이 Gazebo 내에서 시뮬레이션될 수 있다.

#### 8. Gazebo 사용자 인터페이스(UI) 설정

Gazebo의 사용자 인터페이스는 시뮬레이션을 보다 직관적으로 제어할 수 있는 도구를 제공한다. 기본적으로 제공되는 UI는 다음과 같은 주요 기능을 포함한다.

**시뮬레이션 제어 패널**

시뮬레이션 제어 패널은 Gazebo 화면의 상단에 위치하며, 시뮬레이션 실행, 일시 정지, 재시작 등의 기능을 제공한다.

* **Play**: 시뮬레이션을 시작한다.
* **Pause**: 현재 진행 중인 시뮬레이션을 일시 정지한다.
* **Step**: 시뮬레이션을 한 스텝씩 실행한다.

**3D 뷰 컨트롤**

마우스를 사용하여 Gazebo의 3D 환경을 자유롭게 이동할 수 있다. 로봇 모델을 다양한 각도에서 확인할 수 있으며, 다음과 같은 단축키를 사용하여 3D 뷰를 제어할 수 있다.

* **왼쪽 클릭**: 카메라 회전
* **오른쪽 클릭**: 카메라 이동
* **휠**: 줌 인/줌 아웃

**GUI 요소 추가**

Gazebo의 기본 GUI 외에도, 사용자 정의 인터페이스를 추가하여 다양한 데이터를 실시간으로 모니터링할 수 있다. 이를 위해 플러그인을 통해 추가적인 데이터를 시각화할 수 있다.

예를 들어, 시뮬레이션 중 로봇의 센서 데이터를 실시간으로 모니터링하는 플러그인을 추가하여 Gazebo 화면에 센서 출력을 표시할 수 있다.

```xml
<plugin name="sensor_display" filename="libsensor_display.so">
  <update_rate>30</update_rate>
</plugin>
```

`update_rate`는 초당 업데이트 횟수를 설정한다. 이 플러그인은 센서 데이터를 Gazebo GUI에 시각적으로 출력하는 역할을 한다.

#### 9. Gazebo 로그 및 기록 설정

Gazebo는 시뮬레이션 동안 발생하는 모든 이벤트를 기록할 수 있는 기능을 제공한다. 이를 통해 시뮬레이션 결과를 저장하고, 이후 분석을 위해 사용할 수 있다.

**로그 기록 시작**

다음 명령어를 통해 Gazebo의 로그 기록을 시작할 수 있다.

```bash
gazebo --record path_to_world_file.world
```

이 명령어는 시뮬레이션을 실행하면서 발생하는 이벤트와 데이터를 기록한다.

**로그 재생**

기록된 로그 파일은 다음 명령어를 통해 재생할 수 있다.

```bash
gazebo --playback path_to_log_file.log
```

이를 통해 기록된 시뮬레이션을 다시 확인할 수 있으며, 데이터를 기반으로 추가적인 분석을 수행할 수 있다.

**로그 파일 분석**

로그 파일을 분석하기 위해 다양한 도구를 사용할 수 있으며, 특히 로봇의 동작 데이터를 수집하고 분석하는 데 유용하다. Gazebo에서 제공하는 기본적인 분석 도구를 사용하여 로그 데이터를 그래프로 시각화할 수 있다.
