상세 컨텐츠

본문 제목

[드론 만들기] Gazebo 사용하기 3/4

만들기/드론

by kwangpil 2021. 5. 13. 22:54

본문

 

이전 글...

 

드론 만들기

  

   하드웨어

      기본부품

         비행 제어기(FC)

            Pixhawk 시리즈

               Pixhawk의 GPS

               Pixhawk의 텔레메트리(Telemetry)              

               Pixhawk의 변속기(ESC)

                  QGroundControl에서 변속기(ESC) 교정하기     

               Pixhawk 4의 Power Management Board              

               Pixhawk 4

                  QGroundControl에서 Pixhawk 4 펌웨어 설치

                  QGroundControl에서 Pixhawk 4 설정하기 1/2

                  QGroundControl에서 Pixhawk 4 설정하기 2/2       

         모터

         배터리

            리튬 폴리머 배터리 팩

         변속기 (ESC)

         프로펠러 (Propeller)

         파워 분배기(PDB, Power Distribution Board)

         조종기(Radio Control)          

 

   소프트웨어

      MissionPlanner와 QGroundControl

      QGroundControl 설치

         QGroundControl 사용방법 1/4

         QGroundControl 사용방법 2/4

         QGroundControl에서 Pixhawk 4 펌웨어 설치

         QGroundControl에서 Pixhawk 4 설정하기 1/2

         QGroundControl에서 Pixhawk 4 설정하기 2/2

         QGroundControl에서 Pixhawk 파라미터 변경하기  

      VMware Workstation Pro 설치하기

         VMware Workstation Player에 Virtaul Machine 만들기

         VMware Workstation Player에 Ubuntu 설치하기

            Ubuntu(우분투) 터미널 명령어

            Ubuntu(우분투) 주요 디렉터리

            Ubuntu(우분투) 기초용어

 

   조립

      모터, 변속기에 커넥터 연결하기

      Power Management Board에 커넥터 연결하기

      변속기(ESC)와 Power Management Board 연결하기

      모터와 변속기(ESC) 연결하기

      QGroundControl에서 변속기(ESC) 교정하기

      GPS, Telemetry Pixhawk 4에 연결하기

  

   통신

      MAVLink

         MAVLink 설치하기

         MAVLink 라이브러리 생성하기

 

   개발

      드론 비행 시뮬레이터(Simulator)         

         툴체인(toolchain) 설치하기

            jMAVSim 사용하기 1/2

            jMAVSim 사용하기 2/2

            Gazebo 사용하기 1/4

            Gazebo 사용하기 2/4

            Gazebo 사용하기 3/4

            Gazebo 사용하기 4/4

 

   비행

      쿼드콥터(Quadcopter) 비행 원리     

 

   문제해결

      Pixhawk와 Emax ESC(변속기) 호환문제 해결방법

 

   기타

      비행금지구역

      비행 시 주의 사항   

      멀티콥터 종류

      커넥터(connector)

      용어

 


완전 초짜의 드론 만들기 도전! 도전! 도전~!입니다.
맨땅에 헤딩~

인터넷 검색, 관련 사이트를 참고하여 Pixhawk 4(PX4)를 이용한 중/소형 쿼드콥터 드론을 만들려고 하고 있습니다.

참고만 하세요~!

 

※ 사용하는 운영체제는 우분투(Ubuntu) 18.04 또는 20.04이며 특별한 언급이 없을 경우 우분투(Ubuntu) 18.04입니다.


 

[드론 만들기] Gazebo 사용하기 2/4에서 이어서 

 

 

3. 다중 비행 시뮬레이션

 

다중 비행 시뮬레이션은 말 그대로 여러 개의 드론 동시 시뮬레이션하는 것으로 취미로 드론을 만들어볼까... 하는 나 같은 사람은 절대 사용할 일이 없는 기능이다.

 

하지만 텔레비전 광고에서나 스포츠 행사에서 떼로 몰려다니는 드론을 한 두 번 봐왔던 터라 호기심에, 그리고 혹시나 하는 마음에 정리를 해보았다.

 

Gazebo 다중 비행 시뮬레이션(SITL)을 구현 방법은 두 가지, 즉 ROS(Robot Operating System)를 포함하느냐 하지 않느냐로 나눠진다. 

 

다중 비행 시뮬레이션 시 각각의 비행체는 특정 MAVLink 시스템 id(1, 2, 3....)을 할당받는데 동일한 네트워크 상에서 MAVLink 시스템 id가 지원 가능한 최대 개수는 255개이며 따라서 다중 시뮬레이션 가능한 최대 비행 개수 255이고 최소 개수 3이다.

 

