vins-mono初始化代码分析

2023-05-16

大体流程

初始化主要分成2部分,第一部分是纯视觉SfM优化滑窗内的位姿,然后在融合IMU信息。
这部分代码在estimator::processImage()最后面。
在这里插入图片描述

主函数入口:

void Estimator::processImage(const map<int, vector<pair<int, Eigen::Matrix<double, 7, 1>>>> &image, const std_msgs::Header &header)

相机和imu旋转外参数的估计,分两步走:

  1. 获取最新两帧之间匹配的特征点对
vector<pair<Vector3d, Vector3d>> FeatureManager::getCorresponding(int frame_count_l, int frame_count_r)
  1. 计算相机-IMU之间的旋转
    利用旋转约束去估计
    q b k b k + 1 ⊗ q b c = q b c ⊗ q c k c k + 1 q_{b_kb_{k+1}} \otimes q_{bc} = q_{bc} \otimes q_{c_kc_{k+1}} qbkbk+1qbc=qbcqckck+1
    在这里插入图片描述
bool CalibrationExRotation(vector<pair<Vector3d, Vector3d>> corres, Quaterniond delta_q_imu, Matrix3d &calib_ric_result)
{
 //! Step1: 滑窗內幀數加1
    frame_count++;
    //! Step2: 计算两帧之间的旋转矩阵
    // 利用帧可视化的3D点求解相邻两帧之间的旋转矩阵R_{ck, ck+1}
    Rc.push_back(solveRelativeR(corres)); //两帧图像之间的旋转通过solveRelativeR计算出本质矩阵E,再对矩阵进行分解得到图像帧之间的旋转R。
    //delta_q_imu为IMU预积分得到的旋转四元数,转换成矩阵形式存入Rimu当中。则Rimu中存放的是imu预积分得到的旋转矩阵
    Rimu.push_back(delta_q_imu.toRotationMatrix());
    //每帧IMU相对于起始帧IMU的R,ric初始化值为单位矩阵,则Rc_g中存入的第一个旋转向量为IMU的旋转矩阵
    Rc_g.push_back(ric.inverse() * delta_q_imu * ric);

    Eigen::MatrixXd A(frame_count * 4, 4);
    A.setZero();
    int sum_ok = 0;
    //遍历滑动窗口中的每一帧
    for (int i = 1; i <= frame_count; i++)
    {
        Quaterniond r1(Rc[i]);
        Quaterniond r2(Rc_g[i]);
        
        //!Step3:求取估计出的相机与IMU之间旋转的残差 公式(9)
        double angular_distance = 180 / M_PI * r1.angularDistance(r2);
        ROS_DEBUG(
            "%d %f", i, angular_distance);
        
        //! Step4:计算外点剔除的权重 Huber函数 公式(8) 
        double huber = angular_distance > 5.0 ? 5.0 / angular_distance : 1.0;
        ++sum_ok;
        Matrix4d L, R;
        
        //! Step5:求取系数矩阵        
        //! 得到相机对极关系得到的旋转q的左乘
        //四元数由q和w构成,q是一个三维向量,w为一个数值
        double w = Quaterniond(Rc[i]).w();
        Vector3d q = Quaterniond(Rc[i]).vec();
        //L为相机旋转四元数的左乘矩阵,Utility::skewSymmetric(q)计算的是q的反对称矩阵
        L.block<3, 3>(0, 0) = w * Matrix3d::Identity() + Utility::skewSymmetric(q);
        L.block<3, 1>(0, 3) = q;
        L.block<1, 3>(3, 0) = -q.transpose();
        L(3, 3) = w;
        
        //! 得到由IMU预积分得到的旋转q的右乘
        Quaterniond R_ij(Rimu[i]);
        w = R_ij.w();
        q = R_ij.vec();
        R.block<3, 3>(0, 0) = w * Matrix3d::Identity() - Utility::skewSymmetric(q);
        R.block<3, 1>(0, 3) = q;
        R.block<1, 3>(3, 0) = -q.transpose();
        R(3, 3) = w;

        A.block<4, 4>((i - 1) * 4, 0) = huber * (L - R);
    }
    
    //!Step6:通过SVD分解,求取相机与IMU的相对旋转    
    //!解为系数矩阵A的右奇异向量V中最小奇异值对应的特征向量
    JacobiSVD<MatrixXd> svd(A, ComputeFullU | ComputeFullV);
    Matrix<double, 4, 1> x = svd.matrixV().col(3);
    Quaterniond estimated_R(x);
    ric = estimated_R.toRotationMatrix().inverse();
    //cout << svd.singularValues().transpose() << endl;
    //cout << ric << endl;

    //!Step7:判断对于相机与IMU的相对旋转是否满足终止条件    
    //!1.用来求解相对旋转的IMU-Camera的测量对数是否大于滑窗大小。    
    //!2.A矩阵第二小的奇异值是否大于某个阈值,使A得零空间的秩为1
    Vector3d ric_cov;
    ric_cov = svd.singularValues().tail<3>();
    if (frame_count >= WINDOW_SIZE && ric_cov(1) > 0.25)
    {
        calib_ric_result = ric;
        return true;
    }
    else
        return false;
}

