# Gazebo Classic 시뮬레이터

> _Gazebo Classic은_ Ubuntu Linux 20.04까지만 PX4에서 지원됩니다. Ubuntu 22.04 버전 부터는 Gazebo를 사용 합니다.

Gazebo Classic은 객체 회피 및 컴퓨터 비전 테스트에 특히 적합한 자율 로봇을 위한 강력한 3D 시뮬레이션 환경입니다. 이 페이지에서는 SITL 및 단일 차량에서의 사용에 대해 설명합니다. Gazebo Classic은 HITL 및 다중 차량 시뮬레이션 에도 사용할 수 있습니다 .

**지원 차량:** Quad ([Iris](https://docs.px4.io/main/en/airframes/airframe_reference.html#copter_quadrotor_x_generic_quadcopter), Hex (Typhoon H480), [Generic Standard VTOL (QuadPlane)](https://docs.px4.io/main/en/airframes/airframe_reference.html#vtol_standard_vtol_generic_standard_vtol), Tailsitter, Plane, Rover, Submarine/UUV

{% embed url="https://youtu.be/qfFF9-0k4KA" %}

## 설치 <a href="#installation" id="installation"></a>

아래와 같이 aptitude를 이용하여 설치 합니다. (종속성 충돌방지를 위해)

> ROS(1)을 full로 설치 하였다면 Gazebo-Classic은 같이 설치 됩니다. 별도 설치 필요 없음.

```bash
sudo apt install aptitude
sudo aptitude install gazebo libgazebo11 libgazebo-dev
```

> 자세한설치 지침은 [gazebosim.org](https://classic.gazebosim.org/tutorials?cat=guided_b\&tut=guided_b1) 에서 찾을 수 있습니다.

#### 메모

ROS와 함께 PX4를 사용하려는 경우 ROS 지침에 **따라** ROS와 Gazebo Classic을 모두 설치해야 합니다(따라서 설치 충돌을 방지해야 합니다).

다음 명령을 사용하여 [Gazebo(Garden)를](https://docs.px4.io/main/en/sim_gazebo_gz/) 제거 하고 Gazebo-Classic 11을 다시 설치할 수 있습니다.

```
sudo apt remove gz-garden
sudo apt install aptitude
sudo aptitude install gazebo libgazebo11 libgazebo-dev
```

## 시뮬레이션 실행 <a href="#running-the-simulation" id="running-the-simulation"></a>

로드할 기체 구성으로 PX4 SITL 및 Gazebo Classic을 시작하여 시뮬레이션을 실행합니다(멀티콥터, 비행기, VTOL, 광학 흐름 및 다중 차량 시뮬레이션이 지원됨).

이를 수행하는 가장 쉬운 방법은 PX4 PX4-Autopilot 저장소의 루트 디렉터리에서 터미널을 열고 원하는 대상을 `make`빌드하는 것입니다. 예를 들어 쿼드로터 시뮬레이션을 시작하려면(기본값):

```
cd ~/PX4-Autopilot
make px4_sitl gazebo-classic
```

지원되는 차량과 `make`명령은 아래에 나열되어 있습니다(차량 이미지를 보려면 링크를 클릭하세요).

#### 메모

빌드 대상의 전체 목록을 보려면 `make px4_sitl list_vmd_make_targets`를 실행 하고 `gazebo-classic_`로 시작하는 대상을 필터링하세요.

<table><thead><tr><th width="242">Vehicle</th><th>Command</th></tr></thead><tbody><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#quadrotor-default">Quadrotor</a></td><td><code>make px4_sitl gazebo-classic</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#quadrotor-with-optical-flow">Quadrotor with Optical Flow</a></td><td><code>make px4_sitl gazebo-classic_iris_opt_flow</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#quadrotor-with-depth-camera">Quadrotor with Depth Camera</a> (forward-facing)</td><td><code>make px4_sitl gazebo-classic_iris_depth_camera</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#quadrotor-with-depth-camera">Quadrotor with Depth Camera</a> (downward-facing)</td><td><code>make px4_sitl gazebo-classic_iris_downward_depth_camera</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#3dr-solo-quadrotor">3DR Solo (Quadrotor)</a></td><td><code>make px4_sitl gazebo-classic_solo</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#typhoon-h480-hexrotor">Typhoon H480 (Hexrotor)</a> (with video streaming)</td><td><code>make px4_sitl gazebo-classic_typhoon_h480</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#standard-plane">Standard Plane</a></td><td><code>make px4_sitl gazebo-classic_plane</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#standard-plane-with-catapult-launch">Standard Plane (with catapult launch)</a></td><td><code>make px4_sitl gazebo-classic_plane_catapult</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#standard-vtol">Standard VTOL</a></td><td><code>make px4_sitl gazebo-classic_standard_vtol</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#tailsitter-vtol">Tailsitter VTOL</a></td><td><code>make px4_sitl gazebo-classic_tailsitter</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#ackermann-ugv">Ackerman UGV (Rover)</a></td><td><code>make px4_sitl gazebo-classic_rover</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#differential-ugv">Differential UGV (Rover)</a></td><td><code>make px4_sitl gazebo-classic_r1_rover</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#unmanned-underwater-vehicle-uuv-submarine">HippoCampus TUHH (UUV: Unmanned Underwater Vehicle)</a></td><td><code>make px4_sitl gazebo-classic_uuv_hippocampus</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#hippocampus-tuhh-uuv">Boat (USV: Unmanned Surface Vehicle)</a></td><td><code>make px4_sitl gazebo-classic_boat</code></td></tr><tr><td><a href="https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#airship">Cloudship (Airship)</a></td><td><code>make px4_sitl gazebo-classic_cloudship</code></td></tr></tbody></table>

위의 명령은 전체 UI를 갖춘 단일 차량을 시작합니다. 기타 옵션은 다음과 같습니다.

* PX4와 Gazebo를 별도로 시작하면 Gazebo Classic을 계속 실행하고 필요할 때만 PX4를 다시 시작할 수 있습니다(둘 다 다시 시작하는 것보다 빠릅니다).
* Gazebo Classic UI를 시작하지 않는 Headless Mode 에서 시뮬레이션을 실행합니다 (이 방법은 더 적은 리소스를 사용하고 훨씬 빠릅니다).

## PX4 시작하기 <a href="#taking-it-to-the-sky" id="taking-it-to-the-sky"></a>

위의 `make`명령은 먼저 PX4를 빌드한 다음 Gazebo Classic 시뮬레이터와 함께 실행합니다.

PX4가 시작되면 아래와 같이 PX4 쉘이 시작됩니다.

```
______  __   __    ___
| ___ \ \ \ / /   /   |
| |_/ /  \ V /   / /| |
|  __/   /   \  / /_| |
| |     / /^\ \ \___  |
\_|     \/   \/     |_/

px4 starting.

INFO  [px4] Calling startup script: /bin/sh etc/init.d-posix/rcS 0
INFO  [param] selected parameter default file eeprom/parameters_10016
[param] Loaded: eeprom/parameters_10016
INFO  [dataman] Unknown restart, data manager file './dataman' size is 11798680 bytes
INFO  [simulator] Waiting for simulator to connect on TCP port 4560
Gazebo multi-robot simulator, version 9.0.0
Copyright (C) 2012 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org
...
INFO  [ecl/EKF] 5188000: commencing GPS fusion
```

콘솔은 PX4가 기체별 초기화 및 매개변수 파일을 로드하고 시뮬레이터를 기다리는(및 연결하는) 상태를 인쇄합니다. \[ecl/EKF] `commencing GPS fusion`라는 INFO 메시지가 나오면 드론은 시동 준비가 된 것입니다.

#### 메모

쿼드로터 모델을 마우스 오른쪽 버튼으로 클릭하면 상황에 맞는 메뉴에서 팔로우 모드를 활성화할 수 있어 계속해서 볼 수 있어 편리합니다.

![가제보 클래식 UI](https://docs.px4.io/main/assets/img/gazebo_follow.34ff480f.jpg)

다음을 입력하여 이륙할 수 있습니다.

```
pxh> commander takeoff
```

## 사용법/구성 옵션 <a href="#usage-configuration-options" id="usage-configuration-options"></a>

### 센서/하드웨어 오류 시뮬레이션 <a href="#simulating-sensor-hardware-failure" id="simulating-sensor-hardware-failure"></a>

[안전 장치 시뮬레이션에서는](https://docs.px4.io/main/en/simulation/failsafes.html) GPS 오류 및 배터리 소모와 같은 안전 장치를 작동하는 방법을 설명합니다.

### 헤드리스 모드 <a href="#headless-mode" id="headless-mode"></a>

Gazebo Classic은 Gazebo Classic UI가 실행되지 않는 헤드리스 모드 에서 실행될 수 있습니다 . 이는 더 빠르게 시작되고 더 적은 시스템 리소스를 사용합니다(즉, 시뮬레이션을 실행하는 데 더 "가벼운" 방법입니다).

다음과 같이 일반 `make`명령 앞에 다음을 추가하면 됩니다.`HEADLESS=1`

```
HEADLESS=1 make px4_sitl gazebo-classic_plane
```

### 사용자 정의 이륙 위치 설정 <a href="#set-custom-takeoff-location" id="set-custom-takeoff-location"></a>

Gazebo Classic의 이륙 위치는 환경 변수를 사용하여 설정할 수 있습니다. 이는 기본 이륙 위치와 세계에 설정된 모든 값을 모두 재정의합니다 .

설정할 변수는 , `PX4_HOME_LAT`,`PX4_HOME_LON,PX4_HOME_ALT`및 입니다.

예를 들어:

```
export PX4_HOME_LAT=28.452386
export PX4_HOME_LON=-13.867138
export PX4_HOME_ALT=28.5
make px4_sitl gazebo-classic
```

### 시뮬레이션 속도 변경 <a href="#change-simulation-speed" id="change-simulation-speed"></a>

`PX4_SIM_SPEED_FACTOR`환경 변수를 이용하여 실시간 대비 시뮬레이션 속도를 높이거나 낮출 수 있습니다.

```
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl_default gazebo-classic
```

#### 실시간보다 빠르게 시뮬레이션 실행 <a href="#run-simulation-faster-than-realtime" id="run-simulation-faster-than-realtime"></a>

jMAVSim 또는 Gazebo Classic을 사용할 때 SITL은 실시간보다 빠르게 또는 느리게 실행될 수 있습니다.

속도 요소는 `PX4_SIM_SPEED_FACTOR`환경 변수를 사용하여 설정됩니다. 예를 들어, 실시간 속도의 2배로 jMAVSim 시뮬레이션을 실행하려면:

```
PX4_SIM_SPEED_FACTOR=2 make px4_sitl jmavsim
```

절반 실시간으로 실행하려면 다음을 수행하세요.

```
PX4_SIM_SPEED_FACTOR=0.5 make px4_sitl jmavsim
```

다음을 사용하여 현재 세션의 모든 SITL 실행에 요소를 적용할 수 있습니다.

```
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl jmavsim
```

#### 메모

어떤 시점에서 IO 또는 CPU는 컴퓨터에서 가능한 속도를 제한하고 "자동으로" 속도가 느려집니다. 강력한 데스크톱 컴퓨터는 일반적으로 약 6\~10배로 시뮬레이션을 실행할 수 있으며, 노트북의 경우 달성되는 속도는 약 3\~4배일 수 있습니다.

PX4가 데이터 링크 시간 초과를 감지하는 것을 방지하려면 시뮬레이션 속도에 비례하여 [COM\_DL\_LOSS\_T](https://docs.px4.io/main/en/advanced_config/parameter_reference.html#COM_DL_LOSS_T) 매개변수의 값을 늘리십시오 . 예를 들어 실시간으로 10인 경우 10x 시뮬레이션 속도에서는 `COM_DL_LOSS_T=`100으로 증가합니다.

### 풍속 변경 <a href="#change-wind-speed" id="change-wind-speed"></a>

풍속을 시뮬레이션하려면 `windVelocityMean` 플러그인을 월드 파일에 추가하고 m/s 단위로 설정하세요(`SET_YOUR_WIND_SPEED`). 필요한 경우 `windVelocityMean`보다 크도록 `windVelocityMax`매개변수를 조정합니다 .

```
  <plugin name='wind_plugin' filename='libgazebo_wind_plugin.so'>
      <frameId>base_link</frameId>
      <robotNamespace/>
      <windVelocityMean>SET_YOUR_WIND_SPEED</windVelocityMean>
      <windVelocityMax>20.0</windVelocityMax>
      <windVelocityVariance>0</windVelocityVariance>
      <windDirectionMean>0 1 0</windDirectionMean>
      <windDirectionVariance>0</windDirectionVariance>
      <windGustStart>0</windGustStart>
      <windGustDuration>0</windGustDuration>
      <windGustVelocityMean>0</windGustVelocityMean>
      <windGustVelocityMax>20.0</windGustVelocityMax>
      <windGustVelocityVariance>0</windGustVelocityVariance>
      <windGustDirectionMean>1 0 0</windGustDirectionMean>
      <windGustDirectionVariance>0</windGustDirectionVariance>
      <windPubTopic>world_wind</windPubTopic>
    </plugin>
```

풍향은 방향 벡터(표준 ENU 규칙)로 전달되며, 이는 가제보 플러그인에서 정규화됩니다. 또한 (m/s)² 단위의 풍속 변화와 정규 분포를 기반으로 한 방향 변화를 명시하여 시뮬레이션에 임의의 요인을 추가할 수 있습니다. 돌풍은 바람과 동일한 방식으로 내부적으로 처리되지만, 다음 두 매개변수 `windGustStart`및`windGustDuration` 를 사용하여 시작 시간과 지속 시간을 지정할 수 있다는 점에서 약간의 차이가 있습니다.

[PX4/PX4-SITL\_gazebo-classic/worlds/windy.world](https://github.com/PX4/PX4-SITL_gazebo-classic/blob/main/worlds/windy.world#L15-L31) 에서 확인할 수 있습니다.[ ](https://github.com/PX4/PX4-SITL_gazebo-classic/blob/main/worlds/windy.world#L15-L31)

### 조이스틱 사용 <a href="#using-a-joystick" id="using-a-joystick"></a>

조이스틱 및 엄지 조이스틱 지원은 _QGroundControl을_ 통해 지원됩니다.

### GPS 노이즈 시뮬레이션 <a href="#simulating-gps-noise" id="simulating-gps-noise"></a>

Gazebo Classic은 실제 시스템에서 일반적으로 발견되는 것과 유사한 GPS 노이즈를 시뮬레이션할 수 있습니다(그렇지 않으면 GPS 값은 노이즈가 없고 완벽합니다). 이는 GPS 노이즈의 영향을 받을 수 있는 애플리케이션(예: 정밀 위치 지정)을 작업할 때 유용합니다.

대상 차량의 SDF 파일에 `gpsNoise`요소 값이 포함되어 있는 경우 GPS 노이즈가 활성화됩니다 `<gpsNoise>true</gpsNoise>`. 이는 많은 차량 SDF 파일( **solo.sdf** , **iris.sdf** , **Standard\_vtol.sdf** , **delta\_wing.sdf** , **plane.sdf** , **typhoon\_h480** , **tailsitter.sdf** )에서 기본적으로 활성화되어 있습니다 .

GPS 소음을 활성화/비활성화하려면:

1.  SDF 파일을 생성하려면 모든 차량에 대해 전망대 타겟을 빌드하세요. 예를 들어:

    ```
    make px4_sitl gazebo-classic_iris
    ```
2. 대상 차량에 대한 SDF 파일을 엽니다(예: **./Tools/simulation/gazebo-classic/sitl\_gazebo-classic/models/iris/iris.sdf** ).
3.  `gpsNoise`요소 검색 :

    ```
    <plugin name='gps_plugin' filename='libgazebo_gps_plugin.so'>
      <robotNamespace/>
      <gpsNoise>true</gpsNoise>
    </plugin>
    ```

    * 존재하는 경우 GPS가 활성화된 것입니다. 다음 줄을 삭제하여 비활성화할 수 있습니다.`<gpsNoise>true</gpsNoise>`

다음에 Gazebo Classic을 빌드/다시 시작하면 새로운 GPS 노이즈 설정이 사용됩니다.

### 특정 세계 로드 <a href="#loading-a-specific-world" id="loading-a-specific-world"></a>

[PX4 는 PX4-Autopilot/Tools/simulation/gazebo-classic/sitl\_gazebo-classic/worlds](https://github.com/PX4/PX4-SITL_gazebo-classic/tree/main/worlds) 에 저장된 여러 [Worlds를 지원합니다.](https://docs.px4.io/main/en/sim_gazebo_classic/worlds.html)[ ](https://github.com/PX4/PX4-SITL_gazebo-classic/tree/main/worlds) [기본적으로 Gazebo Classic은 empty.world](https://github.com/PX4/PX4-SITL_gazebo-classic/blob/main/worlds/empty.world) 에 정의된 대로 특징 없는 평평한 평면을 표시합니다.[ ](https://github.com/PX4/PX4-SITL_gazebo-classic/blob/main/worlds/empty.world)

PX4 구성 대상에서 최종 옵션으로 지정하여 세계를 로드할 수 있습니다.

예를 들어, _Warehouse_ world를 로드하려면 다음과 같이 추가하면 됩니다.

```
make px4_sitl_default gazebo-classic_plane_cam__warehouse
```

### 세계 위치 설정 <a href="#set-world-location" id="set-world-location"></a>

차량은 일부 시뮬레이션된 GPS 위치에서 세계 모델의 원점에 매우 가깝게 생성됩니다.

메모

차량은 정확히 Gazebo 원점(0,0,0)에 생성되지 않지만 약간의 오프셋을 사용하여 여러 일반적인 코딩 문제를 강조할 수 있습니다.

실제 위치(예: 특정 공항)를 재현하는 세계를 사용하는 경우 시뮬레이션된 세계에 표시되는 것과 지상국 지도에 표시되는 것 사이에 매우 명백한 불일치가 발생할 수 있습니다. 이 문제를 극복하기 위해 세계 원점 위치를 "실제 생활"에 있을 GPS 좌표로 설정할 수 있습니다.

#### 메모

동일한 작업을 수행하는 사용자 정의 이륙 위치를 설정할 수도 있습니다 . 그러나 지도에 위치를 추가하는 것이 더 쉽습니다(필요한 경우 사용자 정의 위치를 ​​설정하여 계속 무시할 수 있음).

세계의 위치는 태그 를 사용하여 원점 위치를 지정하여 **.world** 파일에 정의됩니다. 위도, 경도, 고도를 모두 지정해야 합니다.

예는 [sonoma\_raceway.world 에서 찾을 수 있습니다.](https://github.com/PX4/PX4-SITL_gazebo-classic/blob/main/worlds/sonoma_raceway.world)

```
    <spherical_coordinates>
      <surface_model>EARTH_WGS84</surface_model>
      <latitude_deg>38.161479</latitude_deg>
      <longitude_deg>-122.454630</longitude_deg>
      <elevation>488.0</elevation>
    </spherical_coordinates>
```

다음 명령을 사용하여 [Sonoma Raceway World](https://docs.px4.io/main/en/sim_gazebo_classic/worlds.html#sonoma-raceway) 에서 로버를 생성하여 이를 테스트할 수 있습니다(모델 데이터베이스에서 모델을 다운로드해야 하기 때문에 처음 생성하는 데 시간이 더 오래 걸립니다).

```
make px4_sitl gazebo-classic_rover__sonoma_raceway
```

아래 비디오는 환경의 위치가 세계와 일치하는 것을 보여줍니다.

{% embed url="https://youtu.be/-a2WWLni5do" %}

### Gazebo와 PX4를 별도로 시작하기 <a href="#starting-gazebo-and-px4-separately" id="starting-gazebo-and-px4-separately"></a>

확장된 개발 세션의 경우 Gazebo Classic과 PX4를 별도로 시작하거나 IDE 내에서 시작하는 것이 더 편리할 수 있습니다.

Gazebo Classic과 PX4를 별도로 시작하려면:

*   변형 을 지정하는 터미널을 통해 전망대 클래식(또는 기타 SIM) 서버 및 클라이언트 뷰어를 실행합니다 `_ide`.

    ```
    make px4_sitl gazebo-classic___ide
    ```

    또는

    ```
    make px4_sitl gazebo-classic_iris_ide
    ```
* IDE에서 `px4_<mode>`디버깅하려는 대상을 선택하세요(예: `px4_iris`)
* IDE에서 직접 디버그 세션 시작

이 접근 방식은 시뮬레이터가 항상 백그라운드에서 실행되고 매우 가벼운 px4 프로세스만 다시 실행하기 때문에 디버그 주기 시간을 크게 줄입니다.

## 시뮬레이션된 카메라 <a href="#simulated-survey-camera" id="simulated-survey-camera"></a>

Gazebo _Classic_ 측량 카메라는 [MAVLink 카메라를 시뮬레이션합니다. ](https://mavlink.io/en/services/camera.html)위치 태그가 지정된 JPEG 이미지를 캡처하고 카메라 캡처 정보를 연결된 지상국으로 보냅니다. 카메라는 비디오 스트리밍도 지원합니다. 특히 측량 임무 내에서 카메라 캡처를 테스트하는 데 사용할 수 있습니다.

카메라는 [CAMERA\_IMAGE\_CAPTURED 를 방출합니다. ](https://mavlink.io/en/messages/common.html#CAMERA_IMAGE_CAPTURED)이미지가 캡처될 때마다 메시지가 표시됩니다. 캡처된 이미지는 다음 위치에 저장됩니다: **PX4-Autopilot/build/px4&#x20;**_**sitle\_default/tmp/frames/DSC\_n**_**&#x20;.jpg** (여기서 _n은_ 00000으로 시작하고 각 캡처에서 1씩 반복됩니다).

이 카메라로 평면을 시뮬레이션하려면:

```
make px4_sitl_default gazebo-classic_plane_cam
```

#### 메모

카메라는 다음 MAVLink 명령을 지원/응답합니다:&#x20;

[MAV\_CMD\_REQUEST\_CAMERA\_CAPTURE\_STATUS](https://mavlink.io/en/messages/common.html#MAV_CMD_REQUEST_CAMERA_CAPTURE_STATUS), [MAV\_CMD\_REQUEST\_STORAGE\_INFORMATION](https://mavlink.io/en/messages/common.html#MAV_CMD_REQUEST_STORAGE_INFORMATION), [MAV\_CMD\_REQUEST\_CAMERA\_SETTINGS](https://mavlink.io/en/messages/common.html#MAV_CMD_REQUEST_CAMERA_SETTINGS), [MAV\_CMD\_REQUEST\_CAMERA\_INFORMATION](https://mavlink.io/en/messages/common.html#MAV_CMD_REQUEST_CAMERA_INFORMATION), [MAV\_CMD\_RESET\_CAMERA\_SETTINGS](https://mavlink.io/en/messages/common.html#MAV_CMD_RESET_CAMERA_SETTINGS), [MAV\_CMD\_STORAGE\_FORMAT](https://mavlink.io/en/messages/common.html#MAV_CMD_STORAGE_FORMAT), [MAV\_CMD\_SET\_CAMERA\_ZOOM](https://mavlink.io/en/messages/common.html#MAV_CMD_SET_CAMERA_ZOOM), [MAV\_CMD\_IMAGE\_START\_CAPTURE](https://mavlink.io/en/messages/common.html#MAV_CMD_IMAGE_START_CAPTURE), [MAV\_CMD\_IMAGE\_STOP\_CAPTURE](https://mavlink.io/en/messages/common.html#MAV_CMD_IMAGE_STOP_CAPTURE), [MAV\_CMD\_REQUEST\_VIDEO\_STREAM\_INFORMATION](https://mavlink.io/en/messages/common.html#MAV_CMD_REQUEST_VIDEO_STREAM_INFORMATION), [MAV\_CMD\_REQUEST\_VIDEO\_STREAM\_STATUS](https://mavlink.io/en/messages/common.html#MAV_CMD_REQUEST_VIDEO_STREAM_STATUS), [MAV\_CMD\_SET\_CAMERA\_MODE](https://mavlink.io/en/messages/common.html#MAV_CMD_SET_CAMERA_MODE)

#### 메모

시뮬레이션된 카메라는 [PX4/PX4-SITL\_gazebo-classic/main/src/gazebo\_camera\_manager\_plugin.cpp 에 구현되어 있습니다.](https://github.com/PX4/PX4-SITL_gazebo-classic/blob/main/src/gazebo_camera_manager_plugin.cpp)

## 시뮬레이션된 깊이(Depth) 카메라 <a href="#simulated-depth-camera" id="simulated-depth-camera"></a>

Gazebo _Classic_ [깊이 카메라 모델 ](https://github.com/PX4/PX4-SITL_gazebo-classic/blob/main/models/depth_camera/depth_camera.sdf.jinja)[Openni Kinect 플러그인을](https://classic.gazebosim.org/tutorials?tut=ros_gzplugins#OpenniKinect) 사용하여 Intel® RealSense™ D455 스테레오 심도 카메라를 시뮬레이션합니다.[ ](https://classic.gazebosim.org/tutorials?tut=ros_gzplugins#OpenniKinect)

이는 각각 `/camera/depth/image_raw`및 `/camera/depth/camera_info`ROS 주제에 대한 깊이 이미지와 카메라 정보를 게시합니다.

전방을 향한 깊이 카메라를 사용하여 쿼드로터를 시뮬레이션할 수 있습니다.

```
make px4_sitl gazebo-classic_iris_depth_camera
```

또는 아래쪽을 향하는 깊이 카메라가 있는 쿼드로터:

```
make px4_sitl gazebo-classic_iris_downward_depth_camera
```

## 시뮬레이션된 낙하산/비행 종료 <a href="#simulated-parachute-flight-termination" id="simulated-parachute-flight-termination"></a>

_Gazebo Classic은_ 비행 종료 중 낙하산 배치 를 시뮬레이션하는 데 사용할 수 있습니다 (비행 종료는 _Gazebo Classic_ 에서 시뮬레이션되는 PWM 명령에 의해 트리거됨 ).

목표물 `if750a`에는 차량에 낙하산이 부착되어 있습니다. 차량을 시뮬레이션하려면 다음 명령을 실행하십시오.

```
make px4_sitl gazebo-classic_if750a
```

차량을 비행 종료 상태로 전환하려면 비행 종료가 안전 조치로 설정된 [안전 점검 에 실패하도록 강제할 수 있습니다. ](https://docs.px4.io/main/en/config/safety.html)[예를 들어 지오펜스 위반을](https://docs.px4.io/main/en/config/safety.html#geofence-failsafe) 강제하여 이를 수행할 수 있습니다 .

## 비디오 스트리밍 <a href="#video-streaming" id="video-streaming"></a>

Gazebo Classic용 PX4 SITL은 시뮬레이션된 차량 모델에 부착된 카메라 센서에서 UDP 비디오 스트리밍을 지원합니다. 스트리밍이 활성화되면 QGroundControl (UDP 포트 5600)에서 이 스트림에 연결하고 실제 카메라에서와 마찬가지로 시뮬레이션된 차량에서 Gazebo Classic 환경의 비디오를 볼 수 있습니다. 비디오는 gstreamer 파이프라인을 사용하여 스트리밍되며 Gazebo Classic UI의 버튼을 사용하여 활성화/비활성화할 수 있습니다.

시뮬레이션된 카메라 센서는 다음 프레임에서 지원/활성화됩니다.

* [Typhoon H480 (Hexrotor)](https://docs.px4.io/main/en/sim_gazebo_classic/vehicles.html#typhoon-h480-hexrotor)

### 전제조건 <a href="#prerequisites" id="prerequisites"></a>

_비디오 스트리밍에는 Gstreamer 1.0_ 이 필요합니다. Gazebo Classic을 설정할 때 필수 종속성이 이미 설치되어 있어야 합니다 (macOS 및 Ubuntu Linux용 표준 PX4 설치 스크립트/지침에 포함되어 있음).

#### 메모

참고로 종속성에는 `gstreamer1.0-plugins-base`, `gstreamer1.0-plugins-good`, `gstreamer1.0-plugins-bad`, `gstreamer1.0-plugins-ugly`, `libgstreamer-plugins-base1.0-dev`가 포함됩니다.

### 비디오 스트리밍 시작/중지 <a href="#start-stop-video-streaming" id="start-stop-video-streaming"></a>

대상 차량에서 지원하면 비디오 스트리밍이 자동으로 시작됩니다. 예를 들어 Typhoon H480에서 비디오 스트리밍을 시작하려면:

```
make px4_sitl gazebo-classic_typhoon_h480
```

Gazebo UI _비디오 ON/OFF_ 버튼을 사용하여 스트리밍을 일시 중지/다시 시작할 수 있습니다.

![비디오 ON/OFF 버튼](https://docs.px4.io/main/assets/img/sitl_video_stream.157bd133.png)

### 가제보의 비디오를 보는 방법 <a href="#how-to-view-gazebo-video" id="how-to-view-gazebo-video"></a>

SITL/Gazebo Classic 카메라 비디오 스트림을 보는 가장 쉬운 방법은 _QGroundControl 을_ 사용하는 것입니다 . **애플리케이션 설정 > 일반을** 열고 **비디오 소스를** _UDP h.264 비디오 스트림_ 으로 설정 하고 **UDP 포트를** _5600_ 으로 설정하기만 하면 됩니다.

![Gazebo에 대한 QGC 비디오 스트리밍 설정](https://docs.px4.io/main/assets/img/qgc_gazebo_video_stream_udp.5744f152.png)

그러면 Gazebo Classic의 비디오가 실제 카메라에서와 마찬가지로 _QGroundControl 에 표시되어야 합니다._

![QGC 비디오 스트리밍 가제보 예시](https://docs.px4.io/main/assets/img/qgc_gazebo_video_stream_typhoon.c60f73f0.jpg)

#### 메모

_Gstreamer Pipeline을_ 이용하여 영상을 시청하는 것도 가능합니다 . 다음 터미널 명령을 입력하기만 하면 됩니다.

```
gst-launch-1.0  -v udpsrc port=5600 caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' \
! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink fps-update-interval=1000 sync=false
```

## 자세한 로깅 <a href="#verbose-logging" id="verbose-logging"></a>

모델에 문제가 있으면 SITL은 자동으로 실패합니다. 다음과 같이 `VERBOSE_SIM`를 사용하여 보다 자세한 로깅을 활성화할 수 있습니다.

```
export VERBOSE_SIM=1
make px4_sitl gazebo-classic
```

또는

```
VERBOSE_SIM=1 make px4_sitl gazebo-classic
```
