for Robot Artificial Inteligence

1. introduction to Visual SLAM practice.

|

기본 연습

#include <iostream>
using namespace std;

int main()
{
  cout<<"hello SLAM!"<<endl;
  return 0;
}
  • 컴파일러를 사용하여서 실행 파일을 만들어야하는데 많이 사용 되는 것은 g++이다
    • 만약 설치가 안되어있다면 sudo apt-get install g++
  • 컴파일
g++ helloSLAM.cpp
  • 컴파일이 되었으면 현재 목록에 실행파일 a.out 의 파일을 발견할 수 있다.

  • 실행

./a.out

---
output : hello SLAM!

CMake 사용

  • 다량의 cpp파일을 g++를 이용하여서 compile하는 것은 생각만해도 골치아프다.

  • 이런 Procedeure을 관리해주는 Cmake를 사용한다면 효과적으로 효율을 올릴 수 있따.
  • Cmake는 자동 Compile을 도와주는 도구이다.
  • CMakeLists.txt는 흔히 Makefile이라고 불리는데, 자동 컴파일을 지정해주는 파일이다.

  • 위에와 같은 프로그램을 CMakeLists.txt를 통하여 아래와 같이 자동 컴파일을 지정할 수있다.
# Cmake
cmake_minimum_required( VERSION 2.8)

# Named Project
project( HelloSLAM)

# add_executable, 실행파일 만들기
add_executable( helloSLAM helloSLAM.cpp)
  • CMakeLists.txt를 만들었으면, mkdir을 통해 build 폴더를 만고 cd build 장소에서 cmake .. 를 진행하여 compile 준비를 한다.

  • 준비가 끝났으면 make 를 통해서 compile 진행을 하면 아래와 같이 뜬다.

  • 성공을 하였다면 아래와 같이 실행할 수 있다.
./helloSLAM
Hello SLAM!

Library 사용하기

  • Visual SLAM을 하기 위해서 아래와 같은 라이브러리가 필요하다
    • Opencv Library : Computer Vision 알고리즘 Library
    • Eigen Library : Matrix, linear Algebra 알고리즘
  • Library 사용 대한 이해를 돕기 위해 예로 아래와 같이 Library를 만들어 보았다.
    • file name : libHelloSLAM.cpp
#include <iostream>
using namespace std;

void printHello()
{
  cout<<"hello SLAM!"<<endl;
  return 0;
}
  • printHello의 함수를 만들었지만, main 함수가 없으므로 실행을 할 수 없다. CMakeLists.txt에 아래와 같이 script를 더한다.
# Static library
add_library( hello libHelloSLAM.cpp )
  • 그리고 build 폴더에서 make를 다시한다면 libhello.a 라는 파일이 생성되는 것을 볼 수 있을것이다.
  • libhello.a 이것이 바로 우리의 library다
  • .a 는 Static Library를 뜻하고
    • Static Library는 매번 쓸때마다 복사본을 생성한다.
  • .so 는 Share Library를 뜻한다.
    • .so 는 Share Library로 오직 하나의 복사본만 가지고 있어 공간을 아낄 수 있다.
  • 만약 Static Library가 아닌 Share Library를 쓰고 싶다면 Cmakelists.txt에서 아래와 같이 쓸 수 있다.
# 共享库
add_library( hello_shared SHARED libHelloSLAM.cpp )
  • 그리고 build 폴더에서 make를 다시한다면 libhello.so 라는 파일이 생성되는 것을 볼 수 있을것이다.
  • Library는 compile이 이미 잘된 압축 파일이다. 그러나 .a 혹은 .so 안에 어떤 함수들이 있는지 알수가 없다.
  • 다른사람이 쓰거나 혹은 본인을 위해 Header파일이 필요하다.
  • Header 파일과 Library파일만 있다면 그 Library를 사용할 수 있다.
  • 아래와 같이 예시를 보겠다.

    libHelloSLAM.h

#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
// 上面的宏定义是为了防止重复引用这个头文件而引起的重定义错误
void printHello();
#endif

useHello.cpp

#include "libHelloSLAM.h"

// 使用 libHelloSLAM.h 中的 printHello() 函数
int main( int argc, char** argv )
{
    printHello();
    return 0;
}
  • 두 파일을 만들었다면 CMakeLists.txt에 명령어를 추가하여서 library파일인 libHelloSLAM.cpp를 사용할 수 있게 한다.
add_executable( useHello useHello.cpp )
# 将库文件链接到可执行程序上
target_link_libraries( useHello hello_shared )
  • 이렇게 된다면 useHello 프로그램은 언제든지 hello_share의 프로그램을 사용할 수 있다.

Debug

  • Linux 중에서 Debug Tool은 기본적으로 gdb이다.
  • CmakeList.txt를 이용하여서 쉽게 Debug를 할 수 있다.
# 设置编译模式
set( CMAKE_BUILD_TYPE "Debug" )

Reference

SLAM KR 视觉SLAM书

Cmake Tutorial : https://github.com/TheErk/Cmake-tutorial.

Comments