드론자율주행시스템 구축을 위해 기존에는 Ubuntu 22.04, ROS2, PX4, Gazebo를 사용했다. 다만 Gazebo를 사용하는 과정에서 해당 시뮬레이터의 안정성이 매우 떨어지고 비행제어가 잘 이뤄지지 않는 느낌을 강하게 받아 시뮬레이터를 AirSim으로 바꿔보고자 했다. AirSim 구동을 위한 UnrealEngine과 PX4와의 연동 예제가 Windows를 중점으로 이뤄져 있어 Windows 환경에 설치를 수행하기로 했다. 

 

Windows 11에서 드론비행제어 시뮬레이션 환경을 구성하기 위해 설치해야할 항목은 4가지다. ROS2, PX4, UnrealEngine, AirSim다. Windows 11 환경에 AirSim 시뮬레이션 환경을 구축하며 느낀 것은 Ubuntu 22.04에 ROS2, PX4, Gazebo 환경을 설치할 때 보다 잡다한 에러가 상대적으로 많이 발생했다는 것이고, 레퍼런스가 많지는 않아 공식 문서와 약간의 유튜브 영상을 잘 보고 환경 구성을 해야한다는 것이다. 

 

1. ROS2

ROS2 설치는 humble 배포판을 기준으로 수행했으며 전반적으로 아래 링크를 참조하여 수행하였다.

https://docs.ros.org/en/humble/Installation/Alternatives/Windows-Development-Setup.html#installing-prerequisites
설치해야할 것들이 많았다. chocolatey, python, visual studio, opencv, qt5, rqt 등을 위 공식문서에 따라 설치를 수행했다. 최종적으로 'hello world'를 수행했을 때 아래와 같이 topic을 publish하고 subscribe 할 수 있다면 설치가 완료된 것이다.

 

 

2. UnrealEngine & AirSim

AirSim은 UnrealEngine 기반으로 동작하기 때문에 UnrealEngine 설치가 필요하다. 전반적으로 다음 링크의 공식문서를 참조하여 UnrealEngine과 AirSim 설치를 수행했다. https://microsoft.github.io/AirSim/build_windows/

참고로 UnrealEngine 설치를 수행할 때 UnrealEngine 4.27 이상을 다운로드 받으라고 되어 있는데 23.07.31 기준 5.2.1 버전을 다운로드 받게 되면 UnrealEngine을 구동할 때 "Physxvehicles" 플러그인이 없다는 오류가 발생하므로 4.27 버전으로 맞춰 다운로드 해야 에러가 발생하지 않는다. UnrealEngine은 아래와 같이 독립적인 버전을 각각 설치해 관리할 수 있다. 4.27.2 버전을 다운로드 받자. 

 

 

3. PX4

PX4를 설치하기 위해 Windows의 WSL2를 사용한다. 기존에 사용하던 Ubuntu 22.04를 삭제하고 재설치하는 과정에서 에러가 발생해서 Ubuntu 20.04를 설치했다. Ubuntu 20.04 환경에서 아래 명령을 통해 소스코드를 내려받고 빌드해주었다.

git clone https://github.com/PX4/PX4-Autopilot

make px4_sitl_default none_iris

만약 make 과정에서 오류가 발생한다면 g++, cmake 등의 빌드를 위해 필요한 패키지를 설치해주어야 한다. 그리고 Windwos 11에서 구동되는 AirSim이 PX4와 연결되기 위해서 PX4의 IP address를 알아야 한다. ipconfig를 통해 WSL에 할당된 IP를 환경변수 PX4_SIM_HOST_ADDR에 할당해준다. 

 

 

알다시피 export를 통한 환경변수는 일회성이기 때문에 .bashrc의 제일 아랫 부분에 아래 명령을 추가해서 셸이 생성될 때마다 실행될 수 있도록 해주는 것이 좋다. 

 

 

이후에 UnrealEngine의 AirSim에서 해당 IP와 연결하기 위해 C:\Users\<user>\Documents\AirSim 경로에 있는 settings.json 파일을 아래와 같이 수정해준다. 참고로 이 때 LocalHostIp는 위 PX4의 IP address를 기입해준다.

 

참고로 위 settings.json은 다음 링크를 참조하였다. https://microsoft.github.io/AirSim/px4_sitl_wsl2/

이후 UnrealEngine에서 AirSim 시뮬레이션 모드인 AirSimGameMode를 선택해주고 시뮬레이션을 수행하면 아래와 같이 AirSim의 settings.json을 로딩하고 PX4의 IP와 연결하는 것을 확인할 수 있다. 참고로 UnrealEngine에서 월드를 구성하고 시뮬레이션을 수행하는 과정 전부는 아래 링크를 참조하였다.

 

Unreal AirSim Setup from scratch

AirSimDemo

AirSim with PX4 on WSL 2

UnReal 환경 만들기 및 설정(pixhawk 기반 HITL)

 

 

AirSim과 PX4가 연결되면 연결을 대기 중이던 상태에서 아래와 같이 명령을 수행할 수 있는 상태로 바뀌게 된다.

 

 

현재 상태에서 아래와 같이 commander takeoff 명령을 수행하게 되면 AirSim 시뮬레이션 상으로 명령이 전달되어 드론이 이륙하는 것을 확인할 수 있다.

 

 

ROS2를 통해 PX4에서 발행하는 uORB 토픽을 subscribe하고 AirSim 상으로 비행제어 코드를 수행하는 과정은 추후 포스팅에서 다루고자 한다.

본 글은 국내 신동원, 장형기님께서 배포해주신 "SLAM의 이해와 구현"이라는 자료를 기반으로 요약하였음을 밝힙니다.

 

01. SLAM 이란?

SLAM이란 동시적 위치추정 및 맵핑을 의미한다. 아주 쉽게 말해 Localization은 내가 어디에 있지를 알아내는 것이고 Mapping은 내 주변에 뭐가 있는지를 알아내는 것이다. 이 두 문제를 동시에 풀고자하는 방법이 SLAM이다.

 

02. SLAM 응용분야

SLAM 활용

  • 모바일 로보틱스 (Mobile Robotics)
  • 자율주행 (Autonomous Driving)

로봇 관련 회사

  • 소프트뱅크(Softbank) - 페퍼로봇
  • 테미(Temi) - 테미로봇
  • 테슬라 - 옵티머스

 

03. SLAM 알고리즘 종류