JMAVsim는 지원 가능한 기체 형태가 쿼드콥터뿐이었지만 Gazaebo의 경우 쿼드콥터(iris), plane, standard_vtol이 가능하다.

 

여기서는 ROS를 포함하지 않는 다중 비행 시뮬레이션, 기체 형태는 쿼드콥터(iris)이며, 기체 개수는 3 대이며 통신방법은 mavlinkRTPS 두 가지에 대해서 알아본다.

 

 

- iris 3대가 MAVLink로 통신하는 다중 비행 시뮬레이션 빌드하기

 

여기서는 쿼드콥터인 iris 3대가 MAVLink로 통신하는 다중 비행을 설명한다.

 

먼저 PX4 소스코드 디렉터리로 이동한 후 아래의 명령어로 Gazebo SITL를 빌드한다.

 

DONT_RUN=1 make px4_sitl gazebo

 

<Gazebo SITL 빌드>

 

Gazebo SITL 빌드가 완료되며 이어서 PX4 소스코드 디렉터리에서 3대iris 다중 비행 시뮬레이션 빌드 명령어를 아래와 같이 실행한다.

(Gazebo 다중 비행 시뮬레이션 빌드 설정은 아래 참조)

 

./Tools/gazebo_sitl_multiple_run.sh -n 3

(기본 설정 값생략할 수 있기 때문에 model, world, script, target, label은 생략)

 

<터미널에 3대의 iris 다중비행 시뮬레이션 명령어 입력>

 

엔터키를 누르면 아래와 같은 3대의 쿼드콥터가 생성되어 있는 Gazebo 시뮬레이터가 실행된다.

 

<Gazeobo에서 iris(3대) 다중비행>

 

 

- iris 3대가 RTPS로 통신하는 다중 비행 시뮬레이션 빌드하기

 

앞에서 MAVLink로 통신하는 다중 비행을  매우 간단하고 쉽게 빌드했는데도 불구하고 왜 RTPS로 통신하는 다중 비행을 빌드할까.

이유는 RTPS의 통신 데이터 신뢰성 때문이다.

 

RTPS는 Real Time Publich Subscribe Protocol의 약자로 신뢰성이 낮은 전송 환경에서도 발행(publish)/구독(subscribe) 통신을 위한 신뢰성이 높은 프로토콜이다.

 

이렇게 사용하는 이유는 간단한데 Gazebo에서 RTPS 통신하는 다중 비행 빌드하는 것은 간단하지 않다.

설치 단계를 요약해 보면 아래와 같다.

 

자바(Java JDK 8 권고) 설치

▶ curl 설치

 sdkman 설치

Gradle 설치

Foonathan memory 설치

eProsima Fast DDS 설치

 Fast-RTPS-Gen 빌드

▶ SITL 타깃 용 펌웨어 빌드

▶ SITL 코드 빌드
▶ micrortps_agent 빌드
▶ 다중 비행 시뮬레이터 실행
▶ micrortps_agent 실행

 

위에 단계 중에 알고 있는 것이라고는 자바뿐이지만 픽스호크 홈페이지의 설명을 따라서 차근차근 설치해봤다.

 

 

▶ 자바(Java JDK 8 권고) 설치

 

자바의 경우 우분투 설치 시 함께 설치되었기 때문에 따로 설치할 필요는 없다. 

혹시나... 한다면 아래의 명령어로 자바가 설치되어 있는지는 확인할 수 있다.

 

java -version

 

<자바 설치 확인>

 

▶ curl 설치

 

자바 설치가 확인되었으면 이제는 sdkman을 설치하기 위해서  curl 설치한다.

 

curl는 Client URL의 약자로 다양한 네트워크 프로토콜을 사용하는 데이터 전송을 위한 라이브러리와 커맨드 라인 툴(command line tool)을 제공하는 컴퓨터 소프트웨어 프로젝트이다.

 

혹시 설치되어 있는지 모르겠다면 아래의 명령어로 확인한다.

 

curl -version

설치 전 필요시 아래의 명령어로 먼저 우분투업데이트 및 업그레이드한다.

 

sudo apt update && sudo apt upgrade

업그레이드가 끝나면 아래의 명령어로 curl설치한다.

 

sudo apt install curl

 

<curl 설치>

 

 sdkman 설치

 

Fast-RTPS-Gen을 빌드하기 위해서 Gradle를 설치해야 하는데 설치 시 sdkman으로 Gradle 설치 권고하기 때문에 sdkman을 먼저 설치해야 한다.

 

