自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(51)
  • 收藏
  • 关注

原创 VScode链接已有仓库的代码

如果你在推送时遇到了权限问题,确保你已经配置了正确的凭据。如果你使用的是HTTPS方式,你可能需要在推送时输入你的Gitee用户名和密码。如果你使用的是SSH方式,确保你的SSH密钥已经添加到Gitee账户中。以上步骤会将你的本地代码与Gitee仓库同步。如果你在同步过程中遇到了任何问题,可以使用。来查看提交历史,以便更好地理解发生了什么。来查看当前状态,或者使用。

2024-04-28 17:33:59 94

原创 GDB调试C++顺序

2.这样在回溯时可以看到源码,打断点也可以使用相对路径。这样就可以使用相对路径来打断点,否则要使用绝对路径。查看局部变量,指的是当前函数作用域内的所有局部变量。5.报错内存溢出了用这个查看调用顺序。2.打断点,需要就打,不需要就跳过。后面参数和不用gdb启动的方式一样。1.启动gdb,并加载执行程序。可以用相对路径或者绝对路径。4.有断点的运行方式。

2024-04-02 17:03:01 198

原创 docker容器配置MySQL与远程连接设置(纯步骤)

注意3306不能改,这个是内部的端口号,必须是3306,否则外部会连接不到里面,左边的3000可以改成任意没被占用的端口号,外部连接的时候是输入左边的端口号的,-v参数是连接共享文件夹,自行选择,左边是主机文件夹路径,右边是容器内路径。以下为ubuntu20.04环境,默认已安装docker,没安装的网上随便找个教程就好了。重启一下容器,不然可能概率性出现登录不进mysql的情况。设置一下权限,这样外面才能访问mysql,否则会无法连接。那个密码是创建容器的时候设置的密码。在容器内输入,然后输入密码。

2023-12-08 16:57:54 802

原创 opencv安装过程与问题解决

遇到相关问题看下面的文章解决。

2023-11-27 17:04:44 419

原创 CMake 更换版本安装

如果报错Could NOT find OpenSSL。查看版本,显示版本消息就是安装成功了。cmake官方源码路径在这里。下载cmake 3.23.0。下载哪个版本都行,个人喜好。

2023-11-23 11:44:02 208

原创 docker容器生成镜像并上传个人账户

当你将容器提交为镜像时,提交的是容器的状态快照,其中包括共享的文件夹在内的所有数据。在上传镜像到 Docker Hub 或其他 Registry 时,镜像中会包含提交时容器中存在的所有数据,包括共享的文件夹内的文件。所以,上传容器到 Docker Hub 后,共享文件夹中的文件也会保存在镜像中,并且其他人可以通过拉取这个镜像获取这些文件。这将提示你输入你的 Docker Hub 账户名和密码。

2023-11-23 10:07:58 571

原创 conda常用命令

将 Conda 环境导出为 YAML 文件。在另一台电脑根据yaml生成相同的环境。旧版本libtorch网址。

2023-11-22 16:27:50 786

原创 ubuntu下docker环境使用GPU配置

在容器里面运行一下再验证一下,能正常显示上面那个图案就是能成功调用了,注意那个cuda版本要能显示,要是现实 N/A的话是不行的。docker的版本必须安装19.0版本以上的,这里也只讲19.0版本以上的使用方法。然后配置一下文件,这样容器才能使用runtime。cuda版本显示N/A的话用以下格式创建容器。本文主要讲述整个命令流程,具体讲解请看官网。运行该命令验证是否安装成功。和一篇总结得很详细的博文。然后按照以下格式创建容器。出现这个就是安装成功了。首先设置一下网络信息。

2023-11-22 14:20:51 1698

原创 VINS-Fusion-GNSS松耦合原理

