http://blog.naver.com/PostView.nhn?blogId=windowsub0406&logNo=220503344281
16.01.05 추가
- 매칭기법 - BM(Block Maching)
- 지면 & 하늘(3m이상) 분리 수정 - V-disparity, RANSAC 알고리즘 활용
- Daimler 에서 개발한 Stixel 기법 추가
- occupancy grid 수정
프로젝트 후 혼자 좀 더 개발을 했었습니다.. 갑자기 생각나서 올립니다.
현재는 올해 학교 연구실에 Velodyne이 하나 들어와서...
졸업논문으로 새로운 방식의 3D Lidar - Camera Calibration 을 진행하고 있습니다.
------------------------------------------------------------------------------------------------------------------------
저 혼자 진행한 프로젝트가 아니라 여러 명이 진행했고, 각자 분야가 다 있었기 때문에
제가 담당했던 '비전 분야' 만 간단히 설명해드리겠습니다.
stereo camera를 사용하여 장애물 감지 및 정지 or 회피를 했구요
나중에 사람이 많은 곳에서 저희 GPS가 잘 잡히지 않아 일반 웹캠을 통한 차선인식도
추가를 했습니다.(차선은 나중에 추가를 해서 공부기간이 짧아 간단합니다..)
차선 인식도 stereo camera로 하고 싶었지만 저희 stereo camera로는 햇빛이 강한
낮에 바닥이 그냥 하얗게 보이더군요...
저희 동아리를 관할하시는 교수님 연구실에 자율 주행을 해볼 수 있는 골프카트가 있었고
자율 주행 센서 중 대표적인 Stereo camera와 Lidar 둘 다 있었습니다.
(레이더(radar) 아니고 라이다(lidar) 입니다)
잠시 얘기하지면, 자율 주행 대표급으로 볼 수 있는 구글은 Lidar 라이다 사용하구요,
벤츠는 stereo camera 사용합니다. 벤츠말고 일본의 어떤 곳에서도 스테레오 사용하는데
기억이 잘..안나는데 사실 스테레오보다는 라이다+단안 카메라 이 조합을 좀 더 선호하는
추세라고 하네요. (15.10.07 저희 학교에 PLK 대표님이 오셔서 여쭤봤습니다ㅎㅎ대표님도 졸업논문을 stereo camera로 하셨다더라구요)
저 두 센서 말고 그냥 일반 레이더도 많이 사용합니다. 일단 가격 면에서 싸서 전방 외에 측면이나 후방
에서 사용하는 일이 많습니다. 레이더의 단점을 꼽자면 비싼건 예외일 수 있으나 보통 반경이 좁고 인식 거리도 좁다는 점~
이야기가 다른 데로 샜네요... 자율 주행 자동차에 관한 배경 이야기를 나중에 따로 하던가 하겠습니다.
예전에 자율 주행 자동차 상용화를 주제로 공모전을 나간 적이 있어서 몇몇 전문가분들과 인터뷰도
해보고 했었어요ㅎㅎ
결과가 나오기까지 정말 시행착오가 많았고, 이 주 동안 컴퓨터 앞에서 머리만 싸매고 있던 적도 있었습니다. 일단은 결과 위주로만 설명드릴게요!!!
1. calibration

일단 calibration 은 opencv 에서 해결했습니다. calibration에 대한 정확한 설명은 차후에 하도록
하겠습니다.
2. rectified image

이건 학교 캠퍼스 돌아다니면서 스테레오 카메라로 직접 동영상 찍은 것 중 한 장면입니다.
왼쪽 사진이 스테레오 카메라의 왼쪽, 오른쪽 사진이 오른쪽 영상입니다.
왜곡(distortion), 보정(rectified) 거친 영상입니다. 나중에 자세히 설명하겠습니다.
3. disparity map

BM(block matching)을 통해서 disparity map을 얻었을 때 영상입니다.
프로젝트 후반부에는 영상 크기를 줄이고 BM 이 아닌 SGBM(semi-global BM)을 사용
했기 때문에 좀 더 정확하게 인식을 했는데 일단 이걸 예로 들겠습니다.
4. remove ground

멍청한 제 머리로 가장 힘들었던(?) 단계였습니다. 지면 제거하는 방법이었는데
차량과 가까운 바닥이 장애물로 인식이 되어서 그 부분을 해결하기 위해 지면제거를
했습니다. 참고로 그냥 사진 밑에 부분을 ROI 설정하여 없앤 것이 아니라 영상을 3차원적으로
접근하여 지면 위 20cm 정도를 까맣게 바꾼 것입니다.
Stereo camera를 사용하는 자동차들은 아마 보통 v-disparity를 사용해서 지면 제거를
할 거라고 생각이 듭니다.
저도 나중에 v-disparity 구현은 해봤는데 프로젝트 때는 저 방법을 사용했습니다.
5. remove upper