sdkman은 Software Development Kit MANager의 약자로 유닉스를 기반으로 하는 대부분의 시스템에서 여러 가지 소프트웨어 개발 키트(SDK, Software Development Kits)의 병렬 버전을 관리하기 위한 툴(tool)이다.

 

설치하려는 디렉터리에서 아래의 설치 명령어를 입력한다.

 

curl -s "https://get.sdkman.io" | bash

(여기서는 사용자 디렉터리에 설치함)

 

<sdkman 설치>

 

설치를 완료하기 위해서 아래의 명령어를 터미널에 입력한다.

 

source "$HOME/.sdkman/bin/sdkman-init.sh

 

<sdkman 설치 완료>

 

sdkman 설치가 잘 되었는지 아래의 명령어 확인할 수 있다.

 

sdk version

 

<sdkman 설치 확인>

sdk가 성공적으로 설치되었다.

 

 

 Gradle 설치

 

Gradle는 다중언어 소프트웨어 개발 용 build automation tool로 아래 명령어gradle 설치한다.

 

sdk install gradle 7.0

 

<Gradle 설치>

 

Gradle 설치가 잘 되었는지는 다음 명령어로 확인할 수 있다.

 

gradle -v

 

<Gradle 설치확인>

 

gradle이 성공적으로 설치되었다.

 

 

 

▶ Foonathan memory 설치

 

Foonathan memory는 할당기(Allocator)와 유사하지만 사용하고 쓰기 더 편한 새로운 RawAllocator 개념을 사용하는 STL(Standard Template Library) 호환 가능한 C++ 메모리 할당기(memory Allocator)이다.

 

아래의 명령어로 Foonathan memory설치한다.

 

git clone https://github.com/eProsima/foonathan_memory_vendor.git

 

<Foonathan memory 설치>

 

이어서 foonathan_memory_vendor 디렉터리로 이동한 후 아래의 명령어로 build 디렉터리를 생성하고 build 디렉터리로 이동한다.

 

mkdir build && cd build

 

build 디렉터리에서 cmake 명령어를 입력한다.

 

cmake ..

 

<build 디렉토리에서 cmake 명령어 실행>

 

이어서 아래의 명령어로 설치를 완료한다.

 

sudo cmake --build . --target install

 

<Foonathan memory 설치 완료>

 

 eProsima Fast DDS 설치

 

Foonathan memory까지 설치가 완료되었으며  Fast-RTPS(DDS)를 설치한다.

 

우선 아래의 명령어로 Github에서 프로젝트 복제한다.

git clone --recursive https://github.com/eProsima/Fast-DDS.git -b v2.0.0 ~/FastDDS-2.0.0

 

<Github에서 프로젝트 복제>

 

복제가 완료되면 FastDDS-2.0.2 디렉터리로 이동한 후 아래의 명령어로 build 디렉터리를 생성하고 build 디렉터리로 이동한다.

 

mkdir build && cd build

 

build 디렉터리에서 아래의 cmake 명령어행한다.

 

cmake -DTHIRDPARTY=0N -DSECURITY=ON ..

 

<cmake 명령어 실행>

 

이어서 아래의 make 명령어 실행한다.

 

make -j$(nproc --all)

 

<make 명령어 실행>

 

완료가 되면 마지막으로 아래의 설치 명령어를 입력하여 설치를 완료한다.

 

sudo make install

<Fast-RTPS(DDS) 설치>

 

 Fast-RTPS-Gen 설치

 

Fast-RTPS-Gen은 Fast -RTPS(DDS) IDL 코드 발생기로 Fast -RTPS(DDS) 설치 완료 후에 설치한다.

(IDL: Interface Description/Definition Language)

 

설치하려면 우선 설치할 디렉터리로 이동한 후 아래의 명령어로 Github에서 프로젝트복제한다.

(아래는 사용자 디렉터리에 설치한 예시이다)

 

git clone --recursive https://github.com/eProsima/Fast-DDS-Gen.git -b v1.0.4 ~/Fast-RTPS-Gen

 

<Github에서 프로젝트를 복제>

 

복제가 완료되면 Fast-RTPS-Gen 디렉터리로 이동한 후 아래의 명령어를 실행한다.

 

./gradlew assemble

 

<Fast-RTPS-Gen 설치>

 

마지막으로 아래의 명령어를 입력하여 설치완료한다.

 

sudo ./gradlew install

 

<Fast-RTPS-Gen 설치완료>

 

Fast-RPTS-Gen 설치가 끝났다.

 

 

▶ SITL 타깃 용 펌웨어 빌드

 

이젠 원점인 다중 비행으로 돌아와서 다중 비행을 빌드한다.

 

