鱼C论坛

 找回密码
 立即注册
查看: 922|回复: 1

[已解决]关于嵌套的map的问题

[复制链接]
发表于 2021-10-29 13:42:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如下面的程序,
frame_i我理解的是一个迭代,所以frame->不是应该是指向的ImageFrame实例化的all_image_frame吗?
然后points是其中的一个map映射,问两个问题
(1)怎么通过frame_i访问其中的points,t,R,T?
(2)frame_i->second.R为什么就直接可以指到类中的R呢?


void solveGyroscopeBias(map<double, ImageFrame> &all_image_frame, Vector3d* Bgs)
{
    Matrix3d A;
    Vector3d b;
    Vector3d delta_bg;
    A.setZero();
    b.setZero();
    map<double, ImageFrame>::iterator frame_i;
    map<double, ImageFrame>::iterator frame_j;
    for (frame_i = all_image_frame.begin(); next(frame_i) != all_image_frame.end(); frame_i++)
    {
        frame_j = next(frame_i);
        MatrixXd tmp_A(3, 3);
        tmp_A.setZero();
        VectorXd tmp_b(3);
        tmp_b.setZero();
        Eigen::Quaterniond q_ij(frame_i->second.R.transpose() * frame_j->second.R);
        tmp_A = frame_j->second.pre_integration->jacobian.template block<3, 3>(O_R, O_BG);
        tmp_b = 2 * (frame_j->second.pre_integration->delta_q.inverse() * q_ij).vec();
        A += tmp_A.transpose() * tmp_A;
        b += tmp_A.transpose() * tmp_b;

    }
    delta_bg = A.ldlt().solve(b);
    // ROS_WARN_STREAM("gyroscope bias initial calibration " << delta_bg.transpose());

    for (int i = 0; i <= WINDOW_SIZE; i++)
        Bgs[i] += delta_bg;

    for (frame_i = all_image_frame.begin(); next(frame_i) != all_image_frame.end( ); frame_i++)
    {
        frame_j = next(frame_i);
        frame_j->second.pre_integration->repropagate(Vector3d::Zero(), Bgs[0]);
    }
}
//
class ImageFrame
{
public:
    ImageFrame(){};
    ImageFrame(const map<int, vector<pair<int, Eigen::Matrix<double, 7, 1>>>> &_points, double _t) : t{_t}, is_key_frame{false}
    {
        points = _points;
    };
    map<int, vector<pair<int, Eigen::Matrix<double, 7, 1>>>> points;
    double t;
    Matrix3d R;
    Vector3d T;
    IntegrationBase *pre_integration;
    bool is_key_frame;
};
最佳答案
2021-10-29 16:58:14
首先  c++里的map很坑   它的键值 分别叫做 first second  first 是键   second 是值
frame_i 是一个 迭代器(iterator)  迭代器一般都会重载 '->' 符号  让它可以直接访问键值

frame_i->second.R  这里就按上面的理解   frame_i 是 all_image_frame 的迭代器
所以 frame_i->second 就是访问 all_image_frame 中当前迭代器所在位置的值 也就是 ImageFrame 对象
然后 ImageFrame 类所有属性和方法都是公开的  所以通过 '.'(点) 符号就可以直接访问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-29 16:58:14 | 显示全部楼层    本楼为最佳答案   
首先  c++里的map很坑   它的键值 分别叫做 first second  first 是键   second 是值
frame_i 是一个 迭代器(iterator)  迭代器一般都会重载 '->' 符号  让它可以直接访问键值

frame_i->second.R  这里就按上面的理解   frame_i 是 all_image_frame 的迭代器
所以 frame_i->second 就是访问 all_image_frame 中当前迭代器所在位置的值 也就是 ImageFrame 对象
然后 ImageFrame 类所有属性和方法都是公开的  所以通过 '.'(点) 符号就可以直接访问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 19:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表