计算出 q b c q_{bc} qbc后,对 b g bg bg, [ v 0 , v 1 , . . . , v n , g , s {v_0, v_1, ...,v_n, g, s} v0,v1,...,vn,g,s]进行初始化

bool Estimator::initialStructure()

在这里插入图片描述
IMU陀螺仪bias初始化:
在这里插入图片描述

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]);
    }
}

[ v 0 , v 1 , . . . , v n , g c 0 , s {v_0, v_1, ...,v_n, g^{c0}, s} v0,v1,...,vn,gc0,s]初始化:
α b k + 1 b k = R w b k ( P b k + 1 w − P b k w − v b k w Δ t + 1 2 g w Δ t 2 ) \alpha_{b_{k+1}}^{b_k} = R_{w}^{b_k}(P_{b_{k+1}}^w - P_{b_{k}}^w - v_{b_k}^w \Delta t + \frac{1}{2}g^w \Delta t^2 ) \\ αbk+1bk=Rwbk(Pbk+1wPbkwvbkwΔt+21gwΔt2)
β b k + 1 b k = R w b k ( v b k + 1 w − v b k w + g w Δ t ) \beta_{b_{k+1}}^{b_k} = R_{w}^{b_k}(v_{b_{k+1}}^w - v_{b_k}^w + g^w \Delta t) βbk+1bk=Rwbk(vbk+1wvbkw+gwΔt)
通过平移约束 s p b k c 0 = s p c k c 0 − R b c 0 p c b sp_{b_k}^{c_0} = sp_{c_k}^{c_0} - R_b^{c_0}p_c^b spbkc0=spckc0Rbc0pcb带入上式可得:
α b k + 1 b k = R c 0 b k ( s ( P b k + 1 c 0 − P b k c 0 ) − R b k c 0 v b k b k Δ t + 1 2 g c 0 Δ t 2 ) \alpha_{b_{k+1}}^{b_k} = R_{c_0}^{b_k}(s(P_{b_{k+1}}^{c_0} - P_{b_{k}}^{c_0}) - R_{b_k}^{c_0}v_{b_k}^{b_k} \Delta t + \frac{1}{2}g^{c_0} \Delta t^2 ) \\ αbk+1bk=Rc0bk(s(Pbk+1c0Pbkc0)Rbkc0vbkbkΔt+21gc0Δt2)

