반응형

$ xinput --list --short

 

위의 명령어를 입력하면 아래와 같이 나타나는 것을 확인할 수 있다.

내용을 잘 살펴보면 마우스에 대한 부분이 존재하는데 나의 경우 id=9 에 'BTL Gaming Mouse'라고 존재하는 것을 확인할 수 있다.

 

$ xinput set-prop 9 'Device Accel Constant Deceleration' 1.9

 

xinput set-prop 뒤에 나오는 '9' 라는 숫자는 위에서 찾은 내 마우스의 id를 입력해주면 되고

가장 끝에 넣은 값인 2.0은 마우스의 감속도 크기이므로 값이 클수록 마우스의 감도가 떨어지게 된다.

 

 

하지만 위의 과정은 PC를 재부팅하게 되면 초기화가 되는데 이를 방지하기 위해 우분투가 실행될때마다 위의 설정을 유지할 수 있도록 설정해보자.

 

우분투의 프로그램 검색창에서 '시작'을 입력하면 '시작프로그램' 이라는 프로그램이 보일 것이다.

 

이를 실행시키면  아래와 같이 나타난다.

 

우측의 '추가' 버튼을 눌러준 후

위와 같이 내용을 입력한다.

 

이때 명령은 위에서 마우스의 감도를 조절했던 명령어 라인을 입력한다.

 

이렇게 셋팅이 되었다면 이제 우분투를 시작할때마다 지정한 마우스의 속도가 적용되게 된다.

반응형
반응형

비주얼스튜티오에서 opencv를 사용하기 위해선 기본적인 프로젝트 셋팅이 필요하다.

 

이번 포스트는 OpenCV 4.0.0 을 셋팅하는 것에 대해 다룬다.

 

가장 먼저 현재 설정하고자 하는 프로젝트는 x64 기반으로 변경하자.

 