1900년대

  • 베이즈 필터 기반: Prior + Likelihood = Posterior를 계산.
    • 확장칼만필터 SLAM (EKF SLAM)
  • 파티클 필터 기반
    • Fast SLAM

 

2000년대

  • 그래프 최적화 기반
    • 그래프 노드: 로봇 위치
    • 그래프 엣지: 회전 & 이동
  • 특징점 기반: 카메라 궤적 추적 및 맵핑 수행
    • ORB-SLAM

 

  • 밝기 기반 (Intensity-based)
    • LSD-SLAM

 

04. SLAM 알고리즘 파이프라인

프론트엔드(Frontend)

  1. 카메라 or 라이다 센서 데이터 수집 + 전처리(노이즈 제거)

  2. 2.1 Visual Odometry (시각적 주행 거리 측정)

    - 센서의 상대적인 움직임을 예측

    2.2 루프 폐쇄 검출 (Loop closure detection)

    - 현재 센서 위치가 이전 방문 위치인지 판단
    - 비연속적 데이터로 상대적인 움직임 예측

백엔드(Backend)

  1. 백엔드 최적화
    • 프론트엔드에서 얻은 센서 위치와 주변 환경 정보를 이용해 불확실성 제거하고 일관성 있는 지도 만들기 위한 최적화 과정 수행
    • 현재 센서의 자세와 주변 환경의 랜드마크 정보를 그래프 노드로 표현 후 노드 사이의 제약조건을 그래프 엣지로 표현해 모든 그래프 사이의 제약조건을 최소화 하는 형태로 센서의 자세와 랜드마크 위치를 최적화
  2. 지도 표현
    • 최적화 정보를 기반으로 시나리오에 적합한 환경지도를 생성

 

Visual Odometry란? (시각적 주행 거리 측정)

정의: 인접 이미지 사이의 센서 움직임을 예측해 회전과 이동 파라미터를 계산하는 알고리즘

한계점: Visual Odometry만 사용해 연속적인 센서 궤적을 예측하면 누적된 표류 오차(Drift Erorr) 때문에 실제 궤적과 차이를 보임

보완방법: 루프 폐쇄 검출과 백엔드 최적화 과정이 반드시 필요함

 

루프 폐쇄 검출 (Loop Closure Detection)이란?

  • 정의: 현재 센서 위치가 이전에 방문한 곳인지 판단하는 알고리즘
  • 방법: 현재 센서 입력과 이전 센서 입력 사이의 유사성을 고려
  • 효과: 아래와 같이 Visual Odometry에 의해 표류오차가 누적된 빨간 선에서 루프 폐쇄 검출 알고리즘을 통해 같은 위치임을 판단해 전체 궤적을 초록선에 가까이 보정할 수 있음

  • 동작원리: 센서 입력 사이 유사성은 크게 이미지 간 유사성이나 기하학적 유사성을 고려함
    • 이미지 간 유사성은 같은 장소에서 촬영한 사진임에도 불구하고 다른 시간, 날씨, 조명, 시점과 같은 다양한 요인에 의해 시각적으로 큰 차이가 나는 영상이 나올 수 있음. 하지만 이러한 다양한 변화 요인들에도 불구하고 강건하게 같은 장소임을 판단하는 알고리즘이 루프 폐쇄 검출 알고리즘
    • 기하학적 유사성은 라이다 센서와 같은 3차원 공간에 대한 형상 정보를 수집할 때 사용할 수 있음

 

백엔드 최적화 (Backend optimization)란?

  • 정의: 노이즈가 많은 데이터로부터 전체 시스템의 상태를 정확하게 추정(State estimation) 방법
  • 분류: 필터 기반, 비선형 최적화 기반
    • 필터 기반
      • 베이즈 필터: 사전확률 + 가능도를 융합해 사후확률을 업데이트해 센서의 자세 또는 랜드마크의 위치를 업데이트 하는 방법
        • 칼만 필터
        • 파티클 필터
    • 비선형 최적화 기반
      • 정의
        • 센서 자세와 랜드마크 사이에 비선형적 관측 모델이나 연속적인 센서 사이의 비선형적 움직임 모델이 주어졌을 때 이러한 비선형 모델에 의해 만들어지는 제약조건을 최소화시키는 방향으로 센서의 자세와 랜드마크를 업데이트하는 방법
      • 종류
        • 번들 조정(Bundle adjustment)
        • 그래프 최적화(Graph optimization)

Map representation이란?

정의: SLAM 파이프라인의 마지막 단계로 최적화된 센서 자세와 랜드마크 자세를 이용해 환경 맵을 만드는 과정

고려: 환경 지도는 응용 시나리오에 따라 다르게 구현될 필요가 있음. 예컨데 가정용 로봇 청소기는 2차원 지도만으로 충분하나 자율주행 드론은 3차원 지도가 필요한 것과 같이 시나리오에 따라 정확성, 가용 가능 컴퓨팅 자원을 고려해 지도 표현 방법을 선정해야 함.

  • 로봇 청소기와 같은 실내환경에서 사용하는 2차원 점유 그리드 지도
  • 지하철 노선도와 같은 정점과 간선으로 표현하는 위상 지도
  • 3차원 환경 맵을 표현하는 일반적인 방법은 3차원 점군 지도
  • 가상/증강 현실의 몰입감을 위한 밀도 있는 볼륨형태의 3차원 볼륨 지도

 

05. SLAM의 수학적 정의

처음시간 부터 현재 시간 T까지의 로봇 움직임 제어 정보 $u_{1:T}=\{{u_1, u_2, \dots, u_T\}}$와 주변 환경에 대한 관찰 정보 $z_{1:T} = \{{z_1, z_2, z_3, \dots, z_t\}}$가 주어졌을 때 이것으로부터 정확한 로봇의 궤적에 대한 정보 $x_{1:T}=\{{x_1, x_2, x_3, \dots, x_T\}}$와 지도 정보 $m$을 계산하는 알고리즘이다.

 

그림으로 예를 들자면 파란색 원은 센서가 장착된 로봇의 위치를 나타내고, 노란색이 랜드마크 위치를 나타낸다. 이 때 파란색 화살표로 표시된 로봇 움직임 제어 정보와 검은선으로 표시된 랜드마크에 대한 관찰 정보가 주어졌을 때 오른쪽과 같이 처음부터 현재(T)까지의 로봇 이동 궤적에 대한 정보와 랜드마크 위치 정보를 계산하는 것이 목표다. 이에 대한 결과로서 정확한 로봇의 위치를 추정할 수 있고 주변 환경에 대한 지도를 작성할 수 있게 된다.

 