里面,所以第二次优化时相对约束中就会带有尺度信息进行优化,虽然里面也包含了GPS的抖动误差,因为会把世界系变换到真实尺度下面去,毕竟相对约束里面要的是相对值,世界系去到哪里都无所谓。表示同一时刻的值,所以这个是一个局部变换,因为GPS自身就存在很大的抖动,然后后面这个系统还会把这个大抖动乘上去重复上面的步骤,其实就是去靠近这个抖动值。,即相同世界系,那么我感觉这个值其实就是一个稳定值的VIO值到一个抖动的GPS均值的变化,然后把这个值当作GPS到VIO的外参。

2023-11-21 16:40:27 516

原创 VINS-Mono-后端优化 (四:边缘化原理)

滑窗中固定只能有11帧,当来了新的帧的时候旧的帧就需要抹掉,但是不能直接把旧的帧的全部信息抹掉,因为旧的帧的经历过11次优化,其地图点中的优化信息是有用,边缘化的操作就是为了只把最旧帧的变量去掉,但是保留其对应的优化信息留在窗口里面,因为那些信息仍然具有约束作用。

2023-11-13 11:51:46 284

原创 VINS-Mono-后端优化 (三:视觉雅可比推导)

用逆深度是因为这样可以在优化中从优化3个变量降低到1个,降低优化的维度加快求解速度用逆深度是因为当距离很远的时候,x1​x就会无穷大,而3D点很近的情况也一般不会有,这也是为了数值稳定性用逆深度的话就要和其中一帧进行绑定,这个就是和观测到该点的第一帧进行绑定,这样才能表示一个3D点信息划窗中维护的全部都是IMU下的位姿,所以相机要通过外参变换到IMU坐标系下这里就构成了视觉误差,需要求关于优化变量的雅可比矩阵,这里约束了第i帧和第j。

2023-11-10 17:07:08 583

原创 VINS-Mono-后端优化 (二:预积分残差雅可比推导)

δα这里是求预积分对约束的参数块进行求导,有这个雅可比矩阵才能进行优化步长的计算,这个是预积分这个约束因子对各个优化变量的求导,后面还有相机的观测残差块中的θ是3维的,但是参数块中的四元数是4维的,因为相减后残差只剩虚部了,但是参数是从4个参数变过来的预积分的残差具体如下,总共有15维的自由度,即y有15维而参数块x, 维护的是k和k1时刻的PQVBaBgP是3维,Q是四元数有4维,因为是过参数化的形式,而VBaBg总共是9维的参数块所以整个参数块x。

2023-11-09 17:33:20 477

原创 VINS-Mono-后端优化 (一:预积分残差计算-IMU预积分约束)

也是优化变量,而预积分又与零偏有关系,零偏改变了理论上是要重新积分的,但是由于这个零偏量变化很小,所以这里采用一阶近似的方式来更新预积分,更新的预积分继续作为这个约束,零偏更新建模看这篇文章。是用 IMU 预积分获得的增量(前面用了大篇幅去推导,可以看之前的文章),左边是优化获得的增量,整体就是优化后的值不能离预积分的增量太远,太远的话误差值就会变大。由于现在设置的预积分约束因子,所以前面计算的预积分置信度就是用在这里计算的残差上面,公式为。这个残差计算是每次优化后都会进来计算的,开根号,那么新的残差用。

2023-11-08 16:16:00 598

原创 SLAM中求导相关的公式总结

这里是对两个相乘的旋转矩阵中的其中一个旋转进行求导,上面的左乘扰动例子是对矩阵相乘向量进行求导的,所以可以直接对矩阵进行扰动。用李代数表示旋转会有个问题,就是周期性,就是多个李代数可以对应一个旋转矩阵,如果固定旋转角度在±π时就是唯一对应的。,这个形式比较复杂,工程中不用这个方法,都是用扰动模型,所以只看扰动模型。的导数,这样就变成矩阵对向量的求导,因为扰动量是可以用向量表示的,的正切空间,因为这里李群是9维的,所以切向量也是一个空间。是微量,相当于是对旋转的导数,则等于。的导数性质,所以李代数是李群。

