상세 컨텐츠

본문 제목

[드론 만들기] uORB란 무엇인가

만들기/드론

by kwangpil 2020. 6. 4. 12:42

본문

 

이전 글...

 

드론 만들기

  

   하드웨어

      기본부품

         비행 제어기(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 사용방법 3/4      

         QGroundControl 사용방법 4/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(우분투) 기초용어

 

   미들웨어

       uORB

           uORB 새 토픽 추가하기   

     MAVLink

         MAVLink 설치하기

         MAVLink 라이브러리 생성하기

     

   조립

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

      Power Management Board에 커넥터 연결하기

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

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

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

      GPS, Telemetry Pixhawk 4에 연결하기

  

   통신

      MAVLink

         MAVLink 설치하기

         MAVLink 라이브러리 생성하기

      uORB

           uORB 새 토픽 추가하기   

 

   개발

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

         툴체인(toolchain) 설치하기

            jMAVSim 사용하기 1/2

            jMAVSim 사용하기 2/2

            Gazebo 사용하기 1/4

            Gazebo 사용하기 2/4

            Gazebo 사용하기 3/4

            Gazebo 사용하기 4/4      

      내장된 응용 프로그램 생성 및 실행하기

      PX 시스템의 구성        

 

   비행

      쿼드콥터(Quadcopter) 비행 원리      

 

   문제해결

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

 

   기타

      비행금지구역

      비행 시 주의 사항   

      멀티콥터 종류

      커넥터(connector)

      용어


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

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

참고만 하세요~!

 

※ 아래 내용은 픽스호크 홈페이지 내용을 기반으로 작성한 것으로 틀린 내용을 포함하고 있을 수도 있습니다.

※ 참고만 하세요.


픽스호크 홈페이지를  훝어보다보면 생소하지만 반복되는 용어들이 많이 있는데 그 중 하나가 uORB이다. 

소문자와 대문자가 섞여 눈에는 띄지만 무슨 의미인지인지 추측하기는 어려운 uORB가 무엇인지.... 픽스호크 홈페이지 참조 및 검색을 통해서 모은 정보를 정리해봤다.

 

 

1. uORB란?

 

uORB는 PX4의 내부 통신 메커니즘으로  Micro Object Request Broker의 줄임말이다. 그러니까 uORB의 u는 영어 알파벳 소문자  u가 아니라 100만 분의 1을 의미하는 μ이다. 한국말로 억지 해석해보면 '소규모 객체 요청 브로커'인데 이런 영역으로 너무 관심이 없었기 때문일까... 한국말이 영어보다 더 난해한 느낌이다..

 

 

uORB에 대해서 알아보기 전에 먼저 소규모란 의미의 u를 뺀 ORB가 무엇인지 알아보자. 

 

ORB는 분산 컴퓨팅(distributed computing) 환경에서 한 컴퓨터의 프로그램이 통신망을 통해 다른 컴퓨터의 프로그램을 호출할 수 있는 미들웨어(middleware)로 프로그램을 식별해서 찾고 데이터를 전달/요청하는 통신 환경을 제공한다.

(분산 컴퓨팅: 여러 대의 컴퓨터가 통신망으로 연결되어 하나의 컴퓨터처럼 동작하는 환경...이라고 한다)

 

<ORB>

간략하게 표기한 위의 그림에서 보듯이 ORB는 컴퓨터 프로그램(object1, object2)들의 내부 통신을 연결해주는 중개 역할을 하고 있다.

 

그렇다면 ORB에 u 하나가 더 붙은 uORB는 ORB와 뭐가 다를까?

 

기능은 ORB와 마찬가지로 PX4에서 응용 프로그램 사이의 모든 내부 통신을 처리하는 중개 역할을 한다. 다만 차이점이라면 uORB는 PX4를 위해서 만들어져 더 작고, 더 가볍다. 그래서 ORB 앞에 마이크로(micro, u)가 붙여져 있다. 

 

 

2. uORB는 어떻게 내부 통신을 처리할까?

 

uORB가 PX4에서 무슨 역할을 하는지는 이제 대략 이해가 되었다.

그렇다면 이제 남은 궁금증은 uORB가 어떻게 응용 프로그램 사이의 통신을 조정하는 가이다.

 

이에 대해서 이해하려면 먼저 '메시지', '토픽', '모듈', '발행/구독'이라는 생소한 용어에 익숙해져야 한다.

아래는 이에 대한 간략한 설명이다.

 

▶ 메시지(message)

기본적인 정보정의하는 텍스트 파일필드 형식(field type)필드 이름(field name)들이  각 줄마다 정의되어 있다.

파일의 확장자명은 'msg'이며 메시지 파일에서 사용할 수 있는 필드 형식은 아래와 같다:

- int8, int16, int32, int64

- float32, float64

- string

- time, duration

- 다른 msg 파일

- 가변 크기 배열 및 고정 크기 배열

 

그러니까 메시지 파일은 통신에 사용될 데이터의 이름(예: x)과 그 데이터의 형식(예: float 32)을 정해서 나열해 놓은 것이라고 간단하게 요약할 수 있다.

 

메시지 파일은 필요할 경우 직접 작성할 수도 있고(uORB 새 토픽 추가하기 참조) PX4에서 기본적으로 제공하는 것을 필요에 따라 사용할 수도 있다.

 

PX4에서 기본으로 제공하는 메시지 파일은 소스코드를 다운로드한 디렉터리인 PX4-Autopilot> msg 디렉터리에 저장되어 있다.

 

아래는 기본 제공하는 msg 파일 중 하나인 sensor_accel.msg이다.


uint64 timestamp           # time since system start (microseconds)
uint32 device_id           # unique device ID for the sensor that does not change between power cycles

uint64 error_count

float32 x           # acceleration in the NED X board axis in m/s^2
float32 y           # acceleration in the NED Y board axis in m/s^2
float32 z           # acceleration in the NED Z board axis in m/s^2

uint32 integral_dt           # integration time  (microseconds)
float32 x_integral           # delta velocity in the NED X board axis in m/s over the integration time frame (integral_dt)
float32 y_integral           # delta velocity in the NED Y board axis in m/s over the integration time frame (integral_dt)
float32 z_integral           # delta velocity in the NED Z board axis in m/s over the integration time frame (integral_dt)

float32 temperature           # temperature in degrees celsius

float32 scaling                   # scaling from raw to m/s^s
int16 x_raw
int16 y_raw
int16 z_raw


이러한 메시지 파일들은 빌드 때 해석되고 C/C++ 구조체로 변경되어 프로그램 코드에 사용된다. 이 파일들은 PX4-Autopilot> msg >build>px4_fmu-xx_default\uORB/topics에 저장되어있다.

 

아래는 sensor_accel.msg가 변환된 sensor_accel.h이다.


/* Auto-generated by genmsg_cpp from file sensor_accel.msg */
#pragma once
#include <uORB/uORB.h>


#ifndef __cplusplus

#endif

#ifdef __cplusplus
struct __EXPORT sensor_accel_s {
#else
struct sensor_accel_s {
#endif
       uint64_t timestamp;
       uint64_t error_count;
       uint32_t device_id;
       float x;
       float y;
       float z;
       uint32_t integral_dt;
       float x_integral;
       float y_integral;
       float z_integral;
       float temperature;
       float scaling;
       int16_t x_raw;
       int16_t y_raw;
       int16_t z_raw;
       uint8_t _padding0[2]; // required for logger

#ifdef __cplusplus

#endif
};

/* register this as object request broker structure */
ORB_DECLARE(sensor_accel);

#ifdef __cplusplus
void print_message(const sensor_accel_s& message);
#endif


▶ 토픽(topic)

uORB에서 메시지를 보내고 받는 개별적인 통신 채널을 토픽이라고 한다. 이러한 토픽들은 빌드 시 메시지와 동일한 이름으로 등록된다. 

모든 토픽들은 복수의 발행자(publisher)와 구독자(subscriber)를 가질 수 있지만 최소한 하나의 발행자와 구독자를 가져야 한다.

 

▶ 모듈(module)

프로세스, 노드(node), 응용 프로그램이라고도 하며  각자 특정 기능을 가지고 있다.

 

그러니까 예를 들어 속도 측정 센서 모듈의 경우, 비행체의 속도를 측정하는 특정한 기능을 가지고 있으며 이 모듈은 PX4에 내장된 응용 프로그램 등과 같은 다른 모듈과 통신하기 위해서 uORB를 사용한다.

 

모듈은 토픽광고(advertise)/발행(publish)할 수도 있으며 필요한 토픽구독(subscribe)할 수 있다. 또 구독한 토픽의 데이터복사하여 데이터를 이용/수정할 수도 있다.

모듈은 복사하여 수정한 토픽을 다른 모듈이 구독할 수 있게 다시 광고/발행할 수도 있다. 

 

▶ 발행/구독(Publish / Subscribe)

토픽으로 메시지를 보내는 것발행이라고 하며 발행된 토픽을 받는 것구독이라고 한다. 


 

위에서 uORB를 이해하기 위한 기본 용어인 메시지, 토픽, 모듈, 발행/구독을 위에서 간단히 알아보았다.

그럼 이제 uORB를 통해 어떻게  PX4에서 모듈들이 통신하는지 알아보자.

 

uORB의 통신방법은 MAVLink의 토픽 모드(topic mode)와 유사하다. 그러니까 uORB도 특정 수신자 없이 토픽이 발행되고 구독되는 publish-subscribe 형식의 미들웨어이다.

 

MAVLink와 uORB 두 통신의 차이점이 있다면 MAVLink가 PX4의 외부 통신을 담당하고 있고 uORB는 PX4의 내부 통신을 담당하고 있다는 것이다.

그러니까, MAVLink의 경우 PX4와 지상 통제소, companion computer 등 사이의 통신을 담당하고 uORB의 경우 PX4에 내장되어 있는/외부 장착되는 센서(드라이버)와 비행을 제어하는 응용 프로그램들 사이의 통신을 담당한다.

 

uORB의 대략적인 통신 단계는 아래와 같다.

 

먼저 (1) 메시지/토픽 추가한다. 만약 PX4에서 미리 선언되어 있는 메시지/토픽을 사용할 경우 이 과정은 필요하지 않다. 그다음 (2) 발행자(publisher, 모듈)토픽광고한 후 발행한다. 그러면 (3) 구독자(subscriber, 모듈)는 이 토픽구독하고 프로그래밍에 따라 구독한 토픽을 주기적으로 업데이트한 후 토픽복사하고 필요에 맞게 사용한다.

 

아래는 이 과정을 사용되는 함수와 함께  간략하게 그려 놓았다. 

 

<uORB 통신>

 

uORB 통신에 사용되는 함수는 그 이름에서 기 기능을 쉽게 유추할 수 있다.

 

orb_advertise( )는 광고(advertise) 함수로 토픽을 발행하기 전에 먼저 토픽을 광고한다. 만약 토픽 발행 전에 토픽을 광고하지 않으면 이 토픽을 위한 물리적인 메모리 공간이 존재하지 않게 된다.

 

orb_publish( )는 토픽에 새로운 데이터를 발행하는 함수이며 구독자에게 데이터가 발행되었음을 알린다.

 

orb_subscribe( )는 토픽을 구독하는 함수로 만약 시스템에 알려져 있지 않은 토픽이라면 구독은 실패한다.

 

orb_copy( )는 구독된 토픽으로부터 데이터를 복사하다. 구독자는 구독한 토픽의 데이터를 다른 구독자와 공유해서 데이터를 참조하는 것이 아니라 데이터를 복사하여 임시 버퍼에 저장한 후 자신에게 맞게 데이터를 수정/사용한다.

 

물론 이 외에도 uORB에는 더 많은 함수들이 사용되며 위의 그림은 앞서 언급했듯이 간략하게 필수적인 함수만 표시해 놓은 것이다. 


대략적으로 uORB가 무엇이고 어떻게 통신하는지 이해가 되지만, 그래서 이걸 어떻게 사용하는 거야...라고 드는 의문이 든다. 이에 대한 의문은  uORB 새 토픽 추가하기에서 알아보기로 하고 uORB에 대한 기본적인 설명은 여기서 마친다.

 

 

 

 

관련글 더보기

댓글 영역