vins博客的一部分9

2023-05-16

目录

    • IMUFactor(imu约束)
    • ProjectionTwoFrameOneCamFactor(视觉约束)
    • marginalize(边缘化约束)

IMUFactor(imu约束)

AddResidualBlock(imu_factor, NULL, para_Pose[i], para_SpeedBias[i], para_Pose[j], para_SpeedBias[j])中的传入参数提取出来,放到Pi Qi Vi Bai BgiPj Qj Vj Baj Bgj中。然后:

1、构建IMU残差residual:

residual = pre_integration->evaluate(Pi, Qi, Vi, Bai, Bgi,
                                     Pj, Qj, Vj, Baj, Bgj);//计算pvq ba bg的误差
  • 1 预积分结果更新:

由于预积分和ba bg有关,同时他们是优化量,每次计算后还需用bias的更新值来更新一下预积分的值:

重新积分太麻烦,假设预积分的变化量与 bias 是线性关系,直接这样更新:

Eigen::Vector3d corrected_delta_v = delta_v + dv_dba * dba + dv_dbg * dbg;//预积分
Eigen::Vector3d corrected_delta_p = delta_p + dp_dba * dba + dp_dbg * dbg;//预积分

在这里插入图片描述

其中,雅可比dv_dba等是从预积分时计算的雅可比得来的(增量误差迭代公式 推导的大 J J J的分块,其中 J J J由迭代获得,详见):
在这里插入图片描述

Eigen::Matrix3d dp_dbg = jacobian.block<3, 3>(O_P, O_BG);//(0, 12)
Eigen::Matrix3d dp_dba = jacobian.block<3, 3>(O_P, O_BA);//(0, 9)

Eigen::Matrix3d dq_dbg = jacobian.block<3, 3>(O_R, O_BG);//(3, 12)

Eigen::Matrix3d dv_dba = jacobian.block<3, 3>(O_V, O_BA);//(6, 9)
Eigen::Matrix3d dv_dbg = jacobian.block<3, 3>(O_V, O_BG);//(6, 12)
  • 2 IMU误差的公式:
residuals.block<3, 1>(O_P, 0) = Qi.inverse() * (0.5 * G * sum_dt * sum_dt + Pj - Pi - Vi * sum_dt) - corrected_delta_p;
residuals.block<3, 1>(O_Q, 0) = 2 * (corrected_delta_q.inverse() * (Qi.inverse() * Qj)).vec();
residuals.block<3, 1>(O_V, 0) = Qi.inverse() * (G * sum_dt + Vj - Vi) -  corrected_delta_v;
residuals.block<3, 1>(O_BA, 0) = Baj - Bai;
residuals.block<3, 1>(O_BG, 0) = Bgj - Bgi;
return residuals;

分别是PQV Ba Bg:
在这里插入图片描述

2、残差的马氏距离:

IntegrationBase::evaluate()返回residual后,

其优化的最小二乘是马氏距离,使马氏距离最小。下图中,均值在红圈,红叉和绿叉到红圈的欧氏距离一样,但显然绿叉的偏离小,这就用到了协方差S和马氏距离d,(对尺度进行标准化,然后旋转轴去相关)。作用是:各个PVQ…误差不是独立的,存在相关性,不可等视,按照重要程度和相关性,来合理地得到最优位姿估计(不是简单的各个误差平方和最小时最优)
在这里插入图片描述

马氏距离 d = r T P − 1 r d=r^TP^{-1}r d=rTP1r,P为协方差,但ceres需要输入最小二乘形式 m i n ( e T e ) min(e^Te) min(eTe),所以用LLT 分解把P-1分解成 L T L L^TL LTL就可以和r组合了.

Eigen::Matrix<double, 15, 15> sqrt_info = Eigen::LLT...
residual = sqrt_info * residual;//最小二乘残差(比如残差为loss,最小二乘为|loss|^2,而ceres中只需要写上loss就行了)

3、残差的雅可比:

和残差计算中预积分更新类似,先从预积分时计算的大雅可比得到pqv对ba、bg的雅可比dv_dba等。

然后计算残差对各优化变量的雅可比:
在这里插入图片描述
例如:
在这里插入图片描述

对应代码中的