먼저 PX4 소스코드 디렉터리로 이동한 후 아래의 명령어로 SITL 타깃 용 펌웨어빌드한다.

 

make px4_sitl_rtps

 

<SITL 타깃 용 펌웨어 빌드>

 

 

▶ SITL 코드 빌드

 

SITL 타깃 용 펌웨어 빌드가 끝나면 PX4 소스코드 디렉터리에서 submodule을 업데이트한 후 아래의 명령어로 SITL 코드빌드한다.

 

git submodule update --init --recursive
DONT_RUN=1 make px4_sitl_rtps gazebo

 

<SITL 코드 빌드>

 

micrortps_agent 빌드

 

SITL 코드 빌드가 완료되면 micrortps_agent빌드한다.

 

PX4 소스코드 디렉터리로 이동한 후 아래의 명령어를 입력해서 micrortps_agent 디렉터리로 이동한다.

 

cd build/px4_sitl_rtps/src/modules/micrortps_brigde/micrortps_agent

그다음 아래의 명령어로 build 디렉터리를 생성/이동한다.

 

mkdir build && cd build

이미 build 디렉터리가 있을 경우에는 바로 build 디렉터리로 이동한다.

 

build 디렉토리 생성 후 이동

 

아래의 cmake 명령어로 makefile생성한다.

 

cmake ..

 

<cmake 명령어 실행>

 

완료가 되면 make 명령어로 프로그램 빌드한다.

 

make

 

<make 명령어 실행>

 

다중 비행 시뮬레이터 실행

 

PX4 소스코드 디렉터리에서 아래의 명령어로 다중 비행 시뮬레이터 실행한다.

(아래의 명령어는 3개의 비행체 예이며, Gazebo 다중 비행 시뮬레이션 빌드 설정은 아래 참조)

 

./Tools/gazebo_sitl_multiple_run.sh -t px4_sitl_rtps -m iris -l rtps -n 3

 

<Gazebo 다중비행 빌드>

아래는 세 개의 드론이 생성된 Gazebo 시뮬레이터이다.

 

<세개의 드론이 생성된 Gazebo 시뮬레이터>

 

 

micrortps_agent 실행

 

생성된 각각의 드론은 단일의 MAVLink 시스템 id를 부여받으며 단일 무선 UDP 포트(2019, 2021, 2023)를 통해서 데이터를 받고 UDP 포트(2020, 20200, 2024)로 데이터를 송신하며 micrortps_agent빌드디렉터리에서 아래의 명령어로 micrortps_agent실행한다.

 

./micrortps_agent -t UDP -r 2020 -s 2019 & ./micrortps_agent -t UDP -r 2022 -s 2021 & ./micrortps_agent -t UDP -r 2024 -s 2023 &

 

<micrortps_agent 실행>

 

RTPS로 연결된다.

 

드디어 Gazebo에서 RTPS로 통신하는 다중 비행 시뮬레이션 빌드가 끝났다.

 

아래는 Gazebo에서 iris 3대가 RTPS로 통신하는 다중 비행 시뮬레이션을 하는 동영상이다.

 

 


다중 비행 시뮬레이션을 빌드하려면 PX4 소스코드 디렉터리에서 아래의 명령어를 터미널에 입력해야 한다.

<Gazebo 다중 비행 시뮬레이션 빌드 명령어 설정>

Tools/gazebo_sitl_multiple_run.sh [-m <model>] [-n <number_of_vehicles>] [-w <world>] [-s <script>] [-t <target>] [-l <label>]

<model>: iris(기본 설정), plane, standard_vtol 등과 같은 기체 형태.

<number_of_vehicles>: 생성할 총 기체 개수로 기본값 3에서 최대 255까지 가능.

<world>: 기체가 생성될 시뮬레이션 환경, 기본 설정은 empty.

<script>: 다른 형태의 기체를 다중으로 생성 시 기체 형태 및 개수 설정.

             예) -s "iris:3, plane:2, standard_vtol:3"

<target>: 빌드한 타깃으로 px4_sitl_default(기본 설정) 또는 px4_sitl_rtps.

<label>: 모델 용 특정 레이블, 예) rtps.


픽스호크 홈페이지에 설명되어 있는 대로 따라서 나름 복잡한 과정을 뚫고 설치를 하긴 했는데 SITL 시뮬레이션에서 이게 어떤 이점이 있는 것인지 현재로는 잘 모르겠다.

(알면 초짜가 아니겠지만...)

그것보다도 이게 맞는 건지 틀린 건지를 알 수가 없다.... 일단 동작은 하는 것 같으니 넘어간다.

 

 

관련글 더보기

댓글 영역