美文网首页
SLAM学习笔记2

SLAM学习笔记2

作者: FOFI | 来源:发表于2019-03-10 23:27 被阅读0次
    笔记分两部分:
    1. SLAM基本框架
    2.用cmake编译cpp源文件
    • SLAM基本框架
    SLAM要解决两个问题:定位和建图。一个基本的SLAM框架包括:传感器信息读取,视觉里程计,后端优化,回环检测和建图。视觉里程计称为整个框架的前端,它的任务是估算相邻图像中相机的运动轨迹,构建局部地图。由于估算会有误差积累(累计漂移)导致估算的轨迹不再准确,这时候需要回环检测负责把“机器人回到原始位置”的事情检测出来,视觉里程计和回环检测会把数据传递给后端优化,校正整个轨迹的形状,最后构建全局地图。整个框架的框图如下:
    《视觉SLAM十四讲配图》
    以下是阅读《视觉SLAM十四讲》做的笔记:第一张是相机分类,后两张是SLAM基本框架各部分的大致内容和联系:
    相机分类 SLAM框架 SLAM框架
    • 用cmake编译cpp源文件
    例子会用到opencv和cmake.两者在Linux下安装步骤看这里。为什么要用cmake?《CMake Practice》里这样说:
    1.开放源代码,使用类 BSD 许可发布。
    2.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。
    3.能够管理大型项目,KDE4 就是最好的证明。
    4.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。
    5.高效虑,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来构建 KDE3.5.6 的 kdelibs 快 40% ,主要是因为 Cmake 在工具链中没有 libtool。
    6.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。
    下面用cmake编译mian.cpp构建工程,需要创建一个文件夹,并把两个文件拷贝进去:
    1.main.cpp
    2.CMakeLists.txt
    main.cpp在本例子要实现读取指定文件夹图片,将每张图片重命名为数字序列(如0001.png,0002.png...),并将图片存储在新的文件夹下,代码如下:
    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    using namespace cv;
    
    int main() {
        
        String Pattern = "/home/gaki/image/";
        String OutputDir = Pattern+"output/";//注意在该目录创建一个*output*文件夹,重命名的图片将储存在这个。
        char newName[10];
        Mat OutputImage;
        vector<String> FileName;    
        glob(Pattern, FileName, false);
        
        for(int i=0;i<FileName.size();i++)
        {
          if(FileName[i].find(".png")!=String::npos)
          {
              OutputImage = imread(FileName[i]);
              imshow("image",OutputImage);
              waitKey(1000);
              sprintf(newName,"%04d.png",i);
              imwrite(OutputDir+newName,OutputImage);
              cout<<"images found !"<<endl;
              cout<<"writed in"<<OutputDir+newName<<endl;
          }
          
          else{
            cout<<"not a png image found"<<endl;
          }
        }
        
        return 0;
        
    }
    
    CMakeList.txt如下:
    #这是注释
    cmake_minimum_required(VERSION 2.8) #cmake最低版本要求,低于这个版本编译不会通过
    
    project(practice1) #工程名称,可以随意起名字
    
    #设置源文件列表,当需要编译多个源文件时这样的形式是方便的,如set(SRC_LIST a.cpp b.cpp c.cpp)
    #SRC_LIST作为变量,main.cpp作为一个值赋给SRC_LIST这个变量
    set(SRC_LIST main.cpp) 
    
    find_package(OpenCV REQUIRED)
    
    include_directories(${OpenCV_INCLUDE_DIRS}) #${ }表示取变量的值
    
    add_executable(${PROJECT_NAME} ${SRC_LIST}) #生成一个可执行文件,相关源文件是变量SRC_LIST中的值
    
    target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
    
    一个最简的CMakeLists.txt如下:
    project(practice1)
    add_executable(practice1 main.cpp)
    
    其他语句依实际构建工程需要添加。
    • 编译
    将以上两个文件放在随意一个文件夹下,比如我的在“/home/gaki/slampractice/p1”,首先终端进入该文件夹:
    cd /home/gaki/slampractice/p1
    
    新建build文件夹并且进入build文件夹:
    mkdir build && cd build
    

    构建工程:(注意cmake 后面有两个 .)

    cmake ..
    

    注意到build目录下生成了Makefile,然后进行工程实际构建:

    make
    

    此时build目录中生成可执行文件practice1,运行:

    ./practice1
    

    此时output文件夹下输出重命名后的图片,程序顺利执行~

    0002.png

    相关文章

      网友评论

          本文标题:SLAM学习笔记2

          本文链接:https://www.haomeiwen.com/subject/zoappqtx.html