if (jacobians[0])
{
    Eigen::Map<Eigen::Matrix<double, 15, 7, Eigen::RowMajor>> jacobian_pose_i(jacobians[0]);//新建J[0]=15*7
    jacobian_pose_i.setZero();
    jacobian_pose_i.block<3, 3>(O_P, O_P) = -Qi.inverse().toRotationMatrix();
    jacobian_pose_i.block<3, 3>(O_P, O_R) = Utility::skewSymmetric(Qi.inverse() * (0.5 * G * sum_dt * sum_dt + Pj - Pi - Vi * sum_dt));
    Eigen::Quaterniond corrected_delta_q = pre_integration->delta_q * Utility::deltaQ(dq_dbg * (Bgi - pre_integration->linearized_bg));//bg修正delta_q
    jacobian_pose_i.block<3, 3>(O_R, O_R) = -(Utility::Qleft(Qj.inverse() * Qi) * Utility::Qright(corrected_delta_q)).bottomRightCorner<3, 3>();
    jacobian_pose_i.block<3, 3>(O_V, O_R) = Utility::skewSymmetric(Qi.inverse() * (G * sum_dt + Vj - Vi));
    //雅可比乘信息矩阵
    jacobian_pose_i = sqrt_info * jacobian_pose_i;
}

然后 J [ 1 ] J [ 2 ] J [ 3 ] J[1] J[2] J[3] J[1]J[2]J[3]同理

ProjectionTwoFrameOneCamFactor(视觉约束)

按传入的值初始化

Eigen::Vector3d pts_i, pts_j;//初始化为传入的_pts_i、_pts_j
Eigen::Vector3d velocity_i, velocity_j;//为(_velocity_i.x, _velocity_i.y, 0)
double td_i, td_j;//初始化为传入的_td_i、_td_j

构建视觉残差residual:Evaluate()

  • AddResidualBlock()中的传入参数提取出来,放到Pi Qi 和Pj Qj ,外参tic qic,逆深度和td中

  • 然后坐标系变换,由点在第一帧的归一化平面->世界系->第二帧的归一化平面

pts_i_td = pts_i - (td - td_i) * velocity_i;
pts_j_td = pts_j - (td - td_j) * velocity_j;//点的位置,用修正过的时间差优化一下位置

Eigen::Vector3d pts_camera_i = pts_i_td / inv_dep_i;//还原回i中点的真实3维坐标(相对相机)
Eigen::Vector3d pts_imu_i = qic * pts_camera_i + tic;//(相对i的IMU)
Eigen::Vector3d pts_w = Qi * pts_imu_i + Pi;//(相对word)(Pi,Qi是IMU的位姿)
Eigen::Vector3d pts_imu_j = Qj.inverse() * (pts_w - Pj);//(相对j的IMU)
Eigen::Vector3d pts_camera_j = qic.inverse() * (pts_imu_j - tic);//(相对j的camera)
  • 计算重投影误差

在这里插入图片描述

double dep_j = pts_camera_j.z();//深度,x y / dep_j为重投影到归一化平面的值
residual = (pts_camera_j / dep_j).head<2>() - pts_j_td.head<2>();//重投影误差://i在j的重投影坐标-j的检测坐标 .head<2>()取前两个
  • 优化残差的马氏距离
residual = sqrt_info * residual;//这个协方差矩阵很简单,只和内参有关,几乎是I

雅可比:

因为残差P重投影-P跟踪位置不是简单的 [ x , y , z ] [x, y,z] [x,y,z]了,需要分布求导。如果他是 [ x , y , z ] [x, y,z] [x,y,z]形式不耦合,求导自然是单位阵,不用单独拿出来分步求导。

  • 分步求导:

在这里插入图片描述

  • 后面那部分:重投影的 P P P (还没除以深度)
    在这里插入图片描述
    d P / d p dP/dp dP/dp
    在这里插入图片描述

对应代码:

//分步求导第一部分
reduce << 1. / dep_j, 0, -pts_camera_j(0) / (dep_j * dep_j),
          0, 1. / dep_j, -pts_camera_j(1) / (dep_j * dep_j);
