Skip to main content
Summary

로봇의 눈은 사진을 찍는 장치가 아니다

사람은 컵을 보면 곧바로 "컵이 저기 있네"라고 느낀다. 빨간색인지, 손잡이가 있는지, 테이블 위에 놓였는지 거의 동시에 알아차린다. 하지만 로봇에게 카메라는 처음부터 그런 의미를 주지 않는다. 카메라가 로봇에게 전달하는 것은 "컵"이 아니라 숫자의 묶음이다. 빛이 센서에 닿고, 그 빛이 전기 신호로 바뀌고, 다시 픽셀 값으로 변환된 배열이 로봇의 컴퓨터에 도착한다.

자연어 명령 로봇을 떠올려 보자. 사용자가 "빨간 컵을 집어서 오른쪽에 놓아줘"라고 말한다. LLM은 이 문장을 이해하고 "빨간 컵을 찾는다", "컵을 집는다", "오른쪽 위치에 놓는다" 같은 작업 순서를 만들 수 있다. 하지만 실제 로봇팔이 움직이려면 먼저 한 가지 질문에 답해야 한다.

빨간 컵은 지금 어디에 있는가?

이 질문에 답하는 첫 출발점이 카메라다. 카메라는 로봇이 물리 세계와 만나는 가장 중요한 센서 중 하나다. 하지만 카메라를 단순히 "눈"이라고 생각하면 곤란하다. 로봇 비전에서 카메라는 세상을 숫자로 바꾸는 측정 장치다. 이 장에서는 이미지 데이터가 어떤 구조로 표현되는지, 카메라 좌표계가 공간을 어떻게 해석하는지, 해상도와 프레임레이트 같은 설정이 인식 성능에 어떤 영향을 주는지, 그리고 왜 캘리브레이션이 필요한지 살펴본다.

카메라로 세상을 보기

이미지는 픽셀로 이루어진 숫자 배열이다

디지털 이미지는 작은 점들의 격자다. 이 작은 점을 픽셀이라고 부른다. 화면을 아주 가까이 확대하면 하나의 사진은 수많은 픽셀로 쪼개져 있다. 각 픽셀은 그 위치의 색상 정보를 숫자로 가지고 있다.

예를 들어 640×480 크기의 컬러 이미지를 생각해 보자. 가로로 640개, 세로로 480개의 픽셀이 있다는 뜻이다. 전체 픽셀 수는 307,200개다. 컬러 이미지라면 보통 각 픽셀마다 빨강, 초록, 파랑 값을 가진다. 이를 RGB 값이라고 부른다.

한 픽셀 = [R, G, B]
예: [255, 0, 0]   → 강한 빨강
예: [0, 255, 0]   → 강한 초록
예: [0, 0, 255]   → 강한 파랑
예: [255, 255, 255] → 흰색
예: [0, 0, 0]     → 검은색

컴퓨터 입장에서 이미지는 결국 3차원 배열처럼 다룰 수 있다. 세로 높이, 가로 너비, 색상 채널이 있는 데이터다.

이미지 shape = (height, width, channels)
예: (480, 640, 3)

여기서 중요한 점은 사람이 보는 이미지 좌표와 수학에서 익숙한 좌표가 조금 다르다는 것이다. 이미지에서 픽셀 위치는 보통 왼쪽 위를 원점으로 둔다. 오른쪽으로 갈수록 u 값이 커지고, 아래로 내려갈수록 v 값이 커진다.

(0, 0) ----------------> u
  |
  |
  |
  v
  v

수학 시간에 배운 좌표계에서는 위쪽이 양의 y 방향인 경우가 많다. 하지만 이미지에서는 아래로 내려갈수록 픽셀 행 번호가 증가한다. 이 차이를 모르고 로봇을 제어하면 "위로 움직여야 하는데 아래로 움직이는" 이상한 일이 생긴다. 로봇 비전에서 좌표계가 계속 등장하는 이유가 바로 여기에 있다. 같은 점을 보더라도 이미지 좌표, 카메라 좌표, 로봇 좌표가 서로 다른 방식으로 표현하기 때문이다.

색상 값은 생각보다 믿음직하지 않다