하지만 문제점은 실세계는 불확실성이 산재해 있기 때문에 1미터를 움직이라는 제어 명령을 주어도 외부요인에 의해 움직이는 거리가 달라질 수 있다. 또 센서도 노이즈가 포함되어 있기 때문에 이러한 불확실성을 줄이고 정확한 상태값을 추정하기 위한 최선의 방법으로 확률론적으로 접근이 필요하며 아래와 같은 수식으로 정의할 수 있다.

 

 

즉 SLAM은 처음 시점(0)부터 현재 시점(T)까지 불확실성이 포함된 주변 환경에 대한 관찰 정보와 센서가 장착된 로봇에 대한 움직임 제어 정보가 주어졌을 때, 가장 확률이 높은 로봇의 궤적 정보와 주변 환경에 대한 맵 정보를 추정하는 문제라고 할 수 있다. 이러한 SLAM의 수식적 정의를 도식화해 각 변수의 의존성을 나타내면 다음과 같이 표현할 수 있다.

 

  • 동그라미는 변수를 나타내고 화살표는 변수 사이의 의존성을 나타냄
  • t-1 시점의 로봇 자세$(x)$는 t-1 시점의 로봇 움직임 제어 정보$(u)$에 영향 받음
  • t-1 시점의 로봇 자세$(x)$는 t-1 시점에서 주변 환경에 대한 관찰 정보$(z)$와 다음 시점인 t 시점의 로봇 자세$(x)$에 영향을 미침
  • 지도 정보는 모든 시점에서 주변 환경에 대한 관찰 정보$(z)$에 영향을 미침

드론 자율주행을 위해 목표 GPS 좌표를 설정하고 현재 GPS 좌표와의 차이를 구해 이동해야 할 좌표를 계산하는 데 있어 PID 제어가 쓰이는 것을 알 수 있었고 이에 대한 이해가 필요하다 판단했다. PID 제어는 목표값에 도달하기 위해 현재값과의 차이를 반복적으로 줄여나가는 시스템으로 아래와 같은 구성을 갖는다. 여기서 반복적으로 줄여나간다는 말은 Feedback loop가 있다는 것이다.

PID 제어에서 P, I, D가 나타내는 것은 비례(Proportional), 적분(Integral), 미분(Derivative)를 나타내며 이 세 요소는 에러를 줄여 목표지점에 도달하는 공통의 목표를 가지고 각자 역할을 수행한다. 이 요소는 각각 비례항, 적분항, 미분항이라 부르며 각각의 항에서 사용되는 상수(파라미터)는 Kp, Pi, Kd(비례이득, 적분이득, 미분이득)가 있다. 비례항, 적분항, 미분항을 살펴보기 바로 이전에 결론적으로 이러한 각 항의 상수들이 적절하게 설정되었을 때 시스템에 어떤 영향을 미칠 수 있는지 살펴보자.

 

위 GIF를 보면 Kp, Ki, Kd가 적절하게 전부 설정되었을 때 시스템이 안정화되는 것을 확인할 수 있다. 이는 비례항, 적분항, 미분항의 파라미터들이 함께 사용되었을 때 상보적인 효과를 가져온다는 것을 의미한다. 그렇다면 이제 오차에 대해 비례항과 적분항과 미분항의 역할을 살펴보고 각 항의 구성과 특징을 살펴보자.

 

1. 비례항

비례항은 오차값에 비례해서 시스템의 제어를 수행한다. 가장 직관적인 제어 방식이다. 수식으로는 $ P = K_p \times e$와 같다. e는 error를 의미한다. 여기서 비례항의 파라미터인 비례이득 $K_p$가 높으면 오차에 큰 반응으로 빠른 오차 감소가 가능하지만 불안정한 상태가 된다. 즉 목표지점(setpoint) 근처까지 빠르게 도달할 수 있지만 불안정한 상태로 도달하게 된다. 반대로 $K_p$가 낮으면  오차에 작은 반응을 보여 느린 오차 감소를 보이지만 안정한 상태가 된다. 즉 목표 지점 근처까지 천천히 도달하지만 안정한 상태로 도달할 수 있는 것이다. 비례항을 통해 비례제어를 수행해도 즉, $K_p$를 조절해도 목표지점에 정확히 도달하지 못하는 문제점이 있다. 이는 오버슈팅 현상 때문이다. 오버슈팅 현상은 목표값보다 오차가 커지는 것을 말한다. 제어기가 목표값에 도달해도 지나치게 흔들리거나 진동하는 경우가 있기 때문이다. 따라서 이러한 비례항만으로는 안정성있고 정확하게 목표지점에 도달하기 어렵기 때문에 이를 보완하기 위해 아래 적분항을 함께 사용한다.

 

2. 적분항

적분항은 오차값의 누적을 이용해 시스템의 제어를 수행한다. 적분항은 비례항과 마찬가지로 오차를 줄이기 위한 역할을 수행한다.  비례항은 단순히 오차에 비례이득을 곱했다면 적분항은 오차의 누적을 구해 적분이득을 곱해준다. 수식으로는 $I = K_i \times \int{e}$와 같다. 즉 적분이득($K_i$)을 작게 설정하면 오차의 누적이 둔화되어 안정적인 제어가 가능하지만 오차추종속도가 느릴 수 있고, 반대로 적분이득을 크게 설정하면 오차의 누적이 크게 반영되어 제어신호가 더 많이 증가하고 오차추종속도가 빠르지만 비례항과 마찬가지로 오버슈팅이 발생할 수 있다. 

 

3. 미분항

미분항은 오차의 변화율에 따라 시스템의 제어를 수행한다. 조금 더 구체적으로는 목표값과 제어값의 편차를 비교해 이와 기울기가 반대되는 쪽에 값(힘)을 주어 힘을 상쇄시킨다. 다른 두 항과 마찬가지로 오차를 줄이는 역할을 한다. 다만 특히나 다른 두 항에 비해 안정성을 높이는 역할을 한다. 이는 적분항에 있던 오차들을 변화율에 따라 제거해줌으로써 시스템이 안정화시키기 때문이다. 수식은 $D = K_d \times {de \over dt}$와 같다. 미분이득($K_d$)을 큰 값으로 설정하면 오차의 변화에 민감하게 반응해 오차추종속도가 빨라지나 진동이나 불안정성이 발생할 수 있다. 반면 미분이득을 작은 값으로 설정하면 오차변화에 대한 반응이 둔화되어 안정적인 제어가 가능하지만 오차추종속도가 느릴 수 있다.

 

 

