본문 바로가기
Sensor/Sensor fusion

[Sensor fusion] Camera - Lidar 퓨전

by Gnaseel 2021. 3. 23.
728x90
반응형

이전에 카메라와 라이다를 연동하여 진행하던 포스트가 있었는데,

알고있는 지식의 양이 너무 한정적이기 때문에 제대로 설명할 수 없었다.

 

그 후 다시한번 연구하는 시간을 가졌기 때문에

다시한번 포스팅을 진행해보고자 한다.

 

 

카메라와 라이다를 퓨전하기 위해서 제일 처음 해야 할 일은 좌표계를 통일시키는 것이다.

 

 

 

 

 

 

 

라이다를 중심으로 좌표계를 생성한다면 라이다에서 우리가 보는 데이터는 World frame의 좌표계이다.

이 때 우리는 이 World frame을 Camera frame으로 변환해줘야 한다.

 

 

 

World frame과 Camera frame은 같은 단위계에서 중심만 바뀔 뿐이므로 라이다와 카메라의 실제 물리적 거리만 반영해주면 된다.

위 수식 마지막 부분에서 R과 t가 그 역할을 한다. R은 보통 3*3 행렬로 표현되는 회전변환 행렬이고, t는 3*1벡터로 표현되는 벡터다.

t는 카메라와 라이다의 위치 차이를 말하고, R은 카메라와 라이다의 방향 차이를 말한다.

 

world frame의 좌표들을 R과 t를 이용해서 변환하면 Camera frame으로 변환된다.

라이다에서 본 데이터들을 같은 단위계를 사용해서 카메라를 중심점으로 놓고 볼 수 있게 된 것이다.

이 R과 t는 extrinsic parameter로 불리며 카메라와 라이다의 위치 차이를 보정해주는 역할을 하게된다.

 

 

하지만 이 값은 그대로 사용할 수 없는데, 이유는 두 가지이다.

첫 번째로는 단위가 다르다는 것이다.

실제 세계의 데이터가 m의 단위라면, 카메라 이미지의 데이터는 pixel이 기본 단위이다. 단위 변환이 필요하다.

두 번째로는 카메라는 필연적으로 값이 왜곡된다는 것이다.

world frame에서 물체의 크기는 거리와 아무 관계가 없다. 1m 떨어져있어도, 100m떨어져있어도 같은 크기의 데이터이다.

하지만 카메라는 원근법에 의해 같은 크기의 물체라도 가까이 있는 물체가 훨씬 크게 보이기 때문에, 깊이에 따른 원근법 반영이 필요하다.

 

 

우선 우리는 원근법을 반영하기 위해 Camera frame의 데이터를 pixel frame으로 옮겨야 한다.

pixel frame은 카메라 초점으로부터 거리가 1인 가상의 평면을 뜻한다.

원근법 해결은 생각보다 간단한데, Camera frame의 X와 Y값을 Z값으로 나눠주면 된다.

멀리있으면 작아지고, 가까이있으면 커진다.

 

 

이제 첫 번째 문제였던 단위 변환을 해결해야하는데,  이것을 해결해주는 것이 intrinsic parameter  f와 c이다.

초점거리를 나타내는 f는 카메라 렌즈와 이미지센서 사이의 간격이 이미지의 셀보다 몇 배 큰지 나타내주는데,

일반적으로 현대 카메라는 fx와 fy가 같다.

cx와 cy는 pixel frame의 원점이 image plane에 어디로 사영되는지 나타내는 값이다.

(skew는 비대칭계수인데, 현대 카메라에서는 비대칭 에러가 발생하지 않기때문에 0이라고 설정해도 무방하다.)

 

그렇기 때문에  위에서 얻은 픽셀프레임의 좌표값에 위 파라미터들을 적용하면 image plane에서의 좌표값이 나오게 된다.

 

정리하자면

(Xc, Yc, Zc) = (R, t) *(Xw, Yw,  Zw)

카메라 좌표계 = (extrinsic parameter , 월드 좌표계)

 

Zc*(u, v) = (intrinsic parameter) * (Xc, Yc, Zc)

이미지 평면 = (초점거리*카메라좌표계 + 주점, ~)

 

인 것이다.

 

카메라의 intrinsic parameter은 시중 소프트웨어를 통해 쉽게 진행할 수 있고,

extrinsic parameter는 카메라와 라이다 사이의 거리와, 각도를 직접 측정해야 한다.

 

 

 

요런 체커보드로 진행하는 여러 툴이 있으니 골라서 사용하면 된다.

필자는  간단하게 진행하기위해 적당히 인쇄해서 이리저리 휘두르며  진행했으나,

일반적으로는 더 큰 체커보드로 정확하게 길이를 측정해서 진행해야 한다.

 

 

 

 

 

 

 

라이다에서 얻은 데이터를 카메라의 이미지 평면으로 사영해서, 해당 위치에 해당하는 RGB값을 이미지데이터에서 얻은 모습이다.

사실 너무 적당하게 실험해서 남보여주기 부끄러운 데이터이기 때문에 조만간 더 정확하게 측위하고 실험해서 결과를 얻을 예정이다.

 

 

 

다음부터 진행될 포스트에는 카메라에서 2D object detection을 통해 물체를 판별하고(차, 사람 등등),

그 위치를 라이다 좌표계로 넘겨 판별된 물체에 해당하는 라이다 데이터를 얻을 예정이다.

 

카메라 라이다 좌표계 연동은 매우 쉬운 개념으로, 이해하지 못했다면 설명을 부실하게 한 필자의 잘못이니 가감없이 지적해주시면 감사하겠습니다.

 

 

반응형

댓글8

  • 센퓨 2021.06.27 18:43

    도움이 많이 되었습니다! 다음 글 기다립니다!!!
    답글

  • Prometeous 2022.01.18 16:20

    진행하셨던 캘리브레이션 코드를 받아 볼 수 있을까요?
    답글

  • Ccaaaara 2022.05.20 13:52 신고

    다음부터 진행될 포스트에는 카메라에서 2D object detection을 통해 물체를 판별하고(차, 사람 등등),

    그 위치를 라이다 좌표계로 넘겨 판별된 물체에 해당하는 라이다 데이터를 얻을 예정이다. 라고 말씀하셨는데 2D object detection 시에 나오는 pixel의 원하는 x, y 점에 대하여 -> lidar 좌표계까지 넘길 수 있는 것은 알겠습니다. 하지만 x, y, z 1 결과가 나왔을 때 변환한 값과 실제 lidar 값에 차이가 있을 수도 있지 않나요?! 혹시 그 부분은 보통 어떤식으로 해결하는지 궁금합니다
    답글

    • Gnaseel 2022.05.25 12:09 신고

      2D 이미지에서 검출된 물체를 3차원 좌표계의 입력으로 사용할 때는 여러가지 방법을 사용합니다. 복셀화 시킬수도 있고, pointcloud를 이미지에 프로젝션 시켜서 매칭할 수도 있는데... 가장 일반적으로 시도하기 쉬운 방법은 2D 바운딩박스를 frustum 형태로 만들어 제한되 3차원 공간을 탐색하는 것 입니다.

    • Gnaseel 2022.05.25 12:10 신고

      https://openaccess.thecvf.com/content_cvpr_2018/html/Qi_Frustum_PointNets_for_CVPR_2018_paper.html

      CVPR 2018에서 발표된 논문인데, 위에서 설명한 frustum방식으로 동작하는 가장 대표적인 네트워크입니다.

    • Ccaaaara 2022.05.25 12:11 신고

      아 넵 감사합니다 !!

  • 익명 2022.05.20 14:26

    비밀댓글입니다
    답글