깊이 측정을 위한 커스텀 임베디드 스테레오 시스템

화인스텍

 

 

깊이 측정 시스템 개발을 위한 3D 센서 옵션에는 다양한 옵션들이 있는데, 카메라가 있는 스테레오 비전, 라이다 및 TOF센서가 대표적이다. 그리고 각 옵션에는 장단점이 있다. 그 중 스테레오 비전 시스템은 일반적으로 비용이 저렴하고 실외에서 사용하기에도 충분히 견고하며 고해상도 컬러 포인트 클라우드를 제공한다.


오늘날 시장에서 사용할 수 있는 다양한 기성 스테레오 시스템이 존재하지만, 정확도, FOV, 해상도 등과 같은 요인에 따라 시스템 엔지니어가 특정 애플리케이션 분야의 요구 사항을 해결하기 위해 커스텀 시스템을 구축해야 하는 경우도 있다.

 

스테레오 비전 개요

 

 

스테레오 비전은 두개의 다른 시점에서 촬영한 두 이미지의 정보를 비교하여 디지털 이미지에서 3D 정보를 추출하는 것이다. 두 이미지 평면에서 물체의 상대적 위치는 카메라에서 물체까지의 거리, 즉 깊이에 대한 정보를 제공해준다.


스테레오 비전 시스템의 개요는 아래 이미지와 같으며 다음과 같은 주요 단계로 구성된다.

 

 


1. 캘리브레이션 : 카메라 캘리브레이션의 경우 두 가지 의미가 있다. Instrinsic(내부적인) 캘리브레이션의 경우는 이미지 중심, 초점 거리 및 왜곡 파라미터를 말하며, Extrinsic(외부적인) 캘리브레이션은 카메라의 실제 위치 등을 말한다.


2. 렉티피케이션 : 스테레오 렉티피케이션은 이미지 평면을 양쪽 카메라의 중심 사이의 선과 평행한 공통 평면으로 조정하는 프로세스를 말한다.


3. 스테레오 매칭 : 왼쪽과 오른쪽 이미지 사이에 픽셀을 일치시켜주는 과정을 스테레오 매칭이라고 하며, Disparity image(불균형한 이미지)를 생성하게 된다.


4. Triangulation(삼각측량) : 삼각 측량은 두 이미지에 투영된 3D 공간의 점을 결정하는 과정을 말한다. Disparity image(불균형한 이미지)는 3D 포인트 클라우드로 변환된다.

 

설계 예제


스테레오 시스템의 설계 예제를 살펴본다. 다음은 빠르게 움직이는 물체가 있는 동적 환경인 모바일 로봇 애플리케이션에 대한 요구 사항이다. ROI 크기는 2m, 카메라에서 목표물까지의 거리는 3m, 원하는 정확도는 1cm이다.


깊이 오차는 다음과 같은 요인에 따라 ΔZ=Z²/Bf * Δd에 의해 주어진다.


• Z = 범위


• B = Baseline(기준선)


• F = focal length(픽셀 단위의 초점 거리)


처음에 언급한 요구 사항을 충족할 수 있는 다양한 설계 옵션들이 있는데, 원하는 FOV와 WD에 따라 특정 센서에 대한 렌즈의 초점 거리를 정할 수 있다. 기준선(Baseline)으로 위의 공식을 사용하여 3m에서 예상 깊이 오차를 계산하여 요구되는 정확도를 충족하는지 확인할 수 있다.

 

위 이미지는 기준선이 긴 저해상도 카메라 또는 기준선이 짧은 고해상도 카메라 이렇게 두가지 옵션에 대한 설명이다. 첫번째 옵션은 전체적으로 크기가 더 큰 카메라이지만 복잡한 계산의 필요성이 적고 두번째의 경우는 크기는 더 컴팩트 하지만 복잡한 계산의 필요성이 높다.

 

예제 애플리케이션에서는 컴팩트 한 크기가 모바일 로봇 애플리케이션에 더 적합하기 때문에 두번째 옵션을 선택했으며, 요구되는 프로세스를 처리 할 수 있는 강력한 GPU가 탑재된 TX2 용 Quartet Embedded Solution을 사용할 수 있다.

 

 

하드웨어 요구 사항


이 예에서는 IMX273 Sony Pregius 글로벌 셔터 센서를 사용하여 두 대의 Blackfly S 1.6MP 보드 레벨 카메라를 12cm 기준선을 가진 3D 프린트된 프레임에 장착한다.

 

두 카메라 모두 동일한 6mm S-마운트 렌즈를 장착했다. 카메라는 FPC 케이블을 사용하여 TX2 커스텀 캐리어 보드용 Quartet Embedded Solution에 연결한다. 왼쪽과 오른쪽 카메라를 동기화하여 동시에 이미지를 캡처하기 위해 두 카메라를 연결하는 동기화 케이블도 연결한다.


두 렌즈 모두 애플리케이션이 요구하는 범위에 카메라 초점이 맞도록 조정해야 한다. 초점을 맞춘 후 초점을 고정하기 위해 각 렌즈의 나사를 조여준다. (아래 그림 참고)

 

 

 

소프트웨어 요구 사항


Spinnaker : Teledyne FLIR Spinnaker SDK는 TX2용 Quartet Embedded Solution에 사전 설치되어 제공된다. 카메라와 통신하기 위해선 Spinnaker가 필요하다.