이러한 비례이득, 적분이득, 미분이득은 함께 상호작용하며 시스템의 균형을 잡기 때문에 올바른 조합을 찾는 것이 중요하다. 이들 간의 균형은 시스템에 따라 달라질 수 있으므로 실험을 통해 최적의 값을 도출하는 것이 필요하다. 이를 PID 튜닝이라고 하며 가장 널리 알려진 방법으로는 지글러-니콜스 방법이 있다고 한다.

 

 

Reference

[1] https://ko.wikipedia.org/wiki/PID_%EC%A0%9C%EC%96%B4%EA%B8%B0

[2] https://velog.io/@717lumos/Control-PID-%EC%A0%9C%EC%96%B4

[3] https://blog.naver.com/PostView.nhn?blogId=scw0531&logNo=221285498257 

 

 

본 논문은 2021년에 나온 논문으로 스테레오 카메라를 통해 장애물을 인지하고 이를 기반으로 목표 지점까지 최적의 경로를 계산하는 드론 시스템을 개발하여 이를 검증한다. 장애물 회피 시뮬레이션에서 인지한 장애물은 Octomap을 사용하여 3차원 공간에 장애물 위치를 매핑하고 드론의 목표지점까지 최적의 경로를 계산했다. 나아가 간단히 실외 환경에서도 장애물 회피가 가능함을 보였다.

 

관련연구를 통해 강화학습 기반의 장애물 회피 연구가 수행되고 있음을 알게 되었고 결과적으로는 추후에는 강화학습 기반으로 연구를 이어가야겠다는 생각이 들었다. 장애물을 회피하면서 자율비행을 수행하는 드론 시스템 개발을 위해 저자는 먼저 하드웨어 측면과 소프트웨어 측면으로 나누어 시스템을 구성했다. 먼저 하드웨어 측면은 다음과 같다.

 

  • 간단한 딥러닝 연산이 가능한 Jetson Nano Develop Kit을 장착
  • 미션 컴퓨터는 비행제어 컴퓨터와 유선 시리얼 통신으로 연결되며 비행 상태 정보를 기반으로 최적 경로를 계산함
  • 장애물 인지를 위해 스테레오 카메라 인텔 리얼센스 D455 사용
    • 0.6m ~ 최대 6m 까지의 물체를 인식해 Point Cloud 형태로 출력함
    • 카메라는 최대 해상도 1280x720로 30fps의 Point Cloud 데이터 획득 가능
  • 정밀 위치 추정을 위해 Piksi Multi GNSS 모듈 사용 (LTE 모듈)
  • 개발한 드론은 이륙 중량 2kg, 4셀 6400mah 배터리에 최대 20분 비행 가능

 

한 가지 팁은 대용량의 Point Cloud 데이터를 원활하게 얻기 위해선 USB 3.0 인터페이스를 사용해야 하나 USB 3.0 케이블에 전원이 인가되면 주변 GPS 정보를 교란하는 현상이 있어 USB 2.0 케이블을 이용해 스테레오 카메라 정보를 획득해야 했다는 점이다.

 

소프트웨어 측면으로는 microRTPS를 통해 uORB 토픽을 ROS2 토픽으로 바꿔 비행제어 데이터를 미션 컴퓨터 측으로 송신하도록 구성했다. 또 스테레오 카메라가 획득하는 Point Cloud 데이터의 경우 순간 데이터 통신량이 높기 때문에 대용량 데이터 처리를 위한 QoS 설정을 통해 원활한 데이터 처리가 가능하도록 설정했다.

 

여기까지가 드론 시스템 개발에 대한 하드웨어 측면과 소프트웨어 측면에 대한 기술이다. 이후에는 핵심인 장애물 회피 시스템을 개발하고 시뮬레이션 한 것에 대해 기술하고자 한다.

 

저자는 장애물을 회피하고 목표지점까지 갈 수 있는 전역경로계획(Global Path Planner)를 개발하여 적용했다. 아래는 전역경로계획 시스템의 아키텍처다.

 

크게 경로를 계산하는 Global Planner Node와 주변환경과 장애물을 3차원 그리드로 저장하는 Octomap Node로 구성되어 있다. Global Planner Node는 비행제어 컴퓨터(FCC)로부터 자세 정보인 vehicle_attitude와 위치 정보인 vehicle_global_position, vehicle_local_position을 수신한다. 또 스테레오 카메라로부터 획득하는 주위 환경에 대한 Depth 데이터를 모두 결합하여 드론의 주변 환경을 인식한 결과를 Octomap Node로 전달한다.

 

Octomap Node는 이렇게 전달받은 데이터를 기반으로 3차원 occupancy grid 형태로 만들고 다시 Global Planner Node로 전달하면 이 3차원 정보를 기반으로 비행목적지까지 장애물을 우회해 비행 가능한 최적의 경로를 실시간으로 계산한다. 이후 Global Planner Node는 현재 위치에서 목표 지점을 vehicle_command를 통해 PX4로 전달하고 PX4는 이 지점을 다음 waypoint로 설정하여 비행을 수행하는 방식이다.

 

아래는 전역경로계획을 사용하여 장애물회피주행을 수행하는 그림이다. 좌측에는 Gazebo 시뮬레이션이 구동되고 우측상단은 Octomap Node에서 생성한 3차원 occupancy grid이며 그 아래는 GCS인 QgroundController다.

 

 

여기까지가 전역경로계획을 기반으로 장애물을 회피하여 목표지점까지가는 시스템에 대한 설명이다. 저자는 나아가 장애물을 회피하면서 비행을 할 때 효율적인 비행이 필요하다고 말한다. 여기서 말하는 효율적인 비행이란 위험도가 낮은 비행구간에서는 빠른 비행을 하고 위험도가 높은 구간에서는 천천히 비행할 필요성이 있다고 말한다. 여기서 위험도는 어떻게 정의될까? 아쉽게도 이에 대한 내용은 없다. 다만 현재의 위험도가 사용자가 임의 지정한 threshold를 넘으면 속도를 최소화하고 그렇지 않다면 속도를 증가시키는 방면으로 다음과 같이 알고리즘이 동작한다는 것만 알 수 있었다.

 

 

