개발자 센터
개발자 센터
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/ImuTopicName
Message Type
기본 송출
설명
sensor/d435_color/compressedsensor_msgs/CompressedImageJPEG, 640×480, 15 fps
realsense D435 RGB 이미지 데이터
sensor/d435_depthsensor_msgs/Image16UC1(원본), 640×480, 15 fps
realsense D435 depth 이미지 데이터. 기본 설정에서 컬러 영상에 정렬되어 송출
sensor/d435_ir_left/sensor/d435_ir_rightsensor_msgs/Imagemono8(원본), 640×480, 15 fps
realsense D435 좌·우 IR 이미지 데이터
sensor/d435_imusensor_msgs/Imu약 200 Hz
realsense D435i IMU(각속도·가속도)
sensor/eyes_stereo/compressedsensor_msgs/CompressedImageJPEG, 1280×480, 15 fps
IGRIS-C head stereo 카메라 이미지 데이터. 좌·우 640×480 영상을 가로로 이어 붙인 한 장(왼쪽 절반 = 왼쪽 카메라)
sensor/left_hand/compressedsensor_msgs/CompressedImageJPEG, 640×480, 20 fps
IGRIS-C left hand(end-effector) 이미지 데이터
sensor/right_hand/compressedsensor_msgs/CompressedImageJPEG, 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)」를 참고하십시오.
전송 모드 |
| 수신 방법 |
|---|---|---|
|
|
|
|
|
|
|
|
|
로봇과 클라이언트의 전송 모드·토픽 레이아웃·namespace·domain id가 하나라도 다르면 에러 없이 영상이 수신되지 않습니다(0 FPS).
영상 프레임(frame_id)
header.stamp는 d435_* 토픽에서는 센서가 영상을 획득한 시각이고, eyes_stereo·left_hand·right_hand 토픽에서는 송출 시각입니다. header.frame_id 값은 다음과 같습니다.
토픽 |
| 대응하는 URDF 링크 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
⚠️ 영상 메시지의
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에서 예제를 확인하실 수 있습니다.
https://github.com/robrosinc/igris_c_sdk_public
이미지 데이터 수신 C++
이미지 데이터 수신 Python
이미지 데이터 수신 ROS 2
스트림 수신 상태 확인(텍스트) ROS 2
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에서 편집합니다.
Web Viewer에 접속해 Config 탭의 CAMERA CONFIG › camera config를 선택합니다.
값을 바꾸고 저장합니다.
[Restart services] 버튼으로 Camera 서비스를 재시작하면 적용됩니다. 재시작하는 동안 영상 스트림이 잠시 끊깁니다.
그룹 | 항목 | 기본값 | 선택지 | 설명 |
|---|---|---|---|---|
|
|
|
| RGB / depth / IR(좌·우) / IMU 스트림 송출 여부 |
|
|
| 컬러·depth·IR 공통 프레임 레이트 | |
|
| 0–100 | 컬러 JPEG 품질 | |
|
|
| IR 도트 프로젝터 사용. VIO용 IR 영상에는 | |
|
| 읽기 전용 | 송출 해상도 | |
|
|
|
| 스트림 송출 여부 |
|
|
| 프레임 레이트 | |
|
| 0–100 | JPEG 품질 | |
|
| 읽기 전용 | 송출 해상도(좌·우 이어 붙인 크기) | |
|
|
|
| 좌·우 hand 카메라 송출 여부 |
|
|
| 프레임 레이트(2.1.0 기본 15에서 변경) | |
|
| 0–100 | JPEG 품질 | |
|
| 읽기 전용 | 송출 해상도(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와 카메라에 함께 적용됩니다.
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/ImuTopicName
Message Type
기본 송출
설명
sensor/d435_color/compressedsensor_msgs/CompressedImageJPEG, 640×480, 15 fps
realsense D435 RGB 이미지 데이터
sensor/d435_depthsensor_msgs/Image16UC1(원본), 640×480, 15 fps
realsense D435 depth 이미지 데이터. 기본 설정에서 컬러 영상에 정렬되어 송출
sensor/d435_ir_left/sensor/d435_ir_rightsensor_msgs/Imagemono8(원본), 640×480, 15 fps
realsense D435 좌·우 IR 이미지 데이터
sensor/d435_imusensor_msgs/Imu약 200 Hz
realsense D435i IMU(각속도·가속도)
sensor/eyes_stereo/compressedsensor_msgs/CompressedImageJPEG, 1280×480, 15 fps
IGRIS-C head stereo 카메라 이미지 데이터. 좌·우 640×480 영상을 가로로 이어 붙인 한 장(왼쪽 절반 = 왼쪽 카메라)
sensor/left_hand/compressedsensor_msgs/CompressedImageJPEG, 640×480, 20 fps
IGRIS-C left hand(end-effector) 이미지 데이터
sensor/right_hand/compressedsensor_msgs/CompressedImageJPEG, 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)」를 참고하십시오.
전송 모드 |
| 수신 방법 |
|---|---|---|
|
|
|
|
|
|
|
|
|
로봇과 클라이언트의 전송 모드·토픽 레이아웃·namespace·domain id가 하나라도 다르면 에러 없이 영상이 수신되지 않습니다(0 FPS).
영상 프레임(frame_id)
header.stamp는 d435_* 토픽에서는 센서가 영상을 획득한 시각이고, eyes_stereo·left_hand·right_hand 토픽에서는 송출 시각입니다. header.frame_id 값은 다음과 같습니다.
토픽 |
| 대응하는 URDF 링크 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
⚠️ 영상 메시지의
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에서 예제를 확인하실 수 있습니다.
https://github.com/robrosinc/igris_c_sdk_public
이미지 데이터 수신 C++
이미지 데이터 수신 Python
이미지 데이터 수신 ROS 2
스트림 수신 상태 확인(텍스트) ROS 2
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에서 편집합니다.
Web Viewer에 접속해 Config 탭의 CAMERA CONFIG › camera config를 선택합니다.
값을 바꾸고 저장합니다.
[Restart services] 버튼으로 Camera 서비스를 재시작하면 적용됩니다. 재시작하는 동안 영상 스트림이 잠시 끊깁니다.
그룹 | 항목 | 기본값 | 선택지 | 설명 |
|---|---|---|---|---|
|
|
|
| RGB / depth / IR(좌·우) / IMU 스트림 송출 여부 |
|
|
| 컬러·depth·IR 공통 프레임 레이트 | |
|
| 0–100 | 컬러 JPEG 품질 | |
|
|
| IR 도트 프로젝터 사용. VIO용 IR 영상에는 | |
|
| 읽기 전용 | 송출 해상도 | |
|
|
|
| 스트림 송출 여부 |
|
|
| 프레임 레이트 | |
|
| 0–100 | JPEG 품질 | |
|
| 읽기 전용 | 송출 해상도(좌·우 이어 붙인 크기) | |
|
|
|
| 좌·우 hand 카메라 송출 여부 |
|
|
| 프레임 레이트(2.1.0 기본 15에서 변경) | |
|
| 0–100 | JPEG 품질 | |
|
| 읽기 전용 | 송출 해상도(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와 카메라에 함께 적용됩니다.