β b k + 1 b k = R c 0 b k ( R b k + 1 c 0 v b k + 1 b k + 1 − R b k c 0 v b k b k + g c 0 Δ t ) \beta_{b_{k+1}}^{b_k} = R_{c_0}^{b_k}(R_{b_{k+1}}^{c_0}v_{b_{k+1}}^{b_{k+1}} - R_{b_k}^{c_0}v_{b_k}^{b_k} + g^{c_0} \Delta t) βbk+1bk=Rc0bk(Rbk+1c0vbk+1bk+1Rbkc0vbkbk+gc0Δt)
在这里插入图片描述
在这里插入图片描述
同样将 δ β b k + 1 b k 转 为 矩 阵 形 式 \delta \beta_{b_{k+1}}^{b_k}转为矩阵形式 δβbk+1bk
在这里插入图片描述
即: H 6 × 10 X I 10 × 1 = b 6 × 1 H^{6 \times 10}X_{I}^{10 \times 1} = b^{6 \times 1} H6×10XI10×1=b6×1
这样,可以通过Cholosky分解下面方程求解 X I X_{I} XI:
H T H X I 10 × 1 = H T b H^{T}HX_{I}^{10 \times 1} = H^{T}b HTHXI10×1=HTb

bool LinearAlignment(map<double, ImageFrame> &all_image_frame, Vector3d &g, VectorXd &x)
{
   int all_frame_count = all_image_frame.size();
   // 速度维度:all_frame_count * 3; 重力维度:3; scale维度:1;
   int n_state = all_frame_count * 3 + 3 + 1;

   // 构建 Ax = b 方程求解
   MatrixXd A{n_state, n_state};
   A.setZero();
   VectorXd b{n_state};
   b.setZero();

   map<double, ImageFrame>::iterator frame_i;
   map<double, ImageFrame>::iterator frame_j;
   int i = 0;
   for (frame_i = all_image_frame.begin(); next(frame_i) != all_image_frame.end(); frame_i++, i++)
   {
       frame_j = next(frame_i);

       MatrixXd tmp_A(6, 10);
       tmp_A.setZero();
       VectorXd tmp_b(6);
       tmp_b.setZero();

       double dt = frame_j->second.pre_integration->sum_dt;

       tmp_A.block<3, 3>(0, 0) = -dt * Matrix3d::Identity();
       tmp_A.block<3, 3>(0, 6) = frame_i->second.R.transpose() * dt * dt / 2 * Matrix3d::Identity();
       tmp_A.block<3, 1>(0, 9) = frame_i->second.R.transpose() * (frame_j->second.T - frame_i->second.T) / 100.0;     
       tmp_b.block<3, 1>(0, 0) = frame_j->second.pre_integration->delta_p + frame_i->second.R.transpose() * frame_j->second.R * TIC[0] - TIC[0];
       //cout << "delta_p   " << frame_j->second.pre_integration->delta_p.transpose() << endl;
       tmp_A.block<3, 3>(3, 0) = -Matrix3d::Identity();
       tmp_A.block<3, 3>(3, 3) = frame_i->second.R.transpose() * frame_j->second.R;
       tmp_A.block<3, 3>(3, 6) = frame_i->second.R.transpose() * dt * Matrix3d::Identity();
       tmp_b.block<3, 1>(3, 0) = frame_j->second.pre_integration->delta_v;
       //cout << "delta_v   " << frame_j->second.pre_integration->delta_v.transpose() << endl;

       Matrix<double, 6, 6> cov_inv = Matrix<double, 6, 6>::Zero();
       //cov.block<6, 6>(0, 0) = IMU_cov[i + 1];
       //MatrixXd cov_inv = cov.inverse();
       cov_inv.setIdentity();

       MatrixXd r_A = tmp_A.transpose() * cov_inv * tmp_A;
       VectorXd r_b = tmp_A.transpose() * cov_inv * tmp_b;

       A.block<6, 6>(i * 3, i * 3) += r_A.topLeftCorner<6, 6>();
       b.segment<6>(i * 3) += r_b.head<6>();

       A.bottomRightCorner<4, 4>() += r_A.bottomRightCorner<4, 4>();
       b.tail<4>() += r_b.tail<4>();

       A.block<6, 4>(i * 3, n_state - 4) += r_A.topRightCorner<6, 4>();
       A.block<4, 6>(n_state - 4, i * 3) += r_A.bottomLeftCorner<4, 6>();
   }
   A = A * 1000.0;
   b = b * 1000.0;
   x = A.ldlt().solve(b);
   double s = x(n_state - 1) / 100.0;
   ROS_DEBUG("estimated scale: %f", s);
   g = x.segment<3>(n_state - 4);
   ROS_DEBUG_STREAM(" result g     " << g.norm() << " " << g.transpose());
   if(fabs(g.norm() - G.norm()) > 1.0 || s < 0)
   {
       return false;
   }

   RefineGravity(all_image_frame, g, x);
   s = (x.tail<1>())(0) / 100.0;
   (x.tail<1>())(0) = s;
   ROS_DEBUG_STREAM(" refine     " << g.norm() << " " << g.transpose());
   if(s < 0.0 )
       return false;   
   else
       return true;
}