저자는 비행을 위해 사용한 파라미터를 다음과 같이 별도로 정리했다. PX4에는 수 백 여개의 파라미터가 있는 만큼 비행과 관련된 중요한 몇몇 파라미터를 정리해주었다는 점에서 다소 큰 팁이라 느낀다. 아래 파라미터 중 위험도 기반 속도제어에 사용했던 파라미터는 min_speed_와 max_speed_다.

 

 

아래 그림은 위험도를 고려했을 때와 고려하지 않았을 때의 비행을 비교하여 나타낸 것이다.

 

 

초록선은 속도조절 알고리즘을 적용한 것이며 빨간선은 속도조절 알고리즘을 적용하지 않았을 때다. 그 결과 적용했을 때 목표지점까지 20초가 걸렸고 적용하지 않았을 때 32초가 걸렸다. 이를 통해 효율적인 주행을 위해서는 이러한 위험도를 계산하고 때에 따라 속도를 조절하는 알고리즘이 필요하다는 것을 알 수 있다.

2020년 한국항공우주학회에서 나온 논문으로, 핵심 내용은 PX4 기반 쿼드콥터에 스테레오 카메라를 사용하여 3차원 공간에서 자율탐사와 실시간 경로계획을 수행한 것이다. 경로계획을 위해 크게 광역 경로계획과 지역 경로계획으로 나누어 알고리즘을 수행했다. 

 

광역경로계획

광역경로계획은 그리드 맵을 사용하는 A* 계열 알고리즘이 많이 사용된다. A* 알고리즘은 2차원에서는 8방향 3차원에서는 26방향으로 인접한 노드를 연결하여 경로를 생성한다. 하지만 이러한 A* 알고리즘은 직선과 45도 방향의 대각선만 사용할 수 있다는 단점이 있다. 따라서 이러한 고정된 각도가 아닌 임의의 각도를 사용할 수 있는 Theta* 알고리즘이 만들어졌고, 또 A* 알고리즘의 검색 정보를 다음 검색에 재활용하여 빠른 속도로 탐색할 수 있는 D* 알고리즘 등이 연구되고 있다.

 

해당 논문에서는 A* 계열 알고리즘 중 속도가 가장 빠른 JPS 알고리즘을 사용했다. JPS 알고리즘은 논리적 동치 관계를 이용해 탐색 노드수를 크게 줄인 알고리즘이다. 그리드 맵의 크기가 커질수록 탐색 시간이 지수 함수 형태로 증가하는 A* 알고리즘을 선형에 가까운 탐색시간 증가율을 보이기 때문에 계산효율이 좋다는 특징이 있다.

 

지역경로계획

그리드 맵에 거리 정보를 추가하는 것은 그리드 맵의 각 장애물 셀마다 주변 셀에 거리 정보를 전파하는 방식으로 구현된다. 하지만 3차원 공간에서는 전파해야 할 정보가 상대적으로 많기 때문에 실시간 경로계획에 많은 시간이 소요된다. 이러한 계산효율 문제를 해결하기 위해 지역 그리드 맵이 사용된다. 아래 그림은 광역 경로계획(빨강)으로 출력된 경로를 지역 경로계획으로 수정한 경로(노랑)를 시각화한 것이다. 저자에 따르면 수정된 노란 경로가 더 안전한 경로라고 한다.

 

 

결과적으로 경로계획 알고리즘 수행 알고리즘으로 목표 속도와 yaw rate를 계산하여 PX4 노드에 Offboard 명령 메시지로 전달하여 드론을 제어한다. 이를 Gazebo 시뮬레이션 상에 적용하여 자율탐사로 매핑을 수행한 결과는 다음과 같다.

 

 

새롭게 알게 된 점은 경로계획 관련 알고리즘에 A*, Theta*, D* 이 사용된다는 점이고, 아직 사용해보지 않았지만 SLAM을 위해 Octomap을 사용한다는 점을 알게됨

 

 

본 논문은 2022년 한국소프트웨어종합학술대회에서 나온 논문으로 드론 내부 데이터 추출을 통한 포렌식의 활용 가능성에 대한 논문이다. UAV 시장이 군사, 건설, 물류 산업 등의 분야로 확장되면서 UAV 산업의 중요성이 높아졌다. 이에 따라 UAV를 대상으로 한 취약점 기반 공격이 증가했고 이에 따른 포렌식의 중요성이 대두 된 것이 이 연구의 배경이다. 

 

 

1. PX4 Autopilot 데이터 저장 방식

아래는 PX4 Autopilot의 아키텍처다. 빨간 박스로 표시된 부분이 PX4 Autopilot에서 데이터 저장과 관련된 모듈이다.

 

크게 3가지 모듈로 구성되며 dataman, param, logger다.

 

dataman 모듈: MAVLink로부터 전달받은 비행미션에 관련한 데이터를 SD Card에 저장

param 모듈: 사용자가 셸 커멘드를 통해 설정가능한 PX4 Autopilot 관련 파라미터를 EEPROM, SD Card, Flash 메모리에 저장

logger 모듈: GPS, IMU, 기압계 등의 센서로부터 들어오는 입력이나 Controller, Estimator에서 처리된 데이터를 PX4의 미들웨어인 uORB의 API를 통해 SD card에 저장하며 파일 형식은 ULog로 uORB 토픽 데이터를 저장함.

 

 

2. 드론 주요 데이터 정의 및 분석

 

비행 데이터: 비행 경로 & 미션 수행에 관한 데이터로 dataman 모듈에 의해 파일명이 ‘dataman’인 바이너리 파일로 SD card에 저장된다. dataman 파일에는 드론의 안전귀환지점인 Safe point, 비행구역인 Geofence point, 미션수행 정보인 Way point를 저장한다. Safe point는 UAV가 안전하게 착륙할 수 있는 지점을 의미하고 좌표계와 좌표로 구성된다. Geofence는 UAV가 안전하게 비행할 수 있는 구역으로 각 지점의 좌표와 Fence 형태로 저장한다. Way point는 UAV가 비행하는 경로 또는 수행해야 할 임무를 나타낸다.

 