reduce = sqrt_info * reduce;//乘协方差
//J[0]
if (jacobians[0])
{
    Eigen::Map<Eigen::Matrix<double, 2, 7, Eigen::RowMajor>> jacobian_pose_i(jacobians[0]);
    Eigen::Matrix<double, 3, 6> jaco_i;
    jaco_i.leftCols<3>() = ric.transpose() * Rj.transpose();
    jaco_i.rightCols<3>() = ric.transpose() * Rj.transpose() * Ri * - Utility::skewSymmetric(pts_imu_i);

    jacobian_pose_i.leftCols<6>() = reduce * jaco_i;
    jacobian_pose_i.rightCols<1>().setZero();
}

marginalize(边缘化约束)

一、边缘化理解:

  • 优化时残差的海森矩阵 H H H的构造:
    在这里插入图片描述
    其中,图中红色为视觉约束,蓝色为imu约束,式中 r r r为求得的视觉和imu的残差项, d r / d t dr/dt dr/dt就是视觉和imu的雅可比( H = J T J H=J^TJ H=JTJ),在IMUFactorProjectionTwoFrameOneCamFactor中求的(此例还没有marg约束)。

  • 因子图:
    在这里插入图片描述

  • 先验约束:

边缘化约束:蓝色部分

边缘化 H H H矩阵:

需要丢弃的约束(残差):第0帧的初速度、位姿、所有的视觉约束:
在这里插入图片描述
保留的:第0帧的末速度(第二帧的初)、剩下的位姿、外参:
在这里插入图片描述

将与丢弃的帧相关的约束构造边缘化 H H H矩阵,利用舒尔补将丢弃的约束关系转移到保留的上,作为先验约束(不同于残差的 H H H,这个 H H H矩阵只包含和第一帧有关的、待丢弃的约束,如M0M1,而不包含后面的M(V,Ba,Bg),因为上图中他们本来就不在蓝色里呀)
在这里插入图片描述
经过舒尔补之后,这部分就只剩下右下角的 A r r A_{rr} Arr了,浓缩成一个蓝色块为先验约束,在构建约束时加到残差 H H H对应的块中:
在这里插入图片描述

下次再构造边缘化的 H H H矩阵的时候就把这个A拆进去,与要扔掉的视觉约束和imu约束一起进行下次舒尔补(下次M1—>M0…了)
在这里插入图片描述
二、边缘化程序

1、提取要丢弃的变量和与之有关的约束,进行排序得到各个变量map<addr, data>:
在这里插入图片描述

  • 添加上次marg的marg信息
// 上次边缘化约束中,和本次要扔掉的变量相关的约束
if (last_marginalization_parameter_blocks[i] == para_Pose[0] || last_marginalization_parameter_blocks[i] == para_SpeedBias[0])
   drop_set.push_back (i);//drop_set:parameter_blocks中待marg变量的索引

​ marg的残差和雅可比

MarginalizationFactor *marg_factor = new MargFactor(last_marginalization_info);
ResidualBlockInfo *residual_block_info = new ResidualBlockInfo(marginalization_factor, NULL,last_marginalization_parameter_blocks,//待优化参数快
            drop_set);//需要丢弃的变量的位置
marginalization_info->addResidualBlockInfo(residual_block_info);//添加块得到上表
  • 添加要marg的imu约束
//传入要丢弃的量和与之相关的量,构建它的的imu约束(残差)
IMUFactor* imu_factor = new IMUFactor(pre_integrations[1]);//相关的预积分的值(不需要优化的常量)
ResidualBlockInfo *residual_block_info = new ResidualBlockInfo(imu_factor, NULL,vector<double *>{para_Pose[0], para_SpeedBias[0], para_Pose[1],  para_SpeedBias[1]},//有关约束变量,矩阵中的中的M0、M1 (V0,V1),构建残差快
			vector<int>{0, 1});//需要边缘化的变量位置;0和1是para_Pose[0], para_SpeedBias[0]
marginalization_info->addResidualBlockInfo(residual_block_info);
  • 添加视觉的marg信息
