Visual Servoing
비주얼 서보잉은 카메라 이미지를 활용해 로봇의 움직임을 제어하는 피드백 제어 방식으로, 목표를 향해 연속적인 시각적 보정을 수행합니다.
시각 서보잉은 카메라 이미지를 사용해 로봇의 움직임을 원하는 위치나 시점에 맞추도록 지속적으로 조정하는 피드백 제어 기법입니다. 로봇은 시각적 특징을 관찰하고 목표 구성과의 차이를 측정한 뒤, 새로운 이미지가 들어올 때마다 움직임을 보정합니다. 이 기법은 이미지를 해석하는 컴퓨터 비전과 이러한 측정값을 실제 동작으로 변환하는 로보틱스를 연결합니다. 시각 서보 제어는 동의어입니다. J. Hill과 W. T. Park은 1979년 이동형 카메라를 이용한 로봇의 실시간 제어에서 이 용어를 처음 도입했습니다.
시각 서보잉의 작동 방식#
시각 서보잉 시스템은 현재 관측값을 목표 이미지 또는 상대 포즈와 비교합니다. 특징 추출은 키포인트, 선의 위치, 객체 윤곽 등의 측정값을 제공합니다. 제어기는 그 결과로 얻은 오차를 움직임 명령으로 변환합니다. 움직임에 따라 카메라의 관측값이 바뀌면서 피드백 루프가 닫히고, 로봇이 목표에 다가가는 동안 반복적으로 보정할 수 있습니다.
상호작용 행렬은 이미지 야코비안이라고도 하며, 카메라의 움직임이 시각적 측정값을 어떻게 바꾸는지 설명합니다. 이 행렬의 의사역행렬은 특징 오차를 보정 속도로 변환하고, 제어기 게인은 보정 강도를 설정합니다. 카메라 장착 방식에 따라 두 가지 일반적인 구성이 있습니다. 아이-인-핸드는 움직이는 도구에 카메라를 장착하고, 아이-투-핸드는 작업 공간을 관찰하는 외부 카메라를 사용합니다.
Ultralytics YOLO는 이 루프에 필요한 인식 측정값을 제공합니다. YOLO26은 객체 감지를 통해 바운딩 박스를 생성하며, ROS 통합은 카메라에서 얻은 감지 결과와 깊이 정보를 로봇 소프트웨어 구성 요소 간에 전달합니다. 다운스트림 제어기는 이러한 측정값을 사용해 움직임을 계산합니다.
이미지 기반 및 위치 기반 시각 서보잉#
주요 방법은 제어 오차를 표현하는 방식이 서로 다릅니다:
- 이미지 기반 시각 서보잉(IBVS): 점 좌표와 같은 현재 이미지 특징과 목표 이미지 특징 간 차이를 최소화합니다. 점 특징 제어기는 카메라 기하와 깊이 추정값을 사용해 이미지상의 움직임과 실제 움직임의 관계를 파악합니다.
- 위치 기반 시각 서보잉(PBVS): 포즈 추정을 사용해 3차원 위치와 방향을 복원한 다음 목표 포즈와의 차이를 줄입니다. 카메라 캘리브레이션과 기하학적 재구성이 정확도에 영향을 줍니다.
- 하이브리드 시각 서보잉: 이미지 공간 측정값과 3차원 측정값을 결합합니다. 잘 정립된 2.5D 시각 서보잉 방식은 이미지 특징과 부분적인 포즈 정보를 결합합니다.
객체 추적은 프레임 간에 특징 또는 객체의 대응 관계를 유지하고, 시각 서보잉은 해당 관측값을 사용해 움직임을 제어합니다. 시각 SLAM은 카메라 움직임을 추정하고 맵을 생성합니다. 이러한 인식 기능은 로봇의 내비게이션 및 제어 시스템에서 각기 다른 부분을 지원합니다.
응용 분야와 실제 제약 조건#
- 로봇 파지: 근거리에서 물체를 잡을 때 RGB-D 카메라가 최소 깊이 감지 거리보다 가까워지면 유효한 거리 측정값을 잃을 수 있습니다. 폐루프 시각 파지는 IBVS를 사용해 물체가 움직이는 경우에도 RGB 특징 측정값으로 마지막 접근 동작을 계속 보정합니다.
- 모바일 로봇 위치 결정: ViSP Pioneer 데모는 카메라가 장착된 Pioneer P3-DX 로봇을 시각적 목표물에 맞춰 제어합니다. 목표물 관측값을 바탕으로 위치 기반 제어기가 로봇의 움직임을 보정합니다.
타이밍과 가시성은 제어에 직접적인 영향을 줍니다. 이미지 처리 지연은 추적 지연을 일으켜 루프를 불안정하게 만들 수 있습니다. 따라서 추론 지연 시간은 실시간 추론에서 감지 정확도만큼 중요합니다. 가림 현상은 특징 간 대응 관계를 끊고, 조건이 좋지 않은 특징 기하 구조는 속도 추정값을 이미지 노이즈에 민감하게 만듭니다. 센서 퓨전은 시각 측정값을 관절 엔코더 등의 정보와 결합하여 움직이는 동안 유용한 상태 추정값을 유지합니다.
간단한 IBVS 시뮬레이션#
이 Python 시뮬레이션은 한 위치에 고정된 점을 관찰하면서 카메라를 옆으로 이동시키고, 표준 의사역행렬 제어 법칙을 적용합니다. pip install numpy을 사용해 NumPy를 설치하세요.
import numpy as np
point = np.array([0.0, 0.0, 2.0])
camera = np.array([-0.4, 0.2, 0.0])
desired = np.zeros(2)
gain, dt, focal_pixels = 1.0, 0.05, 800.0
initial_error = np.linalg.norm((point - camera)[:2] / point[2])
for _ in range(200):
relative = point - camera
observed = relative[:2] / relative[2]
error = observed - desired
# Interaction matrix for sideways camera translation.
interaction = -np.eye(2) / relative[2]
velocity = -gain * np.linalg.pinv(interaction) @ error
camera[:2] += velocity * dt
final_error = np.linalg.norm((point - camera)[:2] / point[2])
print(f"Pixel error: {initial_error * focal_pixels:.2f} -> {final_error * focal_pixels:.2f}")반복적인 보정으로 점이 중앙에 정렬되면서 이미지 오차는 약 178.89픽셀에서 0.01픽셀로 감소합니다. 점 특징의 경우 병진 상호작용 항은 깊이에 반비례합니다. 점의 깊이가 두 배가 되면 같은 카메라의 측면 이동으로 발생하는 이미지 변위는 절반이 됩니다.










