一、框架
看一下文件夹组织:
1、bin用来存放可执行的二进制文件。0.1版本主要是搭建SLAM库框架
2、include/myslam存放SLAM模块的头文件,主要是.h文件,声明即可。
3、src存放源代码文件,主要是.cpp文件。
4、test文件是测试SLAM库的文件,也是.cpp文件。
5、lib存放编译好的库文件 .a .so
6、config存放配置文件,也就是需要经常修改的运行参数。这里存放在default.yaml中
7、cmake_modules第三方库的cmake文件,在使用g2o之类的库时会用到。
二、数据结构类
Frame:关键帧,相机位姿估计可以用关键帧描述。
MapPoint:特征点。通常,会把特征点放在地图中,并将新来的帧与地图中特征点进行匹配,完成位姿估计。
Map:管理特征点,添加/删除特征点。
Camera:相机参数,内参、外参以及世界、相机、像素坐标系转换。
Config:参数文件的读取。
1、Camera类:
存储相机的内参K和外参T,有三坐标系(世界坐标系、相机坐标系、像素坐标系)下点的坐标转换函数。
头文件.h
#ifndef CAMERA_H
#define CAMERA_H
#include "myslam/common_include.h"//一些常用的include
namespace myslam
{
//相机类
class Camera
{
public:
//1. 声明变量,相机智能指针、内参、尺度
typedef std::shared_ptr<Camera> Ptr;
float fx_, fy_, cx_, cy_, depth_scale_;
//2. 构造函数
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 )
{}
//3. 世界、相机、像素坐标系转换
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
.cpp执行文件
#include "myslam/camera.h"
namespace myslam
{
//定义构造函数Camera类下
Camera::Camera(){}
//1. 相机和世界转换
Vector3d Camera::world2camera ( const Vector3d& p_w, const SE3& T_c_w )
{
r