텔레오퍼레이션 및 데이터 수집을 위한 로봇 카메라 설정
로봇 데이터 수집에 필요한 카메라를 설정하는 방법 <unk> 카메라 유형, 배치, 동기화, 캘리브레이션 및 녹음 파이프라인을 설정하는 방법
카메라 종류 비교
로봇 데이터 수집 설정을 위해 일반적으로 사용되는 카메라 기술 세 가지가 있습니다. 당신의 선택은 비용, 지연 결정성, 통합 복잡성에 영향을 미칩니다.
| Type | Example Model | Price | 지연시간 | Best For |
|---|---|---|---|---|
| USB (UVC) | Logitech BRIO 4K | ~$200 | 50-200ms variable | Budget setups, low-frequency tasks |
| GigE Vision | Basler ace2 a2A1920 | $400-$1,500 | <1ms deterministic | High-quality datasets, policy training |
| Depth (RGB-D) | Intel RealSense D435 | ~$200 | 30-60ms | Supplemental depth -- not recommended as primary |
USB 카메라 (Logitech BRIO, ELP, Arducam) 는 가장 접근성이 좋지만 USB 호스트 컨트롤러 스케줄링으로 인한 변수 지연으로 고통 받고 있습니다. 부하 하에 프레임 전달은 20-50 ms로 흔들 수 있으며, 이는 멀티 카메라 녹화를 비동일화시키고 정책 훈련을 저하시킨다. 단일 카메라 또는 낮은 프레임 속도 설정 (<15 fps) 에 USB는 허용됩니다.
GigE 비전 카메라 (Basler ace2, FLIR Blackfly S, Allied Vision Alvium) 는 하드웨어 트리거를 할 때 결정적인 <1 ms 지연을 가진 이더넷을 통해 프레임을 제공합니다. 650 달러에 Basler ace2 a2A1920-160ucBAS는 1920x1200을 160 fps에서 제공합니다. 30 fps 로봇 녹음에 충분합니다. GigE 카메라에는 전용 NIC가 필요합니다.
** 깊이 카메라** (RealSense D435, Azure Kinect) 는 추가 3D 장면 이해에 유용하지만 주요 녹음 카메라로 권장되지 않습니다. 물체 경계에 있는 굴러가는 셔터, 깊이 소음 및 빛나는/ 어두운 표면에 대한 어려움은 유일한 시각 관측으로 적합하지 않습니다. 당신의 정책이 깊이 입력이 필요한 경우 RGB 카메라 외에도 사용하십시오.
3개의 카메라 구성
다양한 조작 작업은 다양한 카메라 장치에 의해 이루어집니다. 여기 RCSV에서 사용되는 세 가지 검증된 구성 요소가 있습니다. 복잡성과 데이터 풍부성에 따라 순서대로 순서대로 순서대로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순정됩니다.
구성 1: 최소 (1 카메라, 예산 설정)
- ** 카메라:** 1x 오버헤드 USB 카메라 (Logitech BRIO, $200)
- ** 위치:** 작업 공간 위에 90~100cm 높이로 설치되어, 직진으로 아래로 향한다
- 상화: 1280x720 30fps
- ** 사용 사례:** 간단한 선택 및 장소, 초기 프로토타입 제작, 단일 팔 테이블 작업
- ** 제한:** 고도 정보, 이기 중심의 시각이 없습니다. 복잡한 작업에 3 카메라 설정보다 15-25% 낮은 정책 성능
데이터 수집을 시작하는 가장 빠른 방법입니다. 동기화 하드웨어가 필요하지 않습니다. 멀티 카메라 설정을 투자하기 전에 작업 정의를 검증하기에 적합합니다.
구성 2: 표준 (3 카메라, 권장)
이 구성은 RCSV에서 표준 조작 데이터 수집을 위해 사용되며 커버리, 해상도 및 저장 비용을 균형을 맞추고 있습니다.
- ** 카메라 1 - 고정된 상부 (상하):** 작업 공간 위에 80-100cm 높이 설치되어, 직진으로 향합니다. 해상도 1280x960 30fps. 전체 작업 공간, 객체 배치 및 꽉 잡아 접근을 위에서 촬영합니다. 이것은 대부분의 선택 및 장소 정책에 가장 정보적 인 전망입니다.
- ** 카메라 2 -- 고정된 옆 (옆):** 작업 공간의 높이에 설치되어, 옆으로 60~80cm. 해상도 1280x960 30fps. 상공 조치가 불가능한 높이의 정보를 제공합니다. 겹치기, 붓기, 삽입 작업에 중요합니다.
- ** 카메라 3 - 손목 (자 Ego-centric):** 로봇의 최종 효과자나 도구 플랜지에 전면으로 설치되어 있습니다. 60fps에서 해상도 640x480. 더 높은 프레임 속도는 흐릿하지 않고 손목의 빠른 움직임을 캡처합니다. Ego-centric 시점은 모방 학습 연구에서 포착 및 미세한 조작 정책 성능을 크게 향상시킵니다.
DK1를 사용하는 쌍방향 설정에 있어서, 2 카메라의 반대편에 네 번째 고정된 카메라를 추가하여 팔 사이의 잠복을 덮습니다.
구성 3: 전체 커버 (5+ 카메라, 고급)
- 카메라 1-3: 2형의 카메라와 동일 (머리, 옆, 손목)
- ** 카메라 4 -- 반대편:** 작업 공간의 반대편에 카메라 2 거울을 설치합니다. 손/팔 점막을 제거합니다.
- ** 카메라 5 -- 전면 각 (45도):** 45도 아래쪽 각에서 60cm 앞쪽으로 위치하고, 상공에서 놓친 객체 접근과 지갑 지향을 촬영합니다.
- ** 카메라 6 (선택) -- 깊이 카메라:** 인텔 리얼센스 D435는 추가 포인트 클라우드 데이터에 대한 상공 위치 근처에 설치되어 있습니다.
이 구성은 에피소드 당 3-5배 더 많은 데이터를 생성하지만 가장 완전한 시각적 커버리를 제공합니다. 멀티뷰 정책 학습 및 3D 장면 재구성 연구에 사용됩니다. 저장 요구 사항: 카메라당 15 Mbps에서 약 500 MB/분.
끝에서 끝까지의 지연 예산
텔레오퍼레이션에서 전체 유리-글라스 지연시간 (센서를 타는 광선에서 액추에이터 운동까지) 은 인간 조작을 위해 150 ms 이하로, 정확한 조작을 위해 100 ms 이하로 유지되어야 한다.
| Stage | Component | GigE Camera | USB Camera |
|---|---|---|---|
| 1 | Sensor exposure | 5-10 ms | 5-33 ms (auto-exposure) |
| 2 | Readout + transfer | <1 ms (Ethernet) | 10-50 ms (USB scheduling) |
| 3 | Driver processing | 1-2 ms | 2-5 ms |
| 4 | ROS2 topic publish | 1-3 ms | 1-3 ms |
| 5 | Policy inference | 10-30 ms (GPU) | 10-30 ms (GPU) |
| 6 | Motor command + execution | 5-10 ms | 5-10 ms |
| Total | 23-56 ms | 33-131 ms |
USB 카메라 경로는 로드 상태에서 100 ms를 초과할 수 있습니다 (다중 USB 장치가 호스트 컨트롤러를 공유하고), 눈에 띄는 텔레오프 지연을 유발합니다. [OpenArm 1]
동기화 방법
멀티 카메라 동기화가 중요합니다. 카메라들 사이의 33ms의 해동화 속도는 30fps로 카메라가 한 프레임 뒤쪽에 있다는 것을 의미합니다. 해동된 데이터에 훈련된 정책들은 잘못된 시간 상관관계를 학습합니다.
하드웨어 GPIO 트리거 (GigeE 카메라에 권장)
단일 트리거 인파를 마이크로 컨트롤러 (Arduino Uno, $25 또는 Raspberry Pi GPIO) 로 생성하고 모든 카메라의 트리거 입력에 동시에 연결합니다. <1 ms 동기화를 달성합니다. Pylon (Basler) 또는 SpinView (FLIR) 를 통해 외부 트리거 모드를 통해 카메라를 구성합니다.
# Arduino trigger sketch for 30 fps synchronized capture
void setup() {
pinMode(2, OUTPUT); // Trigger pin → all camera trigger inputs
}
void loop() {
digitalWrite(2, HIGH);
delayMicroseconds(100); // 100us pulse width
digitalWrite(2, LOW);
delay(33); // 33ms → 30 fps
}
NTP를 통해 소프트웨어 동기화
모든 녹음기를 일반적인 NTP 서버 (
ROS2 메시지_filters for Approximate Sync
하드웨어 트리거가 사용되지 않을 때, ROS2
from message_filters import ApproximateTimeSynchronizer, Subscriber
from sensor_msgs.msg import Image
sub_overhead = Subscriber(node, Image, '/cam_overhead/image_raw')
sub_side = Subscriber(node, Image, '/cam_side/image_raw')
sub_wrist = Subscriber(node, Image, '/cam_wrist/image_raw')
sync = ApproximateTimeSynchronizer(
[sub_overhead, sub_side, sub_wrist],
queue_size=10,
slop=0.033 # 33ms tolerance (1 frame at 30fps)
)
sync.registerCallback(synchronized_callback)
카메라 캘리브레이션
캘리브레이션은 두 가지 구성 요소를 가지고 있습니다. 카메라당 내재적 요소와 외재적 요소 (카메라와 로봇 기지에 대한 상대적 자세).
** 내성 캘리브레이션**은 각 카메라의 화소장, 주점 및 왜곡 계수를 특징으로 한다. 9x7 쉐커보드 (25mm 광장) 을 가진 OpenCV의 캘리브레이션 모듈을 사용한다. 다양한 각과 거리에서 20-40개의 이미지를 수집한다. 재탄생 오류를 목표로 <0.5 px ( 최대 1.0 px까지 허용된다).
외부 캘리브레이션은 각 카메라 프레임에서 로봇 기본 프레임으로 6DOF 변환을 결정합니다. 여러 알려진 자세에 장착된 ChArUco 보드를 사용하십시오. 각 카메라에 대해 작업 공간 전체에서 15-20개의 보드 관찰을 수집하십시오. 결과적인 변환은 ROS2 파라미터 파일에서 정적 TF 프레임으로 저장되어 있으며 정책 훈련에 대한 일반적인 로봇 관련 좌표 프레임으로 관찰을 투영하는 데 사용됩니다.
각 카메라 이미지에 로봇의 TCP 위치를 (앞으로의 운동학) 투영하여 캘리브레이션을 확인합니다. 투영된 포인트는 모든 작업 공간 위치에서 5 픽셀 이내에 보이는 TCP와 조화를 이루어야 합니다. 오류 > 10 px는 일반적으로 잘못된 카메라 마운트 포즈를 나타냅니다. 마운트의 딱딱성을 다시 확인하고 외부 데이터를 회수합니다.
ROS2 이미지 운송 파이프라인
ROS2의
| Transport | Bandwidth (1280x960@30fps) | CPU Load | Quality Loss | Best For |
|---|---|---|---|---|
| raw | ~880 Mbps | Minimal | None | Intra-process, shared memory |
| compressed (JPEG 80%) | ~30-60 Mbps | Moderate | Slight (lossy) | Cross-machine recording |
| h264 (ffmpeg_image_transport) | ~10-30 Mbps | High (GPU encode helps) | Moderate (lossy) | Long recording sessions, storage-limited |
| compressed (PNG) | ~300-500 Mbps | High | None (lossless) | Archival, precision-critical data |
** 추천:** 표준 데이터 수집을 위해 80% 품질의 JPEG 압축 운송을 사용하십시오. 이 품질 수준에서의 압축 유물은 대부분의 정책 훈련 파이프라인의 소음 바닥보다 낮습니다. 가장 충실한 연구 데이터 세트에서 PNG 손실 없이 사용하지만 저장량을 10배 증가시킬 계획을 세웁니다.
모방 학습을 위한 HDF5 녹음 형식
녹음 파이프라인은 시크로네이션 프레임, 로봇 합동 상태 및 액션 레이블을 시연당 하나의 파일로 캡처해야 합니다. HDF5는 ACT, 디스포지션 정책 및 대부분의 모방 학습 프레임워크에서 사용되는 표준 형식입니다.
권장 HDF5 구조
/episode_0042/
observations/
images/
cam_overhead # (T, H, W, 3) uint8 JPEG-decoded frames
cam_side # (T, H, W, 3) uint8
cam_wrist # (T, H, W, 3) uint8
joint_positions # (T, 6) float64 — radians
joint_velocities # (T, 6) float64 — rad/s
ee_pose # (T, 7) float64 — xyz + quaternion
gripper_state # (T, 1) float64 — 0.0 closed to 1.0 open
tactile/ # optional
left_finger # (T, 16, 16) uint16 — Paxini pressure
right_finger # (T, 16, 16) uint16
actions/
joint_positions # (T, 6) float64 — target joint positions
gripper_action # (T, 1) float64 — target gripper state
metadata/
timestamp # (T,) float64 — Unix timestamps
trigger_pulse # (T,) uint8 — hardware trigger confirmation
fps # scalar — recording frame rate
camera_intrinsics # dict — per-camera calibration
camera_extrinsics # dict — camera-to-base transforms
** 파이썬으로 HDF5를 작성:**
import h5py
import numpy as np
with h5py.File('episode_0042.hdf5', 'w') as f:
ep = f.create_group('episode_0042')
obs = ep.create_group('observations')
imgs = obs.create_group('images')
# Store images with chunk-based compression
imgs.create_dataset('cam_overhead', data=overhead_frames,
chunks=(1, 960, 1280, 3), compression='gzip')
obs.create_dataset('joint_positions', data=joint_data)
obs.create_dataset('ee_pose', data=ee_data)
# Actions
acts = ep.create_group('actions')
acts.create_dataset('joint_positions', data=action_data)
# Metadata
meta = ep.create_group('metadata')
meta.create_dataset('timestamp', data=timestamps)
meta.attrs['fps'] = 30
** 프레임 조율:** 작성 시 모든 데이터를 트리거 타임 스탬프에 조율하십시오. 잘못된 시간 스탬프로 사용하는 대신 5 ms 이상 늦게 도착하는 프레임을 떨어 뜨십시오. 떨어지는 프레임은 잘못된 라인링 프레임보다 좋습니다.
파이프라인 구조를 기록
카메라 센서에서 HDF5 파일까지의 전체 녹음 파이프라인:
- ** 카메라 드라이버 노드** (카메라당 하나):
T15 을 T16 및 T17 에 게시합니다. - ** 동기화 노드:** 모든 카메라의 프레임을 조정하기 위해
T18 을 사용합니다 + T19 + T20 . 사용자 지정 T21 메시지를 게시합니다. - ** 레코더 노드:**
T22 에 가입하여 메모리에서 버퍼를 저장하고, 에피소드 경계에서 HDF5에 로쉬 (운동자 버튼 누르거나 텔레오퍼레이션 중지 신호로 유발) 합니다. - ** 압축 (선택):** 높은 해상도로 녹음할 경우, H.264 코딩을 별도의 스레드에서 실행하여 녹음 루프를 차단하지 않도록 한다. 10 Mbps에서, 30 fps 스트림의 1280x960는 카메라당 약 75 MB/분 사용한다.
클라우드 저장 및 데이터 세트 관리에 대해, 자동으로 업로드, 분배 및 데이터 세트 버전을 제공하는 [RCSV 데이터 서비스]
저장 계획
데이터 수집 캠페인을 시작하기 전에 저장 요구사항을 계산하세요:
** 예제: 3 카메라 설정 15 Mbps 카메라, 8 시간 수집 일:** 3 카메라 x 15 Mbps x 3600s/h x 8hr / 8 비트/바이트 / 1e9 GB = 162 GB/일. 10 Mbps 평균: 108 GB/일. 4 TB NVMe SSD를 음반 스테이션에 계획, 밤마다 NAS 또는 클라우드 버킷으로 동기화.
| Configuration | Cameras | GB/day (8 hr) | Days on 4 TB SSD | Monthly Cloud Cost (S3) |
|---|---|---|---|---|
| Minimal (JPEG) | 1 | 36 | ~110 | ~$18 |
| Standard (H.264) | 3 | 108 | ~37 | ~$55 |
| Full coverage (H.264) | 5 | 180 | ~22 | ~$92 |
| Full coverage (PNG lossless) | 5 | 900 | ~4 | ~$460 |
조명 설정
일관된 조명 은 정책 일반화를 크게 향상 시킵니다. 일관된 조명 을 적용 하는 정책 은 조명 조건 이 다르면 종종 배치 되지 않습니다.
- ** 색상 온도:** ** 5500K 일광 균형 LED 반지등을 사용** (예를 들어, 60 유닛 $에 Neewer 18 " 반지등). 모든 빛의 일관된 색상 온도는 카메라들 사이의 백색 균형 변이를 방지합니다.
- ** 위치:** 빛의 반사기를 최소화하기 위해, 상부 카메라 축에서 45도 각에서 조명하십시오. 빛나는 물체와 로봇 표면에서 반사기를 최소화하십시오. 카메라 뒤에 직접 조명을 피하십시오.
- 방산: 단단한 그림자를 제거하기 위해 빛 앞에 방산 패널 (
액리크 시트) 을 추가하십시오. 단단한 그림자는 낮의 다른 시간에 일반화되지 않는 시각적 특징을 만듭니다. - 불빛 커튼: 창문 근처의 실험실 설비에 있어서, 구름과 태양 각에서 환경 빛의 변이를 제거하기 위해 불빛 커튼을 설치하십시오. 이것은 데이터 수집 품질에 가장 높은 ROI 투자 중 하나입니다.
흔히 발생하는 문제 와 해결책
| Issue | Cause | Solution |
|---|---|---|
| Dropped frames | USB bandwidth saturation | Move cameras to separate USB controllers; use GigE |
| GigE incomplete frames | Jumbo frames not enabled | ip link set eth0 mtu 9000 |
| Color inconsistency between cameras | Auto white balance enabled | Set manual white balance (5500K) on all cameras |
| Blurry wrist camera | Motion blur from long exposure | Set exposure to <5 ms; increase lighting intensity |
| High CPU during recording | Software JPEG encoding per frame | Use camera-side JPEG encoding or GPU H.264 (NVENC) |
| 캘리브레이션 reprojection >1 px | Too few or poorly distributed calibration images | Collect 30+ images covering all corners at varied distances |
카메라 종류 비교
로봇 데이터 수집 설정을 위해 일반적으로 사용되는 카메라 기술 세 가지가 있습니다. 당신의 선택은 비용, 지연 결정성, 통합 복잡성에 영향을 미칩니다.
| Type | Example Model | Price | 지연시간 | Best For |
|---|---|---|---|---|
| USB (UVC) | Logitech BRIO 4K | ~$200 | 50-200ms variable | Budget setups, low-frequency tasks |
| GigE Vision | Basler ace2 a2A1920 | $400-$1,500 | <1ms deterministic | High-quality datasets, policy training |
| Depth (RGB-D) | Intel RealSense D435 | ~$200 | 30-60ms | Supplemental depth -- not recommended as primary |
USB 카메라 (Logitech BRIO, ELP, Arducam) 는 가장 접근성이 좋지만 USB 호스트 컨트롤러 스케줄링으로 인한 변수 지연으로 고통 받고 있습니다. 부하 하에 프레임 전달은 20-50 ms로 흔들 수 있으며, 이는 멀티 카메라 녹화를 비동일화시키고 정책 훈련을 저하시킨다. 단일 카메라 또는 낮은 프레임 속도 설정 (<15 fps) 에 USB는 허용됩니다.
GigE 비전 카메라 (Basler ace2, FLIR Blackfly S, Allied Vision Alvium) 는 하드웨어 트리거를 할 때 결정적인 <1 ms 지연을 가진 이더넷을 통해 프레임을 제공합니다. 650 달러에 Basler ace2 a2A1920-160ucBAS는 1920x1200을 160 fps에서 제공합니다. 30 fps 로봇 녹음에 충분합니다. GigE 카메라에는 주복 프레임이 활성화 된 전용 NIC (
** 깊이 카메라** (RealSense D435, Azure Kinect) 는 추가 3D 장면 이해에 유용하지만 주요 녹음 카메라로 권장되지 않습니다. 물체 경계에 있는 굴러가는 셔터, 깊이 소음 및 빛나는/ 어두운 표면에 대한 어려움은 유일한 시각 관측으로 적합하지 않습니다. 당신의 정책이 깊이 입력이 필요한 경우 RGB 카메라 외에도 사용하십시오.
3개의 카메라 구성
다양한 조작 작업은 다양한 카메라 장치에 의해 이루어집니다. 여기 RCSV에서 사용되는 세 가지 검증된 구성 요소가 있습니다. 복잡성과 데이터 풍부성에 따라 순서대로 순서대로 순서대로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순서로 순정됩니다.
구성 1: 최소 (1 카메라, 예산 설정)
- ** 카메라:** 1x 오버헤드 USB 카메라 (Logitech BRIO, $200)
- ** 위치:** 작업 공간 위에 90~100cm 높이로 설치되어, 직진으로 아래로 향한다
- 상화: 1280x720 30fps
- ** 사용 사례:** 간단한 선택 및 장소, 초기 프로토타입 제작, 단일 팔 테이블 작업
- ** 제한:** 고도 정보, 이기 중심의 시각이 없습니다. 복잡한 작업에 3 카메라 설정보다 15-25% 낮은 정책 성능
데이터 수집을 시작하는 가장 빠른 방법입니다. 동기화 하드웨어가 필요하지 않습니다. 멀티 카메라 설정을 투자하기 전에 작업 정의를 검증하기에 적합합니다.
구성 2: 표준 (3 카메라, 권장)
이 구성은 RCSV에서 표준 조작 데이터 수집을 위해 사용되며 커버리, 해상도 및 저장 비용을 균형을 맞추고 있습니다.
- ** 카메라 1 - 고정된 상부 (상하):** 작업 공간 위에 80-100cm 높이 설치되어, 직진으로 향합니다. 해상도 1280x960 30fps. 전체 작업 공간, 객체 배치 및 꽉 잡아 접근을 위에서 촬영합니다. 이것은 대부분의 선택 및 장소 정책에 가장 정보적 인 전망입니다.
- ** 카메라 2 -- 고정된 옆 (옆):** 작업 공간의 높이에 설치되어, 옆으로 60~80cm. 해상도 1280x960 30fps. 상공 조치가 불가능한 높이의 정보를 제공합니다. 겹치기, 붓기, 삽입 작업에 중요합니다.
- ** 카메라 3 - 손목 (자 Ego-centric):** 로봇의 최종 효과자나 도구 플랜지에 전면으로 설치되어 있습니다. 60fps에서 해상도 640x480. 더 높은 프레임 속도는 흐릿하지 않고 손목의 빠른 움직임을 캡처합니다. Ego-centric 시점은 모방 학습 연구에서 포착 및 미세한 조작 정책 성능을 크게 향상시킵니다.
DK1를 사용하는 쌍방향 설정에 있어서, 2 카메라의 반대편에 네 번째 고정된 카메라를 추가하여 팔 사이의 잠복을 덮습니다.
구성 3: 전체 커버 (5+ 카메라, 고급)
- 카메라 1-3: 2형의 카메라와 동일 (머리, 옆, 손목)
- ** 카메라 4 -- 반대편:** 작업 공간의 반대편에 카메라 2 거울을 설치합니다. 손/팔 점막을 제거합니다.
- ** 카메라 5 -- 전면 각 (45도):** 45도 아래쪽 각에서 60cm 앞쪽으로 위치하고, 상공에서 놓친 객체 접근과 지갑 지향을 촬영합니다.
- ** 카메라 6 (선택) -- 깊이 카메라:** 인텔 리얼센스 D435는 추가 포인트 클라우드 데이터에 대한 상공 위치 근처에 설치되어 있습니다.
이 구성은 에피소드 당 3-5배 더 많은 데이터를 생성하지만 가장 완전한 시각적 커버리를 제공합니다. 멀티뷰 정책 학습 및 3D 장면 재구성 연구에 사용됩니다. 저장 요구 사항: 카메라당 15 Mbps에서 약 500 MB/분.
끝에서 끝까지의 지연 예산
텔레오퍼레이션에서 전체 유리-글라스 지연시간 (센서를 타는 광선에서 액추에이터 운동까지) 은 인간 조작을 위해 150 ms 이하로, 정확한 조작을 위해 100 ms 이하로 유지되어야 한다.
| Stage | Component | GigE Camera | USB Camera |
|---|---|---|---|
| 1 | Sensor exposure | 5-10 ms | 5-33 ms (auto-exposure) |
| 2 | Readout + transfer | <1 ms (Ethernet) | 10-50 ms (USB scheduling) |
| 3 | Driver processing | 1-2 ms | 2-5 ms |
| 4 | ROS2 topic publish | 1-3 ms | 1-3 ms |
| 5 | Policy inference | 10-30 ms (GPU) | 10-30 ms (GPU) |
| 6 | Motor command + execution | 5-10 ms | 5-10 ms |
| Total | 23-56 ms | 33-131 ms |
USB 카메라 경로는 로드 상태에서 100 ms를 초과할 수 있습니다 (다중 USB 장치가 호스트 컨트롤러를 공유하고), 눈에 띄는 텔레오프 지연을 유발합니다. [OpenArm 1]
동기화 방법
멀티 카메라 동기화가 중요합니다. 카메라들 사이의 33ms의 해동화 속도는 30fps로 카메라가 한 프레임 뒤쪽에 있다는 것을 의미합니다. 해동된 데이터에 훈련된 정책들은 잘못된 시간 상관관계를 학습합니다.
하드웨어 GPIO 트리거 (GigeE 카메라에 권장)
단일 트리거 인파를 마이크로 컨트롤러 (Arduino Uno, $25 또는 Raspberry Pi GPIO) 로 생성하고 모든 카메라의 트리거 입력에 동시에 연결합니다. <1 ms 동기화를 달성합니다. Pylon (Basler) 또는 SpinView (FLIR) 를 통해 외부 트리거 모드를 통해 카메라를 구성합니다.
# Arduino trigger sketch for 30 fps synchronized capture
void setup() {
pinMode(2, OUTPUT); // Trigger pin → all camera trigger inputs
}
void loop() {
digitalWrite(2, HIGH);
delayMicroseconds(100); // 100us pulse width
digitalWrite(2, LOW);
delay(33); // 33ms → 30 fps
}
NTP를 통해 소프트웨어 동기화
모든 녹음기를 일반적인 NTP 서버 (
ROS2 메시지_filters for Approximate Sync
하드웨어 트리거가 사용되지 않을 때, ROS2
from message_filters import ApproximateTimeSynchronizer, Subscriber
from sensor_msgs.msg import Image
sub_overhead = Subscriber(node, Image, '/cam_overhead/image_raw')
sub_side = Subscriber(node, Image, '/cam_side/image_raw')
sub_wrist = Subscriber(node, Image, '/cam_wrist/image_raw')
sync = ApproximateTimeSynchronizer(
[sub_overhead, sub_side, sub_wrist],
queue_size=10,
slop=0.033 # 33ms tolerance (1 frame at 30fps)
)
sync.registerCallback(synchronized_callback)
카메라 캘리브레이션
캘리브레이션은 두 가지 구성 요소를 가지고 있습니다. 카메라당 내재적 요소와 외재적 요소 (카메라와 로봇 기지에 대한 상대적 자세).
** 내성 캘리브레이션**은 각 카메라의 화소장, 주점 및 왜곡 계수를 특징으로 한다. 9x7 쉐커보드 (25mm 광장) 을 가진 OpenCV의 캘리브레이션 모듈을 사용한다. 다양한 각과 거리에서 20-40개의 이미지를 수집한다. 재탄생 오류를 목표로 <0.5 px ( 최대 1.0 px까지 허용된다).
외부 캘리브레이션은 각 카메라 프레임에서 로봇 기본 프레임으로 6DOF 변환을 결정합니다. 여러 알려진 자세에 장착된 ChArUco 보드를 사용하십시오. 각 카메라에 대해 작업 공간 전체에서 15-20개의 보드 관찰을 수집하십시오. 결과적인 변환은 ROS2 파라미터 파일에서 정적 TF 프레임으로 저장되어 있으며 정책 훈련에 대한 일반적인 로봇 관련 좌표 프레임으로 관찰을 투영하는 데 사용됩니다.
각 카메라 이미지에 로봇의 TCP 위치를 (앞으로의 운동학) 투영하여 캘리브레이션을 확인합니다. 투영된 포인트는 모든 작업 공간 위치에서 5 픽셀 이내에 보이는 TCP와 조화를 이루어야 합니다. 오류 > 10 px는 일반적으로 잘못된 카메라 마운트 포즈를 나타냅니다. 마운트의 딱딱성을 다시 확인하고 외부 데이터를 회수합니다.
ROS2 이미지 운송 파이프라인
ROS2의
| Transport | Bandwidth (1280x960@30fps) | CPU Load | Quality Loss | Best For |
|---|---|---|---|---|
| raw | ~880 Mbps | Minimal | None | Intra-process, shared memory |
| compressed (JPEG 80%) | ~30-60 Mbps | Moderate | Slight (lossy) | Cross-machine recording |
| h264 (ffmpeg_image_transport) | ~10-30 Mbps | High (GPU encode helps) | Moderate (lossy) | Long recording sessions, storage-limited |
| compressed (PNG) | ~300-500 Mbps | High | None (lossless) | Archival, precision-critical data |
** 추천:** 표준 데이터 수집을 위해 80% 품질의 JPEG 압축 운송을 사용하십시오. 이 품질 수준에서의 압축 유물은 대부분의 정책 훈련 파이프라인의 소음 바닥보다 낮습니다. 가장 충실한 연구 데이터 세트에서 PNG 손실 없이 사용하지만 저장량을 10배 증가시킬 계획을 세웁니다.
모방 학습을 위한 HDF5 녹음 형식
녹음 파이프라인은 시크로네이션 프레임, 로봇 합동 상태 및 액션 레이블을 시연당 하나의 파일로 캡처해야 합니다. HDF5는 ACT, 디스포지션 정책 및 대부분의 모방 학습 프레임워크에서 사용되는 표준 형식입니다.
권장 HDF5 구조
/episode_0042/
observations/
images/
cam_overhead # (T, H, W, 3) uint8 JPEG-decoded frames
cam_side # (T, H, W, 3) uint8
cam_wrist # (T, H, W, 3) uint8
joint_positions # (T, 6) float64 — radians
joint_velocities # (T, 6) float64 — rad/s
ee_pose # (T, 7) float64 — xyz + quaternion
gripper_state # (T, 1) float64 — 0.0 closed to 1.0 open
tactile/ # optional
left_finger # (T, 16, 16) uint16 — Paxini pressure
right_finger # (T, 16, 16) uint16
actions/
joint_positions # (T, 6) float64 — target joint positions
gripper_action # (T, 1) float64 — target gripper state
metadata/
timestamp # (T,) float64 — Unix timestamps
trigger_pulse # (T,) uint8 — hardware trigger confirmation
fps # scalar — recording frame rate
camera_intrinsics # dict — per-camera calibration
camera_extrinsics # dict — camera-to-base transforms
** 파이썬으로 HDF5를 작성:**
import h5py
import numpy as np
with h5py.File('episode_0042.hdf5', 'w') as f:
ep = f.create_group('episode_0042')
obs = ep.create_group('observations')
imgs = obs.create_group('images')
# Store images with chunk-based compression
imgs.create_dataset('cam_overhead', data=overhead_frames,
chunks=(1, 960, 1280, 3), compression='gzip')
obs.create_dataset('joint_positions', data=joint_data)
obs.create_dataset('ee_pose', data=ee_data)
# Actions
acts = ep.create_group('actions')
acts.create_dataset('joint_positions', data=action_data)
# Metadata
meta = ep.create_group('metadata')
meta.create_dataset('timestamp', data=timestamps)
meta.attrs['fps'] = 30
** 프레임 조율:** 작성 시 모든 데이터를 트리거 타임 스탬프에 조율하십시오. 잘못된 시간 스탬프로 사용하는 대신 5 ms 이상 늦게 도착하는 프레임을 떨어 뜨십시오. 떨어지는 프레임은 잘못된 라인링 프레임보다 좋습니다.
파이프라인 구조를 기록
카메라 센서에서 HDF5 파일까지의 전체 녹음 파이프라인:
- ** 카메라 드라이버 노드** (카메라당 하나):
T31 을 T32 및 T33 에 게시합니다. - ** 동기화 노드:** 모든 카메라의 프레임을 조렬하기 위해
T34 을 사용합니다 + T35 + T36 . 사용자 지정 T37 메시지를 게시합니다. - ** 레코더 노드:**
T38 에 가입하고, 메모리에 버퍼를 저장하고, 에피소드 경계에서 HDF5에 플러쉬 (운동자 버튼 누르거나 텔레오퍼레이션 중지 신호로 유발됩니다). - ** 압축 (선택):** 높은 해상도로 녹음할 경우, H.264 코딩을 별도의 스레드에서 실행하여 녹음 루프를 차단하지 않도록 한다. 10 Mbps에서, 30 fps 스트림의 1280x960는 카메라당 약 75 MB/분 사용한다.
클라우드 저장 및 데이터 세트 관리에 대해, 자동으로 업로드, 분배 및 데이터 세트 버전을 제공하는 [RCSV 데이터 서비스]
저장 계획
데이터 수집 캠페인을 시작하기 전에 저장 요구사항을 계산하세요:
** 예제: 3 카메라 설정 15 Mbps 카메라, 8 시간 수집 일:** 3 카메라 x 15 Mbps x 3600s/h x 8hr / 8 비트/바이트 / 1e9 GB = 162 GB/일. 10 Mbps 평균: 108 GB/일. 4 TB NVMe SSD를 음반 스테이션에 계획, 밤마다 NAS 또는 클라우드 버킷으로 동기화.
| Configuration | Cameras | GB/day (8 hr) | Days on 4 TB SSD | Monthly Cloud Cost (S3) |
|---|---|---|---|---|
| Minimal (JPEG) | 1 | 36 | ~110 | ~$18 |
| Standard (H.264) | 3 | 108 | ~37 | ~$55 |
| Full coverage (H.264) | 5 | 180 | ~22 | ~$92 |
| Full coverage (PNG lossless) | 5 | 900 | ~4 | ~$460 |
조명 설정
일관된 조명 은 정책 일반화를 크게 향상 시킵니다. 일관된 조명 을 적용 하는 정책 은 조명 조건 이 다르면 종종 배치 되지 않습니다.
- ** 색상 온도:** ** 5500K 일광 균형 LED 반지등을 사용** (예를 들어, 60 유닛 $에 Neewer 18 " 반지등). 모든 빛의 일관된 색상 온도는 카메라들 사이의 백색 균형 변이를 방지합니다.
- ** 위치:** 빛의 반사기를 최소화하기 위해, 상부 카메라 축에서 45도 각에서 조명하십시오. 빛나는 물체와 로봇 표면에서 반사기를 최소화하십시오. 카메라 뒤에 직접 조명을 피하십시오.
- 방산: 단단한 그림자를 제거하기 위해 빛 앞에 방산 패널 (
액리크 시트) 을 추가하십시오. 단단한 그림자는 낮의 다른 시간에 일반화되지 않는 시각적 특징을 만듭니다. - 불빛 커튼: 창문 근처의 실험실 설비에 있어서, 구름과 태양 각에서 환경 빛의 변이를 제거하기 위해 불빛 커튼을 설치하십시오. 이것은 데이터 수집 품질에 가장 높은 ROI 투자 중 하나입니다.
흔히 발생하는 문제 와 해결책
| Issue | Cause | Solution |
|---|---|---|
| Dropped frames | USB bandwidth saturation | Move cameras to separate USB controllers; use GigE |
| GigE incomplete frames | Jumbo frames not enabled | ip link set eth0 mtu 9000 |
| Color inconsistency between cameras | Auto white balance enabled | Set manual white balance (5500K) on all cameras |
| Blurry wrist camera | Motion blur from long exposure | Set exposure to <5 ms; increase lighting intensity |
| High CPU during recording | Software JPEG encoding per frame | Use camera-side JPEG encoding or GPU H.264 (NVENC) |
| 캘리브레이션 reprojection >1 px | Too few or poorly distributed calibration images | Collect 30+ images covering all corners at varied distances |