修正重力矢量

对应代码RefineGravity()函数
因为重力矢量的模固定,因此重力优化只有两个变量,可写成:
g ^ 3 × 1 = ∣ ∣ g ∣ ∣ g ^ ˉ 3 × 1 + w 1 b 1 3 × 1 + w 2 b 2 3 × 1 = ∣ ∣ g ∣ ∣ g ^ ˉ 3 × 1 + b 3 × 2 w 2 × 1 \hat g^{3 \times 1} = || g|| \bar{\hat g}^{3\times 1} + w_1 b_1^{3\times1} + w_2 b_2^{3\times1} = ||g||\bar{\hat g}^{3\times 1} + b^{3\times2}w^{2\times1} g^3×1=gg^ˉ3×1+w1b13×1+w2b23×1=gg^ˉ3×1+b3×2w2×1
在这里插入图片描述

整理可得:
[ − I Δ t k 0 1 2 R c 0 b k Δ t k 2 b R c 0 b k ( p ˉ c k + 1 c 0 − p ˉ c k c 0 ) − I R c 0 b k R b k + 1 c 0 R c 0 b k Δ t k b 0 ] [ v b k b k v b k + 1 b k + 1 ω s ] = [ α b k + 1 b k − p c b + R c 0 b k R b k + 1 c 0 p c b − 1 2 R c 0 b k Δ t k 2 ∣ ∣ g ∣ ∣ g ^ ˉ β b k + 1 b k − R c 0 b k − R c 0 b k Δ t k ∣ ∣ g ∣ ∣ g ^ ˉ ] \begin{bmatrix} -I\Delta t_k& 0 & \frac{1}{2}R_{c_0}^{b_k} \Delta t_k^2b& R_{c_0}^{b_k}(\bar p_{c_{k+1}}^{c_0} - \bar p_{c_{k}}^{c_0}) \\ -I& R_{c_0}^{b_k}R_{b_{k+1}}^{c_0}& R_{c_0}^{b_k} \Delta t_kb& 0 \end{bmatrix} \begin{bmatrix} v_{b_k}^{b_k}\\v_{b_{k+1}}^{b_{k+1}} \\\omega\\s\end{bmatrix} = \begin{bmatrix} \alpha_{b_{k+1}}^{b_{k}} - p_c^b + R_{c_0}^{b_k}R_{b_{k+1}}^{c_0}p_c^b - \frac{1}{2}R_{c_0}^{b_k} \Delta t_k^2||g|| \bar{\hat g} \\ \beta_{b_{k+1}}^{b_k} - R_{c_0}^{b_k} - R_{c_0}^{b_k} \Delta t_k ||g|| \bar{\hat g}\end{bmatrix} [IΔtkI0Rc0bkRbk+1c021Rc0bkΔtk2bRc0bkΔtkbRc0bk(pˉck+1c0pˉckc0)0]vbkbkvbk+1bk+1ωs=[αbk+1bkpcb+Rc0bkRbk+1c0pcb21Rc0bkΔtk2gg^ˉβbk+1bkRc0bkRc0bkΔtkgg^ˉ]
即: H 6 × 9 X I 9 × 1 = b 6 × 1 , w 2 × 1 = [ w 1 , w 2 ] T H^{6\times9}X_{I}^{9\times1} = b^{6\times1}, w^{2\times1} = {\begin{bmatrix} {w_1, w_2}\end{bmatrix}}^T H6×9XI9×1=b6×1,w2×1=[w1,w2]T
这样,可以用Cholosky分解下面方程求解 X I X_I XI:
H T H X I = H T b H^THX_{I} = H^Tb HTHXI=HTb
这样我们就得到了在 C 0 C_0 C0系下的重力向量 g c 0 g^{c_0} gc0,通过将 g c 0 g^{c_0} gc0旋转到惯性坐标系中的Z轴方向,可以计算相机到惯性系的旋转矩阵 q c 0 w q_{c_0}^w qc0w,这样就可以将所有变量调整到惯性世界系中。

