2023년 3월 4일 토요일

ICP (Iterative Closest Point)

 

Ref. 

 _01. https://nbviewer.org/github/niosus/notebooks/blob/master/icp.ipynb


위의 노트북에는 그림이 일부 안보이길래 보충..

ICP 의 자세한 내용은 위의 링크나 다른 곳에 잘 설명 혹은 자료가 많은 것 같다.


자율 주행(?)/SLAM 에  ICP  알고리즘이 나와서 Study~~~中

 - 오픈소스와 유용한 자료 기여자분들께  감사~~~~


※ 진입장벽이 힘들지만, 시간이 지나면 괜찮아질거라 믿는다 !!!

※ 아직 Study 중이라, 오류가 있을수도 있다... 그럴쑤 있어~~~암~~

※ 기술 블로그도 시간과 노~~오~~력,  정~~성이  필요한 것 같다.  내멋대로 작성하는 느낌인데  이것도  어쩔 수 없오~~~   훌륭한 블로거는  다른 분들에게  양보하겠다!!!




                                         < 그림 1. example data >

 

그림 1은 ICP 설명을 위한 data 이다.

 - Q 는 true data set, P 는 Q 에 회전 및 병진을 가한 data set


ICP 는 회전과 병진을 찾는 알고리즘인 것 같은데..... (아직  study 중...)

 - P = Rot * Q + translation


자,  ICP 를 공부하기 위한 샘플 데이터는 준비되었다...


ICP 에는  데이터의 무게중심(?)을 구하는 과정이 있다.

 - 무게중심은 평균인 것 같은데...

 - 회전을 찾기 용이하기 위해서 P 와 Q 를 origin 으로 이동시키는 역할로 보임...

 - 그림 2는 무게중심을 제외한 전처리 후의 그래프이다.

 - 느낌상, bias 를 제거하는 것 뉘앙스의 전처리와 유사해 보임




< 그림 2. 무게중심 offset 을 제거하여 origin 으로 이동한 그래프 >


ICP 의 기본로직은 알고리즘 이름에도 표현되어 있듯이 Closest 포인트를 찾아서 반복하는 것이다.

 - 어떤 유투브에서는 Data Association 으로 표현하기도 하던데, P와 Q 의 correspondence 를 찾는 과정이다.

 - 간단하다, 이중 for 문을 돌면서, P와 각 요소와 Q의 각 요소의 Euclidean distance 를 비교하여 가장 가까운 포인트들을 C = { i, j } 쌍으로 저장함

  * 예제는 2차원이므로 Euclidean distance !!   코드는 결국 norm (P - Q) 형태 !!

 - 그림 3은 P 집합과 Q 집합의 corrspondence pair 를 회색 선으로 나타낸 그림



< 그림 3. P와 Q 의 correspondence >



SVD 를 이용하여 회전과 병진을 찾는다.

 - SVD 방식은 좀 더 자료등을 찾아봐서 이해가 필요한데..

 - P_correct = R_found * P + t_found

 - 그림 4는 P_correct 와 Q 의 그래프

 - 이전보다 P와 Q 가 정렬이 되긴 했다.




< 그림 4. 1번째 P 변환 후 결과 >



< 10회 iteration animation >












댓글 없음:

댓글 쓰기