콘텐츠로 이동
GitHub

카메라 교체

Pinkrab 은 그리퍼 카메라와 탑 카메라에 ELP AR0234 모듈을 쓰지만, OpenCV 로 열리는 UVC 카메라라면 다른 모델로 바꿀 수 있습니다. 카메라를 여는 방식과 영상을 읽는 방식은 모두 src/pinkrab_description/config/camera.yaml 한 파일에 적혀 있고, 렌즈는 사양값을 쓰지 않고 개체마다 측정하기 때문에 카메라를 바꿀 때 코드를 고칠 일은 없습니다.

조건 그리퍼 카메라 탑 카메라
연결 USB UVC USB UVC
화각 가로 약 145° 이상(어안 렌즈) 작업 자리, 테이블 마커, 두 Hermit 이 함께 보이는 만큼
노출 제약 없음 UVC 로 수동 노출을 고정할 수 있어야 함, gain 은 있으면 씀
셔터 global shutter 권장 global shutter 권장
초점 고정 고정
개수 같은 모델 4개(Hermit 둘, 팔 둘) 1개
  • 그리퍼 카메라의 화각: jaw 를 끝까지 열면 jaw 끝이 렌즈 축에서 71.3° 떨어진 곳에 오기 때문에, 가로 화각이 그보다 좁은 카메라는 jaw 를 화면 밖으로 놓칩니다.
  • 같은 모델 4개: policy 는 Hermit 카메라의 영상으로 학습하고 팔 카메라의 영상을 보며 실행하므로, Hermit 과 팔에는 같은 모델을 같은 자리에 답니다.
  • 탑 카메라의 노출: 모든 마커 pose 를 탑 카메라 영상에서 풀기 때문에, 노출이 길면 움직이는 손의 마커가 번져 놓치게 됩니다. 그래서 노출을 짧게 고정하고(기본 10 ms), 밝기는 gain 과 조명으로 맞춥니다. studio 의 탑 카메라 패널에서 exposure 와 brightness 를 조절하는데, brightness 는 gain 을 움직이는 값이라 UVC gain 이 없는 카메라에서는 exposure 만 조절되고 밝기는 조명으로 맞춥니다. 수동 노출을 받지 않는 카메라는 탑 카메라로 열리지 않습니다.
  • 탑 카메라의 거리: 마커가 작업 거리에서 충분히 크게 보여야 합니다. 120° 렌즈의 1920×1200 카메라는 작업 자리에서 약 50 cm 안에 있어야 하므로, 머리에 달아 손을 내려다보게 합니다.
  • 탑 카메라의 자리: 탑 카메라는 시연자 머리에 달려 고개와 함께 움직입니다. Hermit pose 를 매 프레임 테이블 마커 기준으로 계산하므로 테이블 마커가 늘 화면에 있어야 하고, 고개를 빨리 돌리면 마커가 번져 그 프레임을 놓칩니다.

camera.yaml 의 gripper 와 top 블록이 각 카메라의 profile 입니다.

src/pinkrab_description/config/camera.yaml
gripper:
model: ELP-AR0234-GS-fisheye
usb: [0x32e4, 0x5234]
sensor: [1920, 1200]
resolution: [1280, 960]
region: [160, 0, 1600, 1200]
fps: 30
fourcc: MJPG
latency_s: 0.012
crop: [0.8125, 0.95]
top:
model: ELP-AR0234-GS-H120
usb: [0x32e4, 0x5234]
resolution: [1920, 1200]
fps: 60
fourcc: MJPG
latency_s: 0.012
exposure_unit_us: 16.667
hfov_deg: 120.0
항목 뜻
model 카메라 이름. 녹화마다 기록에 남습니다
usb USB vendor id 와 product id. 적으면 그 id 의 카메라만 후보로 삼고, null 이면 연결된 USB 카메라를 모두 후보로 삼습니다. 어느 카메라가 어느 손인지는 id 가 아니라 꽂은 소켓으로 정합니다
resolution 여는 해상도
sensor 그리퍼 카메라만. 센서 전체 프레임의 크기. 렌즈 측정은 늘 이 크기로 하고, 렌즈 축도 이 프레임의 비율로 적습니다. 없으면 resolution 과 같습니다
region 그리퍼 카메라만. resolution 모드가 센서의 어느 부분(x, y, 가로, 세로)을 담는지. AR0234 의 1280×960 모드는 센서 가운데 1600×1200 을 0.8 배로 줄인 것이라, dataset 이 쓰는 렌즈 쪽 영역은 그대로 담고 영상 크기는 센서 전체의 절반 남짓입니다. 없으면 센서 전체입니다
fps 여는 frame rate. 탑 카메라는 30 을 요청하면 약 21 fps 만 보내서 60 을 요청합니다(실제 약 50)
fourcc 영상 형식. 카메라 여러 대를 같은 USB 버스로 받을 때는 MJPG 를 씁니다
latency_s 노출부터 프레임이 컴퓨터에 도착하기까지의 시간. 카메라끼리, 그리고 jaw 와 시각을 맞추는 데 씁니다
crop 그리퍼 카메라만. dataset 이 남기는 영역을 센서 가로·세로의 비율로 적고, 영역은 각 카메라의 렌즈 축을 중심으로 잡습니다. 어안 렌즈의 검은 모서리를 잘라 내는 값이며, 영상이 프레임을 꽉 채우는 렌즈는 [1.0, 1.0] 입니다
exposure_unit_us 탑 카메라만. 노출 제어값 1 의 길이(µs). UVC 표준은 100 이지만 모듈마다 다릅니다
hfov_deg 탑 카메라만. 제조사가 밝힌 가로 화각. 렌즈 측정이 시작하는 값으로만 씁니다