2023-11-08 13:57:58 117

原创 VINS-Mono-VIO初始化 (六:基于已知重力对重力方向进行调整)

其实这个切平面的向量是可以任意方向的,毕竟绕着重力向量旋转的任意正交向量都符合,这个temp向量只是一个临时向量去固定其中一个平面,找到对应的向量而已。我们一定是在球面上运动的,我们以向之前求出的向量的起点为圆心,9.81作为半径,与球面的切平面取相互正交的两个向量。这样调整的目的是因为,上一节求解的方程中的已知量中也是包含的重力的误差影响在里面的,需要这样对误差调整回来。,这两个向量相乘就是重力方向,这样就能对重力方向进行调整,三个量是必然互相垂直的。是重力归一化的结果,则这两个点乘的结果就是。

2023-11-02 14:10:41 121

原创 VINS-Mono-VIO初始化 (五:视觉惯性对齐求解)

整体思想就是根据预积分的公式,把已知量和未知量各放到一边,因为前面的数据都是变换到$c_{0}$下的,不是真正意义上和重力对齐的世界坐标,然后位移和速度的预积分中会用到加速度计获取的重力加速度g,但是这个重力g是没有和世界的重力方向对齐的,所以里面就存在了未知量,通过每组预积分的数据联立起来构成一个大矩阵对重力向量进行求解,这里是求解了重力方向(对于起始帧$c_{0}$的重力方向

2023-10-31 18:04:40 189

原创 docker容器中安装ROS1/ROS2(不用配任何环境,10分钟搞定)

拉取完后创建容器,但是为了能在docker中能打开窗口,将使用以下参数,只需要修改名字即可,your_name 改成你想要的名字,必须英文。然后就可以运行容器啦,$containerId 换成容器名字也可以。运行下面这句,把 $containerId 替换为容器的 id。这个时候必然会报错,上步的目的是为了创建有对应参数的容器,然后把下面的3行指令按顺序分别执行在3个终端中。此时进入容器了,再在容器里面运行这句。每次进入容器前都需要先启动容器。查看刚刚创建的容器的 id。然后再运行以下进入容器。

2023-10-30 19:18:43 2133

原创 VINS-Mono-VIO初始化 (四:陀螺仪零偏初始化)

之前估计的旋转等我外参,加速度计的零偏不在这里进行估计,会在后面滑窗优化的时候进行估计。,这个是用视觉算出来旋转乘上外参算出来的,这样就和imu坐标系有关联了,后面才乘上个。这样就可以更新零偏然后知道满足结果为0为止,前面计算的对零偏的雅克比也是在这里这样用的。会比较大,所以才会重新传播,后面都是用雅克比矩阵进行一阶近似来传播的,算出来的是。(这个在前面零偏建模的时候有过推导是怎么来的),然后通过这样的方式更新旋转量。指的是取虚部,因为只有需要发生变化,实部一直都是1,整个公式的未知量只有。

2023-10-28 16:36:43 80

原创 VINS-Mono-VIO初始化 (三:SFM中的三角化方法)

前面预积分对IMU的数据进行预处理,现在需要对视觉的信息进行处理,在VINS中视觉初始化的处理就是使用SFM,但是这里的三角化他没有用opencv给的函数,而是用自己的方法进行三角化。这里SFM的方式就是现在滑窗里面找到枢纽帧,然后枢纽帧和最后一帧进行三角化获得3D点,然后通过PNP计算滑窗中其他关键帧的位姿,同时也三角化出更多新的点,顺序是先从枢纽帧向右再向左,然后再遍历只被中间帧看到的点进行三角化。

2023-10-27 12:01:12 150

原创 VINS-Mono-VIO初始化 (二:旋转外参初始化)

最后结果还要检查前三个奇异值,比0大才是有效的,最后一个奇异值一般在0附近,检查的前三个奇异值都接近0的话就证明可能在0空间附近运动,证明激励不足够。左边的矩阵可以定为 A 矩阵,问题则变成 Ax=0 ,A为超定方程,奇异值矩阵为对角矩阵,但不是严格的N×N的对角,具体形式为。也是正交矩阵,只是旋转的方向相反,和上面同理,这里定义。每一行都是 4×4 的矩阵,总共为 4(N+1)×4行,,因为相机到 IMU 的旋转外参不会变化的,公式变成。,因为旋转矩阵不会改变大小,只会改变向量的方向。

2023-10-25 17:12:04 79

原创 VINS-Mono-VIO初始化 (一:为什么要初始化)

因为VINS是一个基于优化框架的VIO,优化问题非常依赖初始值,因为基本都是找离初始值最近的局部最小值,这个值作为全局最优值,初始值越近迭代次数越少,每次迭代都要计算雅可比和求解Hx=g的方差,这样减少计算时间。

2023-10-21 16:19:59 56

原创 VINS-Mono-IMU预积分 (八:预积分代码带读+对应推导公式)

这个雅可比的作为是为了在零偏 $b_{a},b_{w}$ 在经过优化数值发生变化后不需要再重新进行预积分,因为实际上 $k+1$ 时刻的预积分是用 $k$ 时刻的零偏 $b$ 来进行的,当经过优化后 $k+1$ 时刻的零偏 $b$ 就会发生变化,理论上 $k+1$ 时刻的预积分应该是用 $k+1$ 时刻的零偏 $b$ 来进行才对,由于是优化后才获得,但是重新进行预积分又非常耗时,所以采用 $f(x+Δb)=f(x)+J^{x}_{b}·Δb$ 这样的方式来进行近似更新,从这个公式可以看出里面就必须要对零偏

2023-10-21 16:19:32 241 1

原创 VINS-Mono-IMU预积分 (七:预积分零偏建模方式)

由于里面的零偏ba​bw​也是待优化变量,每次求解一次之后ba​bw​都会被改变以满足残差最小,那这样整个积分就得重新积分,这样会很耗时由上节给出的更新公式Δxk1​FΔxk​GnF∈15×15,求协方差矩阵的时候F⋅P⋅FT,此时是3个15×15的矩阵相乘(一个IMU数据),如果每迭代一次就要把所有的IMU数据都这样重新相乘的话计算量会非常大。Δx的方差P怎么来的可以根据一阶泰勒展开来近似,来进行更新,避免重新预积分fx。

2023-10-20 15:42:13 89

原创 VINS-Mono-IMU预积分 (六:离散时间预积分误差传递)

为了求出连续时间的变化量,所以要求出连续时间误差量的变化量的导数,因为是误差卡尔曼滤波,所以是对误差量进行求导。,这里面认为零偏是不会变化的,所以没有k+1时刻的零偏的噪声,零偏的导数就是高斯噪声。代入进去,剩下的就是整理归纳系数了,自己归纳一下就能得到上面对应的值了。现在要根据前面连续时间的方程推导出离散下的变化。时刻的误差,代码中也是构造 F ,G矩阵。,现在要求出离散时间下的变化关系是什么,而实际系统的数据肯定是离散的。先列出连续时间积分的角度的导数。先列出连续时间积分的速度的导数。

2023-10-18 10:33:21 107

原创 VINS-Mono-IMU预积分 (五:连续时间预积分误差状态传递)

我们最后拿到IMU的值是离散的,我们要从连续推导离散的一个形式,这个只是一个中间形式,离散的形式才是最终的形式,将在下一节讲解

2023-10-17 09:40:23 96

原创 VINS-Mono-IMU预积分 (四:误差卡尔曼滤波)

为什么需要误差卡尔曼滤波旋转的误差量一般为很小的值,通常用旋转向量来表示旋转误差,因为四元数是过参数化的表示形式,用一个4自由度的协方差矩阵来描述一个3自由度旋转就存在问题,为了避免这个问题则引入李代数(旋转向量)来进行表述,由于误差量很小,∈[Π,−Π]∈[Π,−Π] 之间,且在0附近,则可以避免周期性的问题 。

2023-10-16 10:38:15 111

原创 VINS-Mono-IMU预积分 (三:为什么要预积分+预积分推导)

在滤波中,来了图像帧的位姿其实是相当于观测值,两帧图像间大概会有10个IMU数据,图像的频率一般在20Hz~30Hz,IMU的一般为100Hz,当来到第k+1时刻的位姿时,会把相机的位姿和IMU积分得到的位姿同时扔给滤波器中获得置信度最高的位姿,然后把该位姿赋值给第k时刻的变量,循环往复。就是预积分量,此时可以看出这3个量没有任何相邻两帧之间的关系,即没有直接引入相邻两帧的姿态或者速度来作为它的观测值(相机的重投影位姿),在滤波的积分中的第k时刻的PVQ就是融合了相机观测值的结果,

2023-10-14 17:08:31 160

原创 VINS-Mono-IMU预积分 (二:连续时间的PVQ积分+四元数求导)

这样做的好处就是,四元数的乘法通过这个矩阵变换变成矩阵的乘法,且这样可以有两个表示形式,两种形式的结果都是一样的。,由于上面需要进行矩阵化的两个向量的实部都是1,在相减后是会被约掉的,然后只剩下。这样就获得了旋转微量的表达式,积分的时候只需要乘上Δt即可。这两个矩阵构造都是有相似的形式,可以整理成比较一致的表达。写成积分后,积分内部的形式和上面求导的形式是一致的。的需要加个负号,所以两个矩阵的构造还是相似的。内部用的是矩阵的乘法,外面是用的四元数乘法。为 k 到 k+1 时刻的姿态的变换,

2023-10-13 15:25:38 218

原创 VINS-Mono-IMU预积分前置学习 (一:旋转的定义)

运算方便,使用9个量描述3自由度旋转(roll,pitch,yaw),引入额外约束(正交矩阵,行列式=1),求导困难,要求导只能对李代数(也是旋转向量)求导,无法对旋转矩阵进行求导。单位四元数才能表示旋转,额外约束的引进就会使得表示旋转也会过参数化,即4个变量描述3个自由度,当需要描述旋转误差的协方差矩阵时,其对应的矩阵为。这里采用了旋转向量进行表示,虽然旋转向量有周期性的问题,但是后面是采用误差卡尔曼进行计算,维护的是一个角度的误差量,误差量都是在0附近的,起码。紧凑的表示旋转,没有额外的约束;

2023-10-13 11:22:10 48

原创 pytorch导出torchscript记录

目前网上使用torchscript导出实际模型的案例比较少,以下遇到的问题均是本人导出PatchmatchNet过程中遇到的问题欢迎使用torchscript导出模型的同学们一起在评论区中讨论遇到的问题,尽量使得本文提出的问题能为我们以后避坑出错提示 RuntimeError: undefined value warped_feature355行注释掉 del warped_feature, src_feature, src_proj, similarity, view_weight出错提示’int

2022-12-07 16:43:40 2510 1

原创 LIO-SAM话题数据流程图总结

该流程图描述了LIO-SAM整个系统的话题是如何相互作用的,流程图原文件在这里。不需要积分分享给大家。

2022-09-17 16:48:45 309

原创 LIO-SAM后端中的后端里程计、GPS、回环因子

这部分主要是讲如何添加odom因子、gps因子、回环因子和获取优化后的信息给到下一次优化使用,讲解函数void saveKeyFramesAndFactor()

2022-09-16 18:02:52 690

原创 LIO-SAM后端中的回环检测及位姿计算

回环检测思路描述:主要是通过里程计判断回环,根据最后一个关键帧的平移信息,寻找离他15米内的其它关键帧,并且两帧的时间戳相差要大于30s,上面两个条件都满足则认为是找到了回环帧,开始用icp匹配计算位姿,算完后把两帧索引,两帧相对位姿,噪声(icp得分)放入回环约束队列中,对回环因子的使用,和因子图的更新在函数saveKeyFramesAndFactor()中,后面会详解

2022-09-15 19:22:12 1431

原创 LIO-SAM后端中的点云配准

分别将局部地图的角点和面点放入局部地图的kdtree中(注意这里的角点面点不是当前帧的,是局部地图的,在上一个函数中筛选出来的),LIO-SAM中初值计算及局部地图构建中有详细解析局部地图构建,extractSurroundingKeyFrames()函数构建的局部地图是把那些点都筛选出来了,但是还没有加入kdtree中,局部地图其实就是通过kd_tree提取离当前帧一定距离内的关键帧

2022-09-15 16:18:13 882

原创 LIO-SAM后端中初值计算及局部地图构建

下面详解的两个函数主要作用 是更新当前匹配结果的初始位姿 和 提取当前帧相关的关键帧并且构建点云局部地图

2022-09-13 17:07:47 484

原创 LIO-SAM前端中提取面角点

- 提取角点:根据之前算的sp、ep,即每个scan的起始和结束id,来将每根的所有点进行6等份,当点不是遮挡点并且曲率大于边缘点门限则认为是角点,每一份只找最多20个点,将这些点手机进cornerCloud,每提取一个角点的时候都将该点左右各5个点设置为遮挡点避免太集中(设定为遮挡点后就通过不了角点判断了)- 提取面点:把提取出来的有效点云转成pcl格式pcl::fromROSMsg(msgIn->cloud_deskewed, *extractedCloud); // new cloud

2022-09-13 10:11:25 139

原创 LIO-SAM前端点云预处理

这是imageProjection.cpp中的 **ImageProjection IP**类前端点云预处理其实就是提取运动补偿信息、用提取的信息对点进行补偿到最开始的点的时刻、保存有效点云数据信息和确定计算曲率的点索引的起止点,实际操作在原始点云回调函数中

2022-09-06 19:22:22 973

原创 LIO-SAM前端中位姿融合输出

实际操作简述: 说白了就是拿到优化后的全局位姿和imu的局部增量位姿,然后加起来就是当前时刻的位姿了,具体操作在下面第4点,这样就能高频输出比较准确的位姿了,全局位姿在后端优化比较久

2022-09-06 15:53:07 287

原创 LIO-SAM前端中基于IMU预积分的前端代码详解

这里将通过代码解析预积分这个节点的运行顺行。

2022-09-02 14:37:07 1023 4

原创 LIO-SAM前端中预积分的意义

(个人理解为,假设调整第 k 时刻的位姿,但是 k 到 k+1时刻的IMU积分项是不会变的,因为这就是个固定的测量值,但是根据最上面的公式可以看到,当调整 k 时刻位姿时 第 k+1 时刻就要重新积分,而在图优化中,关键帧的位姿在不停的调整是必然且正常的,每次调整都要使得第 k+1 帧的位姿重新积分很耗时间)乘了以后,所有状态量都和世界坐标系无关,都变成只和当前起始的 第 k 帧有关,即和前一个关键帧相关。首先看 IMU 原始积分的公式 ,两个关键帧。实际的系统状态是离散的,则变成如下。......

2022-08-30 22:17:13 842

LIO-SAM的话题流程图xmind原文件,适合入门激光SLAM学习LIO-SAM中的童鞋们,自动驾驶SLAM领域

LIO-SAM的话题流程图xmind原文件,适合入门激光SLAM学习LIO-SAM中的童鞋们,自动驾驶SLAM领域

2022-09-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除