지면 제거와 같은 방식으로 일정 높이 이상의 위쪽 면도 제거를 한 영상입니다.
실제 학교 캠퍼스를 돌아다니다 보니까 울창한 나무들 사이를 지나가니
그냥 장애물 투성이로 인식이 되더라고요... 밑에서 보여드릴 occupancy grid
도 무용지물이 되어버리고요...
위 영상은 윗면 제거 말고도 모폴로지를 통해서 노이즈가 많이 제거된 것을
알 수 있습니다.
6. detect obstacle & print distance

궁극적인 목표였죠.. 정확한 장애물 인식...
13미터 이내의 장애물만 검출한 것이고, 보시는 것과 같이 거리 값도 정확하게 출력이 됩니다.
아 갑자기 생각난 건데 위에 raw image 보고 이거 보니까 왼쪽이 좀 잘린 것 같다
잘못 나와서 일부러 자른 건가?라고 생각하실 수 있는데
block matching을 하게 되면 numberofdisparities 값에 따라 (이거도 나중에 자세히..)
그 값이 클수록 더 많이 왼쪽 면이 까맣게 나옵니다.
그런데 왜 BM을 썼냐!! 고 물으신다면 속도 때문이죠... 실시간으로 이 많은 연산을
돌리려면 BM이 제일 빨라서요ㅠㅠ 그래도 나중에는 영상크기를 줄이고 SGBM 으로 실시간 돌렸습니다!
7. obstacle avoidance

6번에서 검출한 이미지로는 설명할 수 없어 다른 이미지를 가져왔습니다.
최신 저장 이미지가 없네요.. 조금 예전 거라 장애물 인식이 조금 이상한 부분도 있지만
일단 차량 기준으로 3m 이내에 장애물이 있고 현재 내 주행 루트에 있다면 정지하고, 3~6m에 장애물이 있고 현재 내 주행 루트에 있다면 (주행 방향. 그러니까 차량 폭과 높이 등을 고려해서 주행에 무관한 장애물이면 회피 및 정지를 하지 않습니다) 노란색으로 네모를 치고, 정확한 회피 각도를 전달해 줍니다.
즉 노란색 네모 = 3~6m 이내에 장애물있고 방향 안 틀면 박는다~
위 영상 내에 오른쪽 부분은 아시는 분들은 아시겠지만 labview고, 랩뷰에 데이터를 잘 보낸다~
라는걸 알리고 싶어서 저장해놓은 이미지였던 거 같네요..
실제로 프로젝트 때는 이미지 내에 장애물 감지와 함께 바로 회피 각도를 출력했습니다.
물론 그에 맞는 각도로 스스로 회피합니다.
8. occupancy grid

occupancy grid 이구요 top view라고 생각하시면 됩니다. 하늘에서 봤을 때를
이미지화 시킨 거예요. 보시면 맨 왼쪽 파란게 자동차구요
정확하게 카메라 FOV만큼 각도 조정했고 결과는 보시다시피 정확하네요ㅎㅎ
참고로 자동차 같은 거는 다 OPENCV 사용해서 그린 거예요
(별거 없지만 그림판이라고 생각하실까 봐...)
차모양 앞쪽에 약간 흰부분은 실제로 유효(?)장애물로 인식하는 부분입니다.
지금 이동루트와 상관없는 쪽의 장애물까지 굳이 다 띄워줄 필요는 없다고 생각해서요.
상관해야할 위치까지 오면 그때 알아서 다 회피나 정지를 하니까요..
큰 기술 들어간 것도 아니고, 프로젝트에 필수적인 건 아니었는데, occupancy grid 라는게
있다는 걸 논문 검색하다가 알게 됐고, 한번 만들어볼까? 했는데
됐을 때의 그 성취감...ㅠㅠ
때문에 그냥 계속 같이 코드에 넣어놓고 있어요..ㅋㅋ
9. lane detection



차선 인식이라고 하기도 참 뭐하네요..ㅎㅎ 실제 고속도로 주행 동영상으로 진행한
것은 따로 있고 아직 급격한 코너에서는 검출이 힘듭니다.
어제 PLK 대표님이 학교에 오셔서 PLK의 기술 동영상을 보여주셨는데 차선인식이
대단하더라고요.. 정말 많이 자극을 받았습니다.
실제 심사위원 분들 앞에서 시연을 해야 했고, 그 장소가 협소 했기 때문에 직접
차선처럼 흰색 테이프를 붙였구요, 같은 이유로 일반 차선 너비보다 더 좁습니다.
1.8M 로 간격을 두었어요.
두 번째 영상에서 가운데 아래 보시면 차선 중앙에 위치하도록 각도 알려주는 것이고요
세 번째 영상은... 차선 이탈 관련해서 저장된 이미지가 저거뿐이네요..
차선 이탈했을 때 돌아가라고 출력하는 건데, 실제 프로젝트 때는
이미지 상으로 출력을 했고, 스스로 차선 안으로 돌아가게 했습니다.
차선인식은 앞으로 빡세게 공부를 해보겠습니다.
여기까지 대충 자율 주행 프로젝트 때 적용했던 것을 적어보았습니다.
실제로는 더 볼만한데 이미지들이 예전 거네요..
다음에 시간 나면 밖에 나가서 다시 찍어야겠어요..
