![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
vlsam
文章平均质量分 52
记录有关vlsam的知识
ScaredPan
这个作者很懒,什么都没留下…
展开
-
不同三角化方法的表现
上面的代码是,分别构建1.Ax=0 用SelfAdjointEigenSolver和JacobiSVD求解 2.构建在New_A上面加了10-5的阻尼,用JacobiSVD 和QR求解。这是三角化后的点和优化后的点误差原创 2022-10-12 12:27:15 · 336 阅读 · 0 评论 -
g2o的hessian矩阵、b怎么存储
其中A1是第一条边对C1的雅克比,A2是第一条边对P1的雅克比,A3是第二条边对C2的雅克比,A4是第二条边对P1的雅克比。观测H矩阵可知,在对角线元素上,是误差边对对应顶点hessian的累积和,而非对角元素则是每条边对两个顶点的雅克比乘积。假设我们有两个相机位姿C1 C2 都看到一个顶点P1 ,即我们有两条边,则我们的J可以写成。因此,对于H的对角线元素,我们可以单独存放在顶点类里面,每个顶点对应的元素等于。而非对角线元素,必须存储在边的类里面,一条边对应一个元素(对称应该是两个)。原创 2022-09-20 20:28:33 · 299 阅读 · 0 评论 -
ORBslam3中想把ros的代码放在主工程里编译出现内存错误
oorbslam3原创 2022-08-03 17:36:41 · 690 阅读 · 0 评论 -
Pixel-Perfect Structure-from-Motion with Featuremetric Refinement
论文阅读原创 2022-06-04 18:39:02 · 580 阅读 · 0 评论 -
vins 跟踪部分改为提取特征点匹配结论
一直对vins跟踪部分用光流跟踪想要改为提取特征点匹配,原因有如下几点;光流跟踪时间长了,特征点会有一点点偏移,实际测试确实会这样,但这个偏移很小,无奈我们对回环有较高的精度要求(<15cm),回环是重新提取特征点去和这个光流跟踪得到的特征点匹配,光流跟踪得到的特征点有偏移显然会影响回环精度。这是主要原因。光流会有对速度有限制,太快效果不好。因此最近终于实现了想法,将光流跟踪部分改为了提取特征点,然后暴力匹配。发现能连续跟踪的点变少了好多。这是连续三帧跟踪(每隔0.4s)的情况,原创 2022-01-19 16:36:12 · 2847 阅读 · 3 评论 -
vins-fusion 融合rtk原理
vins-fusion融合rtk原理:使用优化的方式融合,假设融合后的位姿是fusion_T[n], vio输出的位姿是vio_T[n],rtk输出的位姿是rtk_T(只有最后一帧)那么fusion_T的初值是fusion_T[n] = fusion_T[n-1] * (vio_T[n-1].inverse()*vio_T[n])两个观测 一个是rtk:残差就是 fusion_T[n] - rtk_T一个是vio的残差是 fusion_T[i-1].inverse()*fusion_T[i] -原创 2021-12-14 16:54:25 · 723 阅读 · 0 评论 -
通过跟踪效果来看vins输出结果
下面是vins跑出来的结果,vio输出是绿线轨迹。线速度是0.28m/s,拐角的地方是我根据蓝线把vio轨迹掰正了。vio在初始阶段走的比较弯曲,后有一段笔直的轨迹,这里旋转非常慢,之后又走了一段很不错的直线,之后就跳变了几下,轨迹彻底偏了。我把每帧需要新提取的特征点个数打印出来(我们每帧必须有150个特征点,减去跟踪上的,就是需要新提取的),通过这个个数可以反应出跟踪的好不好,新提的特征点个数越多,则说明跟踪的越不好。n_max_cnt 0last_track_num150n_max_cnt原创 2021-11-30 20:29:31 · 717 阅读 · 1 评论 -
慎用cv::fitLine
cv::Point2f p1(-1,-1);cv::Point2f p2(-2,-2);vector<Point2f> vec;vec.push_back(p1);vec.push_back(p2);cv::Vec4f line1;cv::fitLine(vec,line1,CV_DIST_HUBER, 0, 0.01, 0.01);fitline是对点进行直线拟合,vec是输入的点,line1是输出,前两个是(vx,vy)即方向向量,后两个是(x0,y0)是线上的某一点。我们原创 2021-11-30 17:39:03 · 1035 阅读 · 0 评论 -
几款全局曝光相机的参数
ar0144ov92810v7251sc031GSvg5661 和SC132GS的对比原创 2021-11-29 14:26:04 · 1525 阅读 · 0 评论 -
对齐rtk坐标和world坐标系的问题
在对齐rtk和world坐标系时发生了很诡异的现象,无论如何也对不好。红色是world的轨迹,后来飘了,但是我只用了0.5m以内的轨迹来对齐,基本是在x轴上的。右下角蓝色轨迹是rtk原始轨迹,左上角是根据计算出rtk和world的夹角之后旋转(y取负)的轨迹。我使用的方法是1.算出红色轨迹(world)1m内的航向yaw1,,基本为02.算出蓝色轨迹(rtk)1m内航向,yaw = -90(从图中看出)3.rtk旋转90度,然后把rtk的y取负。这样就得到了左上角的蓝色轨迹。对比原始轨迹和.原创 2021-11-24 16:54:47 · 926 阅读 · 0 评论 -
平面约束公式推导
在地面运行的小车如果可以认为在平面运动,则可以使用平面约束(注意不能用于斜坡之类的地面,这里相当于绝对水平。)水平则有z=0,roll和pitch=0,对于四元数q来说,就是只绕z轴旋转yaw角 q = cos(yaw/2) + sin(yaw/2)(0,0,1) 也就是qx = 0 qy = 0这三个可以成为每一帧的约束。q转为RR应该为[1−2z22wz0−2wz1−2z20001]\begin{matrix}[ 1-2z^2 & 2wz & 0 \\ -2wz &原创 2021-11-10 17:28:40 · 1777 阅读 · 1 评论 -
ceres库AddResidualBlock函数解析
在定义损失函数时,我们会预先告诉parameter_blocks的个数,class ProjectionFactorXYZ : public ceres::SizedCostFunction<2, 7, 3> 表示2个损失函数,2个参数块,第一个参数块有7个数,第二个参数块有3个数。我们在传给ceres时,传进去的是参数块的首地址。又知道参数块里面的参数个数。所以ceres就可以一个个把参数拿出来。ResidualBlock* ProblemImpl::AddResidualBlock(原创 2021-11-04 16:27:18 · 4368 阅读 · 3 评论 -
vins-mono的bug记录
在imu数据和image数据对齐时,存在bugvins里面一直在优化image和imu之间实际时间戳的间隔td,然后在对齐时把td加在了image的时间戳上。getMeasurements()里面while (imu_buf.front().timestamp < img_msg.timestamp + td) { IMUs.emplace_back(imu_buf.front()); imu_buf.pop();原创 2021-07-29 09:55:21 · 617 阅读 · 0 评论 -
superpoint在vlam应用的设计思路
vslam是在跟踪一般跑20hz,只需要提点,不需要描述子。但是在后端回环时,一般跑5hz,这时候需要更多的点和描述子。而superpoint模型是一下子把特征点和描述子都提取出来的,为了节约资源,只让模型跑一次,进行如下设计。由于提点的时候,我们已经知道这一帧是不是要发布给后端的,所以如果这帧是发布给后端的,就把superpoint提取的结果(score和des)和对应的时间戳保存到buff里面。在后端通过时间戳去取。由于首尾都需要插入,中间不做操作,故选用queque。...原创 2021-06-21 14:46:04 · 432 阅读 · 0 评论 -
Apriltag使用
Apriltag使用开源项目:https://github.com/AprilRobotics/apriltagapriltag库是一个纯c的库,基本不依赖任何其他库。Apriltag目前有版本2和版本3,版本3可兼容版本2.版本3的tag如下图:tag2如下:tag3是检测里面四个点,tag2是检测外面四个点。所以同样的大小的tag,tag2的位姿精度会更高。但tag3的检测速度更快(是tag2的两倍以上)。考虑位姿精度,目前我们使用tag2。我们实际使用4个tag,id分别是tag36h原创 2021-05-10 15:35:55 · 11978 阅读 · 7 评论 -
回调函数
回调函数,设上层模块为A,下层模块为B。本来是A调用B里的函数b(),但是b()需要调用A模块里的a(),这时候a()就称为回调函数。实际上回调函数就是用于实现两个模块相互通信。当然,在c++里面,实现交互功能还可以用相互作为成员变量。举个例子:B:typedef void (Axxx) (void lp, Data data);//这就是回调函数原型,lp是A模块和B模块相互的纽带,由A创建,在A调用B时使用,一般是b()函数的实参,b(viod* lp)。data就是B想从A得到的数据了void原创 2021-04-23 10:25:08 · 135 阅读 · 0 评论 -
对齐两段不同坐标系的轨迹
对齐两段不同坐标系的轨迹,实际就是已知两两3D点的对应关系,求取它们之间的R,T。这实际就是简化的ICP算法(省去了寻找点的对应关系这一步)。设一段轨迹的3d点为pt, 一段为ps,那么它们之间的关系为:s∗pt=R∗ps+Ts*p_t = R*p_s + Ts∗pt=R∗ps+T假设两段轨迹的尺度是一样的,则s=1.将R,T去耦合,我们知道点云的平均值也是满足旋转关系的,即ptˉ=R∗psˉ+T\bar{p_t} = R * \bar{p_s} +Tptˉ=R∗psˉ+T故原创 2021-04-23 10:14:42 · 918 阅读 · 0 评论 -
用dcm算法求取imu+wheel位姿思路
难点在于imu和wheel是帧对齐,我们需要求出每一帧wheel对应的dcm姿态。基本思路:1.我们在做imu和wheel对齐时,就求出每一帧wheel对应的绝对dcm姿态。(我们原来的wheel_q,求的是每一帧wheel到上一次image之间的姿态)如下图所示:注意:1.wheel_dcm一直是一个累加的绝对值,求取wheel_dcm不能再像wheel_q那样求取,我们必须求出每一段wheel对应的imu,而不是像以前那样,求出wheel和i帧image之间的imu即可。而且,在对齐的最后的原创 2021-04-14 13:47:13 · 627 阅读 · 0 评论 -
vins的imu和camera对齐以及预积分计算
imu和image的对齐策略如下图所示:image20hz,imu100hz.每两帧image会对应6帧imu,注意,w6一定会加入进去。在下一帧image中,w6也会加入进去(就变成下一帧image的头),w6会被使用两次。求j帧image对应的imu预积分过程:代码里预积分采用的最简单的中值,un_gyro = 0.5 * (w+last_w)*dt故我们需要知道每段imu当前的w,上一次的w和两者之间的dt1.首先我们确定j帧image对应几组imu数据:w1(wi, idt2),w2(w原创 2021-04-13 15:24:14 · 494 阅读 · 0 评论 -
机器人坐标系的问题
1.坐标系是基于东北天。旋转矩阵是从当前帧到世界坐标系。2.旋转矩阵的定义是,matrix = Rz * Ry * Rx坐标系的表达两种方式1.JPL 左手坐标系 global-to-local 世界坐标系 --> 局部坐标系 (opencv用的是这种)2. Hamilton 右手坐标系 local-to-global 局部坐标系 --> 世界坐标系 (vins-mono用的这种)** 旋转矩阵的推导**旋转矩阵是一个单位正交矩阵,行和列两两正交且为单位阵。不同的旋转顺序得到的旋转矩原创 2021-03-30 13:52:20 · 713 阅读 · 0 评论 -
内存管理
1.不要随意的写空析构函数不写析构函数,编译器会在需要调用析构的时候再帮你生成一个;而写一个空析构函数的话,就一定会在你书写空析构函数的地方生成一个。也就是你写了就用你的。2.尽量用智能指针。...原创 2021-03-16 17:13:38 · 61 阅读 · 0 评论 -
词袋
brief描述子一般Sb=48,Lb为256.brief描述子不具备旋转尺度不变性。词袋将描述子用k-means聚类,原创 2021-02-08 09:00:59 · 329 阅读 · 0 评论 -
tartanAir数据集
一般数据集KITTI使用小车采集数据,在translation和rotation只有两个方向。仿真得到,各个方向可以分布均匀。基本涵盖了常见传感器信息。各种VSLAM算法在tartanAir的表现。ORB失败的场景用该数据训练了一个tartanVO模型。只计算两帧之间的位姿。有两点1.尺度的问题loss的位置部分用只考虑方向,来解决尺度问题。2.不同相机的内参不同问题:把训练图片resize(相当于改变焦距),裁剪(相当于改变cx,cy)加入内参层。这样训练的原创 2021-02-05 16:22:28 · 1765 阅读 · 0 评论