ROBROS

Human First,

line

Always

개발자 센터

Last Updated On: 2026-06-25

Camera

1. IGRIS-C Camera Topic List

2.1.1부터 카메라 영상은 로봇 PC의 카메라 서비스가 직접 송출합니다(2.1.0의 Jetson 중계 구성과 DDS 도메인 1 예약은 삭제되었습니다). 카메라는 로봇과 같은 domain id·로봇 호기 namespace·전송 모드(Transport)를 사용하므로, 다른 SDK 토픽과 같은 설정으로 수신합니다.

  • Data Topic - 표준 메시지 타입 sensor_msgs/Image / sensor_msgs/CompressedImage / sensor_msgs/Imu

    TopicName

    Message Type

    기본 송출

    설명

    sensor/d435_color/compressed

    sensor_msgs/CompressedImage

    JPEG, 640×480, 15 fps

    realsense D435 RGB 이미지 데이터

    sensor/d435_depth

    sensor_msgs/Image

    16UC1(원본), 640×480, 15 fps

    realsense D435 depth 이미지 데이터. 기본 설정에서 컬러 영상에 정렬되어 송출

    sensor/d435_ir_left / sensor/d435_ir_right

    sensor_msgs/Image

    mono8(원본), 640×480, 15 fps

    realsense D435 좌·우 IR 이미지 데이터

    sensor/d435_imu

    sensor_msgs/Imu

    약 200 Hz

    realsense D435i IMU(각속도·가속도)

    sensor/eyes_stereo/compressed

    sensor_msgs/CompressedImage

    JPEG, 1280×480, 15 fps

    IGRIS-C head stereo 카메라 이미지 데이터. 좌·우 640×480 영상을 가로로 이어 붙인 한 장(왼쪽 절반 = 왼쪽 카메라)

    sensor/left_hand/compressed

    sensor_msgs/CompressedImage

    JPEG, 640×480, 20 fps

    IGRIS-C left hand(end-effector) 이미지 데이터

    sensor/right_hand/compressed

    sensor_msgs/CompressedImage

    JPEG, 640×480, 20 fps

    IGRIS-C right hand(end-effector) 이미지 데이터

각 영상 스트림은 원본 sensor/<name>(sensor_msgs/Image)과 압축 sensor/<name>/compressed(sensor_msgs/CompressedImage) 두 형태가 있으며, 카메라는 설정(format, depth_format)에 따라 둘 중 한쪽에만 송출합니다. 위 표는 기본 설정 기준입니다. 예를 들어 d435.depth_format을 png16으로 바꾸면 깊이 영상이 sensor/d435_depth/compressed(PNG 16bit)로 송출됩니다. CompressedImage.format은 ROS 표준 규약을 따릅니다(예: bgr8; jpeg compressed bgr8).