다음으로 `프로젝트 설정의 C/C++ 파트에서 '추가 포함 디렉터리' 부분에서 opencv의 header파일이 위치한 경로를 설정한다.

 

다음으로는 '링커'의 '일반' 탭에서 '추가 라이브러리 디렉터리'를 다음과 같이 설정한다.

 

다음으로 '링커'의 '입력'탭에서 '추가 종속성'을 다음과 같이 셋팅한다.

 

 

마지막으로 '디버깅' 탭에서 다음과 같이 설정한다.

PATH=C:\opencv\build\x64\vc15\bin;%PATH%

 

반응형
반응형

Particle Filter 혹은 Sequential Monte Carlo 방식은 몬테카를로 알고리즘을 통해 신호처리와 베이지안 추정을 통한 필터링문제 해결 방안이다.

 

여기서 필터링문제란 관측되고 있는 동적인 환경에서 현재 상태를 추정하는 것으로 particle filter의 목표는 노이즈가 많고 부분적인 관찰이 진행되었을 때 일부 마르코프 결정 과정 상태의 사후 분포를 계산하는 것이다.

 

그럼 마르코프 결정 과정은 무엇인가?

마르코프 결정 과정(MDP, Markov Decision Process)은 의사결정 과정을 모델링하는 수학적인 틀을 제공한다.

 

어떤 시점에서 마르코프 결정과정은 어떠한 상태 s에 존재한다.

 

의사결정자는 해당 상태 s에서 어떤 행동 a를 취할 수 있으며 다음 시점에서 마르코프 결정 과정은 확률적으로 새로운 상태 s'으로 전이한다.

 

이 때 의사결정자는 상태전이에 해당하는 보상(R_a(s, s')) 을 받는다.

 

기존의 상태 s에서 새로운 상태 s'으로 전이하는 확률은 의사결정자의 행동에 영향을 받고 즉 전이 확률 함수는 P_a(s, s')로 표현되고 결과적으로 다음상태 s'은 현재상태 s와 의사결정자의 행동 a에만 영향을 받으며 이전의 상태와는 확률적으로 독립적일 때의 결정과정 상태를 얘기한다.

(https://ko.wikipedia.org/wiki/%EB%A7%88%EB%A5%B4%EC%BD%94%ED%94%84_%EA%B2%B0%EC%A0%95_%EA%B3%BC%EC%A0%95)

 

 

그럼 다시 Particle Filter, Sequential Monte Carlo에 대해 얘기해보자.

 

보통 Dynamic Programming을 진행할때 Planning 혹은 Learning을 진행한다.

Planning이란 주변 Environment에 대한 Model을 구하여 이를 푸는 과정이고

Learning이란 Environment의 model은 모르지만 상호작용을 통해서 문제를 푸는 과정을 말한다.

 

여기서는 Environment Model은 정확히 모르지만 Trial-and-error 의 과정(강화학습)을 통해 실재 측정되는 정보들을 통해 update하는 과정을 진행하게 된다.

(https://daeson.tistory.com/327)

 

Monte-Carlo란 단어는 무엇인가를 random하게 측정하는 것을 의미하고 강화학습에서는 "averaging complete returns"하는 방법을 의미한다고 한다.

 

 

 

그럼 이제 본격적으로 Particle Filter의 과정을 살펴보겠다.

 

2D Lidar센서를 장착한 모바일로봇이 있다고 가정해보자.

위의 그림에서 현재 로봇의 위치는 초록색 점으로 표시된 좌측 상단이고 붉은 점들은 particles에 해당한다.

particle은 좌표와 방향(x, y, yaw)의 값을 갖고있다.

 

그리고 전역지도의 랜덤한 위치에 particle을 분포한 것이다.

 

그리고 로봇이 이동하게 되면 이 모든 파티클 역시 이동하게 된다.

예를들어 로봇이 앞으로 3m를 이동하였다 가정하자.

 

그럼 모든 파티클이 현재의 방향(yaw)로 3m를 이동할 것이고 그때 로봇의 라이다 센서에서 관측되는 주변 환경이 있을 것이다.

 

그럼 각각의 파티클에 라이다센서가 장착되어있다 가정하고 로봇에서 관측된 측정값과 유사한 파티클의 경우 가중치(weight)를 높이고 관측된 측정값이 차이가 크게 발생할 것으로 예상되는 경우 가중치의 값을 낮춘다.

 

 

그리고 가중치의 값을 선택 확률로하여 다시 particle들을 샘플링한다.(resampling)

 

그럼 위의 이미지와 같이 현재 로봇의 위치로 추정되는 위치에 파티클들이 모이게 된다.

 

이 상태에서 다시 로봇을 이동시키고 관측되는 신호화 각각의 파티클에서 관측될 것으로 예상되는 신호들을 비교하여

파티클들의 가중치를 설정하고 다시 리샘플링(resampling)을 진행하면 다음과 같이 나타날 것이다.

 

위의 과정을 반복하면 결과적으로 현재 로봇의 위치를 정확하게 추정할 수 있게 된다.

 

 

아래 그림은 가중치에 대한 정보를 도식화한 것이다.

 

 

 

 

베이지안은 X_k의 상태를 이전의 확률밀도를 통해 계산하게 된다.

필터링 문제는 연속적인(sequentially) 상황에서 상태를 나타내는 X_1, X_2, X_3, ...  이 있다고 할때

이때 측정되는 신호(관측되는 신호) Y_1, Y_2, Y_3, ... 로 할때 어떠한 상태 X_k를 이전의 상태 X_(k-1)과 현재 관측되는 값 Y_k를 통해 추정하는 것이다.

 

 

반응형
반응형

turtlebot_navigation.launch파일에서 amcl.launch파일을 실행시키는데

이 amcl.launch파일은 ros/opt/kinetic 에 위치하는 amcl 패키지를 통해 실행된다.

(이는 sudo apt-get install ros-kinetic-amcl 을 통해 설치된 것으로

sudo apt-get purge ros-kinetic-amcl 을 통해 삭제가 가능하다)

 

그럼 이제 catkin_ws를 생성하고 여기에 turtlebot_navigation 패키지와 amcl패키지(ros-planning/navigation)을

설치해보자.

 

설치가 다 되었으면 해당 workspace를 빌드해보자.

(catkin_make)

 

우선 amcl 패키지의 src내에 존재하는 amcl_node.cpp 파일에 대한 내용을 분석해보자.

 

 

 

 

코드의 초반은 위와 같이 코드에서 사용될 변수들의 선언에 대한 내용들을 나타내고 있다.

 

그리고 AmlNode의 생성자 부분을 살펴보면 NodeHandler(private_nh_)에 대한 파라미터 초기화 내용이 진행된다.

 

nodehandler.param("AA", BB, CC); 

위의 문장은 "노드의 파라미터 "AA"에 대하여 변수 BB의 값을 할당해주며 초기값은 CC로 한다"의 내용을 담고있다.

 

 

파라미터들에 대한 초기화가 마무리되면 바로 updatePoseFromServer() 함수가 실행된다.(line 441)

 

해당 함수는 1차원배열 init_pos_ 배열과 init_cov_ 배열의 원소에 값을 할당해주는 과정으로 보인다.

그럼 가장 윗부분만 살펴보자.

우선 init_pose_ 배열과 init_cov_ 배열을 초기화해준다.

그리고 파라미터 initial_pose_x 의 값을 tmp_pos값으로 초기화하는데 이때 값을 init_pose_[0]의 값으로 설정한다.

 

init_pose_[0]은 위에서 0.0의 값으로 초기화를 했으니

initial_pose_x 의 파라미터는 0.0으로 초기화되는 것으로 볼 수 있다.

 

그 후 std::isnan(tmp_pos) 가 등장하는데 이때 tmp_pos에는 0.0의 값이 들어가있고 isnan(0.0)은 False를 반환하게 될 것이다.

isnan은 괄호안의 값이 Nan(Not a number)인지를 확인하며 괄호안의 값이 숫자일경우 False, 숫자가 아닐경우 True를 반환한다.

 

따라서 if(!std::isnan(tmp_pos)) 는 정상적인 경우 if(!False) 이므로 해당되는 조건문으로 볼 수 있다.

그렇다면 tmp_pos는 init_pose_[0]의 값으로 초기화되고 다시 init_pose_[0]은 tmp_pos로 초기화된다.

(무슨 목적인지는 잘 이해되지 않는다.)

 

결과적으로 updatePoseFromServer() 함수는 init_pose_와 init_cov_에 대한 초기화를 진행하게 된다.

 

 

다음으로 ros의 duration에 1.0s를 할당해주는 부분, TF정보를 Broadcast, listen해주는 동적 객체를 생성한다.

그리고 amcl_pose, particlecloud 토픽에 대한 정보를 나타낼 수 있도록 pose_pub, particlecloud_pub_를 설정한다.

 

amcl_pose는 로봇의 실시간 position과 orientation을 나타내고(x, y, yaw) particlecloud는 particle들의 정보를 나타내는 것으로 보인다.

 

즉, particlecloud가 어떻게 수렴되어가는지를 확인해보면 될 것이다.

 

생성자의 나머지 부분들 역시 publish할 메시지들과 subscribe할 메시지들을 설정해주는 부분으로 볼 수 있다.

 

 

 

다음으로 등장하는 부분은 reconfigureCB 함수에 대한 내용이다.

자세한 내용을 살펴봐야 하겠지만 내부에 ROS_ERROR를 넣어 실행시켜본 결과

이 부분은 초기에 1회만 진행되고 중간에 위치인식을 수행하는데에는 실행되지 않는 것으로 보인다.

frame_id를 설정해주고 lidar센서의 셋팅들을 불러오는 것으로 확인된다.

 

 

 

 

다음으로는 rosbag에 대한 부분이다.

이는 저장된 bag파일을 통해 작업을 진행하기 위한 부분으로 보인다.

따라서 스킵하도록 하겠다.

 

 

 

다음으로는 savePoseToServer( ) 함수이다.

여기선 map_pose에 대하여 initial_pose_x와 initial_pose_y, 그리고 회전을 나타내는 initial_pose_a의 값을 설정한다.

이 부분은 노드가 실행될때 주기적으로 실행되는 부분이고 x, y값은 바퀴 엔코더의 회전량을 통해, yaw의 경우 imu의 신호를 통해 측정되는 것으로 보인다.

(로봇을 손으로 들어 이동시키면 yaw값이 변화하고 teleop을 통해 모터를 회전하면 x, y값이 변화한다.)

 

즉 이 부분이 로봇의 x, y, yaw의 값을 설정해주는 부분으로 보인다.

 

 

 

다음은 checkLaserReceived( )함수로 라이다센서의 측정 신호가 지정한 interval 내에 수신되는지 확인하기 위한 부분이다.

 

이 뒤에 연달아 등장하게 되는

AmclNode::requestMap() 함수와

AmclNode::mapReceived(const nav_msgs::OccupancyGridConstPtr& msg) 함수 역시 이미 생성된 global map을 불러오기 위한 과정으로 볼 수 있다.

 

 

 

다음은 handleMapMessage( ) 부분이다.

 

이 부분에 대한 역할을 이해하기 위해 함수 내 모든 코드를 주석처리 해보니 아래와같이 Laser의 신호도 제대로 받지 못하고

로봇의 모델을 표시하는데에도 문제가 발생하게 된다.

 

아마 지도정보를 제대로 받아오지 못하기에 발생한 것으로 보인다.

그리고 이 함수는 프로세스를 진행하면서 초기에 1회만 실행되는 것을 확인하였다.

 

 

그런데 중간에 내용을 살펴보면 다음과 같은 부분이 존재한다.

 

주석으로 "Create the particle filter" 로 되어있는데

이 부분을 통해 particle filter에 대한 설정을 진행하는 것으로 보인다.

 

이 부분을 좀 더 정확하게 분석하여 보자.

init_pose_배열에는 위에서 초기화된 값들이 x, y, yaw순서로 들어 있는데

이를 pf_init_pose_mean.v벡터에 넣는 것을 볼 수 있다.

즉 위치를 지정해주고 노이즈로 인한 불확실성을 추가한 후

pf_init( ) 함수를 통해 초기화를  진행하는 것으로 보인다.

 

 

pf_init() 함수는 /navigation/amcl/src/amcl/pf/ 경로에 있는 pf.c 파일에서  확인할 수 있다.

가우시안 분포를 통해 particle들을 초기화하는 것으로 보인다.

 

다음으로 주의깊게 볼 부분은 getOdomPose( ) 함수의 부분이다.

이 부분은 프로세스가 실행될 때 반복적으로 실행되는 부분으로

현재 로봇의 Odometry를 나타내는 부분으로 보인다.

함수의 자료형이 Bool 형태인걸로 봐서 odom정보를 잘 받아왔는지 아닌지를 판단하는 부분으로 보인다.

 

다음으로 등장하는 부분은 uniformPoseGenerator( ) 함수이다.

허나 이 함수의 내부에 ROS_ERROR()를 통해 실행시켜본 결과

출력되지 않는 것으로 보아 이는 특별하지 않으면 실행되지 않는 부분으로 봐도 될 것 같다.

 

 

 

다음은 laserReceived( ) 함수이다.

이 부분은 굉장히 코드의 길이가 길기도 하며 센서의 신호를 처리하는 중요한부분으로 보인다.

반응형
반응형

Docker 설치를 위한 셋팅

윈도우 환경에서 검색창에 'PC 정보'를 입력하면 아래와 같이 바로가기 아이콘을 확인할 수 있다.

 

 

가장 아래에 'Windows 사양'이 표시되고 내 윈도우의 에디션을 확인할 수 있다.

 

Docker를 사용할 때 Windows10 Homoe Edition과 Pro Edition의 가장 큰 차이는

Hyper-V 기능의 지원 여부이다.

 

Hyper-V는 Windows 10 Pro, Enterprise 및 Education 64비트 버전에서 사용할 수 있고.

Home 버전에서는 사용할 수 없다고 한다.

 

Docker Desktop은 기본적으로 Hyper-V 기능을 사용하기에 기존에는 Windows10 Pro에서만 사용이 가능했지만 최근 업데이트를 통해 WSL2를 통해 Home Edition에서도 사용할 수 있게 되었다고 한다.

 

정리하면 다음과 같다.

 

 * Windows10 Pro

    - WSL2 기반 Docker Engine 사용 가능

    - Hyper-V 기반 Docker Engine 사용 가능

 

 * Windows10 Home

    - WSL2 기반 Docker Engine 사용 가능

 

 

따라서 Home Edition의 경우 Docker를 사용하기 위해 WSL2가 필수이기에 이 설치 과정부터 살펴보겠다.

 

 

먼저 Windows를 최신 버전으로 업데이트 한다.

 

그리고 명령 프롬프트를 실행하여 아래 명령어를 입력한다.

 

$ dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

(Microsoft-Windows-Subsystem-Linux 기능 활성화)

 

$ dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

(VirtualMachine Platform 기능 활성화)

 

그럼 다음으로 WSL2 Linux 커널 업데이트를 진행한다.

 

 

https://docs.microsoft.com/ko-kr/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

위의 링크로 이동하여 'x64 머신용 최신 WSL2 Linux 커널 업데이트 패키지'를 다운로드하여 설치한다.

 

 

 

그럼 윈도우 명령 프롬프트에서 다음 명령어를 통해 기본적으로 사용할 WSL 버전을 2로 변경한다.

 

$ wsl --set-default-version 2

 

 

그럼 이제 Docker를 설치하기 위한 셋팅이 완료된 것이다.

 

 

 

 

Docker Desktop 다운로드(Windows)

 

WSL2 셋팅이 완료되었으니 이제 Docker를 설치해보자.

 

https://www.docker.com/products/docker-desktop

위의 주소로 이동한 후 상단의 'Developers' 의 'Docs'로 이동한다.

 

여기서 윈도우의 환경에 대한 다운로드 및 설치를 진행한다.

 

설치가 완료되었으면 명령 프롬프트를 실행하여 아래 명령어를 입력해보자.

 

$ docker images

위의 사진과 같이 에러 없이 뭔가가 출력된다면 설치가 잘 진행된 것이다.

반응형
반응형

ROBOTIS의 E-Manual을 통해 TURTLEBOT을 사용하여 지도를 작성하고 주행해보는 과정을 진행해봤다는 가정하에 작성한다.

 

 

앞에서 TURTLEBOT이 SLAM을 통해 지도를 저장할때 생성되는 pgm 파일과 yaml파일에 대해 살펴봤다.

 

이번에는 이 파일들을 통해 주행을 하는 과정, 그 중에서도 위치인식(Localization)에 대한 내용을 다룬다.

 

그럼 Navigation을 수행하기 위해 실행하는 navigation.launch파일부터 다시 살펴보자.

 

 

line14의 map_server 노드가 하는 역할은 앞에서 살펴봤다.

 

그럼 이제 line17의 amcl.launch파일이 하는 역할에 대해 살펴보자.

 

AMCL, Adopted Monte Carlo Localization 의 약어로 위치인식을 위해 진행되는 particle filter에 대한 내용이다.

 

 

우선 amcl.launch 파일을 찾아 내용을 살펴보자.

(여기서 amcl의 런치파일은 turtlebot3_navigation 패키지 안에 들어있다.)

 

 

노드의 파라미터들을 살펴보면 해당 노드는 2D Lidar 데이터를 사용하는데 최적화가 되어있는 것으로 예상된다.

 

그럼 이 노드의 source로 들어가 각각의 파라미터들이 어떤 역할을 하는지, 어떠한 구조를 갖는지 살펴볼 필요가 있다.

우선 source가 무엇인지를 파악하기 위해 CMakeLists를 찾아보자.

(ros-planning/navigation/amcl/CMakeLists.txt)

 

 

위의 파일을 통해 amcl 노드가 src/amcl.cpp를 통해 생성됨을 확인할 수 있다.

 

amcl_node.cpp
0.05MB

 

코드를 분석해보자.

 

코드가 너무 긴가?

 

천리길도 한걸음부터.

반응형
반응형

TURTLEBOT이란 ROBOTIS에서 제공하는 모바일로봇 플랫폼이다.

 

ROS를 처음 배우는 입문단계에서 ROS의 흐름 및 구조를 파악하기에 유용한 플랫폼이라 생각된다.

 

TURTLEBOT을 동작시키고 다양한 작업을 해보는데에는 Robotis의 E-Manual을 포함하여 많은 예제들과 설명들이 즐비하므로

나는 조금 더 깊게 TURTLEBOT의 코드들에 대하여 분석해보겠다.

 

우선 ROBOTIS에서 제공하는 E-Manual을 따라해보며 Turtlebot으로 지도를 작성해보고 네비게이션까지 해보았다고 가정하고 이야기를 시작하겠다.

 

https://emanual.robotis.com/docs/en/platform/turtlebot3/navigation/

 

ROBOTIS e-Manual

 

emanual.robotis.com

 

 

SLAM을 진행하고 마지막으로 작성한 지도를 저장하기 위해서 아래 명령어를 실행했을 것이다.

$ rosrun map_server map_saver -f ~/map

 

map_server 패키지의 map_saver 노드를 통해 지도를 저장하겠다는 명령어이고 이를 통해 지도를 나타내는 pgm파일 및 yaml파일이 생성된다.

 

 

pgm파일은 Portable Gray Map으로 GrayScale로 표현되는 이미지라고 보면 될 것이다.

그리고 yaml파일은 노드를 실행시킬때 필요한 파라미터들에 대한 정보를 담고 있다고 볼 수 있고 따라서 생성한 yaml 파일은 지도의 분해능(resolution)이라든지 여러 정보들이 포함되어 있다.

 

 

그럼 생성한 yaml은 어떠한 노드를 실행시키기 위한 파라미터들인가?

 

Robotis의 E-Manual에서는 map_server 를 통해 작성한 지도를 저장하고 난 후 Navigation chapter로 넘어가고 다음의 명령어가 나타난다.

 

$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml

 

turtlebot3_navigation.launch 파일을 실행시키는데 map_file의 파라미터로 yaml파일을 넣어주는 것이 보인다.

그래서 해당 launch파일을 살펴보았다.

 

 

line4 에서 map_file이라는 변수에 yaml이 할당되는 것을 볼 수 있다.

그리고 line14 에서 map_file 변수는 map_server 패키지의 map_server 노드의 파라미터로 지정되는 것을 확인할 수 있다.

 

그럼 map_server 노드는 yaml파일을 갖고 무엇을 하는걸까??

 

이를 확인하기 위해 map_server 라는 실행노드가 생성될때 필요한 source code를 살펴봐야 할 것이다.

 

이를 위해 map_server 패키지의 CMakeLists.txt를 살펴보자.

 

 

map_server라는 실행노드는 src/main.cpp를 통해 생성됨을 확인할 수 있다.

그리고 코드의 내용은 아래와 같다.

 

 

MapServer 클래스의 생성자에서 fname 이라는 문자열의 주소를 파라미터로 입력받는 것을 볼 수 있다.

저기서 문자열은 yaml파일의 경로 및 이름이 해당될 것이다.

 

그리고 fname이라는 변수는 line77의 std::ifstream fin(fname.c_str()) 에서 사용된다.

 

ifstream fin(xxx) 의 구조는 xxx를 읽어와 입력스트림을 생성한다는 의미이다.

그럼 fin에는 xxx의 내용들이 담기게 된다.

 

fin에 대한 설명은 아래 pdf 파일을 보며 이해하면 좋다.

CPP12_File IO.pdf
0.87MB

 

따라서 fin에는 'fname'이라는 파일에 담긴 내용들이 들어가게 된다.

 

그리고 아래를 보면 YAML라이브러리의 Node클래스 객체 doc는 YAML라이브러리의 Load함수를 통해 fin의 내용을 불러오는 것을 확인할 수 있다.

(YAML::Node doc 의 구조에 대해 잘 모르겠다면 OpenCV 라이브러리를 생각해보자.

OpenCV라이브러리를 통해 객체를 생성하고 함수를 사용할땐 cv::Mat img,  cv::imshow() 를 사용하게 된다.)

 

 

결과적으로 doc에는 fin의 내용들 즉, yaml파일의 내용들이 담기게 되고

doc에 순서대로 할당된 값들을 통해 res, negate, occ_th 등의 변수들에 값을 할당하게 된다.

 

즉 이 부분에서 yaml의 값들을 통해 변수들에 값을 할당하는 것을 볼 수 있다.

 

그리고 코드를 더 살펴보면 변수들을 통해 지도에 대한 메시지를 생성하고 map에 대한 정보(OccupancyGrid) 등을 publish하게 됨을 확인할 수 있다.

 

 

그럼 이 지도를 갖고 어떻게 주행을 하게 될까?

주행에 대한 부분은 다음 게시물에서 다루겠다.

반응형
반응형

OpenCV에서 Line Matching을 진행해주는 API가 존재하는 것 같다.

 

https://docs.opencv.org/3.4/df/dfa/tutorial_line_descriptor_main.html

 

코드를 확인해보면 도입부에 아래와 같은 내용을 작성한다.

여기서 opencv2/line_descriptor.hpp 파일이 linematching을 위한 중요한 헤더파일로 보이는데

OpenCV를 설치 후에 opencv2 경로에는 해당 파일이 존재하지 않는다.

 

그래서 찾아보니 OpenCV에서는 새로운 API가 추가되는 경우 안정성이나 성능 검증이 완벽하게 검증되지 않은 경우 배포를 하지 않고 Extra Module(opencv_contrib)에 포함시키게 된다고 한다. 즉 베타버전들의 모음으로 볼 수 있을 것 같고

OpenCV의 line matching도 이에 포함되는 것이다.

 

그럼 어떻게 opencv_contrib을 다운받고 안에 들어있는 내용을 사용해볼 수 있는지 알아보자.

 

 

 

 

1. opencv_contrib 다운로드

 

https://github.com/opencv/opencv_contrib

 

GitHub - opencv/opencv_contrib: Repository for OpenCV's extra modules

Repository for OpenCV's extra modules. Contribute to opencv/opencv_contrib development by creating an account on GitHub.

github.com

 

위의 주소로 들어가면 다음과 같은 화면을 볼 수 있다.

 

 

해당 저장소를 다운로드한다.

이때 자신의 OpenCV 버전과 일치하는 opencv_contrib을 다운받도록 한다.

 

다운받으면 .zip형식의 파일을 다운받게 되는데 이의 압축을 풀어주자.

 

 

2. 프로젝트 빌드

 

우선 CMake-GUI를 실행시킨다.

프로그램 창에서 위의 source code: 경로는 opencv를 설치한 경로와 source까지의 경로,

그 아래 build the binaries: 경로는 빌드된 파일이 어디다 저장할것인지를 지정하는 부분이다.

(이때 사진에서는 Desktop 경로로 설정하였는데 생성되는 파일이 많으므로 새로운 폴더를 하나 생성하여

그 폴더에다가 실행하도록 하자)

 

 

 

그리고 아래의 "Configure" 버튼을 클릭하면 다음과 같은 창이 뜬다.

 

프로젝트를 설정하기 위해 어떠한 Visual Studio버전을 사용하는지 지정을 하게 되고

아래의 라디오버튼은 "Use defualt native compilers"를 선택한다.

그리고 Finish 버튼을 누른다.

 

그럼 아래와 같은 화면을 확인할 수 있을 것이다.

(log 창 부분에 "Configuring done"이 출력됨을 확인할 수 있다.)

 

 

그럼 이제 opencv_contrib을 불러와 넣어주자.

CMake 의 창에서 찾아보면 "OPENCV_EXTRA_MODULES_PATH" 라는 부분을 찾을 수 있다.

여기의 Value값에 아까 다운받은 opencv_contrib 경로를 넣어주자.

이때, opencv_contrib 경로 안에 modules라는 경로가 있는데 이 부분까지 입력해주도록 하자.

 

 

 

그리고 다시 Configure 버튼을 눌러준다.

 

 

 

이번에도 "Configuring done"이라는 문장이 이상없이 출력됨을 확인할 수 있다.

그럼 옆의 "Generate" 버튼을 누르고

위와 동일하게 "Generating done" 이라는 문장을 확인하였으면

"Open Project" 버튼을 눌러 프로젝트를 열어준다.

 

 

 

 

솔루션 내 프로젝트들 중 'CMakeTargets' 경로에 있는 INSTALL 프로젝트에 대하여 우클릭 후

빌드를 진행하자.

 

 

Debug 모드에서 빌드를 진행할 경우 위와 같이 python38_d.lib 을 열 수 없다는 에러문장이 출력된다.

 

하지만 Release모드에서 빌드를 진행하게 되면 아래와 같이 이상없이 빌드가 진행되었다.

 

조금은 찜찜하지만 우선 되는 방향을 통해 작업을 진행해보자.

 

 

 

 

 

프로젝트를 새로 만들어준다.

 

빈 프로젝트로 생성하며 src.cpp 파일을 추가해주고 프로젝트 설정으로 들어간다.

 

 

구성속성 - 디버깅 - 환경  에서 앞에서 생성한 프로젝트의 install 경로 안에 존재하는 bin 경로를 지정한다.

 

나머지 include될 경로와 라이브러리 경로도 install 경로 안에 있는 include, lib 경로로 지정해준다.

 

추가 종속성에는 일단 lib파일들을 모두 추가해주었다.

 

더보기

opencv_aruco400.lib

opencv_bgsegm400.lib

opencv_bioinspired400.lib

opencv_calib3d400.lib

opencv_ccalib400.lib

opencv_core400.lib

opencv_datasets400.lib

opencv_dnn_objdetect400.lib

opencv_dnn400.lib

opencv_dpm400.lib

opencv_face400.lib

opencv_features2d400.lib

opencv_flann400.lib

opencv_fuzzy400.lib

opencv_gapi400.lib

opencv_hdf400.lib

opencv_hfs400.lib

opencv_highgui400.lib

opencv_img_hash400.lib

opencv_imgcodecs400.lib

opencv_imgproc400.lib

opencv_line_descriptor400.lib

opencv_ml400.lib

opencv_objdetect400.lib

opencv_optflow400.lib

opencv_phase_unwrapping400.lib

opencv_photo400.lib

opencv_plot400.lib

opencv_reg400.lib

opencv_rgbd400.lib

opencv_saliency400.lib

opencv_shape400.lib

opencv_stereo400.lib

opencv_stitching400.lib

opencv_structured_light400.lib

opencv_superres400.lib

opencv_surface_matching400.lib

opencv_text400.lib

opencv_tracking400.lib

opencv_video400.lib

opencv_videoio400.lib

opencv_videostab400.lib

opencv_xfeatures2d400.lib

opencv_ximgproc400.lib

opencv_xobjdetect400.lib

opencv_xphoto400.lib

 

 

 

소스코드는 아래에서 가져왔다.

https://github.com/opencv/opencv_contrib/blob/3.1.0/modules/line_descriptor/samples/matching.cpp

 

GitHub - opencv/opencv_contrib: Repository for OpenCV's extra modules

Repository for OpenCV's extra modules. Contribute to opencv/opencv_contrib development by creating an account on GitHub.

github.com

 

그럼  이제 프로젝트를 실행해보자.

 

main문의 도입부를 지우고

내가 지정한 임의의 이미지 파일들을 불러오도록 해봤다.

 

 

 

 

 

-끝

반응형

+ Recent posts