설정 데이터: 기체 드라이버, 모듈에서 사용되는 파라미터 값으로 param 모듈에 의해 관리된다. 초기 설정 파라미터는 펌웨어에 저장되어 있고 설정값을 변경하는 경우 EEPROM에 저장된 mtd_params 파일에 파라미터 명과 함께 변경된 설정값을 저장한다. PX4 부팅시 퍼웨어에서 초기 파라미터를 RAM에 로드하고 mtd_params 파일에서 변경된 파라미터를 덮어써 기체의 파라미터를 수정한다. GCS에 전달하기 위한 파라미터값은 별도의 /tc/parameters.json.xz 파일에 저장된다.

 

로그 데이터: logger 모듈이 저장하는 uORB 토픽 데이터로 ULog 파일 형태로 SD card에 저장된다. 센서 데이터나 기체 내부 상태, 파라미터 값, 로그 메시지, RC 입력, CPU 부하, EKF 상태 등 여러 데이터가 저장된다.

 

 

3. 드론 내부 데이터 추출 방법

드론 내부의 데이터를 추출하기 위해 드론 기체와 로컬 PC와 USB 시리얼 포트로 연결 후 MAVLink의 하위 프로토콜인 MAVFTP를 이용해 추출한다. 아래는 PX4 Autopilot mini 4의 디렉터리 구조라고 한다.

/bin, /dev, /obj는 가상 파일 시스템에 의해 관리되어 MAVFTP로 폴더 추출이 불가능하다고 한다. proc의 경우도 추출이 불가능했으나 cat을 통해 데이터를 추출했다고 한다. 이외의 /etc와 /fs 디렉터리는 추출이 가능했다. 이렇게 추출 가능한 디렉터리를 활용해 데이터 분석 도구를 개발했고 포렌식에 활용하기 위해 간단히 파일 생성 타임스탬프와 해시값 계산, CSV 추출 기능 등의 기능을 구현했다. 

 

결론적으로 드론 포렌식을 위해 MAVFTP 프로토콜로 접근 드론 내부 데이터에 접근해 추출하는 방안을 제시했고, 데이터 추출을 위해 GUI 도구를 개발하였다. 

 

-- Question

Q1. Waypoint는 UAV가 비행하는 경로만을 나타내는 것이 아닌가? 수행해야 할 임무를 나타낸단 건 무슨 의미인가? 같은 의미로 볼 수 있는가?

Q2. MAVLink의 하위 프로토콜 종류는 무엇이 있는가?

Q3. 가상 파일시스템은 무엇이고 동작원리는 무엇인가?

2020년 대한전자공학회에서 나온 논문이다. 핵심은 제목 그대로 자율주행드론을 위한 위치제어와 고도제어가 핵심이다. 연구배경은 GPS와 같은 센서는 외부환경에서는 사용할 수 있지만 실내와 같은 내부환경에 들어오게 되면 차폐된 내부로 인해 GPS 신호가 단절될 수 있어 자율주행의 한계가 있다는 점이다. 따라서 실내환경에서 드론의 자율비행 임무수행을 위한 위치제어와 고도제어 방법에 대해 제시한다.

 

1. 위치제어

