ROBROS

Human First,

line

Always

개발자 센터

Last Updated On: 2026-06-25

Camera

1. IGRIS-C Camera Topic List

  • Data Topic - igris_c::msg::dds::CompressedMessage

    TopicName

    설명

    igris_c/sensor/d435_color

    realsense D435 RGB 이미지 데이터

    igris_c/sensor/d435_depth

    realsense D435 depth 이미지 데이터

    igris_c/sensor/eyes_stereo

    IGRIS-C head stereo 카메라 이미지 데이터

    igris_c/sensor/left_hand

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

    igris_c/sensor/right_hand

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

  • Service

    TopicName

    Message Type

    설명

    igris_c/sensor/realsense_config_request

    igris_c::msg::dds::RealsenseConfigRequest

    realsense D435 configuration 서비스

    igris_c/sensor/stereo_config_request

    igris_c::msg::dds::StereoConfigRequest

    IGRIS-C head stereo 카메라 configuration 서비스

    igris_c/sensor/mono_config_request

    igris_c::msg::dds::MonoConfigRequest

    IGRIS-C hand(end-effector) configuration 서비스

    igris_c/sensor/camera_config_response

    igris_c::msg::dds::ServiceResponse

    configuration 서비스 응답

2. Camera Topic & Service API

  • SDK 초기화

#include <igris_sdk/channel_factory.hpp>
#include <igris_sdk/igris_c_client.hpp>
#include <igris_sdk/igris_c_msgs.hpp>
#include <igris_sdk/subscriber.hpp>

using namespace igris_sdk;
using CompressedMessage = igris_c::msg::dds::CompressedMessage;

int main() {
    // Initialize SDK with domain ID
    int domain_id = 0;
    ChannelFactory::Instance()->Init(domain_id);
    if (!ChannelFactory::Instance()->IsInitialized()) {
        std::cerr << "Failed to initialize ChannelFactory" << std::endl;
        return 1;
    }

    // Initialize service client
    IgrisC_Client client;
    client.Init();
    client.SetTimeout(10.0f);  // 10초 타임아웃 설정

    // ... 이후 서비스 호출
}
  • 이미지 Subscriber 예제

    Subscriber<CompressedMessage> sub("igris_c/sensor/d435_color");
    
    sub.init([](const CompressedMessage &msg) {
        cv::Mat raw(1, msg.image_data().size(), CV_8UC1,
                    const_cast<uint8_t*>(msg.image_data().data()));
    
        cv::Mat img = cv::imdecode(raw, cv::IMREAD_UNCHANGED);
    });
    
    • JPEG 기반 압축 이미지 전송

  • 이미지 센서 Service 예제

    #include <dds/dds.hpp>
    #include <igris_sdk/igris_c_msgs.hpp>
    
    #include <chrono>
    #include <iostream>
    #include <thread>
    
    using namespace igris_c::msg::dds;
    
    int main() {
        int domain_id = 10;
    
        // DDS Participant 생성
        dds::domain::DomainParticipant participant(domain_id);
        dds::pub::Publisher publisher(participant);
        dds::sub::Subscriber subscriber(participant);
    
        // Topic 정의
        dds::topic::Topic<StereoConfigRequest> req_topic(
            participant, "igris_c/sensor/stereo_config_request");
    
        dds::topic::Topic<ServiceResponse> res_topic(
            participant, "igris_c/sensor/camera_config_response");
    
        // Writer / Reader 생성
        dds::pub::DataWriter<StereoConfigRequest> writer(publisher, req_topic);
        dds::sub::DataReader<ServiceResponse> reader(subscriber, res_topic);
    
        // request id 생성
        std::string request_id = "req_001";
    
        // =========================
        // Request 작성
        // =========================
        StereoConfigRequest req;
        req.request_id(request_id);
        req.stereo_width(1280);
        req.stereo_height(480);
        req.stereo_fps(30);
        req.stereo_jpeg_quality(90);
        req.enable_stereo(true);
    
        // publish
        writer.write(req);
        std::cout << "[publish] StereoConfigRequest sent\n";
    
        // =========================
        // Response 대기
        // =========================
        auto start = std::chrono::steady_clock::now();
        int timeout_ms = 5000;
    
        while (true) {
            auto samples = reader.take();
    
            for (auto &s : samples) {
                if (!s.info().valid()) continue;
    
                const auto &res = s.data();
    
                if (res.request_id() == request_id) {
                    std::cout << "\n=== Response ===\n";
                    std::cout << "success: " << res.success() << "\n";
                    std::cout << "message: " << res.message() << "\n";
                    std::cout << "error_code: " << res.error_code() << "\n";
                    return 0;
                }
            }
    
            // timeout 체크
            auto now = std::chrono::steady_clock::now();
            auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count();
            if (elapsed > timeout_ms) {
                std::cout << "[timeout] no response\n";
                break;
            }
    
            std::this_thread::sleep_for(std::chrono::milliseconds(50));
        }
    
        return 0;
    }
    



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