이전 글...
드론 만들기
하드웨어
QGroundControl에서 변속기(ESC) 교정하기
Pixhawk 4의 Power Management Board
QGroundControl에서 Pixhawk 4 펌웨어 설치
QGroundControl에서 Pixhawk 4 설정하기 1/2
QGroundControl에서 Pixhawk 4 설정하기 2/2
파워 분배기(PDB, Power Distribution Board)
소프트웨어
MissionPlanner와 QGroundControl
QGroundControl에서 Pixhawk 4 펌웨어 설치
QGroundControl에서 Pixhawk 4 설정하기 1/2
QGroundControl에서 Pixhawk 4 설정하기 2/2
QGroundControl에서 Pixhawk 파라미터 변경하기
VMware Workstation Player에 Virtaul Machine 만들기
VMware Workstation Player에 Ubuntu 설치하기
조립
Power Management Board에 커넥터 연결하기
변속기(ESC)와 Power Management Board 연결하기
QGroundControl에서 변속기(ESC) 교정하기
GPS, Telemetry Pixhawk 4에 연결하기
통신
개발
비행
문제해결
Pixhawk와 Emax ESC(변속기) 호환문제 해결방법
기타
완전 초짜의 드론 만들기 도전! 도전! 도전~!입니다.
맨땅에 헤딩~
인터넷 검색, 관련 사이트를 참고하여 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 대이며 통신방법은 mavlink와 RTPS 두 가지에 대해서 알아본다.
- iris 3대가 MAVLink로 통신하는 다중 비행 시뮬레이션 빌드하기
여기서는 쿼드콥터인 iris 3대가 MAVLink로 통신하는 다중 비행을 설명한다.
먼저 PX4 소스코드 디렉터리로 이동한 후 아래의 명령어로 Gazebo SITL를 빌드한다.
DONT_RUN=1 make px4_sitl gazebo |
Gazebo SITL 빌드가 완료되며 이어서 PX4 소스코드 디렉터리에서 3대의 iris 다중 비행 시뮬레이션 빌드 명령어를 아래와 같이 실행한다.
(Gazebo 다중 비행 시뮬레이션 빌드 설정은 아래 참조)
./Tools/gazebo_sitl_multiple_run.sh -n 3 |
(기본 설정 값은 생략할 수 있기 때문에 model, world, script, target, label은 생략)
엔터키를 누르면 아래와 같은 3대의 쿼드콥터가 생성되어 있는 Gazebo 시뮬레이터가 실행된다.
- 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 |
▶ 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 |
(여기서는 사용자 디렉터리에 설치함)
설치를 완료하기 위해서 아래의 명령어를 터미널에 입력한다.
source "$HOME/.sdkman/bin/sdkman-init.sh |
sdkman이 설치가 잘 되었는지 아래의 명령어 확인할 수 있다.
sdk version |
sdk가 성공적으로 설치되었다.
▶ Gradle 설치
Gradle는 다중언어 소프트웨어 개발 용 build automation tool로 아래의 명령어로 gradle을 설치한다.
sdk install gradle 7.0 |
Gradle 설치가 잘 되었는지는 다음 명령어로 확인할 수 있다.
gradle -v |
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_vendor 디렉터리로 이동한 후 아래의 명령어로 build 디렉터리를 생성하고 build 디렉터리로 이동한다.
mkdir build && cd build |
build 디렉터리에서 cmake 명령어를 입력한다.
cmake .. |
이어서 아래의 명령어로 설치를 완료한다.
sudo cmake --build . --target install |
▶ 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 |
복제가 완료되면 FastDDS-2.0.2 디렉터리로 이동한 후 아래의 명령어로 build 디렉터리를 생성하고 build 디렉터리로 이동한다.
mkdir build && cd build |
build 디렉터리에서 아래의 cmake 명령어를 실행한다.
cmake -DTHIRDPARTY=0N -DSECURITY=ON .. |
이어서 아래의 make 명령어를 실행한다.
make -j$(nproc --all) |
완료가 되면 마지막으로 아래의 설치 명령어를 입력하여 설치를 완료한다.
sudo make install |
▶ 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 |
복제가 완료되면 Fast-RTPS-Gen 디렉터리로 이동한 후 아래의 명령어를 실행한다.
./gradlew assemble |
마지막으로 아래의 명령어를 입력하여 설치를 완료한다.
sudo ./gradlew install |
Fast-RPTS-Gen 설치가 끝났다.
▶ SITL 타깃 용 펌웨어 빌드
이젠 원점인 다중 비행으로 돌아와서 다중 비행을 빌드한다.
먼저 PX4 소스코드 디렉터리로 이동한 후 아래의 명령어로 SITL 타깃 용 펌웨어를 빌드한다.
make px4_sitl_rtps |
▶ SITL 코드 빌드
SITL 타깃 용 펌웨어 빌드가 끝나면 PX4 소스코드 디렉터리에서 submodule을 업데이트한 후 아래의 명령어로 SITL 코드를 빌드한다.
git submodule update --init --recursive |
DONT_RUN=1 make px4_sitl_rtps gazebo |
▶ 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 디렉터리로 이동한다.
아래의 cmake 명령어로 makefile을 생성한다.
cmake .. |
완료가 되면 make 명령어로 프로그램을 빌드한다.
make |
▶ 다중 비행 시뮬레이터 실행
PX4 소스코드 디렉터리에서 아래의 명령어로 다중 비행 시뮬레이터를 실행한다.
(아래의 명령어는 3개의 비행체 예이며, Gazebo 다중 비행 시뮬레이션 빌드 설정은 아래 참조)
./Tools/gazebo_sitl_multiple_run.sh -t px4_sitl_rtps -m iris -l rtps -n 3 |
아래는 세 개의 드론이 생성된 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 & |
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 시뮬레이션에서 이게 어떤 이점이 있는 것인지 현재로는 잘 모르겠다.
(알면 초짜가 아니겠지만...)
그것보다도 이게 맞는 건지 틀린 건지를 알 수가 없다.... 일단 동작은 하는 것 같으니 넘어간다.
[드론 만들기] QGroudControl 사용방법 4/4 (0) | 2021.07.24 |
---|---|
[드론 만들기] QGroundControl 사용법 3/4 (0) | 2021.05.24 |
[드론 만들기] Gazebo 사용하기 2/4 (0) | 2021.05.01 |
[드론 만들기] Gazebo 사용하기 4/4 (0) | 2021.04.29 |
[드론 만들기] Gazebo 사용하기 1/4 (2) | 2021.04.25 |
댓글 영역