USB id 는 카메라를 꽂은 뒤 macOS 에서는 system_profiler SPUSBDataType, Linux 에서는 lsusb 로 확인합니다.

exposure_unit_us 는 노출값을 올려 가며 영상 밝기를 보면 알 수 있습니다. 노출이 프레임 주기를 채우면 밝기가 더 오르지 않으므로, 프레임 주기를 그때의 노출값으로 나눈 값이 한 단위입니다. AR0234 는 60 fps 에서 약 1000 에서 밝기가 멈춰서, 16.7 ms ÷ 1000 = 16.7 µs 입니다.

region 은 그 모드로 찍은 프레임과 센서 전체 프레임을 같은 카메라로 나란히 찍어, 가운데를 자른 것과 줄인 것 가운데 어느 쪽과 같은지로 확인합니다. dataset 이 남기는 영역이 region 안에 들어가야 합니다.

그리퍼 카메라의 crop 을 바꾸면 dataset 의 영상 크기가 달라집니다. 이전 dataset 으로 학습한 checkpoint 는 Policy 페이지가 실행을 거절하므로, 시연을 다시 convert 해서 학습합니다.

그리퍼 카메라는 팔의 손목과 Hermit 에 같은 camera bracket 으로 달립니다. 다른 카메라는 케이스 크기가 달라서 bracket 을 새로 그려야 하고, 지금 bracket 의 형상은 src/pinkrab_description/print/camera_bracket_right.stl(팔)과 src/pinkrab_umi/print/camera_bracket_right.stl(Hermit)에 있습니다.

카메라의 위치와 방향은 camera.yaml 의 pose 가 정합니다. 기준은 TCP frame(+z 가 두 손가락 사이로 나가는 방향, x 가 jaw 가 열리는 방향)이고 오른손 기준이며, 왼손은 y 와 yaw 의 부호가 반대입니다.

항목 뜻 지금 값
offset_out 손가락이 열리는 평면에서 바깥으로 떨어진 거리 62 mm
offset_back TCP 에서 손목 쪽으로 떨어진 거리 78 mm
pitch, yaw 광축의 기울기 3.05°, 5.11°

새 bracket 은 다음을 지키도록 그립니다.

  • 렌즈 중심이 offset_out, offset_back 자리에 오고, 광축이 pitch, yaw 방향을 향합니다. 화각이 다른 렌즈라면 jaw 를 닫았을 때 두 손가락 끝이 화면 세로 중앙선의 아래쪽 1/4 높이에 오도록 pitch, yaw 를 다시 정합니다.
  • 손목 roll 전 범위(±175°)와 jaw 전 범위에서 bracket 과 카메라가 손목·jaw 에 닿지 않습니다. 지금 bracket 은 손목과 4.1 mm, jaw 와 1.9 mm 떨어져 있습니다.
  • 팔과 Hermit 의 bracket 이 카메라를 같은 자리, 같은 방향에 둡니다.
  1. camera.yaml 의 profile 을 새 카메라에 맞게 고칩니다.
  2. 카메라를 꽂은 소켓을 다시 지정합니다. 준비의 pinkrab cameras, pinkrab-umi cameras, pinkrab-umi cameras --top 입니다.
  3. 바꾼 카메라마다 렌즈를 다시 측정합니다(pinkrab lens, pinkrab-umi lens). 탑 카메라는 렌즈 측정이 없으면 열리지 않고, 그리퍼 카메라는 측정이 없으면 convert 와 실행을 거절합니다.
  4. 그리퍼 카메라를 바꿨다면 Hermit 으로 짧게 시연을 녹화해, 두 jaw 가 끝까지 열렸을 때도 화면 안에 있는지 확인합니다.