글

라벨이 Code인 게시물 표시

Cmake setting for Boost library

Boost library를 위한 Cmake 설정 Boost library 는 대부분이 헤더만 있어도 사용이 가능하지만 아래와 같이 몇몇개(thread system와 같은 library)는 링크시켜 주어야 한다.   # cmake 최소 요구 버전 2.8 cmake_minimum_required(VERSION 2.8) set(CMAKE_CXX_FLAGS "-std=c++11") project( project ) find_package(Boost REQUIRED thread system) # 프로젝트 디렉터리의 파일을 SRC_LIST에 추가 aux_source_directory(. SRC_LIST) # project name의 executable을 생성 # SRC_LIST를 컴파일 add_executable( ${PROJECT_NAME} ${SRC_LIST} ) TARGET_LINK_LIBRARIES( ${PROJECT_NAME} ${Boost_LIBRARIES} ) 

Linux Serial communication code

Linux Serial 통신코드 쉽게 구할수 있는 C code를 class로 묶어쉽게 사용하기 쉽게 해두었지만, 이왕이면 Qt혹은 Boost등에 있는 외부라이브러리를 이용하세요.(그 외 라이브러리도 마찬가지) 라이브러리를 사용하는 것이 성능으로나 안정성으로나 개발속도면에서 더 좋습니다. #include <string.h> #include <unistd.h> #include <termios.h> #include <fcntl.h> #include <iostream> class Serial { public: Serial() { memset(&newtio, 0, sizeof(newtio) ); newtio.c_cflag = B9600; // 통신 속도 115200 newtio.c_cflag |= CS8; // 데이터 비트가 8bit newtio.c_cflag |= CLOCAL; // 외부 모뎀을 사용하지 않고 내부 통신 포트 사용 newtio.c_cflag |= CREAD; // 쓰기는 기본, 읽기도 가능하게 newtio.c_iflag = IGNPAR; // parity 비트는 없음 newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 1; tcflush (fd, TCIFLUSH ); tcsetattr(fd, TCSANOW, &newtio ); // 포트에 대한 통신 환경을 설정합니다. } int open(std::string device) { fd = ::open(device.c_str() , O_RDWR | O_NONBLOCK ); ...

[OPENCV] pose estimation using solvePnP

이미지
solvePnP opencv함수로 chessboard의 좌표계를 구성하여 chessboard 좌표계까지의 변환 행렬을 얻을 수 있다. 물론, 카메라 calibration 및 그 외의 전과정은 미리 다 해둔 것으로 가정. * 정확하게는 chessboard와 카메라 사이의 translation vector와 rotation vector가 반환된다. homography matrix를 얻고싶다면 위의 값을 잘 이용해보자. 아래의 동영상을 보면 쉽게 이해 될 것이다. 이와 같은 pose estimation은 써먹을 곳이 많다. 예로들면, 움직이는 물체를 추적하고 이동거리를 알고 싶을 때 pixel단위가 아닌 mm단위로 이동거리를 알아낼 수 있다. 이와 마찬가지로 지면과 카메라 간의 변환 행렬을 구하여 실제 거리를 재는등의 목적으로 사용할 수 있을 것 같다.   장점 1. 오차가 상당히 없는 듯하다. 2. 데이터를 실험적으로 뽑아 낸 것은 아니지만 나의 감각에 의하면 오차가 커봐야 1cm터 내외 일 듯 하다. *위의 영상에서는 chessboard 좌표계의 원점에서 부터 x,y,z 축으로 5cm의 선을 그리도록 하였다. 단점 1. findChessboard 과정에서 corner를 못 찾게 되면 상당한 시간이 지연된다. 2. 최소 3x3 chessboard가 필요하다. 핵심 코드 struct CamParameter { cv :: Mat cameraMatrix; cv :: Mat distCoeffs; }; void solvePnP (Mat & img, CamParameter camParam) { vector < Point3f > objectPoint; vector < Point2f > imagePoint = findChessboard(img); if (imagePoint.size() != CHESS_COLS ...