[OpenDDS] 3.실시간 영상 스트리밍 구현::단방향

Juhyun Maeng
juhyun.maeng
Published in
8 min readAug 30, 2019

맹주현 (JuHyun Maeng), 이동혁(DongHyuk Lee)

지난 2부에 이어 이번 3부에서는 OpenDDS 기반의 네트워크 환경에서 OpenCV를 통하여 획득한 웹캠의 영상을 단방향으로 전송하는 과정에 대한 설명을 다룹니다. 이후 글을 통하여 양방향 통신 과정에 대한 설명을 다룰 것입니다.

단방향 통신을 구현하기 위하여 IDL 구조체 내 sequence형 변수(데이터 타입)를 선언하였습니다. 그리고 Publisher에서 OpenCV를 통하여 얻은 Mat 타입의 영상 데이터를 앞서 말한 sequence형 변수에 저장하여 Subscribe에게 전송하도록 하였습니다. 또한, Subscriber는 받은 데이터를 다시 Mat 타입으로 변환한 후, 재생하도록 구현하였습니다.

OpenDDS의 IDL(Interface Definition Language) 파일은 실제 전송되는 데이터와 관련한 자료형에 대한 선언이 되어있는 파일입니다. 우리는 이 파일을 사용하여 C++이나 JAVA에서 OpenDDS가 동작하도록 하기 위하여 IDL 타입의 파일로 데이터를 선언하였습니다.

Messenger 예제 소개

OpenDDS에서 기본적으로 지원하는 Messenger 예제를 통하여 실시간 영상 스트리밍 구현을 진행하였습니다.

여러 예제 중, Messenger 예제를 선택한 이유는 OpenDDS에서 사용하는 Pub/Sub 모델이 구현되어 있고, 이 모델이 우리가 구현하려는 환경에 필요했기 때문입니다. 또한, Messenger 예제 안에 포함된 run_test.pl 실행 파일을 통하여 Publisher와 Subscriber를 하나의 노드에서 동시에 실행시켜 단방향 통신 실험을 할 수 있기도 합니다.

OpenDDS에서 예제 파일이나 테스트 파일은 Perl 언어로 작성되어 있으며, Perl 프로그래밍 언어는 인터프리터 방식을 사용합니다.

구현에 사용한 Messenger 예제

Messenger 예제는 OpenDDS를 Microsoft Visual Studio 2015로 빌드한 후, 솔루션 탐색기를 통하여 찾을 수 있습니다. 예제가 저장된 폴더는 OpenDDS-3.13.2/DevGuideExamples/DCPS/Messenger이며, Visual Studio에서 위 그림에 보이는 3개의 프로젝트가 Messenger 예제에 해당합니다. 해당 프로젝트에서 데이터 전송에 사용하는 구조체인 Messenger.idl를 확인할 수 있고, publisher.cpp와 DataReaderListenerImpl.cpp에서 전송부와 수신부 각각을 확인할 수도 있습니다.

Messenger 예제 중 실시간 영상 스트리밍 구현을 위해 사용한 파일

Messenger.idl에는 실제 전송되는 데이터들이 정의되어 있습니다. 선언(정의)되어 있는 자료형으로는 Messenger 예제에서 Publisher가 전송하는 from, subject_id, subject, count, text가 있습니다. publisher.cpp에서는 Messenger.idl에서 선언한 자료형을 불러와 데이터를 입력하고, 이를 Publishing 합니다.

OpenDDS에서 IDL을 사용하는 이유는 특정 프로그래밍 언어에 의존적이지 않은 Topic을 Publisher와 Subscriber 사이에서 주고받도록 하기 위함입니다. 우선 IDL은 소프트웨어 컴포넌트의 인터페이스를 묘사하기 위한 명세 언어입니다. 이 IDL은 어느 한 언어에 국한되지 않는 언어 중립적인 방법으로 인터페이스를 표현함으로써, 같은 언어를 사용하지 않는 소프트웨어 컴포넌트 사이에서도 통신을 가능하게 합니다.

Messenger.idl 구조체 내부

영상 스트리밍 구현을 위하여 Messenger.idl에 sequence형 변수를 위 그림에서 처럼 추가하였습니다. 이 변수는 1차원 배열이며, 최대 크기를 원하는 크기만큼 지정할 수 있습니다. 하지만 실제 구현에서 변수 선언시 따로 크기 지정을 하지는 않았습니다.