처음 로봇 비전을 배울 때는 색상으로 물체를 찾는 방법이 매우 직관적으로 보인다. "빨간 컵을 찾으려면 빨간 픽셀을 찾으면 되지 않을까?" 실제로 단순한 환경에서는 잘 작동한다. 빨간 컵이 흰 테이블 위에 있고 조명이 일정하다면, 빨간색 영역을 마스크로 분리해 컵 위치를 찾을 수 있다.

하지만 현실은 조금 더 장난스럽다. 같은 빨간 컵도 햇빛 아래에서는 밝은 주황색처럼 보일 수 있고, 어두운 방에서는 검붉게 보일 수 있다. 카메라 자동 노출이 바뀌면 전체 이미지 밝기가 변하고, 형광등과 LED 조명에 따라 흰색의 기준도 달라진다. 사람의 눈과 뇌는 이런 변화를 꽤 잘 보정하지만, 로봇은 숫자 변화로 받아들인다.

그래서 로봇 비전에서는 RGB 값만 보고 세상을 판단하지 않는다. 색상 공간을 바꾸기도 하고, 밝기 변화를 줄이는 전처리를 하기도 하며, 딥러닝 모델을 사용해 물체의 모양과 문맥까지 함께 본다. 다음 장에서 OpenCV를 다룰 때는 이런 색상 공간과 마스크 개념을 직접 사용하게 된다. 지금은 한 가지만 기억하면 충분하다. 이미지는 단순한 그림이 아니라 조명, 카메라 설정, 렌즈 특성, 물체 표면이 섞여 만들어진 측정값이다.

카메라 좌표계: 화면 속 점을 공간의 방향으로 바꾸기

이미지에서 컵의 중심이 (320, 240)에 있다고 하자. 이것은 이미지 한가운데에 컵이 보인다는 뜻이다. 하지만 로봇팔이 컵을 집으려면 이것만으로는 부족하다. 컵이 카메라 앞 20cm에 있는지, 1m 떨어져 있는지 알아야 한다. 또 카메라 기준으로 왼쪽에 있는지 오른쪽에 있는지, 위쪽에 있는지 아래쪽에 있는지도 알아야 한다.

이때 등장하는 것이 카메라 좌표계다. 카메라 좌표계는 카메라를 기준으로 3차원 공간을 표현하는 방법이다. 일반적으로 로봇 비전에서는 카메라의 광학 중심, 즉 렌즈 중심 근처를 원점으로 생각한다. 그리고 카메라가 바라보는 방향을 z축으로 둔다.

많이 쓰이는 카메라 좌표계의 직관은 다음과 같다.

  • x축은 카메라 이미지에서 오른쪽 방향을 나타낸다.

  • y축은 카메라 이미지에서 아래쪽 또는 위쪽 방향을 나타내며, 사용하는 시스템의 convention에 따라 달라질 수 있다.

  • z축은 카메라가 바라보는 앞쪽 깊이 방향을 나타낸다.

여기서 convention은 "약속된 기준"이라는 뜻이다. ROS, OpenCV, 특정 깊이 카메라 SDK, 로봇 제조사 소프트웨어가 좌표축 방향을 조금씩 다르게 정의할 수 있다. 따라서 코드를 작성하기 전에 반드시 "이 시스템에서 x, y, z가 어느 방향인가?"를 확인해야 한다.

카메라 좌표계에서 z는 특히 중요하다. 이미지 좌표만으로는 물체가 얼마나 멀리 있는지 알기 어렵다. 2D 이미지에서는 작은 컵이 멀리 있는 것인지, 실제로 작은 물체가 가까이 있는 것인지 헷갈릴 수 있다. 깊이 정보가 있으면 이 모호함이 줄어든다. 깊이 카메라나 스테레오 카메라를 사용하면 각 픽셀에 대해 카메라로부터의 거리 정보를 얻을 수 있고, 이를 이용해 픽셀 위치를 3D 위치로 바꿀 수 있다.

예를 들어 이미지에서 컵 중심 픽셀이 (u, v)이고, 그 픽셀의 깊이가 z라고 하자. 카메라 내부 파라미터를 알고 있다면 이 점을 카메라 좌표계의 (x, y, z)로 변환할 수 있다. 지금 당장 수식을 완벽히 외울 필요는 없다. 핵심은 이미지의 한 점이 깊이와 카메라 모델을 만나면 3차원 공간의 한 점이 된다는 것이다.

