[c++] DDS Linux 실습

wangki·2025년 6월 1일
0

cpp

목록 보기
3/7

FastDDS 란?

  • Fast DDS: 사람들이 메시지를 보내고 받게 도와주는 시스템
  • Fast CDR: 메시지를 네트워크로 보낼 수 있게 깔끔하게 포장하고, 받은 메시지를 다시 뜯는 일

FastDDS 설치

  • Fast CDR 설치
git clone https://github.com/eProsima/Fast-CDR.git
cd Fast-CDR
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
  • Fast DDS
cd ~  # 홈 디렉토리로 이동
git clone https://github.com/eProsima/Fast-DDS.git
cd Fast-DDS
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install

⚠️ Fast DDS 설치 시 Asio, tinyXML2, foonathan_memory 을 추가로 설치해야할 수 있음.

⚠️ install 시 -dev를 붙이는 이유

예시)

  • libasio → 실행할 때 쓰는 공유 라이브러리 (바이너리만 있음)
  • libasio-dev → 개발할 때 쓰는 헤더파일(.h)과 심볼릭 링크 등등을 포함

⚠️ sudo make install을 왜 하는지?
make를 하게되면 build 디렉토리 내부에 빌드한 출력물을 저장시켜놓는다.
make install을 하게되면 시스템 디렉토리에 복사해서 다른 데서 쓸 수 있게 등록하는 과정

항목설치 경로(예시)
헤더 파일(.h)/usr/local/include/
라이브러리(.so)/usr/local/lib/
실행 파일/usr/local/bin/

windows에서 시스템 path로 등록을 하는 개념이라고 생각하면 될 것 같다.
그러나 완전히 같은 것은 아니다.
윈도우에서는 헤더, 라이브러리가 있는 path를 등록을 해주는 것이지만 리눅스에서는 실제 시스템 디렉토리에 복사를 한다.

Fast DDS 사용

Fast DDS는 DDS(데이터 분산 서비스) 구조를 따르기 때문에, 다음 4가지 핵심 구성 요소가 필요하다.

  • Topic: 데이터를 보내는 "주제"
  • DataWriter: 데이터를 보내는 퍼블리셔 쪽 객체
  • DataReader: 데이터를 받는 서브스크라이버 쪽 객체
  • TypeSupport: 보낼 데이터의 타입 정의 (HelloWorld 구조체 등)

https://github.com/eProsima/Fast-DDS/tree/master/examples/cpp/hello_world를 참고하면 제일 간단한 fastdds 예제를 참고할 수 있다.

  • Fast-DDS-Gen 설치
git clone https://github.com/eProsima/Fast-DDS-Gen.git
cd Fast-DDS-Gen
gradle assemble
sudo cp scripts/fastddsgen /usr/local/bin/
sudo cp build/libs/fastddsgen-*.jar /usr/local/bin/fastddsgen.jar

*.ldl 파일을 변환하기 위해서는 Fast-DDS-Gen이 필요하다.

⚠️ *.ldl파일: 어떤 메시지를 주고받을지 약속해놓은 설계도

jave 빌드는 처음이라서 gpt의 도움을 빌렸다.

sudo apt install openjdk-11-jdk
sudo apt install gradle

위와 같이 java를 빌드하기 위한 tool을 설치해준 뒤 빌드 하고 서비스 디렉토리에 복사해준다.

/usr/local/bin

fastddsgen 실행파일이 존재하는 걸 확인할 수 있다.

이제 준비가 완료되었다. 이제 HelloWorld.idl 파일을 생성해준다.

// -- HelloWorld.idl
struct HelloWorld 
{
  string message;  
};

위 처럼 간단하게 작성해준다.

/usr/local/bin/fastddsgen -example CMake HelloWorld.idl

명령어를 입력하게되면


위처럼 *.cxx, *.hpp 파일이 생성되는 것을 볼 수 있다.

CMakeLIst.txt에는

cmake_minimum_required(VERSION 3.10.0)
project(fastdds_test VERSION 0.1.0 LANGUAGES C CXX)

# Find requirements
if(NOT fastcdr_FOUND)
    find_package(fastcdr 2 REQUIRED)    # REQUIRED는 없으면 빌드를 아예 실패시켜라.
endif()

if(NOT fastdds_FOUND)
    find_package(fastdds 3 REQUIRED)
endif()


file(GLOB HELLO_WORLD_SOURCES_CXX "*.cxx")
file(GLOB HELLO_WORLD_SOURCES_CPP "*.cpp")

add_executable(fastdds_test ${HELLO_WORLD_SOURCES_CXX} ${HELLO_WORLD_SOURCES_CPP})


target_link_libraries(fastdds_test fastdds fastcdr)

위와 같이 설정해준다. 이 후 아래 명령어를 실행시킨다.

mkdir build
cd build
cmake ..
make


fastdds_test 실행파일이 생성된 것을 확인할 수 있다.

terminal창을 2개 띄운 뒤 publisher와 subscriber를 실행한다.

./fastdds_test subscriber
./fastdds_test publisher

위와 같이 테스트가 되는 것을 확인할 수 있다.

결론

일단 dds 통신을 fastdds를 활용하여 테스트를 해보았다.
내부적으로 코드가 어떤식으로 동작하는지는 분석을 해봐야할 것 같다.
aws서버에 subscriber를 개발하여 올릴 예정이다.
linux에서 하는 것이 쉽지는 않지만 조금씩 익숙해지는 것 같다.

끝.

0개의 댓글