2.1.0의 igris_c::msg::dds::CompressedMessage 타입과 igris_c/sensor/* 토픽, 카메라 configuration 서비스 4종은 삭제되었습니다. 설정 변경은 아래 3절을 참고하십시오.

전송 모드별 실제 토픽 이름

표의 토픽은 접두어 없는 이름이며, 실제 토픽 이름은 로봇의 전송 모드(igris_c.network.transport)가 정합니다. 전송 모드에 대한 자세한 내용은 SDK Overview 페이지의 「3. 전송 모드 (Transport)」를 참고하십시오.

전송 모드

sensor/d435_color/compressed의 실제 토픽 이름

수신 방법

cyclonedds_native (출하 기본)

<ns>/sensor/d435_color/compressed

./build/<예제> <domain_id> <ns>
python3 python/<예제>.py --domain-id <domain_id> --namespace <ns>
(--dds-topic-naming native는 기본값이라 생략)

cyclonedds_ros_compatible

rt/<ns>/sensor/d435_color/compressed

./build/<예제> <domain_id> <ns> --dds-topic-naming ros_compatible
python3 python/<예제>.py --domain-id <domain_id> --namespace <ns> --dds-topic-naming ros_compatible

ros

/<ns>/sensor/d435_color/compressed

ROS_DOMAIN_ID=<domain_id> ros2 run igris_c_sdk <예제> --ros-args -p robot_namespace:=<ns>

로봇과 클라이언트의 전송 모드·토픽 레이아웃·namespace·domain id가 하나라도 다르면 에러 없이 영상이 수신되지 않습니다(0 FPS).

영상 프레임(frame_id)

header.stamp는 d435_* 토픽에서는 센서가 영상을 획득한 시각이고, eyes_stereo·left_hand·right_hand 토픽에서는 송출 시각입니다. header.frame_id 값은 다음과 같습니다.

토픽

header.frame_id

대응하는 URDF 링크

sensor/d435_color

rs_color

d435_color_link

sensor/d435_depth

rs_depth

d435_color_link (기본 align_depth: true, 컬러 정렬) / d435_depth_link (정렬 끔)

sensor/d435_ir_left

rs_ir_left

d435_ir_left_link

sensor/d435_ir_right

rs_ir_right

d435_ir_right_link

sensor/d435_imu

d435_imu_link

d435_imu_link (일치)

sensor/eyes_stereo

stereo_image

eyes_stereo_left_link (왼쪽 절반) / eyes_stereo_right_link (오른쪽 절반)

sensor/left_hand

left_hand

left_hand_camera_link

sensor/right_hand

right_hand

right_hand_camera_link

⚠️ 영상 메시지의 frame_id는 로봇 모델(URDF)의 링크 이름과 다릅니다(IMU만 일치). TF로 카메라 좌표를 찾을 때는 frame_id 대신 위 표의 URDF 링크 이름을 사용하십시오. 카메라 링크는 ROS 광학 좌표계(+Z 전방, +X 오른쪽, +Y 아래)입니다. 장착 위치는 Specs (Camera) 페이지를 참고하십시오.

2. Camera Topic API

  • SDK 초기화

#include <igris_c_sdk/channel_factory.hpp>
#include <igris_c_sdk/igris_c_msgs.hpp>
#include <igris_c_sdk/subscriber.hpp>

#include <iostream>
#include <string>

using namespace igris_c_sdk;

int main() {
    // Initialize SDK with domain ID and robot namespace (로봇 설정과 동일해야 합니다)
    int domain_id  = 0;
    std::string ns = "igris_c_IG01";  // 로봇 호기 namespace
    // 4번째 인자: 로봇 전송 모드가 cyclonedds_native면 TopicNaming::Native(기본),
    //             cyclonedds_ros_compatible이면 TopicNaming::RosCompatible
    ChannelFactory::Instance()->Init(domain_id, ns, "", TopicNaming::Native);
    if (!ChannelFactory::Instance()->IsInitialized()) {
        std::cerr << "Failed to initialize ChannelFactory" << std::endl;
        return 1;
    }

    // ... 이후 토픽 구독 (카메라에는 서비스가 없습니다)
}
  • 이미지 Subscriber 예제

    #include <opencv2/imgcodecs.hpp>
    
    using CompressedImage = sensor_msgs::msg::dds_::CompressedImage_;
    using Image           = sensor_msgs::msg::dds_::Image_;
    
    // 압축 스트림 (d435_color, eyes_stereo, left_hand, right_hand): JPEG
    Subscriber<CompressedImage> color_sub("sensor/d435_color/compressed", QosProfile::SensorData());
    color_sub.init([](const CompressedImage &msg) {
        cv::Mat raw(1, static_cast<int>(msg.data().size()), CV_8UC1,
                    const_cast<uint8_t*>(msg.data().data()));
    
        cv::Mat img = cv::imdecode(raw, cv::IMREAD_UNCHANGED);  // BGR
    });
    
    // 원본 스트림 (d435_depth: 16UC1, d435_ir_left / d435_ir_right: mono8)
    Subscriber<Image> depth_sub("sensor/d435_depth", QosProfile::SensorData());
    depth_sub.init([](const Image &msg) {
        cv::Mat depth(static_cast<int>(msg.height()), static_cast<int>(msg.width()), CV_16UC1,
                      const_cast<uint8_t*>(msg.data().data()), msg.step());
    });
    
    // 구독 객체는 수신하는 동안 유지하고, 종료할 때 stop()을 호출합니다.
    • JPEG 기반 압축 이미지 전송

    • depth·IR은 압축하지 않은 원본(sensor_msgs/Image) 전송

    • 모든 스트림을 동시에 받으면 약 22 MB/s가 필요합니다. Wi-Fi 환경에서는 필요한 스트림만 구독하십시오(예제 뷰어는 스트림별로 구독을 켜고 끌 수 있습니다).

  • 예제 뷰어 실행

    # cyclonedds_native / cyclonedds_ros_compatible 전송 모드 (CYCLONEDDS_URI 설정 후)
    ./cyclonedds_sensor_viewer <domain_id> <namespace> [topics...] [--dds-topic-naming native|ros_compatible]
    python3 sensor_viewer.py --domain-id <domain_id> --namespace <namespace> [--dds-topic-naming native|ros_compatible]

ROS 2 전송 모드(ros)에서 수신

로봇의 전송 모드가 ros이면 SDK 배포본의 ros2/ 패키지 예제로 수신합니다. 영상 프레임은 UDP 데이터그램 여러 개로 나뉘어 전송되므로, 수신 PC에서 ros2/setup_client_network.sh를 한 번 실행해 수신 버퍼와 IP 재조립 설정을 늘려야 합니다. 설정하지 않으면 제어 토픽과 IMU는 정상인데 영상 토픽만 0 Hz로 멈춰 있습니다.

# 수신 PC에서 한 번만 실행 (수신 버퍼·IP 재조립 설정, sudo 사용, 재부팅 후에도 유지)
cd <SDK 배포본>/ros2
./setup_client_network.sh

# ros 전송 모드에서 영상 수신
ROS_DOMAIN_ID=<domain_id> ros2 run igris_c_sdk ros_sensor_viewer --ros-args -p robot_namespace:=<namespace>
ROS_DOMAIN_ID=<domain_id> ros2 run igris_c_sdk ros_sensor_listener --ros-args -p robot_namespace:=<namespace>

*Github Repository에서 예제를 확인하실 수 있습니다.

ros_sensor_viewer 실행 화면입니다. 카메라 7개 스트림과 D435 IMU를 동시에 수신하며, 오른쪽 패널에서 스트림별 구독을 켜고 끌 수 있습니다(실기, domain 27).

3. 카메라 설정 변경

2.1.0의 카메라 configuration 서비스(realsense_config_request, stereo_config_request, mono_config_request, camera_config_response)는 삭제되었습니다. 해상도·프레임 레이트·스트림 사용 여부 등은 로봇의 카메라 설정 파일 camera.yaml에서 바꾸며, Web Viewer에서 편집합니다.

  1. Web Viewer에 접속해 Config 탭의 CAMERA CONFIG › camera config를 선택합니다.

  2. 값을 바꾸고 저장합니다.

  3. [Restart services] 버튼으로 Camera 서비스를 재시작하면 적용됩니다. 재시작하는 동안 영상 스트림이 잠시 끊깁니다.

그룹

항목

기본값

선택지

설명

d435 (머리 RealSense D435i)

enable_color / enable_depth / enable_ir / enable_imu

true

true / false

RGB / depth / IR(좌·우) / IMU 스트림 송출 여부

fps

15

6 / 15 / 30

컬러·depth·IR 공통 프레임 레이트

jpeg_quality

80

0–100

컬러 JPEG 품질

emitter_enabled

true

true / false

IR 도트 프로젝터 사용. VIO용 IR 영상에는 false 권장

output_resolution

[640, 480]

읽기 전용

송출 해상도

eyes_stereo (head stereo 카메라)

enable_stereo

true

true / false

스트림 송출 여부

fps

15

5 / 7.5 / 10 / 15

프레임 레이트

jpeg_quality

80

0–100

JPEG 품질

output_resolution

[1280, 480]

읽기 전용

송출 해상도(좌·우 이어 붙인 크기)

hand_mono (hand 카메라)

enable_mono

true

true / false

좌·우 hand 카메라 송출 여부

fps

20

5 / 10 / 20 / 30

프레임 레이트(2.1.0 기본 15에서 변경)

jpeg_quality

80

0–100

JPEG 품질

output_resolution

[640, 480]

읽기 전용

송출 해상도(1920×1200으로 캡처 후 축소)

일반 사용자 화면에는 위 공개 항목만 표시됩니다. 관리자 모드에서는 d435.initial_reset(기본 false, true이면 기동 전에 카메라를 하드웨어 리셋하며 기동이 5~8초 늘어남. 2.1.0 기본은 true), d435.depth_format(raw / png16), d435.align_depth(기본 true, depth를 컬러 영상에 정렬), 카메라별 format(jpeg / png) 등도 바꿀 수 있습니다. 전송 모드는 camera.yaml이 아니라 robot config의 igris_c.network.transport가 정하며, bridge와 카메라에 함께 적용됩니다.