Image Echo — C++ 예제
소스: rbq_sdk/cpp/example/src/rbq_image_echo.cpp
압축 카메라 토픽을 구독해 초당 수신율, 마지막 프레임 크기, 이미지 포맷을 출력하는 읽기 전용 진단 도구입니다. 카메라 스트림이 실제로 발행되고 있는지, SDK 호스트에서 도달 가능한지 확인할 때 사용합니다.
동작 방식
프로그램 동작:
argv[1]에서 토픽 이름을 읽습니다 (기본값rt/rbq/vision/sensor_front/rgb/compressed).- DDS
ChannelFactory를 초기화하고Subscriber<CompressedImage_>를 생성합니다. - 샘플을 수신할 때마다 카운터, 마지막 바이트 크기, 이미지 포맷을 갱신합니다.
- 1초마다 경과 시간, 총 샘플 수, 1초 수신율, 마지막 프레임 크기, 포맷을 출력합니다.
Ctrl+C(SIGINT/SIGTERM) 시 총 샘플 수를 출력하고 정상 종료합니다.
발행은 하지 않으므로 실제 로봇이나 시뮬레이터와 함께 실행해도 안전합니다.
사전 요구사항
- RBQ SDK 빌드 및 설치 완료 — C++ SDK 개요 참조.
- 압축 이미지 토픽을 발행하는 측이 실행 중이어야 합니다 — 로봇 비전 스택 또는 비전 포함 MuJoCo 시뮬레이터(
bash scripts/sim.bash --vision).
빌드
rbq_sdk/cpp/example/에서:
bash scripts/setup.bash
bash scripts/build.bash바이너리 위치: bin/rbq_image_echo
실행
실제 로봇에서
기본값이 로봇에 맞춰져 있으므로 그대로 실행하면 됩니다:
./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 scripts/sim.bash --vision -i enp3s02. 이 클라이언트를 같은 인터페이스로 맞춘 뒤 실행하세요. 인터페이스가 소스에 하드코딩돼 있으니 CycloneDDS 설정으로 덮어씁니다. SDK는 CYCLONEDDS_URI가 설정돼 있을 때만 그 값을 쓰므로 먼저 파일을 만들어야 합니다(enp3s0을 본인 인터페이스로 교체):
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으로 발행):
./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_0–sensor_3은 depth와 ir만 발행합니다.
심과 이 클라이언트는 같은 인터페이스를 써야 합니다 — 다르거나, 둘 다
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 인터페이스를 확인하세요.
