화인스텍 로고

지식정보

지식창고

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

2022-09-07

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

 


 

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

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

먼저 스테레오 비전 시스템의 주요 파트를 설명한 다음 기성 하드웨어 부품 및 오픈소스 소프트웨어를 사용하여 커스텀 스테레오 카메라를 만드는 방법에 대해 설명 하도록 하겠습니다. 커스텀 시스템의 구성은 임베디드에 초점을 맞추기 때문에 호스트 PC 없이도 실시간으로 모든 장면의 Depth Map을 계산할 수 있습니다.

 

스테레오 비전 개요

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

 

Figure 1 – 스테레오 비전 시스템 개요

 

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

 

1.      캘리브레이션 – 카메라 캘리브레이션의 경우 두가지 의미가 있습니다. Instrinsic(내부적인) 캘리브레이션의 경우는 이미지 중심, 초점 거리 및 왜곡 파라미터를 말하며, Extrinsic(외부적인) 캘리브레이션은 카메라의 실제 위치 등을 말합니다. 컴퓨터 비전 프로그램에서 특히 깊이와 같은 이미지의 메트릭 정보가 필요한 경우 캘리브레이션 단계는 매우 중요합니다. 캘리브레이션 단계에 대해서는 아래 캘리브레이션 섹션에서 자세히 설명 드리겠습니다.

2.      렉티피케이션 – 스테레오 렉티피케이션은 이미지 평면을 양쪽 카메라의 중심 사이의 선과 평행한 공통 평면으로 조정하는 프로세스를 말합니다. 렉티피케이션 이후 해당 포인트가 평행하게 놓여 있게 되므로 매칭에 소요되는 시간이 줄어들기 때문에 꼭 필요한 과정으로 인식되고 있습니다. 이 단계는 커스텀 시스템을 구축하기 위해 제공된 코드로 실행 가능합니다.

Figure 2 – Stereo Rectification 예시

 

3.      스테레오 매칭 – 왼쪽과 오른쪽 이미지 사이에 픽셀을 일치시켜주는 과정을 스테레오 매칭이라고 하며, Disparity image(불균형한 이미지)를 생성하게 됩니다. SGM(Semi-Global Matching) 알고리즘은 커스텀 시스템을 구축하기 위해 제공되는 코드에 사용됩니다.

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

 

설계 예제

 

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

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

 

Z = 범위

B = Baseline(기준선)

F = focal length(픽셀 단위의 초점 거리로, 카메라 시야 각 및 이미지 해상도와 관련 있습니다)

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

 

Figure 3 – 예제 어플리케이션에 대한 스테레오 시스템 설계 옵션

 

위 이미지는 Baseline(기준선)이 긴 저해상도 카메라 또는 Baseline이 짧은 고해상도 카메라 이렇게 두가지 옵션에 대한 설명입니다. 첫번째 옵션은 전체적으로 크기가 더 큰 카메라이지만 복잡한 계산의 필요성이 적고 두번째의 경우는 크기는 더 컴팩트 하지만 복잡한 계산의 필요성이 높습니다. 예제 어플리케이션에서는 컴팩트 한 크기가 모바일 로봇 어플리케이션에 더 적합하기 때문에 두번째 옵션을 선택했으며, 요구되는 프로세스를 처리 할 수 있는 강력한 GPU가 탑재된 TX2 용 Quartet Embedded Solution을 사용할 수 있습니다.

 

 

하드웨어 요구 사항

Figure 4 – 커스텀 임베디드 스테레오 시스템의 앞면과 뒷면

 

이 예에서는 IMX273 Sony Pregius 글로벌 셔터 센서를 사용하여 두 대의 Blackfly S 1.6MP 보드 레벨 카메라를 12cm Baseline(기준선)를 가진 3D 프린트된 프레임에 장착합니다. 두 카메라 모두 동일한 6mm S-마운트 렌즈를 장착했습니다. 카메라는 FPC 케이블을 사용하여 TX2 커스텀 캐리어 보드용 Quartet Embedded Solution에 연결됩니다. 왼쪽과 오른쪽 카메라를 동기화하여 동시에 이미지를 캡처하기 위해 두 카메라를 연결하는 동기화 케이블도 연결합니다.

 

위 이미지의 하드웨어 구성품은 다음과 같습니다 :

Quartet Carrier with TX2 Module 8GB – 1ea

BFS-U3-16S2C-BD2(카메라) – 2ea

S-Mount & IR filter – 2ea

6mm S-Mount lens(렌즈) – 2ea

15cm FPC 케이블 – 2ea

NVIDIA Jetson TX2/TX2 4GB/TX2i Active Heat Sink(방열판) – 1ea

동기화 케이블 – 1ea

카메라 부착용 프레임 – 1ea

 

두 렌즈 모두 어플리케이션이 요구하는 범위에 카메라 초점이 맞도록 조정해야 합니다. 초점을 맞춘 후 초점을 고정하기 위해 각 렌즈의 나사를 조여줍니다. (Figure 5 참고)

 

Figure 5 – 렌즈 나사를 보여주는 스테레오 시스템의 측면도

 

소프트웨어 요구 사항

 

a.     Spinnaker

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

b.     CUDA를 지원하는 OpenCV 4.5.2

스테레오 매칭 알고리즘 중 하나인 SGM을 사용하기 위해선 OpenCV 4.5.1 버전 또는 그 이상의 버전이 필요합니다. 코드를 포함하고 있는 첨부된 zip 파일을 다운로드 후 압축을 풀어줍니다. 리눅스 터미널에서 아래와 같이 OpenCV를 설치하는 스크립트 인 OpenCVInstaller.sh를 실행합니다.

cd ~/StereoDepth

chmod +x OpenCVInstaller.sh

./OpenCVInstaller.sh

설치 관리자를 통해 관리자 암호를 설정 후 OpenCV 4.5.2 설치가 시작됩니다. OpenCV를 다운로드하고 빌드하는데 몇 시간이 걸릴 수도 있습니다.

 

캘리브레이션

스테레오 이미지를 불러와 캘리브레이션 하는 코드는 “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에서 게인 및 노출을 자동으로 설정할 수 있습니다.

 

Figure 6 – SpinView GUI 설정

 

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

./grabStereoImages

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

./grabStereoImages 20

위의 명령어를 사용하면 20쌍의 이미지만 수집됩니다. 이전 폴더에 저장된 모든 이미지를 덮어 쓰는 점은 참고하셔야 됩니다. 아래 이미지는 일부 캘리브레이션 이미지 샘플입니다.

 

Figure 7 – 샘플 캘리브레이션 이미지

 

이미지 수집 후 다음 명령어를 통해 캘리브레이션 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에서 해당 지점을 클릭하여 아래 이미지와 오른쪽 하단 이미지와 같이 깊이가 표시되는 것을 확인할 수 있습니다.

 

Figure 8 – 왼쪽 카메라 이미지 및 해당 Depth Map 샘플 하단의 Depth Map에서는 특정 지점의 깊이를 보여줍니다.

 

요약

스테레오 비전을 사용하여 깊이 측정 시스템을 개발하면 실외에서도 잘 작동이 가능하며, 고해상도 Depth Map을 제공하고, 저렴한 기성품들로 매우 쉽게 접근할 수 있다는 장점이 있습니다. 시장에는 이미 요구 조건이 정해진 기성 스테레오 시스템이 많이 있습니다. 커스텀 임베디드 스테레오 시스템을 개발해야하는 경우 이 글에서 설명 드린 내용처럼 비교적 간단하게 작업하실 수 있습니다.