OpenCV로 획득하는 Mat 타입의 데이터를 Messenger.idl 구조체에 선언한 sequence형 변수에 저장하여서 Publisher가 전송할 때 이용할 수 있도록 하였습니다.

전송부 구현(publisher.cpp)

publisher.cpp 중 영상 데이터를 전송하는 함수

publisher.cpp는 OpenDDS Messenger 예제에서 전송을 담당하는 부분이며, 이 파일 내에서 영상 스트리밍 구현에 필요한 실제 데이터를 전송하는 함수를 찾아보았습니다.

위 그림에서 확인할 수 있는 write 함수가 실제 데이터를 전송하는 함수에 해당하며, 이 함수는 message 구조체를 전송합니다. 이 message 구조체는 앞서 말한 Messenger.idl 구조체 안에 선언되어 있습니다.

여기서 OpenCV를 통하여 획득할 수 있는 Mat 타입의 데이터를 Messenger.idl에 추가한 sequence형 변수에 저장하여서 Publishing 하도록 구현하였습니다.

write 함수는 Publishing 하고자 하는 데이터를 동일한 토픽을 가지고 있는 Subscriber에게 전송하는 함수이며, 파라미터는 Publishing 하는 데이터인 message 구조체와 리소스 관리를 위하여 사용되는 DDS::HANDLE_NIL가 있습니다.

위 설명과 같이 publisher.cpp를 통하여 실시간 영상 스트리밍을 위한 전송부에 대한 구현을 마쳤습니다.

수신부 구현(subscriber.cpp)

DataReaderListenerImpl.cpp 중 영상 데이터를 수신하는 함수

DataReaderListenerImpl.cpp에서는 on_data_available을 통하여 수신한 데이터를 읽어 들이는 작업을 합니다.

위 그림에서 확인할 수 있는 take_next_sample 함수가 실제 데이터를 수신하는 함수에 해당하며, 이 함수는 Publisher의 wirite 함수가 전송하는 message 구조체를 수신합니다. take_next_sample 함수는 Publishing 된 데이터를 수신하는 함수이며, 파라미터는 Subscribing 하는 데이터인 message 구조체와 info가 있습니다. OpenDDS에서 sample 이라고 표현하는 부분은 데이터를 의미하는데 파라미터로 포함된 info가 sample에 대한 정보를 담고 있습니다.

OpenDDS 에서 Publisher는 publisher.cpp를 통하여 Topic 생성과 DataWriter 생성 등 Pub/Sub 통신을 위하여 필요한 작업을 수행하고, 실제 데이터를 전송하는 기능을 합니다. 또한, Subscriber는 subscriber.cpp를 통하여 Pub/Sub 통신에 필요한 요소인 Topic 생성과 DataReader 생성에 관한 기능을 하고, DataReaderListenerImpl.cpp에서 데이터를 수신하여서 처리합니다.

그리고 수신부인 DataReaderListenerImpl.cpp에서 message 구조체 안에 data라고 선언된 sequence형 변수를 저장하도록 하였습니다. 여기서 수신된 영상 데이터를 다시 Mat 타입의 자료형으로 변환한 후, OpenCV를 통하여 재생하였습니다.

마치며

우리는 OpenDDS의 Pub/Sub 모델을 통하여 실시간 영상 스트리밍을 구현하였습니다. 우선 OpenDDS를 빌드하고, OpenCV와 연동하였습니다. 그 후, OpenDDS에서 제공하는 예제 중 하나인 Messenger 예제의 전송 및 수신 기능 을 수행하는 함수 각각을 찾아 분석하였습니다. 또한, 이 함수들을 이용하여 OpenCV로 획득한 영상 데이터를 Publisher와 Subscriber 사이에서 전송하고 수신하며, 재생토록 하였습니다.

Edit by

맹주현
한양대학교 컴퓨터·소프트웨어학과 박사과정
maengjuhyun@gmail.com
관심분야 : Blockchain, Network, DDS

이동혁
한양대학교 컴퓨터·소프트웨어학과 석사과정
shine5601@naver.com
관심분야 : DDS, Network, Blockchain

--

--

Juhyun Maeng
juhyun.maeng

Hanyang University, Seoul, Republic of Korea Major in Computer·Software, PhD candidate