//添加要marg的视觉约束(左右目都构建)
for (auto &it_per_id : f_manager.feature)
  if (it_per_id.start_frame != 0)//只有第一帧的点存在边缘化的约束
        continue;
	//对第一帧要扔掉的路标点,构建残差块
  for (auto &it_per_frame : it_per_id.feature_per_frame)//所有帧和第一帧的有共视的约束,都放进去
	imu_j++;
	ProjectionTwoFrameOneCamFactor *f_td = new ProjectionTwoFrameOneCamFactor(pts_i, pts_j,it_per_id.feature_per_frame[0].velocity, it_per_frame.velocity,it_per_id.feature_per_frame[0].cur_td, it_per_frame.cur_td);//(常量)
	ResidualBlockInfo *residual_block_info = new ResidualBlockInfo(f_td, loss_function,	vector<double *>{para_Pose[imu_i], para_Pose[imu_j], para_Ex_Pose[0], para_Feature[feature_index], para_Td[0]},//(约束变量)矩阵中的[P,L,Tbc](Ti,Tj,Tbc,λ)
        vector<int>{0, 3});//需要扔掉的变量位置,0、3代表(Ti,Tj,Tbc,λ)中的Ti、λ
	// 将视觉损失函数对应的优化变量、边缘化位置存入到 parameter_block_sizes 和 parameter_block_idx 中 
	marginalization_info->addResidualBlockInfo(residual_block_info);
  • 前面三步的addResidualBlockInfo:(得到上表的一部分,最终在marginalize()得到)

将不同损失函数对应的优化变量、边缘化位置存入到 parameter_block_sizes 和 parameter_block_idx 中

构建map,map的key就是他们的addr:(符号有的使用的PVQ或TV,示意图都是PM)

//parameter_block_size:变量维度,imu:[7,9,7,9](T0,V0,T1,V1);视觉[7,7,7,1](Ti,Tj,Tbc,λ)
for (int i = 0; i < residual_block_info->parameter_blocks.size(); i++)
{
    double *addr = parameter_blocks[i];//指向数据的指针,也是作为map的key
    int size = parameter_block_sizes[i];//地址指向的这个数据的长度
    parameter_block_size[reinterpret_cast<long>(addr)] = size;//放进parameter_block_size
}
//parameter_block_idx:排序序号,要扔的不需要了,设成0,imu: [T0 V0];视觉[Ti,λ]
for (int i = 0; i < static_cast<int>(residual_block_info->drop_set.size()); i++)
{
    double *addr = parameter_blocks[residual_block_info->drop_set[i]];//变量的id 
    parameter_block_idx[reinterpret_cast<long>(addr)] = 0;//id存入parameter_block_idx
}

如视觉中,每次传入一个约束parameter_block_size就产生下图这么一块。然后有很多约束,就有跟多块最终组成最初的表。
在这里插入图片描述

2、preMarginalize()

得到每次IMU和视觉观测对应的参数块,雅克比矩阵,残差值。在这里调用了各自的Evaluate()计算残差和雅克比矩阵。结果的地址赋值parameter_block_data

it->Evaluate();//分别计算所有状态变量构成的残差和雅克比矩阵,其实就是调用各个损失函数中的重载函数Evaluate()
std::vector<int> block_sizes = it->cost_function->parameter_block_sizes();
long addr = reinterpret_cast<long>(it->parameter_blocks[i]);//优化变量的地址
memcpy(data, it->parameter_blocks[i], sizeof(double) * size);//重新开辟一块内存
parameter_block_data[addr] = data;//变量约束的地址parameter_block_data

3、 marginalize()

  • 对参数块变量进行排序,待marg的参数块变量放在前面,其他参数块变量放在后面,并将每个参数块的对应的下标放在parameter_block_idx
for (const auto &it : parameter_block_size)
{
    // 大小累加作为pos
    parameter_block_idx[it.first] = pos;//就将这个待marg的变量id设为pos
    pos += localSize(it.second);//pos加上这个变量的长度
}

通过上面的操作就会将所有的优化变量进行一个伪排序,待marg的优化变量的idx为0,其他所在的位置相关,最终得到最初的排列。

  • 多线程构造各个残差对应的各个优化变量的信息矩阵,然后在加起来
Eigen::MatrixXd A(pos, pos);//整个矩阵H的大小(Hx=b)
Eigen::VectorXd b(pos);
ThreadsConstructA()//分别构造H矩阵

在这里插入图片描述

if (i == j)
    p->A.block(idx_i, idx_j, size_i, size_j) += jacobian_i.transpose() * jacobian_j;
else
{
    p->A.block(idx_i, idx_j, size_i, size_j) += jacobian_i.transpose() * jacobian_j;
    p->A.block(idx_j, idx_i, size_j, size_i) = p->A.block(idx_i, idx_j, size_i, size_j).transpose();
}
  • 舒尔补