이미지 좌표: (u, v)
깊이 정보: z
카메라 모델: 내부 파라미터
결과: 카메라 좌표계의 3D 점 (x, y, z)

이 변환이 가능해져야 "컵이 화면 중앙에 보인다"가 "컵이 카메라 기준 오른쪽 5cm, 앞쪽 40cm 지점에 있다"로 바뀐다. 그리고 다음 단계에서 이 좌표를 로봇팔 좌표계로 변환하면 "로봇팔이 어디로 손을 뻗어야 하는가"라는 질문에 답할 수 있다.

프레임은 한순간의 세계다

비디오 카메라는 사진을 연속해서 찍는 장치라고 볼 수 있다. 한 장의 이미지를 프레임이라고 부른다. 초당 몇 장의 프레임을 얻는지를 프레임레이트라고 한다. 30FPS는 1초에 30장의 이미지를 받는다는 뜻이다. FPS는 frames per second의 약자다.

로봇에게 프레임레이트는 단순한 영상 품질 문제가 아니다. 행동의 타이밍과 직접 연결된다. 컨베이어 벨트 위를 지나가는 물체를 집는 로봇을 생각해 보자. 카메라가 1초에 한 장만 이미지를 준다면, 로봇은 물체가 어디로 움직였는지 자주 놓칠 것이다. 반대로 30FPS나 60FPS로 이미지를 받으면 물체의 움직임을 더 촘촘하게 추적할 수 있다.

하지만 프레임레이트가 높다고 항상 좋은 것은 아니다. 프레임을 많이 처리하려면 컴퓨터가 더 많은 이미지를 빠르게 분석해야 한다. 객체 검출 모델이 한 프레임을 처리하는 데 100ms가 걸린다면, 이론적으로는 초당 10장 정도밖에 처리하지 못한다. 카메라가 60FPS로 이미지를 보내도 인식 알고리즘이 따라가지 못하면 프레임이 쌓이거나 버려진다.

로봇 비전에서는 카메라 속도, 네트워크 전송, 이미지 처리 속도, 로봇 제어 주기가 서로 맞아야 한다. 카메라가 보는 세계와 로봇이 행동하는 세계 사이에 시간 차이가 생기면 문제가 커진다. 컵이 이미 움직였는데 로봇은 과거 위치로 집으러 갈 수 있다. 사람에게는 찰나처럼 보이는 지연도 빠르게 움직이는 로봇에게는 큰 오차가 된다.

그래서 실제 시스템에서는 각 이미지에 타임스탬프를 붙인다. 타임스탬프는 "이 데이터가 언제 측정되었는가"를 나타내는 시간 정보다. 로봇은 카메라 이미지, 관절 상태, 깊이 정보, 위치 추정 데이터를 시간 기준으로 맞추어야 한다. 로봇 비전은 공간만 다루는 기술이 아니라 시간도 함께 다루는 기술이다.

해상도는 많이 볼수록 좋지만, 많이 계산해야 한다

해상도는 이미지가 얼마나 많은 픽셀로 구성되어 있는지를 나타낸다. 320×240, 640×480, 1280×720, 1920×1080 같은 표현이 해상도다. 해상도가 높으면 작은 물체나 세밀한 모양을 더 잘 볼 수 있다. 멀리 있는 작은 나사, 얇은 케이블, 투명 컵의 테두리처럼 미세한 정보를 잡는 데 유리하다.

그러나 해상도가 높아지면 처리해야 할 픽셀 수가 크게 늘어난다. 640×480 이미지는 약 30만 픽셀이다. 1920×1080 이미지는 약 207만 픽셀이다. 단순히 가로세로가 조금 커진 것처럼 보여도 계산량은 몇 배로 늘어난다. 딥러닝 객체 검출 모델에 고해상도 이미지를 그대로 넣으면 추론 시간이 늘어나고, 메모리 사용량도 커진다.

