携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
通过分析已有在本地计算机环境下调用公开数据集的简单开源项目的运行方式等细节,补充对成果的概念。
一、《VSLAM十四讲》- 极简的双目SLAM系统
项目地址:GitHub - gaoxiang12/slambook2: edition 2 of the slambook
实现结果
\
项目特色
双目视觉里程计的优势在于双目实现更简单,只需要单帧就可以完成初始化,双目相机也存在3D观察,实现的效果也比单目好。
包含模块
该系统仅包括以下必需模块。
- 前端:提取图像特征值,与上一帧进行光流追踪,通过光流结果计算该帧的定位,并在必要时补充新特征点且三角化;
- 后端:处理优化前端产生的关键帧和路标点,返回优化结果;
- 相机类:管理相机内外参和投影函数;
- 配置文件类:配置输入目录,记录重要参数;
- 公开数据集解析类;
- 可视化模块:用于输出地图和特征点的可视化结果;
运行环境
- Ubuntu20.0.4
- C++11/14
- OpenCV3
- Pangolin
- ……
输入的数据结构
输入的图片被转换为帧。
struct Frame {
public:
EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
typedef std::shared_ptr<Frame> Ptr;
unsigned long id_ = 0; // id of this frame
unsigned long keyframe_id_ = 0; // id of key frame
bool is_keyframe_ = false; // 是否为关键帧
double time_stamp_; // 时间戳,暂不使用
SE3 pose_; // Tcw 形式Pose
std::mutex pose_mutex_; // Pose数据锁
cv::Mat left_img_, right_img_; // stereo images
// extracted features in left image
std::vector<std::shared_ptr<Feature>> features_left_;
// corresponding features in right image, set to nullptr if no corresponding
std::vector<std::shared_ptr<Feature>> features_right_;
public: // data members
Frame() {}
Frame(long id, double time_stamp, const SE3 &pose, const Mat &left,
const Mat &right);
// set and get pose, thread safe
SE3 Pose() {
std::unique_lock<std::mutex> lck(pose_mutex_);
return pose_;
}
void SetPose(const SE3 &pose) {
std::unique_lock<std::mutex> lck(pose_mutex_);
pose_ = pose;
}
/// 设置关键帧并分配并键帧id
void SetKeyFrame();
/// 工厂构建模式,分配id
static std::shared_ptr<Frame> CreateFrame();
};
结果分析
其输出的结果有三种,
- 命令行界面的实时运算结果结果;
- 激活的关键帧;
- 地图;
该程序在处理非关键帧时耗时约16ms,处理关键帧时由于新增了提取特征点和地图点,耗时会适当增多。目前该程序会存储所有关键帧和地图点。
\