//舒尔补的4个分块
	Eigen::MatrixXd Amm = A.block(0, 0, m, m)//求逆Amm_inv
	Eigen::VectorXd bmm = b.segment(0, m);
    Eigen::MatrixXd Amr = A.block(0, m, m, n);
    Eigen::MatrixXd Arm = A.block(m, 0, n, m); 
    Eigen::MatrixXd Arr = A.block(m, m, n, n);
    Eigen::VectorXd brr = b.segment(m, n);
//新的矩阵H* b*
    A = Arr - Arm * Amm_inv * Amr;
    b = brr - Arm * Amm_inv * bmm;
  • H ∗ H^* H b ∗ b^ * b中恢复出雅克比矩阵和残差(把H分解为 J T J J^TJ JTJ ,b也是),存到linearized_jacobians、_residuals
linearized_jacobians = S_sqrt * saes2.eigenvectors().transpose();
linearized_residuals = S_inv_sqrt * saes2.eigenvectors().transpose() * b;

A = J T J = V S V = V S S V > > > J = S V A=J^TJ=VSV=V\sqrt{S}\sqrt{S}V >>> J=\sqrt{S}V A=JTJ=VSV=VS S V>>>J=S V

b = J T f > > > f = ( J T ) − 1 b = S − 1 V b b=J^Tf >>> f=(J^T)^{-1}b=\sqrt{S}^{-1}Vb b=JTf>>>f=(JT)1b=S 1Vb

J J J用来作为下次优化时 H H H的一部分(边缘化约束的 H H H), b b b用来更新这些约束丢弃后,约束残差的转移,作为下次的边缘化残差(边缘化约束)

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