로봇에서 해상도를 선택할 때는 "잘 보이는가"와 "제때 처리되는가"를 함께 봐야 한다. 책상 위 컵을 집는 로봇이라면 640×480이나 1280×720으로도 충분할 수 있다. 하지만 먼 거리의 표지판을 읽어야 하는 이동 로봇이라면 더 높은 해상도가 필요할 수 있다. 반대로 빠른 제어가 중요한 작업에서는 해상도를 낮추고 프레임레이트를 높이는 편이 더 나을 때도 있다.

좋은 로봇 비전 시스템은 가장 큰 이미지를 무조건 쓰지 않는다. 작업에 필요한 만큼의 정보를 안정적으로, 제시간에 얻는 것을 목표로 한다. 로봇에게 카메라는 영화 촬영 장비가 아니라 행동을 위한 센서이기 때문이다.

노출과 조명: 로봇이 세상을 너무 밝게 또는 어둡게 볼 때

노출은 카메라 센서가 빛을 얼마나 받아들이는지를 결정하는 설정이다. 노출 시간이 길면 더 많은 빛을 받아 밝은 이미지를 얻을 수 있다. 하지만 움직이는 물체는 흐릿하게 찍힐 수 있다. 노출 시간이 짧으면 움직임은 선명해지지만 이미지가 어두워질 수 있다.

자동 노출은 편리하다. 카메라가 주변 밝기에 따라 스스로 노출을 조절한다. 하지만 로봇 비전에서는 자동 노출이 예기치 않은 변화를 만들기도 한다. 예를 들어 로봇팔이 흰 종이를 카메라 앞에 가져오면 화면이 갑자기 밝아진다. 카메라는 너무 밝다고 판단해 노출을 낮춘다. 그 결과 옆에 있던 어두운 물체는 더 어둡게 보이고, 검출 모델이 놓칠 수 있다.

조명도 매우 중요하다. 같은 알고리즘도 조명이 안정적인 실험실에서는 잘 작동하다가, 창가 옆이나 그림자가 많은 장소에서는 성능이 흔들릴 수 있다. 반짝이는 금속, 투명한 플라스틱, 검은색 고무처럼 빛을 특이하게 반사하거나 흡수하는 물체는 특히 어렵다.

실제 로봇 시스템에서는 알고리즘만 고치는 것이 답이 아닐 때가 많다. 조명을 일정하게 만들고, 카메라 위치를 조정하고, 배경을 단순하게 만드는 것만으로도 인식 성능이 크게 좋아질 수 있다. AI 모델이 똑똑해져도 센서 입력이 불안정하면 로봇의 행동은 불안정해진다. 좋은 데이터는 좋은 물리 환경에서 시작된다.

렌즈는 세상을 휘게 만든다

카메라는 세상을 그대로 기록하는 것처럼 보이지만, 실제로는 렌즈를 통해 투영된 이미지를 만든다. 이 과정에서 왜곡이 생긴다. 특히 광각 렌즈를 사용하면 이미지 가장자리의 직선이 휘어 보일 수 있다. 사람이 보기에는 "조금 휘었네" 정도일 수 있지만, 로봇에게는 위치 오차가 된다.

컵이 이미지 중앙에 있을 때와 가장자리에 있을 때, 같은 픽셀 계산을 적용했는데 실제 위치가 다르게 틀어진다면 로봇팔은 안정적으로 집을 수 없다. 특히 물체를 집는 작업에서는 몇 센티미터의 오차도 실패로 이어질 수 있다. 그리퍼가 컵의 중앙이 아니라 가장자리를 누르거나, 물체 옆의 빈 공간을 집으려 할 수 있다.

이 문제를 줄이기 위해 카메라 캘리브레이션을 한다. 캘리브레이션은 카메라가 세상을 어떻게 이미지로 바꾸는지 그 관계를 추정하는 과정이다. 쉽게 말해 "이 카메라는 어떤 렌즈 특성을 가지고 있고, 픽셀과 실제 광선 방향이 어떻게 연결되는가"를 알아내는 절차다.

카메라 내부 파라미터 이해하기

카메라 캘리브레이션에서 자주 등장하는 말이 내부 파라미터다. 내부 파라미터는 카메라 자체의 특성을 나타내는 값이다. 대표적으로 초점 거리와 주점이 있다.

