第十章g2o_custombundle中的common文件夹中的BundleParams.h

这个文件就是定义BA优化中用到的所有参数变量。并利用CommandArgs类进行变量管理。比如赋默认值等。
这里再啰嗦一遍,CommandArgs类只是一个变量(这里就是BA用到的所有参数了)管理类,真正的变量(这里就是参数集了)定义是在这个头文件中,也就是所有参数都定义在BundleParams这个结构体中。
其中有一些参数因为还没看BA的代码,所以没搞清楚,只是大概写了写,但是在这里不是重点,重点是,这个结构体中定义BA所需要的所有参数,不管干啥用的,肯定是个参数而已。

贴代码:

#ifndef BUNDLEPARAMS_H
#define BUNDLEPARAMS_H

#include <string>
#include "flags/command_args.h"

using namespace std;
/**
 * 这个结构体定义了Bundle Adjustment使用所有参数。
 * 说一下整体的结构和逻辑:
 * 结构体名称非常直观,就是BA的参数,当然成员就是一堆参数了
 * 那在最后用CommandArgs arg;这么一句,相当于创建了一个参数描述类,
 * 结构成员定义完毕,开始构造函数。
 * 构造函数中首先调用arg这个类中的.param()函数,这个函数有两个功能:
 * 1、给上面定义的每一个参数后面挂一个结构体类型的描述,name、type等等描述
 * 2、给这这些参数赋了一些值,也就是默认值了。
 * 然后构造函数又调用了arg这个类中的.parseArgs()函数。这个函数功能就是检查一下命令行中有没有用户自定义的参数值,有的话读进来将默认值覆盖。
 */

struct BundleParams{
public:
    //构造函数,在后面定义,这里只声明。
    BundleParams(int argc, char** argv);
    //析构函数
    virtual ~BundleParams(){};

public:
    //这里的一堆参数才是实打实的BA程序中要用的参数变量!!
    //输入,那个文件被处理
    string input;
    //信赖域策略
    string trust_region_strategy;
    //线性求解器
    string linear_solver;
    //稀疏的线性代数求解器
    string sparse_linear_algebra_library;
    //稠密的线性代数求解器
    string dense_linear_algebra_library;

    //是否鲁棒??还没整明白
    bool robustify; // loss function
    // double eta;

    //迭代次数
    int num_iterations;

    // for making noise
    //噪声发生器
    //随机种子
    int random_seed;
    //旋转sigma
    double rotation_sigma;
    //变换sigma
    double translation_sigma;
    //空间点sigma
    double point_sigma;

    // for point cloud file...
    //原始点云
    string initial_ply;
    //优化后点云
    string final_ply;

    //此类在command_args.h中,用于解析用户输入的参数
    //创建一个命令行参数类实例,通过下面的构造函数,对这个实例的成员进行赋值。
    CommandArgs arg;

};

//构造函数定义,注意看,前面还是要加上类名称空间BundleParams::
//这里看见,直接处理的命令行,也就是main()中的第一句:BundleParams params(argc,argv),用命令行实例化一个BundleParams
BundleParams::BundleParams(int argc, char** argv)
{
    /**
     * 这一堆瞅着有点蛋疼和复杂。。。
     * 慢慢看用法结构:.para()是个函数,下面用法有多种,参数列表也有很多种,明显是一个重载。
     * 点开定义去看,.param()在CommandArgs类中。
     * 从用法上看出来:(参数名称,参数,参数值,参数描述)
     */

    //这个input就是要被BA的数据集。也就是要被处理的文件名。在这个程序里用的就是data文件夹下的problem-16-22106-pre.txt文件。
    //发现默认值是空字符串,所以这种就是肯定要通过命令行输入进来值的参数。
    arg.param("input", input, "", "file which will be processed");
    arg.param("trust_region_strategy", trust_region_strategy, "levenberg_marquardt",
              "Options are: levenberg_marquardt, dogleg.");
    arg.param("linear_solver", linear_solver, "dense_schur",                             // iterative schur and cgnr(pcg) leave behind...
              "Options are: sparse_schur, dense_schur");

    // arg.param("sparse_linear_algebra_library", sparse_linear_algebra_library, "suite_sparse", "Options are: suite_sparse and cx_sparse.");
    // arg.param("dense_linear_algebra_library", dense_linear_algebra_library, "eigen", "Options are: eigen and lapack.");


    // arg.param("ordering",ordering,"automatic","Options are: automatic, user.");
    arg.param("robustify", robustify, false, "Use a robust loss function");


    // arg.param("num_threads",num_threads,1, "Number of threads.");
    arg.param("num_iterations", num_iterations,20, "Number of iterations.");
    arg.param("rotation_sigma", rotation_sigma, 0.0, "Standard deviation of camera rotation "
            "perturbation.");
    arg.param("translation_sigma", translation_sigma,0.0, "translation perturbation.");
    arg.param("point_sigma",point_sigma,0.0,"Standard deviation of the point "
            "perturbation.");
    arg.param("random_seed", random_seed, 38401,"Random seed used to set the state ");
    arg.param("initial_ply", initial_ply,"initial.ply","Export the BAL file data as a PLY file.");
    arg.param("final_ply", final_ply, "final.ply", "Export the refined BAL file data as a PLY");


    //解析命令行中的参数,看看有没有新值过来,有的话就覆盖。
    arg.parseArgs(argc, argv);
}

#endif

2017年10月2日19:57 晟碟假期中的会议室 午饭还没吃。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值