CUDA를 지원하는 OpenCV 4.5.2 : 스테레오 매칭 알고리즘 중 하나인 SGM을 사용하기 위해선 OpenCV 4.5.1 버전 또는 그 이상의 버전이 필요하다.

 

코드를 포함하고 있는 설치 파일을 다운로드 후 압축을 풀어준다. 리눅스 터미널에서 아래와 같이 OpenCV를 설치하는 스크립트 인 OpenCVInstaller.sh를 실행한다.


cd ~/StereoDepth
chmod +x OpenCVInstaller.sh
./OpenCVInstaller.sh

 

캘리브레이션


스테레오 이미지를 불러와 캘리브레이션 하는 코드는 ‘Calibration’ 폴더에서 확인할 수 있다. SpinView GUI를 사용하여 좌우 카메라의 일련 번호를 확인한다. 우측 카메라는 마스터, 좌측 카메라는 슬레이브로 설정해준다. 마스터 및 슬레이브 카메라의 일련 번호를 grabStereoImage.cpp 파일의 60번째와 61번째 줄에 복사해준다. 리눅스 터미널에서 다음 명령어를 사용하여 실행 파일을 빌드한다.


cd ~/StereoDepth/Calibration
mkdir build
mkdir -p images/{left, right}
cd build
cmake ..
make

 


채커보드 패턴을 인쇄하여 평평한 표면에 부착 후 캘리브레이션 타켓으로 사용할 수 있다. 캘리브레이션을 하는 동안 최상의 결과를 얻으려면 SpinView에서 Exposure Auto는 off로 설정하고 아래 그림과 같이 채커보드 패던이 선명하고 흰색 부분이 과하게 노출되지 않도록 노출을 조정해준다. 캘리브레이션 이미지가 수집된 후 SpinView에서 게인 및 노출을 자동으로 설정할 수 있다.


이미지 수집을 시작하기 위해 아래 명령어를 입력해준다.


./grabStereoImages


코드에 따르면 이미지 수집은 약 초당 1프레임의 속도로 진행된다. 왼쪽의 이미지는 images/left 폴더에 저장되고 오른쪽의 이미지는 images/right 폴더에 저장된다. 타겟을 움직여 이미지의 구석 부분까지도 잘 보이게 촬영해준다. 타겟을 회전 시켜 가까이서, 그리고 또 멀리서도 찍어준다. 기본적으로 프로그램은 100쌍의 이미지를 캡처하지만 아래 명령어를 사용하여 변경도 가능하다.


./grabStereoImages 20


위의 명령어를 사용하면 20쌍의 이미지만 수집된다. 이전 폴더에 저장된 모든 이미지를 덮어 쓰는 점은 참고하여야 한다.


이미지 수집 후 다음 명령어를 통해 캘리브레이션 Pyhton 코드를 실행한다.


cd ~/StereoDepth/Calibration
python cameraCalibration.py


위 명령어로 스테레오 시스템의 내부 및 외부 파라미터가 포함된 ‘intrinsics.yml’및 ‘extrinsics.yml’이라는 2개의 파일이 생성된다. 기본적으로 30mm 정사각형 크기의 채커보드를 가정하여 만든 코드이지만 필요한 경우 편집이 가능하다. 캘리브레이션이 끝나면 캘리브레이션이 얼마나 잘 수행 되었는지를 나타내는 RMS 오류가 표시된다. 캘리브레이션이 잘 된 경우 RMS 오류는 일반적으로 0.5 픽셀 미만이다.

 

Real-time Depth Map


실시간으로 차이(disparity)를 계산하는 코드는 ‘Depth’ 폴더 내에 있다. 카메라의 일련 번호를 복사하여 live_disparity.cpp의 230과 231번째 줄에 붙여 넣는다. 리눅스 터미널에서 다음 명령어를 사용하여 실행파일을 빌드한다.


cd ~/StereoDepth/Depth
mkdir build
cd build
cmake ..
make

 


캘리브레이션 단계에서 얻은 ‘intrinsics.yml’ 및 ‘extrinsics.yml’ 파일을 이 폴더에 복사한다. 실시간으로 Depth Map 데모를 실행하려면 다음 명령어를 입력한다.


./live_disparity


왼쪽 카메라 이미지(Raw 이미지)와 Depth Map(최종 output)이 표시된다. 아래쪽의 이미지는 몇가지 예제 output을 보여주고 있다. 카메라로부터의 거리는 Depth Map의 오른쪽에 표시된 범례에 따라 색상으로 구분된다.

 

Depth Map의 검은색 영역은 해당 영역에서 차이(disparity)점이 있는 데이터가 없다는 것을 의미한다. NVIDIA Jetson TX2 GPU로 1440 x 1080의 해상도에서 최대 초당 5프레임, 720 x 540의 해상도에선 최대 초당 13프레임 속도로 실행할 수 있다. 특정 지점의 깊이 데이터는 Depth Map에서 해당 지점을 클릭하여 아래 이미지와 오른쪽 하단 이미지와 같이 깊이가 표시되는 것을 확인할 수 있다.

 

 

 

 

자료 제공: 화인스텍(www.fainstec.com)

 

 

주요기사

먼저 비밀번호를 입력하여 주세요.

창닫기확인