초점 거리는 카메라가 3D 공간의 점을 이미지 평면에 투영할 때 얼마나 확대되어 보이는지와 관련된 값이다. 로봇 비전에서는 보통 픽셀 단위의 초점 거리 fx, fy로 표현한다. fx는 가로 방향, fy는 세로 방향의 초점 거리라고 생각하면 된다.

주점은 카메라의 광축이 이미지 평면과 만나는 지점이다. 이상적으로는 이미지 중앙에 있을 것 같지만 실제 카메라에서는 조금 어긋날 수 있다. 이를 cx, cy로 표현한다.

내부 파라미터를 간단히 정리하면 다음과 같다.

  • fx: 이미지 가로 방향의 초점 거리

  • fy: 이미지 세로 방향의 초점 거리

  • cx: 이미지에서 주점의 가로 위치

  • cy: 이미지에서 주점의 세로 위치

이 값들은 픽셀 좌표를 3D 방향으로 해석하는 데 쓰인다. 예를 들어 어떤 픽셀이 이미지 중앙보다 오른쪽에 있다면, 그 점은 카메라 기준 오른쪽 방향의 광선 위에 있다고 볼 수 있다. 중앙에서 얼마나 떨어져 있는지, 초점 거리가 얼마인지 알면 그 광선의 방향을 계산할 수 있다. 여기에 깊이 z가 결합되면 3D 좌표가 나온다.

직관적으로는 다음과 같은 관계가 있다.

x ≈ (u - cx) * z / fx
y ≈ (v - cy) * z / fy
z = 깊이 값

여기서 u, v는 이미지 픽셀 좌표다. 이 수식은 로봇 비전에서 매우 중요한 감각을 준다. 이미지 중앙에서 멀리 떨어진 픽셀일수록 x나 y 방향으로 더 크게 벗어난 3D 점이 된다. 깊이 z가 클수록 같은 픽셀 차이도 실제 공간에서는 더 큰 거리 차이가 된다. 멀리 있는 물체의 작은 픽셀 오차가 실제로는 큰 위치 오차가 될 수 있는 이유다.

왜곡 보정: 휘어진 이미지를 바로잡기

렌즈 왜곡은 내부 파라미터만으로 끝나지 않는다. 카메라 렌즈는 직선으로 들어오는 빛을 완벽하게 이상적인 방식으로 모으지 못한다. 그래서 방사 왜곡과 접선 왜곡 같은 현상이 생긴다. 방사 왜곡은 이미지 중심에서 멀어질수록 점이 바깥쪽이나 안쪽으로 밀리는 현상이다. 접선 왜곡은 렌즈와 이미지 센서가 완벽하게 평행하지 않을 때 생기는 비대칭적인 왜곡이다.

이런 용어가 조금 낯설어도 괜찮다. 핵심은 간단하다. 이미지 가장자리의 픽셀 위치가 실제 공간의 방향과 정확히 맞지 않을 수 있고, 이를 수학적으로 보정해야 한다는 것이다.

캘리브레이션을 할 때는 보통 체커보드처럼 크기와 모양을 알고 있는 패턴을 여러 각도에서 촬영한다. 컴퓨터는 이미지 속 체커보드 꼭짓점이 어디에 보이는지 찾고, 실제 체커보드의 기하학적 구조와 비교한다. 그 차이를 이용해 카메라 내부 파라미터와 왜곡 계수를 추정한다.

캘리브레이션이 끝나면 왜곡 보정을 적용할 수 있다. 왜곡 보정은 휘어진 이미지를 더 이상적인 카메라 모델에 맞게 펴 주는 과정이다. 완벽한 현실 복원은 아니지만, 픽셀 위치와 공간 방향의 관계를 훨씬 안정적으로 만들어 준다. 로봇팔이 물체를 집는 작업에서는 이 안정성이 매우 중요하다.

카메라만 보정하면 끝일까?

카메라 내부 파라미터를 알고 왜곡 보정까지 했다고 해서 로봇이 곧바로 물체를 집을 수 있는 것은 아니다. 아직 하나의 큰 문제가 남아 있다. 카메라가 본 3D 좌표는 카메라 기준 좌표다. 하지만 로봇팔이 움직이는 기준은 로봇 베이스 좌표이거나 엔드 이펙터 좌표다.

