设计前端(一)

本文介绍了前端VO框架的搭建,包括bin、include、src等目录的组织结构,以及基本数据结构的设计:帧、路标、配置文件和坐标变换。详细讲解了5个核心类的功能,如Camera类用于存储坐标系转换,Frame类作为基本数据单元,MapPoint类表示特征点,Map类管理所有路标点,而Config类则负责参数读取和管理。
摘要由CSDN通过智能技术生成

1.搭建VO框架

A. SLAM库是一个小型库,库的组织结构如下:

1.bin 用来存放可执行的二进制文件。
2.include/myslam存放SLAM模块的头文件,主要是.h文件,当把包含目录设到include,引用自己的头文件时,需要写include“myslam/xxx.h”。
3.src 存放源代码文件,主要是.cpp文件。
4.test 存放测试文件,也是.cpp文件。
5.lib 存放编译好的库文件。
6.config 存放配置文件。
7.cmake_modules 第三方库的cmake文件,在使用g2o之类的库会用到它。

2 . 确定基本数据结构

1.帧:相机采集到的图像单位,包含一个或一对图像。还有特征点、位姿、内参等信息。
2.路标:路标即图像中的特征点,在相机运动后,我们还能估计他们的3D位置(对极几何、PnP、ICP、光流法和直接法等)。通常都是把路标点放在一个地图当中,并将新来的帧与地图中的路标点进行匹配,估计相机位姿。
3.配置文件:在程序中遇到各种各样的参数,相机的内参、特征点数量等,较好的方式是在外部定义一个配置文件,程序运行读取该配置文件的参数值。
4.坐标变换:会经常遇到坐标系之间的转换,世界到相机、相机到归一化、归一化到像素等,定义一个类把这些操作都放一起更方便。

3. 5个类及其功能

5个类:Frame为帧,Camera为相机模型、MapPoint为特征点/路标点,Map管理特征点,Config提供配置参数。

camera类:存储摄像机各个坐标系的转换关系
camera.h :

#ifndef CAMERA_H  //防止头文件重复引用,防止在俩处引用此头文件时出现类的重复定义
#define CAMERA_H

#include "myslam/common_include.h"  //将一些常用的头文件都放在这里面,避免每次书写都用很长的include

namespace myslam    //用namesapce myslam 将类定义包裹起来
{

// Pinhole RGBD camera model
class Camera
{
public:
    typedef std::shared_ptr<Camera> Ptr; //把智能指针定义为camera类型指针,传递函数使用Camera::Ptr即可
    float   fx_, fy_, cx_, cy_, depth_scale_;  // Camera intrinsics 

    Camera();
    Camera ( float fx, float fy, float cx, float cy, float depth_scale=0 ) :
        fx_ ( fx ), fy_ ( fy ), cx_ ( cx ), cy_ ( cy ), depth_scale_ ( depth_scale )
    {}

    // coordinate transform: world, camera, pixel  vetor3d 三维向量
    Vector3d world2camera( const Vector3d& p_w, const SE3& T_c_w );//用李代数来表达相机的位姿,头文件对函数进行了声明
    Vector3d camera2world( const Vector3d& p_c, const SE3& T_c_w );
    Vector2d camera2pixel( const Vector3d& p_c );
    Vector3d pixel2camera( const Vector2d& p_p, double depth=1 ); 
    Vector3d pixel2world ( const Vector2d& p_p, const SE3& T_c_w, double depth=1 );
    Vector2d world2pixel ( const Vector3d& p_w, const SE3& T_c_w );

};

}
#endif // CAMERA_H

camera.cpp

#include "myslam/camera.h"

namespace myslam
{
   

Camera::Camera()
{
}

Vector3d Camera::world2camera ( const Vector3d& p_w, const SE3& T_c_w )
{
    return T_c_w*p_w;      //世界坐标系的三维向量转成相机坐标系的三维向量
}

Vector3d Camera::camera2world ( const Vector3d& p_c, const SE3& T_c_w )
{
    return T_c_w.inverse() *p_c; //相机坐标系的点转到世界坐标系,T_c_w.inverse()表示逆矩阵
}

Vector2d Camera::camera2pixel ( const Vector3d& p_c )//相机空间点转化成像素点
{
    return Vector2d (
        fx_ * p_c ( 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值