본문 바로가기

전체 글

OpenCV Stereo Camera Calibration 프로그램 두개의 카메라를 이용하여 카메라의 이동 위치와 자세를 계산할 목적으로 다음과 같이 로지텍 QuickCam Pro c920을 두 개 이어붙여 스테레오 시스템을 만들었습니다. 하지만 두 카메라를 물리적으로 최대한 평행하게 정렬하더라도 다양한 왜곡 요인에 의해 행 정렬된 영상을 얻기는 불가능 하다고 봐야할 것입니다. 그래서 스테레오 보정(Stereo Calibration)과 스테레오 조정(Stereo Rectification) 과정이 필요합니다. 스테레오 보정은 두 카메라 사이의 기하학적인 관계(두 카메라 간의 회전 행렬과 이동 벡터)를 계산하여 두 영상이 동일 평면상에 위치하도록 하는 것이고 스테레오 조정은 각각의 영상들을 교정(correcting)하여 영상들이 행-정렬된 카메라에서 촬영된 것처럼 바꾸는 과.. 더보기
OpenCV Camera Calibration 프로그램 2 (C++) 카메라 보정(Camera Calibration)은 카메라의 내부 행렬 및 왜곡 파라미터를 구하는 과정입니다. 카메라 보정은 카메라에서 입력받은 영상으로 3차원 복원을 하는 등의 작업에 앞서 반드시 수행하여야 할 작업입니다. 여기서 직접 카메라 보정 알고리즘을 구현하는 것이 아니라 OpenCV에서 제공하는 알고리즘을 사용하여 GUI로 쉽게 사용가능하도록 구현하였습니다. 예전에 작성한 OpenCV Camera Calibration 프로그램()의 C++ 버젼이 됩니다. 상기 프로젝트는 OpenCV 라이브러리의 samples/cpp/calibration.cpp 파일을 참조하여 작성하였습니다. 만일 프로젝트에 첨부된 체스판이 아닌 경우이거나 체스판 인식 횟수를 변경하실 때에는 다음 파일에서 인식할 체스판 수와 C.. 더보기
바닥의 패턴을 사용한 로봇의 위치인식 방법 2 이전 글에서 바닥의 패턴을 사용한 로봇의 위치인식 방법()에 대하여 다뤘습니다. 이번에는 바닥의 패턴이 좀 드물게 존재하는 곳에서도 위치인식이 잘 되도록 하기위해 바닥의 패턴에서 특징(feature)을 추출하는 방법을 개선해 보았습니다. 기존 방법에서는 바닥 이미지에서 일정한 간격의 격자 형태로 특징점 픽셀을 샘플링 하여 지도와 비교하였기때문에 바닥의 패턴이 복잡한 곳에서는 잘 되었습니다. 하지만 상기 사진과 같이 패턴이 좀 드문 곳에서는 잘 되지 않았습니다. 그래서 이번에는 바닥의 패턴 경계에서 특징점을 뽑아 와서 지도와 매칭 함으로 패턴의 경계가 좀 더 잘 매칭되도록 하였습니다. 특징점의 추출 방법에 대해서는 다음 문서를 참고하시기 바랍니다. 특징점 추출과 위치인식 시뮬레이션을 위해서는 다음 Visu.. 더보기
OpenCV 마커인식을 사용한 증강현실(augmented reality) 구현 이전에 만든 마커 인식기()와 OpenGL 도형을 OpenCV 이미지에 그리는 방법(), obj 파일 로더()를 조합해서 증강현실(augmented reality)을 구현해 보았습니다. 현재 구현된 증강현실은 카메라로 입력된 이미지에서 마커를 인식하고 인식된 마커 위에 마커의 ID를 구분하여 단순히 OpenGL 도형을 그리거나 obj, mtl 파일을 로드한 객체를 그리도록 하였습니다. 다른 분들께서 이 소스코드를 기반으로 애니메이션과 같은 여러 기능들도 마구마구 추가해 줬으면 합니다. 소스코드의 기능을 업그레이드 하신 분들께서는 자신의 블로그나 웹에 올리시고 저에게도 알려주시면 고맙겠습니다. 동영상을 참고하시기 바랍니다. * 2012.6.4 업데이트 - 행렬 계산 라이브러리 Eigen을 사용하지 않고 O.. 더보기
로봇의 구조적 파라미터 추정을 통한 odometry 정밀도 향상 Differential drive 방식의 모바일 로봇에서 좌우 바퀴간의 정확한 거리와 좌우 바퀴의 정확한 크기를 알아야 오도메트리를 에러 없이 계산할 수 있습니다. 하지만 로봇의 무게에 의해 바퀴의 반경이 변하게 되고 바퀴와 지면 간에 면접촉이 발생함으로 좌우 바퀴간의 정확한 거리를 알 수 없는 경우가 많습니다. 여기서는 이러한 로봇의 구조적 파라메터에 대한 오차(오른쪽과 왼쪽 바퀴의 크기, 좌우 바퀴간 거리)를 두 개의 칼만필터를 사용하여 보정하는 방법을 소개합니다. 오도메트리 정밀도 향상에 대해 다음 pdf 문서를 참고하시기 바랍니다. 그리고 시뮬레이션을 위해 작성된 코드를 참고하시기 바랍니다. diff_drive_robot.cpp 파일에 보시면 로봇의 구조적 파라미터(좌우 바퀴의 반지름과 바퀴간 거.. 더보기
ICP(Iterative Closest Point)와 레이저 센서로 2D 지도구축 3 이전 글에서 ICP 알고리즘으로 지도를 그리는 소프트웨어를 작성해 보았습니다. 여기서는 이 소프트웨어를 좀 더 쓰기 쉽도록 설명을 추가하도록 하겠습니다. 이전 소스코드도 일부 수정되었고 OpenMP로 멀티코어를 지원하도록 하였습니다. 상기 MapBuilding 파일을 다운받아 VisualStudio C++ 2008로 열어 컴파일하고 실행합니다. 그러면 laser.bin 파일을 읽어 프로그램이 맵을 이어붙여 나갑니다. MapBuilding 윈도우의 크기는 조절 가능하며 만들어지고 있는 지도를 마우스 왼쪽 버튼으로 누른 상태에서 드래그 하여 위치를 이동 가능합니다. 그리고 마우스 스크롤로 지도의 축소와 확대가 가능합니다. laser.bin 파일은 소스코드 내에 첨부 되어 있는데, 다음과 같이 만들어집니다. .. 더보기
INS만들기: Kalman Filter로 GPS와 IMU 결합 실험 한동안 자이로 센서와 가속도 센서로 AHRS 만들기에 도전했었는데요. 이번에는 자이로 센서와 가속도 센서, GPS 센서, 바퀴의 오도메트리 정보(차량의 바퀴에서 오도메트리 정보를 읽을 수 없는 상황이라 GPS의 속도 출력 정보를 오도메트리 정보로 대신함)를 결합한 INS(Inertial Navigation System)를 설계하고 실제로 차에 장착하여 실험해 보았습니다. 아래 지도에서 빨간색 선이 차로 이동한 경로입니다. 먼저 차가 경로를 따라가면서 GPS, 자이로, 가속도 센서의 데이터를 취득하였습니다. 소스코드에 첨부된 imu_data.txt, gps_data.txt 파일을 참조하시기 바랍니다. 그리고 이 데이터를 실험실로 가져와 재생하면서 Kalman filter 알고리즘을 수정해 나갔습니다. 두 .. 더보기
ICP(Iterative Closest Point)와 레이저 센서로 2D 지도구축 2 이전 글에서 ICP 알고리즘으로 지도 모델과 레이저 스캐너로 측정한 데이터간의 매칭 과정을 시뮬레이션해 보았습니다. 이번에는 실제로 저희 생기원 내 환경을 호쿠요 레이저 스캐너 UTM-30LX로 떠서 파일로 저장하였고, 이 데이터를 불러와 ICP 알고리즘으로 지도를 복원하는 실험을 하였습니다. 처음에는 시뮬레이터로 잘 되었기 때문에 실전에서도 별 어려움 없이 될 줄 알았는데 생각과 달리 잘 되지 않았습니다. 측정 거리, 반복횟수, 종료조건 설정, 아웃라이어 제거를 위한 임계값 설정 등 여러 파라메터 세팅에 따라 결과가 많이 달랐습니다. 소스코드와 레이저 스캐너로 획득한 데이터를 올립니다. 아무래도 실전에서 활용하기에는 여러 파라메터를 적절히 설정하는데 어려움이 있지 않을까 합니다. download dat.. 더보기