위치제어란 실내에서 장애물회피 임무를 수행할 뿐아니라 드론 기체가 외력을 받아 Drift되지 않도록 위치를 제어하는 것을 말한다. 논문에서는 위치제어를 위한 방법으로 px4flow를 사용해 컴퓨터비전 알고리즘을 적용했다. px4flow란 optical flow 센서 중 하나인데 optical flow는 영상을 통해 호버링 시 기체의 위치가 흔들리지 않도록 도와주는 센서다. (https://docs.px4.io/v1.13/ko/sensor/px4flow.html)

px4flow: 영상 변화에 따른 빛의 변화를 계산하는 기능의 카메라

 

 

2. 고도제어

고도제어란 지면으로부터 거리를 조절하는 것이다. 

자율주행에 고도제어가 필요한 이유는 3차원 공간(x, y, z)의 특정지점에서 비행이 가능해야 하기 때문이다. 드론의 고도제어를 위해 사용하는 센서는 적외선 센서, 기압센서, 초음파센서, 라이다센서가 있다. 결론부터 말하면 논문에선 다 사용해보았으나 라이다센서가 가장 높은 정확성을 보였다. 서술한 센서의 실험 결과를 차례대로 기술해보자면,

 

2.1 적외선 센서

적외선 센서를 사용한 결과 온도에 영향을 받아 외부환경 파악에 신뢰성 떨어지는 신호를 수신했다.

 

2.2 기압 센서

Pixhawk에 내장되어 있다고만 서술되어 있고 이에 대한 실험 내용은 누락되어 있음.

 

2.3 초음파 센서

초음파 센서는 초음파 방출 후 물체에 반사되어 돌아오는 시간을 통해 물체와의 거리를 구하는 센서다. 초음파 센서를 사용한 결과 비교적 고른 값을 수신하나 중간값, 평균값에 차이가 많이나는 이상치가 수신되는 경우가 발생했다. 이 이상치는 확장칼만필터(EKF)로 보정을 했음에도 고도제어에 부정확성을 야기하는 것이 관찰되었다. 

 

실험에 사용한 초음파센서는 Maxbotix사의 HRLV-MaxSonar-EZ4 센서이며, EZ4에서 0~4는 빔폭을 나타내고 클수록 빔폭이 좁아진다. 초음파 센서에 들어온 아날로그 신호를 ADC 포트를 거쳐 디지털 신호로 바뀐다음 Pixhawk로 전달된다. 초음파 센서의 입력값을 정확히 이용하기 위해선 Scaling 파라미터를 조절해주어야 한다. 이는 Ardupilot 공식 홈페이지에서 제시하는 값이 있으나 오차가 커서 잘 들어맞지 않았다.

 

2.4 라이다 센서

라이다 센서를 px4flow 센서와 함께 사용한 결과 드론 위치와 고도를 제어할 수 있었고 실내 환경에서 높은 신뢰성을 얻었다. 실험에 사용한 제품은 Benewake 사의 TF mini LiDAR를 사용했다. 이는 단거리 측정을 목적으로 개발된 센서로 실내에서 최대 12m, 실외에서 최대 7m 거리를 측정가능하다. TF mini Lidar는 Serial, UART, I2C 통신 등 다양한 방법으로 연결할 수 있고 실험에선 Serial 포트를 통해 연결했다. LiDAR 센서를 통한 실험의 결과로는 별다른 센서 calibration 없이 비교적 정확한 값을 측정할 수 있었다. 논문에선 Pixhawk와 LiDAR 센서의 Serial 통신에서 BaudRate를 115200으로 설정해줘야 한다고 한다.

 

TF Mini LiDAR

 

3. 실험 결과

 

초록선이 라이다 센서고 빨간선이 초음파 센서다. 초음파의 경우 드론이 움직일 때 마다 값의 변화가 크다. 즉 노이즈가 많이 추가되는 것을 볼 수 있다. 반면 라이다 센서는 안정적인 고도값을 측정했다. 초음파 센서는 0.5m 이상 오차가 발생했지만 라이다 센서는 0.05m의 오차만 발생했다고 한다. 위에서도 기술했지만 초음파 센서 값을 EKF로 보정했으나 오히려 이착륙시 고도제어가 더 불안정하게 되었고 결론적으로 고도제어에는 초음파 센서가 적합하지 않다는 결론을 내렸다.

 

--- 결론 ---

다른 적외선 센서나 기압 센서와의 비교가 없으나 결론적으로 라이다 센서가 가장 드론 위치제어와 고도제어에 안정적이라고 한다.

 

--- 이외 기타 내용 정리 ---

- px4flow 사용을 위해 초점 조절과 calibration을 수행해야 하는데 이는 파라미터로서 지원되고 파라미터 설정이 가능한 GCS를 사용해 가능함. 논문에선 Mission Planner 사용

- px4flow calibration은 기체의 자이로 정보와 px4flow의 자이로 정보를 일치시킴으로써 수행함. 이를 위해 기체 프로펠러를 뺀 체 손으로 roll, pitch 동작을 반복하고 이후 로그를 통해 pixhawk의 자이로 값과 px4flow의 자이로 값을 비교해 오차가 있다면 파라미터를 변경해 오차를 줄이는 방식을 사용함.

- px4flow 정상작동을 위한 전원공급을 위해 BEC를 이용해 5V 전원 별도 공급

- px4flow와 pixhawk 간의 연결을 위해 I2C 통신포트를 사용.

 

--- Question ---

Q1. 위 그래프의 초록선은 저자가 간단히만 언급했던 라이다 센서와 px4flow 센서를 함께 결합한 성능인가 라이다 센서의 독립적인 성능인가? 

Q2. 라이다 센서 vs 카메라 센서를 비교하면 어떨까?

Q3. PMW란 무엇인가?

Q4. QGroundController에서도 px4flow calibration을 수행할 수 있는가?

2019년 한국통신학회에서 나온 논문이다. Gazebo 시뮬레이션 환경에서 드론에 LiDAR를 장착한 다음 장애물 회피 알고리즘을 통해 테스트를 한 것이 핵심이다. 장애물 회피 알고리즘은 가장 처음 직관적으로 떠올릴 수 있는 로직이자 심플한 절차로 수행된다. 

목표를 정하고 장애물을 인식하고 장애물과 이에 반대 방향의 벡터를 만들고 목표 벡터와 반대 방향의 벡터를 결합하는 것이 골자다. 위와 같은 장애물 회피 알고리즘을 적용했을 때 아래와 같은 경로로 드론이 장애물을 회피하며 목표지점에 도달하게 된다.

 

 

이외에 몇 가지 팁이있다면 첫 번째는 드론을 너무 빠른 속도로 움직이면 관성에 의해 장애물에 부딪히기 때문에 드론의 최대 비행 속도를 적절히 제어해야 한다. 두 번째는 Gazebo 시뮬레이션은 URDF, SDF를 사용하는데 URDF가 SDF에 비해 ROS와 호환성이 좋아 로봇 모델링에 많이 사용한다는 것이다. SDF는 Gazebo 시뮬레이션에 사용할 수 있지만 ROS와 호환성이 좋지 않다고 한다. 따라서 URDF로 모델링하는 것이 최선이라고 함. 저자들은 URDF로 기술된 드론 모델에 추가코드를 통해 PX4Flow, SF-10a, RPLIDAR 센서가 장착된 드론을 모델링 했다. 세 번째는 원하는 모델(메쉬)이 없다면 Blender나 Sketchup와 같은 모델링 툴을 이용해 직접 모델을 구성할 수 있다. 

 

Q1. 목적지 지정 방법은? GPS 좌표 기반?

Q2. 과정 5에서 드론 이동 방향과 속도 결정은 구체적으로 어떻게 이뤄지는가?

Q3. 장애물이 조밀하게 있을 경우에도 알고리즘이 동작할 수 있는가?

Q4. SDF 포맷이 공개된 것처럼 URDF도 공개된 포맷이 있을까?

Q5. 모델링 툴로 만들면 곧 바로 Gazebo에 적용할 수 있는가?

2021년 한국항공우주학회에서 나온 논문이다. 내용의 핵심은 드론이 장애물을 회피하면서도 안전하게 비행할 수 있는 전역 경로 플래너(Global Path Planner)를 개발한 것으로 아래와 같은 아키텍처를 갖는다. 비행제어 S/W로는 PX4를 활용했고 미션 컴퓨터로는 Jetson Nano를 사용했다. 

위 아키텍처의 핵심은 Mission Computer 내의 Global Planner Node와 Octomap Node 두 가지다. Global Planner Node는 PX4로부터 드론의 자세정보(vehicle_attitude)와 위치정보(vehicle_local_position, vehicle_global_position)를 수신하고 동시에 Depth data를 수신한다. 이후 Depth data의 정확한 위치를 계산한 값을 Octomap Node로 보낸다. Octomap Node는 수신 받은 데이터를 사용해 비행 구역의 장애물 유무를 3차원 occupancy grid map으로 만들어 Global Planner Node로 전달한다. 이후 Global Planner Node는 Octomap Node에서 전달받은 3차원 지형정보를 기반으로 드론이 목표지점까지 장애물과 충돌하지 않고 안전히 비행할 수 있는 경로를 지속적으로 계산하여 PX4에 다음 위치를 명령하는 방식으로 비행이 이뤄진다. 

 

위와 같이 구성한 아키텍처는 gazebo 환경에서 PX4-ROS2 기반의 경로 계획을 수행하는 시뮬레이션을 통해 그 동작을 확인하였다. 인식한 장애물을 우측상단의 rviz를 통해 3차원 맵으로 시각화하였고 또 목적지까지 장애물을 회피하며 비행하였다. 

 

 

실질적으로 얼마나 잘 동작했는지는 확인할 수 없었지만 목표지점 도달을 위해 경로 계획(Path planning)이 필요하고 이러한 경로 계획에 필요한 여러 파라미터 값을 알 수 있었다. 예컨데 vehicle_command를 통해 드론의 위치 명령을 내리거나 up_cost, down_cost를 조정해 드론의 수직이동에 소모되는 에너지를 다르게 계산한다는 점, 또 risk_factor, neighbor_risk_flow를 조정해 지형지물의 위험도 수준을 다르게 줄 수 있다는 점을 알게 됐다. 또 새롭게 접하게 Octomap과 occupancy grid map이 있었고 향후 이에 대해 알아보고자 한다.

최근 드론의 수평제어를 위해 PX4의 gazebo에서 출력하는 IMU 센서 데이터를 기반으로 calibration을 수행하여 보정값을 다시 드론으로 전달하는 기능 구현이 필요하다 생각됐다. 결론부터 말하자면 삽질이었고 이미 PX4 펌웨어에서는 센서 데이터에 대해 확장칼만필터를 적용하여 제공하고 있어서 별도로 기능 구현을 할 필요가 없었다. 그래도 간단히나마 삽질 과정을 기록해본다.

 

찾다보니 IMU 센서 데이터를 보정하기 위해 칼만필터와 확장칼만필터가 사용되는 것을 알 수 있었다. 칼만필터는 선형시스템의 상태추정을 위해 사용되고 확장칼만필터는 비선형시스템의 상태추정을 위해 사용된다. 이러한 칼만필터와 확장칼만필터을 통해 드론의 자세추정과 수평제어에 사용할 수 있어 비행의 안정성을 가져올 수 있기 때문에 필수적이다. 칼만필터는 선형시스템의 실제상태와 추정상태 간의 차이를 나타내는 '오차공분산'을 최소화하는 알고리즘이다. 통계 기반 알고리즘이며 이전 추정상태가 다음 상태추정에 영향을 미치므로 마르코프 연쇄를 가정한 알고리즘이다. 이러한 칼만필터는 선형시스템일 경우 최적화된 상태 추정이 가능하다는 것이 수학적으로 증명되어 있다고 한다. 하지만 대부분의 경우 비선형시스템을 따르므로 모델링을 위해서는 확장칼만필터를 사용한다. 확장칼만필터는 비선형시스템을 나타내는 상태식을 매 순간 미분하여 선형시스템으로 근사한 다음 칼만필터를 적용하여 비선형시스템의 상태를 추정한다. 아래는 칼만필터의 알고리즘이다. 

 

칼만필터에 사용되는 주요 변수는 A, H, Q, R, P, K로 여섯 가지다. 이 중 네 가지(A, H, Q, R)는 이미 정해진 값이며 칼만이득인 K는 자연스럽게 계산되는 값이다. 실제로 구해야할 것은 P 밖에 없다. 이 P가 오차공분산이며 이를 계산하여 다음 상태추정에도 활용한다. 이 P를 최소화하는 것이 칼만필터 알고리즘의 목표다. 이러한 칼만필터를 활용해 IMU 센서 데이터를 보정하여 드론 수평제어 기능을 만들고 싶었다. 나이브했던 접근은 PX4 uORB topic 중 IMU 센서 관련 토픽을 구독해 칼만필터 알고리즘을 적용해 보정하고 보정값을 다시 토픽 발행을 통해 적용해주려 했다. 

 

 

PX4 uORB의 topic 중 /fmu/out/sensor_combined에서 IMU 센서값을 얻을 수 있었고 C++로 /fmu/out/sensor_combined 데이터를 구독하는 기능을 구현했다. 다만 칼만필터 알고리즘 적용이전 간단히 하드코딩된 값으로 설정해 발행해보았지만 적용되는 것 같지 않았다. 알고보니 /fmu/in/sensor_combined가 있을 것이고 여기로 보정값을 전달하면 수평제어가 되지 않을까 했었는데 /fmu/in/sensor_combined 토픽 자체가 없었던 것이다. 왜 없을까 생각해보았을 때 어쩌면 안정성을 추구하는 PX4의 철학때문이지 않을까 싶다. 잘은 알지 못하겠다. 아무튼 이렇게 IMU 센서 관련 정보를 직접적으로 calibration할 수 없다면 어떻게 이뤄질까하며 찾다보니 /fmu/out/sensor_combined는 이미 확장칼만필터가 적용된 센서값임을 알 수 있었다. PX4에는 이러한 확장칼만필터와 같은 기능을 활성화할지 비활성화할지를 결정하는 여러 개의 'parameter'가 있다. 이러한 paramter는 PX4의 펌웨어에 접근하거나 QGroundController 내부에서 변경이 가능하다. (https://docs.px4.io/v1.11/en/advanced_config/parameter_reference.html)

 

위 parameter reference에서 보다보면 확장칼만필터(EKF) 관련 parameter가 수 십여 개가 있는 것을 확인할 수 있다. EKF2_*로 시작하는 parameter들이다. 이러한 parameter들을 포함하여 PX4에서 사용하는 여러 paramter들은 PX4 셸에서 param show 명령을 통해서도 그 목록을 확인할 수 있다. 또 param show -c 옵션을 통해 default 값에서 바뀐 모든 매개변수를 확인할 수도 있다.

 

 

또 이런 parameter들은 PX4가 실행할 때 start script인 /PX4-Autopilot/ROMFS/px4fmu_common/init.d-posix/rcS 파일에서도 설정할 수 있음을 확인할 수 있었다.

 

 

또 PX4 셸에 구현되어 있는 uORB 앱 중에서 확장칼만필터를 보완한 ekf2를 확인할 수 있었다. ekf2 start를 통해 실행시킬 수도 있는 것 같은데 에러가 발생한다. 잘 모르겠다.

 

 

참고로 이 확장칼만필터인 ekf2는 PX4-Autopilot/src/modules/ekf2에서 구현체를 확인할 수 있다. 워낙 PX4 관련 레퍼런스가 적고 여기저기 찾으면서 부분을 더듬고 있다보니 작성한 글에도 오류가 있을진 모르겠다. PX4에 대해 익숙해진다면 고생하는 초심자들을 위해 관련 가이드 서적을 만들고 싶단 생각이 든다. 다음엔 어떤 기능을 만들어야 할까.

+ Recent posts