参考资料

《VINS论文推导及代码解析》崔华坤

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vins-mono初始化代码分析 的相关文章

  • ubuntu 22.04安装nvm

    执行安装脚本 span class token function sudo span span class token function apt span span class token function install span spa
  • 手推DNN,CNN池化层,卷积层反向传播

    反向传播算法是神经网络中用来学习的算法 xff0c 从网络的输出一直往输出方向计算梯度来更新网络参数 xff0c 达到学习的目的 xff0c 而因为其传播方向与网络的推理方向相反 xff0c 因此成为反向传播 神经网络有很多种 xff0c
  • 软件架构概念和面向服务的架构

    摘要 软件架构作为软件开发过程的一个重要组成部分 xff0c 有着各种各样的方法和路线图 xff0c 它们都有一些共同的原则 基于架构的方法作为控制系统构建和演化复杂性的一种手段得到了推广 引言 在计算机历史中 xff0c 软件变得越来越复
  • 初识强化学习,什么是强化学习?

    相信很多人都听过 机器学习 和 深度学习 但是听过 强化学习 的人可能没有那么多 那么 什么是强化学习呢 强化学习是机器学习的一个子领域 它可以随着时间的推移自动学习到最优的策略 在我们不断变化的纷繁复杂的世界里 从更广的角度来看 即使是单
  • 强化学习形式与关系

    在强化学习中有这么几个术语 智能体 Agent 环境 Environment 动作 Action 奖励 Reward 状态 State 有些地方称作观察 Observation 奖励 Reward 在强化学习中 奖励是一个标量 它是从环境中
  • 多层网络和反向传播笔记

    在我之前的博客中讲到了感知器 xff08 感知器 xff09 xff0c 它是用于线性可分模式分类的最简单的神经网络模型 xff0c 单个感知器只能表示线性的决策面 xff0c 而反向传播算法所学习的多层网络能够表示种类繁多的非线性曲面 对
  • 在Kaggle手写数字数据集上使用Spark MLlib的朴素贝叶斯模型进行手写数字识别

    昨天我在Kaggle上下载了一份用于手写数字识别的数据集 xff0c 想通过最近学习到的一些方法来训练一个模型进行手写数字识别 这些数据集是从28 28像素大小的手写数字灰度图像中得来 xff0c 其中训练数据第一个元素是具体的手写数字 x
  • Ros使用自定义数据通讯无法收到消息的分析和解决

    nbsp 在实际的开发中 和别的模块定义了自定义的 数据类型 比如 userMsg msg文件 Header header int32 nState string strImageName string strYamlName 报错和原因
  • 在Kaggle手写数字数据集上使用Spark MLlib的RandomForest进行手写数字识别

    昨天我使用Spark MLlib的朴素贝叶斯进行手写数字识别 xff0c 准确率在0 83左右 xff0c 今天使用了RandomForest来训练模型 xff0c 并进行了参数调优 首先来说说RandomForest 训练分类器时使用到的
  • 遇见AI,从Java到数据挖掘。

    在上小学的时候就听说过AI xff0c 人工智能 xff0c 那个时候我对人工智能的感受都来自于各类影视作品 xff0c 类人的外表 xff0c 能听说读写 xff0c 有情感 xff0c 会思考 所以那个时候的我将人工智能想象成和人类相似
  • PyTorch模型保存与加载

    torch save xff1a 保存序列化的对象到磁盘 xff0c 使用了Python的pickle进行序列化 xff0c 模型 张量 所有对象的字典 torch load xff1a 使用了pickle的unpacking将pickle
  • ROS和ROS2.0到底该用哪个呢?

    很多朋友经常问ROS1 0 下文简称ROS 和ROS2 0我到底该学习 使用哪个呢 欢迎拍砖讨论 但若是因此对您的项目或产品造成了损失 本人不负任何责任 我先给出个人的观点 再说明其中原因 对于大众学习者 普通开发者 机器人算法开发者 在2
  • C++ Primer第五版_第一章习题答案

    文章目录 题目概览1 1 编译器文档1 2 错误标识1 3 Hello World1 4 两数相乘1 5 独立语句1 6 程序合法性1 7 不正确的嵌套注释1 8 语句合法性1 9 50到100的整数相加1 10 递减顺序打印10到0之间的
  • C++ Primer第五版_第十五章习题答案(11~20)

    文章目录 练习15 11练习15 12练习15 13练习15 14练习15 15Disc quote hBulk quote h 练习15 16练习15 17练习15 18练习15 19练习15 20 练习15 11 为你的 Quote 类
  • ROS机器人操作系统(roscpp)

    1 Client Library与roscpp 1 1 Client Library简介 ROS为机器人开发者们提供了不同语言的编程接口 比如C 接口叫做roscpp Python接口叫做rospy Java接口叫做rosjava 尽管语言
  • OpenCVSharp之ArucoSample例程

    ArUco xff1a 是一个根据预设黑白Markers来估计相机位姿的开源库 该库由C 43 43 编写 xff0c 运行速度很快 已被应用在了机器人导航 增强现实和目标姿态估计中 DetectorParameters xff1a 检测标
  • PUTTY连接虚拟机linux,出现connection refused的解决方法!

    先确认是否已经给UBUNTU安装了SSHD 在终端输入SSHD 若未安装 xff0c 按提示安装 sudo apt get install openssh server 若出现以下问题 xff1a E Could not get lock
  • docker-compose部署emqx集群 配置带mysql授权认证

    EMQX 是一款大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器 作为全球最具扩展性的 MQTT 消息服务器 xff0c EMQX 提供了高效可靠海量物联网设备连接 xff0c 能够高性能实时移动与处理消息和事件流数据 xff0c
  • ES6(ECMAScript6)新特性

    点击打开链接 箭头操作符 ES6中新增的箭头操作符 61 gt 简化了函数的书写 xff0c 操作符左边为输入的参数 xff0c 右边是进行的操作以及返回的值 引入箭头操作符后可以方便地写回调了 xff1a var array 61 1 2
  • K8s --HPA容器水平伸缩

    目录 一 什么是HPA 1 HPA伸缩过程 2 HPA进行伸缩算法 二 HPA实例 创建HPA 1 压力测试 2 同时监控cpu和memory 一 什么是HPA HPA的全称为 xff08 Horizontal Pod Autoscalin

