Skip to content

Image Echo — C++ 예제

소스: rbq_sdk/cpp/example/src/rbq_image_echo.cpp

압축 카메라 토픽을 구독해 초당 수신율, 마지막 프레임 크기, 이미지 포맷을 출력하는 읽기 전용 진단 도구입니다. 카메라 스트림이 실제로 발행되고 있는지, SDK 호스트에서 도달 가능한지 확인할 때 사용합니다.

동작 방식

프로그램 동작:

  1. argv[1]에서 토픽 이름을 읽습니다 (기본값 rt/rbq/vision/sensor_front/rgb/compressed).
  2. DDS ChannelFactory를 초기화하고 Subscriber<CompressedImage_>를 생성합니다.
  3. 샘플을 수신할 때마다 카운터, 마지막 바이트 크기, 이미지 포맷을 갱신합니다.
  4. 1초마다 경과 시간, 총 샘플 수, 1초 수신율, 마지막 프레임 크기, 포맷을 출력합니다.
  5. Ctrl+C(SIGINT/SIGTERM) 시 총 샘플 수를 출력하고 정상 종료합니다.

발행은 하지 않으므로 실제 로봇이나 시뮬레이터와 함께 실행해도 안전합니다.

사전 요구사항

  • RBQ SDK 빌드 및 설치 완료 — C++ SDK 개요 참조.
  • 압축 이미지 토픽을 발행하는 측이 실행 중이어야 합니다 — 로봇 비전 스택 또는 비전 포함 MuJoCo 시뮬레이터(bash scripts/sim.bash --vision).

빌드

rbq_sdk/cpp/example/에서:

bash
bash scripts/setup.bash
bash scripts/build.bash

바이너리 위치: bin/rbq_image_echo

실행

실제 로봇에서

기본값이 로봇에 맞춰져 있으므로 그대로 실행하면 됩니다:

bash
./bin/rbq_image_echo

로봇의 enp45s0 인터페이스로 rt/rbq/vision/sensor_front/rgb/compressed을 구독합니다 — 인터페이스(main()ChannelFactory::Instance().Init(0, "enp45s0"))와 기본 토픽 모두 예제에 내장돼 있습니다. 다른 카메라를 보려면 토픽을 첫 번째 인자로 전달하세요.

MuJoCo 시뮬레이터에서

시뮬레이터는 로봇이 아니라 본인 PC에서 동작하므로 두 가지가 달라집니다.

1. 실제로 존재하는 인터페이스로 심을 띄우세요. -i 없이 sim.bash --vision을 실행하면 비전/카메라 발행 측이 로봇의 enp45s0에 뜨는데, 이 인터페이스는 본인 PC에 없어서 클라이언트가 아무것도 못 받습니다. ip link로 인터페이스를 확인해(예: enp3s0) 전달하면 심 전체가 그 인터페이스를 공유합니다:

bash
bash scripts/sim.bash --vision -i enp3s0

2. 이 클라이언트를 같은 인터페이스로 맞춘 뒤 실행하세요. 인터페이스가 소스에 하드코딩돼 있으니 CycloneDDS 설정으로 덮어씁니다. SDK는 CYCLONEDDS_URI가 설정돼 있을 때만 그 값을 쓰므로 먼저 파일을 만들어야 합니다(enp3s0을 본인 인터페이스로 교체):

bash
cat > /tmp/cyclonedds.xml <<'EOF'
<?xml version="1.0" encoding="utf-8" ?>
<CycloneDDS xmlns="https://cdds.io/config">
  <Domain Id="any">
    <General>
      <Interfaces><NetworkInterface name="enp3s0" priority="default" multicast="default"/></Interfaces>
      <AllowMulticast>spdp</AllowMulticast>
    </General>
  </Domain>
</CycloneDDS>
EOF
export CYCLONEDDS_URI=file:///tmp/cyclonedds.xml

그런 다음 번호가 매겨진 카메라 토픽을 구독하세요(심은 sensor_front이 아니라 sensor_N으로 발행):

bash
./bin/rbq_image_echo rt/rbq/vision/sensor_4/rgb/compressed   # 전방 카메라
./bin/rbq_image_echo rt/rbq/vision/sensor_5/rgb/compressed   # 후방 카메라

sensor_4전방, sensor_5후방 카메라입니다. sensor_0sensor_3depthir만 발행합니다.

심과 이 클라이언트는 같은 인터페이스를 써야 합니다 — 다르거나, 둘 다 lo(보통 멀티캐스트 미지원)에 두면 rate=0 Hz가 됩니다.

출력 예시

MuJoCo 시뮬레이터(sim.bash --vision)에서 sensor_4(전방 카메라)를 구독한 결과:

[rbq_image_echo] subscribed to 'rt/rbq/vision/sensor_4/rgb/compressed'
[rbq_image_echo] waiting for samples (Ctrl+C to exit)...
[rbq_image_echo] 1.0s  total=15  rate=15 Hz  last=13053 bytes  fmt='jpeg'
[rbq_image_echo] 2.0s  total=29  rate=14 Hz  last=13080 bytes  fmt='jpeg'
[rbq_image_echo] 3.0s  total=44  rate=15 Hz  last=13067 bytes  fmt='jpeg'
[rbq_image_echo] exiting, total samples = 44

수신율이 일정하고 바이트 크기가 0이 아니며 fmt='jpeg'이면 스트림이 정상입니다. rate=0 Hz이면 해당 토픽/인터페이스에서 발행 측을 찾지 못한 것이니 토픽 이름과 DDS 인터페이스를 확인하세요.

This user manual is intended for RBQ users.