즉, 카메라가 "컵은 내 앞 40cm 지점에 있다"고 말해도 로봇팔은 "그게 내 기준으로는 어디인데?"라고 다시 물어야 한다. 카메라가 로봇팔 위에 달려 있는지, 테이블 위 고정 지점에 있는지, 로봇 머리 부분에 달려 있는지에 따라 좌표 변환이 달라진다.

이 문제는 뒤에서 카메라 좌표에서 로봇 좌표로 변환하는 장에서 자세히 다룬다. 지금은 큰 흐름만 잡으면 된다. 카메라 캘리브레이션은 카메라 내부의 보는 방식을 보정하는 일이고, 카메라-로봇 캘리브레이션은 카메라와 로봇 사이의 위치 관계를 알아내는 일이다. 두 과정이 함께 있어야 픽셀 속 물체가 로봇팔의 실제 목표점으로 바뀐다.

로봇 비전 파이프라인의 첫 단추

카메라 입력은 이후 모든 로봇 비전 기술의 바탕이 된다. 객체 검출은 이미지 안에서 물체의 박스를 찾는다. 세그멘테이션은 픽셀 단위로 물체 영역을 분리한다. 깊이 추정은 화면 속 물체를 3D 위치로 바꾼다. 좌표 변환은 그 위치를 로봇이 움직일 수 있는 목표로 만든다.

이 흐름을 자연어 명령 로봇에 연결해 보면 더 분명해진다. 사용자가 "빨간 컵을 집어 오른쪽에 놓아줘"라고 말했을 때, LLM은 문장을 계획으로 바꾼다. 하지만 계획은 카메라가 제공하는 숫자 세계와 만나야 실행된다. 빨간 컵을 찾고, 컵의 중심을 계산하고, 깊이를 추정하고, 로봇 좌표로 변환한 뒤, 로봇팔이 접근할 수 있는 목표 자세를 만들어야 한다.

그래서 로봇 비전의 첫 단추는 화려한 딥러닝 모델이 아니라 이미지와 좌표계의 기본을 이해하는 것이다. 픽셀 하나가 무엇을 의미하는지, 프레임 하나가 언제 측정된 것인지, 카메라가 어느 방향을 보고 있는지, 렌즈가 얼마나 왜곡을 만드는지 알아야 한다. 이 기본이 흔들리면 아무리 좋은 AI 모델을 붙여도 로봇은 엉뚱한 곳을 바라보고 엉뚱한 곳으로 손을 뻗는다.

이번 장의 핵심

카메라는 로봇에게 세상을 보여 주지만, 그 세상은 처음부터 의미로 주어지지 않는다. 로봇이 받는 것은 픽셀 배열, 색상 값, 시간 정보, 카메라 모델이다. 이 숫자들을 해석해야 비로소 "물체가 어디에 있다"는 판단으로 이어진다.

핵심을 정리하면 다음과 같다.

  • 이미지는 픽셀 배열이며, 각 픽셀은 RGB 같은 색상 값을 가진 숫자 데이터다.

  • 이미지 좌표는 보통 왼쪽 위를 원점으로 하고, 오른쪽과 아래쪽으로 값이 증가한다.

  • 카메라 좌표계는 카메라를 기준으로 공간의 x, y, z 방향을 표현하며, z는 깊이 방향과 연결된다.

  • 해상도, 프레임레이트, 노출, 조명은 로봇 인식 성능과 실시간성에 직접적인 영향을 준다.

  • 카메라 캘리브레이션은 내부 파라미터와 렌즈 왜곡을 추정해 픽셀을 더 정확한 공간 정보로 해석하기 위한 과정이다.

이제 로봇은 카메라로 받은 이미지를 숫자 배열로 읽을 준비를 했다. 다음 단계는 이 숫자 배열을 실제로 다루는 도구를 익히는 것이다. OpenCV를 사용하면 이미지를 읽고, 색상을 바꾸고, 특정 영역을 분리하고, 물체의 위치를 계산할 수 있다. 로봇의 눈이 단순히 보는 장치에서 행동을 위한 센서로 바뀌기 시작한다.

책 목록

AI 로봇 에이전트 만들기: 비전·로봇팔·학습·LLM으로 자연어 명령을 실행하는 로봇

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기