안녕하세요, K-ROAD 6기 장호현입니다. 저는 이번에 LiDAR와 Camera 센서 퓨전을 하기위해 선행적으로 필요한 센서 캘리브레이션에 대해 설명드리겠습니다.

Introduction

사람의 경우, 왼쪽 눈과 오른쪽 눈이 각각 다른 장면을 보지만, 뇌는 이를 보정해 자연스럽고 하나의 통합된 이미지로 인식합니다. 이때 두 눈 사이의 시차를 통해 거리 감각도 함께 얻을 수 있습니다.

컴퓨터도 마찬가지입니다. 서로 다른 센서를 융합하게 되면 단독으로 사용할 때보다 더 풍부한 정보를 얻을 수 있습니다. 하지만 기본적으로 각 센서의 데이터는 서로 독립적이기 때문에, 함께 사용하려면 보정(calibration) 과정이 필요합니다.

센서 보정을 통해 컴퓨터는 각각의 정보를 하나의 통합된 시야로 이해할 수 있습니다. 즉, 센서들은 서로 다른 위치에 있지만 같은 장면을 보고 있다는 것을 컴퓨터가 인식하게 되는 것입니다.

LiDAR - Camera Calibration

카메라로 확인된 2D 이미지라이다로 확인된 3D 포인트

지금, 저희가 현재 사용하고 있는 센서는 바로 라이다(LiDAR)와 카메라입니다.

자율주행에서 카메라와 라이다는 각각의 특징이 훌륭하여 장애물을 회피하고, 경로를 파악하는데 핵심적인 정보를 제공합니다. 그런데, 카메라는 사물의 형태나 색상을 구분하는 데 뛰어나지만, 빛에 민감하여 환경 변화에 따라 인식 성능이 달라질 수 있습니다. 반면 라이다는 거리와 크기 같은 공간 정보를 정확하게 파악할 수 있지만, 사물의 정체를 분류하는 능력은 카메라에 비해 비교적 떨어집니다.

하지만, 각각의 센서를 융합하여 함께 활용한다면 서로의 단점을 보완하고 장점을 부각할 수 있습니다. 카메라의 이미지 정보와, 라이다의 크기, 거리 정보를 함께 활용한다면 단독 활용보다 신뢰도 높은 환경 인식이 가능해집니다.

센서 퓨전을 위해서는 먼저 카메라와 라이다가 각각 어떤 위치에서 어떤 장면을 보고 있는지, 그리고 서로 어떻게 연결되는지(즉, 카메라의 어느 부분이 라이다와 일치하는가)를 컴퓨터가 이해해야 합니다.

이렇게 센서 융합을 위해 좌표계를 통일하는 보정 과정이 LiDAR-Camera Calibration입니다.

Calibrating

라이다와 카메라에 대한 센서 캘리브레이션은 라이다로 측정한 3차원 위치와 카메라로 본 2차원 이미지상의 위치 사이의 정확한 관계를 찾는 과정입니다.

저희는 캘리브레이션을 위해 MATLAB을 활용하지만, 시중에 Kalibr과 같은 캘리브레이션을 수행할 수 있는 오픈소스 도구들도 여럿 공개되어있습니다.

전체적인 과정은 다음과 같습니다.

카메라와 라이다의 좌표 정렬과정

  1. 체커 보드를 들고 카메라 안의 모든 영역에 대해 촬영
  1. MATLAB의 모듈을 활용하여 촬영한 사진으로 캘리브레이션 실행, 내부 파라미터 획득
  1. 카메라 jpg와 라이다 pcd 데이터를 다시 가져와서 내부 파라미터와 함께 캘리브레이션 진행
  1. 'Detect'를 했을 때, 라이다 포인트에 체커보드 영역이 충분히 검출되는지 확인
  1. 결과 확인 후 'Calibrate'하고 보정 결과를 저장

이렇게 얻은 캘리브레이션 결과물에는 외부 파라미터(변환행렬)과 내부 파라미터, 왜곡계수가 담겨있습니다.

왜곡 계수는 카메라의 렌즈 등으로 인한 왜곡현상을 보정하기 위한 파라미터 입니다.

내부 파라미터는 3D 포인트들을 2D 좌표계로 투영할 때 활용하며, 다음과 같이 표현됩니다.

K=[fx0cx0fycy001]K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0& 1 \end{bmatrix}

  • f는 x와 y방향의 초점거리이고, c는 이미지 상의 중심좌표입니다.

변환 행렬은 다음과 같이 구성됩니다.

  • 회전 행렬 RR: 라이다 축을 카메라 기준으로 어떻게 회전시킬지 결정합니다.
  • 이동 행렬 tt: 라이다 기준으로 카메라가 어느 위치에 있는지를 나타냅니다.

변환에 관한 기본 수식은 다음과 같습니다.

Xcamera=RXLiDAR+tX_{camera} = R \cdot X_{LiDAR} + t

회전 행렬(RR)에 해당하는 부분

[0.44540.89530.00600.39540.19070.89850.80330.40250.4389]\begin{bmatrix} -0.4454 & -0.8953 & 0.0060 \\ -0.3954 & 0.1907 & -0.8985 \\ 0.8033 & -0.4025 & -0.4389 \end{bmatrix}

  • 1행은 LiDAR의 x축이 카메라 좌표계에서 어떤 방향으로 회전하였는지, 2행은 y축, 3행은 z축의 회전 결과입니다.

이동 행렬(tt)에 해당 하는 부분

[0.24050.37070.3472]\begin{bmatrix} -0.2405 \\ 0.3707 \\ 0.3472 \end{bmatrix}

  • 카메라는 라이다를 기준으로 후방으로 24cm, 좌측으로 37cm, 상단으로 34cm에 위치하고 있다는 의미입니다.
  • 결과는 회전 행렬과 이동행렬을 동차 좌표계로 변환하여 [Rt01]\begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix}형태의 444 \cdot 4 형태로 표현됩니다.

캘리브레이션 후 전체적인 카메라와 라이다 좌표의 변환 수식은 다음과 같이 표현됩니다.

[Xcamera1]=[Rt01][XLiDAR1]\begin{bmatrix} X_{camera} \\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} X_{LiDAR} \\ 1 \end{bmatrix}



이 수식을 바탕으로 라이다에서 얻은 3D 좌표를 카메라 이미지 위로 투영하거나, 두 센서의 데이터를 동일한 프레임에서 융합하여 활용할 수 있습니다.

Result

아래 이미지는, 보정된 외부 파라미터(회전 행렬과 이동 벡터)를 이용해 라이다 포인트를 카메라 좌표계로 변환한 후, 내부 파라미터를 바탕으로 카메라 이미지에 투영한 결과입니다.

이처럼 3차원 라이다 포인트가 이미지 위의 실제 물체들과 잘 일치하는 것을 통해, 캘리브레이션이 올바르게 수행되었음을 시각적으로 확인할 수 있습니다. 특히, 콘에 투영된 점들이 형태를 따라 정확히 정렬되어 있는 것을 볼 수 있습니다.

이러한 투영 결과는 단순한 시각화에 그치지 않고, 이후 센서 융합 기반의 객체 인식, 거리 추정 등의 응용으로 바로 확장할 수 있습니다.

센서 캘리브레이션은 라이다와 카메라로부터 얻은 정보를 정확하게 통합하여 보다 풍부하고 정밀한 환경 인식을 가능하게 하는 출발점이 됩니다.

긴 글 읽어주셔서 감사합니다.

References

profile
한국기술교육대학교 자율주행연구회 K-ROAD의 기술블로그 입니다.

0개의 댓글