내부 process간 통신의 이해

process나 application 사이에서 통신이 PX4 소프트웨어 구조를 이해하는 핵심이다. 예를 들자면 센서 어플리케이션에서 얻은 값을 attitude filter 어플리케이션으로 보내는 경우이다. process(보통 node라고 부르기도 함)는 topic이라는 버스상에서 메시지를 교환한다. PX4에서 topic은 단 하나의 message type을 포함한다. 예로 vehicle_attitude topic은 attitude 구조체(roll, pitch, yaw)를 포함하는 메시지를 전송한다. node는 message를 bus/topic상에서 보내거나 bus/topic에서 수신할 수 있다. 하지만 어떤 process와 통신하는지를 알지 못한다. 하나의 topic에 복수개의 publisher와 subscriber가 존재할 수 있다. 이런 디자인 패턴으로 locking 문제를 해결할 수 있어서 로보틱스 분야에서 아주 일반적이다. 이를 더욱 효과적으로 만들기 위해서 bus상에서 단 하나의 메시지만 존재하고 메시지를 유지하는 queue를 두지 않는다.

publish/subscribe 메커니즘은 Micro Object Request Broker(uORB)로 구현한다. broker는 publish-subscribe pattern의 단순한 버전을 구현한 것이다.

시작하기
상세한 부분으로 들어가기 전에, 단순하면서 완성된 publisher/subscriber pair를 살펴보자. 아래 코드에서 publisher는 random_integer라는 topic을 advertise하고 random integer를 가지는 topic을 업데이트한다. subscriber는 확인 후 이 업데이트된 값을 출력한다.

topic.h


// topic 선언
ORB_DECLARE(random_integer);

//publish할 자료구조 정의를 통해 subscriber가 볼 수 있음
struct random_integer_data {
int r;
};


publisher.c

#include <topic.h>
// topic metadata 생성
//publish에 사용할 파일 핸들
static int topic_handle;
int int()
{
//첫번째 publication을 위해 초기 data 생성
struct random_integer_data rd = { .r = random(), };
topic_handle = orb_advertise(ORB_ID(random_integer), &rd);
}

int update_topic()
{
// publication을 위해 새로운 난수 생성
struct random_integer_data rd = { .r = random(), };

// 새로운 자료구조 publish
orb_publish(ORB_ID(random_integer), topic_handle, &rd);
}

subscriber.c


#include <topic.h>
// subscribing을 위한 file handle
static int topic_handle;

int init()
{
// topic에 subscribe하기
topic_handle = orb_subscribe(ORB_ID(random_integer));
}

void check_topic()
{
bool updated;
struct random_integer_data rd;

// 마지막으로 값을 읽은 이후로 topic이 변경 되었는지 확인
orb_check(topic_handle, &updated);

if(updated) {
// 갱신된 자료구조의 복사본을 만들기
orb_copy(ORB_ID(random_integer), topic_handle, &rd);
printf("Random integer is now %d\n", rd.r);
}
}

 

[Pixhawk] 내부 process간 통신의 이해

Leave a Reply

Your email address will not be published. Required fields are marked *