随机推荐

  • linux磁盘读写命令,ubuntu命令行查看硬盘使用情况

    linux磁盘读写命令 ubuntu命令行查看硬盘使用情况 除了CPU和内存 xff0c 硬盘读写 I O 能力也是影响Linux系统性能的重要因素之一 本节介绍了可用于检查硬盘读写性能的几个系统命令 xff0c 并介绍了如何根据这些命令的
  • byr论坛技术楼

    链接 xff1a http bbs byr cn article MobileTerminalAT 17730 p 61 1
  • Zabbix5系列-监控华为、H3C交换机(snmpv2c/snmpv3/snmptrap) (二)

    Zabbix5系列 监控华为 H3C交换机 一 参考二 配置交换机2 1 华为SNMP v2c版本2 2 华为SNMP v3版本2 3 H3C SNMP v2c版本2 4 H3C SNMP v3版本 三 添加主机3 1 snmp v2c创建
  • docker 之普通用户运行

    ubuntu 不加sudo 执行 docker 时报错 Got permission denied while trying to connect to the Docker daemon socket at unix var run do
  • matlab simulink 自定义bus使用

    使用matlab simulink 可以方便的查看数据 xff0c simulink支持自定义bus xff0c 在bus中可以自定义数据结构 其中需要注意的是 xff0c 自定义的数据结构是有顺序的 xff0c 当signal需要和bus
  • stl container adapter

    容器适配器 xff1a stack queue priority queue stack Definition namespace std template lt typename T typename Container 61 deque
  • C 字符串获取元素地址

    打印出c字符串元素的地址 xff0c 需要将取地址符号 amp 进行静态类型转换为 void xff0c 或者使用static cast lt void gt 进行转换 const char p 61 34 abcdefg 34 char
  • MarkDown 内部跳转链接

    最近在用markdown写文档 xff0c 文档中需要有内部跳转链接 在此记录下可行的办法 这边我用表格中的文字跳转到另一个表格为例子 xff1a 表格1 商品 价格 备注 iphone13 6000 xff5e 10000 可参考采购平台
  • 深度学习 - TensorFlow Lite模型,云侧训练与安卓端侧推理

    TensorFlow Lite模型 xff0c 云侧训练与安卓端侧推理 引言一 云侧深度模型的训练代码1 加载数据集的格式分析1 1 从数据集加载的数据格式1 2 对加载的数据进行处理 2 深度模型搭建3 模型训练 评估 保存 转换4 模型
  • 无人驾驶-激光雷达与相机联合校准(Lidar Camera Calibration)

    1 激光雷达与摄像头性能对比 在无人驾驶环境感知设备中 xff0c 激光雷达和摄像头分别有各自的优缺点 摄像头的优点是成本低廉 xff0c 用摄像头做算法开发的人员也比较多 xff0c 技术相对比较成熟 摄像头的劣势 xff0c 第一 xf
  • vim c++开发

    vim 编写c 43 43 代码的快捷键 代码折叠 zf 创建折行 xff0c f 表示 foldzo 打开折行 xff0c o 表示 openzc 关闭折行 xff0c c 表示 closezd 删除折行 xff0c d 表示 delet
  • ros2 colcon

    ros2 项目构建之colcon 常用指令 colcon build symlink install cmake args DCMAKE BUILD TYPE 61 Release packages up to lt name of pkg
  • vscode docker clangd

    配置中报错 xff0c 找不到omp h头文件 sudo ln s usr lib gcc x86 64 linux gnu 9 include omp h usr include omp h
  • ros CMakeLists.txt template

    这里记录一个使用ros的CMakeLists txt的模板 xff0c 方便以后套用 示例 cmake minimum required VERSION 3 0 2 project rs parse set CMAKE CXX FLAGS
  • python 读取csv文件绘图

    python 读取csv文件数据 xff0c 然后通过plot绘图 bin bash python import csv import numpy as np from matplotlib import pyplot as plt col
  • ros utest

    在ros框架下编写代码 xff0c 在CMakeLists txt配置好之后 xff0c 在编译的时候执行下面指令即可生成测试代码的可执行文件 catkin make run tests 代码发布前 xff0c 测试用例一定要做好 xff0
  • boost 创建文件夹

    这里记录下如何使用boost创建文件夹的方法 主要步骤 包含filesystem头文件 include lt boost filesystem hpp gt 检测传入的文件目录 log path 是否存在 xff0c 目录不存在的话会新建一
  • GVINS论文阅读笔记

    Code Pseudorange Measurement c o d e p s e
  • matlab 读取csv文件绘图

    话不多说 xff0c 直接上代码 读取csv文件然后绘图 clc data 61 csvread 39 home lyb tools matlab files test csv 39 x 61 data 1 y 61 data 2 t 61
  • vins-mono初始化代码分析

    大体流程 初始化主要分成2部分 xff0c 第一部分是纯视觉SfM优化滑窗内的位姿 xff0c 然后在融合IMU信息 这部分代码在estimator processImage 最后面 主函数入口 xff1a void Estimator p