vins博客的一部分9 的相关文章

  • favicon.ico不显示

    静态页面中 xff0c title前的favicon ico不显示的问题 原因还不详 解决办法 xff1a 清除浏览器缓存或者将favicon ico文件重命名
  • 树莓派系统镜像的下载和烧录

    一 树莓派镜像下载地址 树莓派官网的下载地址 xff1a 树莓派官网 软件安装 可在官网上下载最新的Raspbian树莓派系统 二 树莓派系统镜像烧写 准备 xff1a 一张2G以上的SD卡及读卡器 xff0c 最好是高速卡 xff0c 推
  • TF 坐标变换(已整理)

    文章目录 坐标msg消息静态坐标变换1 C 43 43 实现发布方 demo01 static pub cpp订阅方 demo02 static sub cpp 2 Python实现发布方 demo01 static pub p py订阅方
  • ROS Action通信

    文章目录 自定义action文件 类似msg和service 服务端 action01 server cpp客户端 action02 client cpp服务端 action01 server p py客户端 action02 client
  • 位姿图优化小记2021.10.18

    1 场景描述 现在有一个小车在运动 xff0c 并搭载相机或激光雷达进行建图工作 xff0c 由于SLAM的作用 xff0c 在建图的同时小车也可以进行自身的定位 xff0c 因此建立的地图的参考都是相对于自身坐标系的 xff0c 也就是每
  • 【CRAHNs】CRAHNs网络中多径环境下大规模MIMO接收信道估计均衡技术

    1 软件版本 matlab2017b 2 本算法理论知识 对于大规模MIMO xff0c 通常情况下 xff0c 采用3D MIMO信道来实现 这是由于3D MIMO一般采用大规模的二维天线阵列 xff0c 不仅天线端口数较多 xff0c
  • VINS笔记1——滤波与优化

    1 滤波 1 1 什么是滤波 这里的卡尔曼滤波实际上和信号处理里面的滤波有很大的不同 信号处理里面的滤波 xff0c 假设一个正弦信号有很多毛刺 xff0c 想要对其进行滤波滤除毛刺 信号处理里面的做法是把信号进行FFT变换到频域 xff0
  • Ubuntu设置CMake编译时使用的OpenCV版本

    文章目录 1 方法一 xff1a 统一修改CMakeLists txt文件中的OpenCV版本1 1 具体操作1 2 命令讲解1 2 1 sed命令1 2 2 xargs命令1 2 3 find命令 2 方法二 xff1a 调用cmake命
  • ROS中常见的msg消息类型

    文章目录 1 基本数据类型1 1 三维向量Vector3 msg1 2 标头Header msg1 3 四元数Quaternion msg1 4 空间中三维点Point msg 2 传感器数据类型2 1 Imu msg 3 机器人状态数据类
  • VIO标定工具kalibr和imu_utils的使用

    0 参考资料 Kalibr进行IMU 43 相机的标定 xff1a 这个步骤写的非常好 xff0c 应该是目前看到的最符合的步骤了 使用ROS功能包标定相机内参 Kalibr标定camera IMU详细步骤 xff1a 这篇博客里给出了它的
  • ros功能包安装

    正确指令 xff1a sudo apt get install ros kinetic dwa local planner 以后安装安装包 xff0c 用sudo apt get install ros kinetic 缺少的PACKAGE
  • vins-mono编译问题--rosrun launch问题

    launch is neither a launch file in package nor is a launch file name解决办法 cd catkin ws source devel setup bash catkin ws
  • 软件工程中的框架是什么?什么是框架?

    IT领域 软件工程中所说的框架是什么 xff1f 1 1 什么是框架 xff1f 软件框架 xff08 software framework xff09 的标准定义 xff1a 通常指的是为了实现某个业界标准或完成特定基本任务的软件组件规范
  • Docker容器中远程连接实现GUI图形显示的配置方法

    1 输入xhost 43 没有问题的话会提示 access control disabled clients can connect from any host 2 使用echo DISPLAY查看本地显示器localhost 会打印结果
  • HAL库 串口收发函数解析

    一 UART Receive IT 对于CubeMX生成的代码 xff0c USART1 IRQHandler void 函数为了提高中断效率采用了回调机制 xff08 业务代码可以等中断关闭了再去处理 xff0c 这样中断处理不会占用太多
  • c++调用python

    在我们的生活中 xff0c 如果我们想调用其他程序的话 xff0c 往往会需要一些额外的代码 xff0c 比如说我们要调用 python去执行某些函数 在我们使用 python的过程中 xff0c 为了能够调用其他程序 xff0c 我们往往
  • 基于simulink的svm-dtc-adrc控制建模与仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 永磁电机由于没有励磁绕组和励磁装置 xff0c 不消耗励磁功率 xff0c 对磁极设在转子的电机 如一般同步电机 还可省去滑环和电刷 随着永磁材料和控制技术的发展 xff0c 永
  • 关于自制openmv的一些建议

    从接触到openmv开始一直都想制作一块自己的openmv xff0c 包括从硬件 xff0c 到烧录程序 最开始制作的版本是openmv3 xff0c 其实openmv3并不是属于自己制作 xff0c 而是下载的硬件电路城开源的openm
  • vue3创建文件报“组件名称应该总是由多个单词组成“Component name “index“ should always be multi-word

    在项目根目录下的 eslintrc js 文件中添加 vue multi word component names off 没有该文件就创建一个 module span class token punctuation span export
  • STM32和ARM的区别?

    下面先看一张图 xff1a 这张图是我在意大利与法国合资的意法半导体公司 xff08 ST xff0c 世界几大半导体公司之一 xff09 的官网上看到的 这说明 xff0c STM32是意法半导体公司的产品 意法半导体 xff08 ST

随机推荐

  • OrangePi 5 Docker下安装OpenWRT作软路由(同样适用于树莓派等设备)

    OrangePi5 Docker下安装OpenWRT作软路由 xff08 同样适用于树莓派等设备 xff09 说明 本文的软路由作为家中的二级路由 xff0c 用一根网线连接主路由的LAN口和二级路由的WAN口 xff08 当主路由使用配置
  • kubernetes-----k8s入门详解

    目录 docker的编排工具 k8s的介绍 k8s的特性 pod的分类 service 网络 通信 认证与存储 插件 docker的编排工具 docker的第一类编排工具 xff08 docker三剑客 xff09 docker compo
  • ROS机械臂开发:Moveit + Gazebo仿真/Gazebo配置

    一 ROS中的控制器插件 ros control的功能 xff1a ROS为开发者提供的机器人控制中间件 包含一系列控制器接口 传动装置接口 硬件接口 控制器工具箱等等 可以帮助机器人应用功能包快速落地 xff0c 提高开发效率 ros c
  • 匿名飞控openmv寻色块解读

    作者 xff1a 不会写代码的菜鸟 时间 xff1a 2019 7 26 源码 xff1a 匿名TI板飞控源码 43 openmvH4 说明 xff1a 限于本人水平有限 xff0c 并不能写的很详细 xff0c 还望各位能够补充
  • 校验和的计算方法

    实验要求 编写一个计算机程序用来计算一个文件的16位效验和 最快速的方法是用一个32位的整数来存放这个和 记住要处理进位 xff08 例如 xff0c 超过16位的那些位 xff09 xff0c 把它们加到效验和中 要求 xff1a 1 x
  • MT7621路由器芯片/处理器参数介绍

    MT7621路由器芯片包括一个880 MHz MIPS 1004Kc CPU双核 xff0c 一个5端口10 100 1000交换机 PHY和一个RGMII 嵌入式高性能cpu可以很容易地处理高级应用程序 如路由 安全和VoIP等 MT76
  • 谈谈你对事件的传递链和响应链的理解

    一 xff1a 响应者链 UIResponser包括了各种Touch message 的处理 xff0c 比如开始 xff0c 移动 xff0c 停止等等 常见的 UIResponser 有 UIView及子类 xff0c UIViCont
  • CMake 引入第三方库

    CMake 引入第三方库 在 CMake 中 xff0c 如何引入第三方库是一个常见的问题 在本文中 xff0c 我们将介绍 CMake 中引入第三方库的不同方法 xff0c 以及它们的优缺点 1 使用 find package 命令 在
  • u-boot的启动模式(面试常考)

    交互模式 uboot启动之后 xff0c 在倒计时减到0之前按任意键 xff0c uboot会进入到交互模式 xff0c 此时可以输入各种uboot命令 和uboot进行交互 自启动模式 uboot启动之后 xff0c 在倒计时减到0之前不
  • vins-fusion代码理解

    代码通读了一遍做些总结 xff0c 肯定有很多理解错了的地方 xff0c 清晰起见详细程序都放到引用链接里 从rosNodeTest cpp开始 main函数 ros span class token operator span span
  • vins博客的一部分1

    文章目录 imu callbackimg callback imu callback 从话题中读入各个数据的t x y z g y r xff0c 存放到acc和gry中 span class token comment 从话题读入 spa
  • vins博客的一部分2

    sync process 对两个imgBuf里的图像进行双目时间匹配 xff08 通过判断双目图像时间之差 lt 3ms xff09 xff0c 扔掉匹配不到的老帧 span class token keyword double span
  • vins博客的一部分3

    FeatureTracker trackImage 包含了 xff1a 帧间光流法 区域mask 检测特征点 左右目光流法匹配 计算像素速度 画图 跟踪上一帧的特征点 如果已经有特征点 xff0c 就直接进行LK追踪 xff0c 新的特征点
  • vins博客的一部分4

    processMeasurements 取出数据 将 featureBuf中 xff0c 最早帧的feature取出 xff1a feature 61 featureBuf front 节点的接收IMU的消息再imu callback中被放
  • vins博客的一部分5

    目录 initFirstIMUPose xff08 xff09 processIMU propagate initFirstIMUPose xff08 xff09 得到IUM的Z与重力对齐的旋转矩阵 xff1a IMU开始很大可能不是水平放
  • vins博客的一部分6

    processImage 输入是本帧的特征点 id cam id xyz uv vxvy 包含了检测关键帧 估计外部参数 初始化 状态估计 划窗等等 检测关键帧 选择margin帧 addFeatureCheckParallax 检测和上一
  • vins博客的一部分7

    目录 initFramePoseByPnP frame count Ps Rs tic ric triangulate frame count Ps Rs tic ric initFramePoseByPnP frame count Ps
  • vins博客的一部分8

    目录 optimization slideWindow optimization 优化先验残差 重投影残差 预积分残差 xff08 即要拟合的目标是 xff0c 之前边缘化后的先验值 xff0c 前后帧之间的IMU的预积分值 xff0c 每
  • 以下为WindowsNT下32位 C++程序,请计算sizeof的值

    转帖地址 xff1a http hi baidu com hikeba blog item 68ad9f10a7dd8003213f2ecf html char str 61 34 hello 34 char p1 61 str int n
  • vins博客的一部分9

    目录 IMUFactor xff08 imu约束 xff09 ProjectionTwoFrameOneCamFactor xff08 视觉约束 xff09 marginalize 边缘化约束 IMUFactor xff08 imu约束 x