- 博客(80)
- 收藏
- 关注
原创 unix ROS时间戳和北京时间的转换
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。1618037024.299775 rosbag中的10位时间戳的单位为秒, 代表是格林威治时间1970年01月01日到当前时刻总共经过的秒数。...
2023-03-24 15:48:13
1184
原创 图优化在后端优化中的简单理解
这点总结比较重要,不想清楚的话很容易在繁琐的推导中迷失掉,因此这里我们又有了一个新的认识,“前端”关注的是光度误差与重投影误差之类的东西,而这里“后端”关注的是已经知道了不同的位姿T,如何整体对它进行调整,这也就更符合了“后端”的含义。三角形的位姿T1,T2。。。是通过和世界坐标系的比较而得到的,蓝色的边是两个位姿之间相对运动的估计。如何获得T1,T2:世界坐标系的路标点有了,然后根据图像坐标系下的点,估计世界坐标系与图像坐标系下的变换关系,解得位姿,这里的位置是有误差的。如何估计它们的相对运动,也就
2023-03-24 15:47:24
380
原创 IMU随机游走和角速度理解
反对称矩阵就可以找到一个与之对应的向量随机游走可以等效为马尔可夫过程,就是这次的bias是在上次的bias基础上随机变化一个值造成的,而下次的bias是在这次的bias基础上又随机变化一个值得到,经过一段时间的累计,就会有一个大的偏差。加速度计、陀螺仪的观测量都是相对BODY坐标系而言的;但是要求的速度、位置等等量显而易见是相对于一个不变的坐标系而言的,是参考坐标系注意这里的角速度 ω 是在参考坐标系下表达的。物体在惯性系下的加速度=物体在body系下的加速度乘上变换矩阵+科氏力+离心力等等s
2023-03-24 15:39:56
734
原创 舒尔补-边际概率-条件概率
协方差计算公式:cov(x,y)=EXY-EX*EY在本例的信息矩阵中, Λ 13 = Λ 31 = 0 \Lambda_{13}=\Lambda_{31}=0 Λ13=Λ31=0,这意味着变量 x 1 x_1 x1和 x 3 x_3 x3在给定条件 x 2 x_2 x2的条件下是互相独立的,而初始的协方差矩阵二者的对象项并不为零,表示两者的边缘分布并不是独立的。https://b
2023-03-24 15:36:27
432
2
原创 T265相关使用
rs-enumerate-devices1.读取相机内外参信息rs-enumerate-devices -c图像数据发布的Topic 图像数据30Hz/camera/fisheye1/camera_info /camera/fisheye1/image_raw /camera/fisheye2/camera_info /camera/fisheye2/image_rawIMU 数据发布的Topic, 陀螺仪数据200Hz 加速度数据为 63H.
2023-03-24 15:34:24
1089
原创 vins-fusion中为什么是四自由度的优化理解
VINS-MONO 视惯融合的输出参考都是第一帧:将重力对齐到当地水平面使得pitch、roll是已知的,已经得到绝对姿态了,而载体待估计的状态只剩yaw和x、y、z是相对参考坐标系的。不是绝对坐标系下的。所以在位姿优化的时候,只对四个自由度进行优化(回环修正:由于vins系统IMU的使用,使得位姿估计只有4自由度不客观,分别是3自由度的平移和1自由度的yaw角,因此估计系统也只有在这4自由度上发生漂移。可以将在同一坐标系下位姿的漂移看作是该位姿所在坐标系的漂移,这是一个相对的过程。
2023-03-24 15:18:07
371
1
原创 vins-fusion中的GPS和VO融合
一开始假设Tgps<-vio中旋转矩阵为单位阵,平移向量为0,在实际进行融合的时候,重新更新Tgps<-vio=Tgps*Tvio.inverse()坐标系处理就是GPS信息转换到第一个GPS信息为原点的东北天 坐标系里,,即机体系相对BODY系里面的坐标是已知的。根据+-10ms的时间偏差找GPS中的位置信息。理论上该变换矩阵是不变的,因为第一帧都已经确定了,但是在实际解算的过程中,Tvio存在误差,所以是在一直变化的。VIO结果以到第一帧图像的东北天坐标系为参考,和机体系之间的矩阵是已知的,
2023-03-24 15:16:33
594
原创 ROS-in-SLAM
ROS原始的编译和打包系统是rosbuild,而catkin(基本就是创建功能和编译功能包)是现在ROS官方指定的系统。catkin的原理和流程和CMake很类似,与rosbuild相比,它的可移植性,以及对交叉编译的支持更好。roscpp rospy 表示不同语言的接口,都可以用来创建topic等,是package的依赖。
2023-03-24 15:11:38
237
原创 string类的自定义实现
涉及到的内容包括:构造、拷贝构造、赋值、析构、输入输出的重载函数、友元函数 、strlen、 strcpy、 explict关键字。字符串的最后以'\0'结尾,即便是空字符串也需要动态申请一个char的动态空间,存放'\0';strlen统计字符串长度,不计算'\0';strcpy 复制内容,会复制最后一位的'\0';拷贝构造、赋值函数的传入形参是const类型;赋值函数为了能连续赋值,返回值类型是引用型;输入输出的操作符重载同样为了能连续赋值,返回值是引用型;cin、cout.
2022-04-05 14:01:01
361
原创 基于引用计数的shared_ptr的简单实现
//简易版的智能指针 多线程中智能指针的读取对象是不安全的#include <iostream>#include<bits/stdc++.h>using namespace std;template<typename T>//智能指针就是包装了指向T类型的指针class Ptr{public: Ptr(T*p= nullptr):mptr(p){// mcount=new size_t(1);//无论是什么内容都把这个初始值设为1.保证
2022-04-05 13:49:13
710
原创 opencv Mat的一些基础操作
cout<<"value:"<<int(object.mask.ptr<uchar>(track_prev_y)[track_prev_x])<<endl;没有把uchar的ptr转成int型,会输出乱码
2022-01-13 16:24:14
1577
原创 Gdb 调试核心已转存储-调试VINS-FUSION/ORB-SLAM
GDB调试C++工程非ROS1.通过运行可执行程序来进入gdbCMakeLists中的修改: SET(CMAKE_BUILD_TYPE "Debug") SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")#用于进行gdb调试 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")gdb调试指令 (gdb) gdb ./Examp...
2021-12-14 19:00:19
2106
1
原创 快速排序法
partition函数int partition(vector<int >&arr,int l, int r){ int k=rand()%(r-l+1)+l; swap(arr[l],arr[k]);//随机挑选一个元素 int value=arr[l];//直接以最左边的元素为标志位对于近乎有序的数组就会i退化成o(n^2) //arr[l+1...j]>arr[l] arr[j+1..i-1]>arr[l] int j=l
2021-12-13 22:09:53
70
原创 VINS-FUSION的一些理解
关于滑窗中优化变量的理解:Ps 、Vs 、Rs 代表的意义可能很多人还没有清楚,这个强调多少次都不为过!这个值是由IMU机械编排出来的,代表的是 b(k) 坐标系相对与世界坐标系的位置、速度、姿态,而这个k是对应的相机帧,因为相机和IMU是固连的 。而相机和IMU通过Rb_c进行转换的,也就是我们自动外参标定的部分!组织特征点的方式:关键帧选取规则1、当前帧相对最近的关键帧的特征平均视差大于一个阈值就为关键帧(因为视差可以根据平移和旋转共同得到,而纯旋转则导致不能三角化成功,所以这一步需要IMU
2021-12-13 10:27:33
3969
原创 C++ stl容器
1. std::string// string constructor#include <iostream>#include <string>int main (){ std::string s0 ("Initial string"); //根据已有字符串构造新的string实例 // constructors used in the same order as described above: std::string s1; //
2021-12-10 11:20:06
683
原创 线程与进程的对比、互斥锁和条件变量的使用-多线程编程
线程与进程的对比线程的概念是共享CPU的需要,进程概念是共享内存的需要。一个进程里代码段,数据段、堆是共享的,但是进程中的每个线程中的栈、寄存器内容独立;进程都是独立的,通常的IPC,管道,共享内存都可以通讯。处于一个线程的代码觉得它拥有整个CPU,处于一个进程的代码觉得它拥有全部内存条多线程是通过时间片轮询来执行的当某个线程持有这把锁的时候(加锁),该线程就是独占所有的资源,这里指执行的权限,其他要抢夺的资源不得不改变。当线程拥有某把锁开始上锁以后,那么在锁住的区域,资源就被独占了,其他线程
2021-12-10 10:27:03
476
原创 1209数据集和开源代码
https://www.cnblogs.com/CV-life/p/13619828.html第一个「视觉惯性里程计+深度图」 的数据集 && 用VIO实现的无监督深度图补全方法https://github.com/alexklwong/unsupervised-depth-completion-visual-inertial-odometryhttp://www.360doc.com/content/21/0823/11/74116089_992244297.shtmlVIODE:
2021-12-09 21:20:32
1726
原创 ceres优化参数的传递、残差构建时状态量的传递、evaluate函数的使用
误差函数中的参数包括: 已知参数和待优化参数两部分,1. 添加待优化参数ceres::LocalParameterization *local_parameterization = new PoseLocalParameterization();problem.AddParameterBlock(para_Pose[i], SIZE_POSE, local_parameterization);2. 添加残差及需要对待优化参数变来嗯进行雅可比矩阵的计算(解析求导)先加入残差项IMU残差项 I
2021-12-09 20:53:46
6816
原创 VINS-FUSION滑窗数组的大小
滑窗大小是WINDOW_SIZE+1 Vector3d Ps[(WINDOW_SIZE + 1)]; Vector3d Vs[(WINDOW_SIZE + 1)]; Matrix3d Rs[(WINDOW_SIZE + 1)]; Vector3d Bas[(WINDOW_SIZE + 1)]; Vector3d Bgs[(WINDOW_SIZE + 1)]; for (int i = 0
2021-12-09 11:25:09
439
原创 C++string类型和int类型的相互转换
string 转换到int型如果转换的是单个数字 string s = "1234"; s += "null"; std::cout << s[1] << std::endl; //用[]重载得到的元素是char类型的一个元素 auto b = s[1];//得到一个字符 std::cout <<typeid(b).name()<< std::endl; int c = b - '0'; //'1'通过减去'0'
2021-12-08 10:20:28
946
原创 IMU误差传递模型和预积分关于状态的雅可比矩阵
IMU误差传递模型误差传递模型是对误差项关于时间进行求导,可以得到误差项的协方差矩阵,即迭代优化使用的权重,同时可以得到bias关于状态量的偏导预积分的雅可比矩阵速度、角度、加速度的预积分项和陀螺、加表的bias误差量是观测量,关于状态量的偏导就是迭代优化使用的雅可比矩阵...
2021-12-07 22:24:36
645
原创 在clion IDE下进行camke控制及Run/Debug配置。
FILE--->Settings--->Build,Execution,Deployment设置以后类似catkin_make利用clion生成devel、build路径2. ROS环境变量的添加 在小锤子右边点开Edit Configurations进行程序运行/debug设置Program arguments输入程序指令在终端下, env指令可以看到所有能使用的环境变量,可以将ROS等路径加入到clion中。Environment variables...
2021-12-06 20:00:32
1259
原创 git相关操作
基本配置git config --global user.name "zhoushuailin"git config --global usr.email "1009386400@qq.com"git config --list创建仓库clion等编译器打开一个项目工程- 进入一个目录,然后git init- git init test2, 创建目录2的同时创建git仓库然后就会生成.git初始化commit提交,历史记录git status //modified状态就是
2021-11-29 10:59:53
134
原创 滑动窗口之滑动窗口最大值
思路分析:力扣https://leetcode-cn.com/problems/sliding-window-maximum/首先相同题目的比较,字符串和子字符串的相关题目是需要自己利用left、right指针来表示一个自适应的窗口,但是滑动窗口的最大值是不需要设置left、right指针的,直接设置了窗口的大小。所以在代码实现中直接利用if 先把窗口大小k-1进行 赋值,然后else进入窗口的滑动; 实现单调队列实现在窗口内以O(1)的复杂度获取窗口中的队列 「单调队列」数据结构解决滑动窗口.
2021-11-27 15:41:21
850
原创 滑动窗口系列-无重复字符的最长子串
1.什么时候开始收缩窗口,当加入当前元素时出现重复元素2.什么时候更新答案,在没有重复元素的情况下进行更新3.相比寻找最短覆盖子串和字符串的异位词而言,同时无重复字符的最长字串中window中的元素就是left、right指针指向的原大字符串上对应的元素;而寻找最短覆盖子串、字符串的异位词时,window中元素是与要找的子串need中一致的,只有子串中的元素才会加入window中,同时通过valid去判断是否匹配完成; 不需要设定need容器、valid进行比较,直接根据window关于字..
2021-11-27 13:50:49
119
原创 滑动窗口系列-找到字符串中所有字母异位词
整体的框架基本类似寻找最小覆盖字串。这里的几个特殊需要注意的点:1. 什么时候窗口进行收缩利用right-left>=p.size()判断条件作为收缩条件,因为一开始[left,right)是左闭右开的区间,right在移动的时候先进行窗口的滑动(right++),那么在right-left的时候就是window中放入数据的个数了,window.size()!=right-left,因为可能存在重复元素2.需要把left放入数组的返回值class Solution {publ.
2021-11-27 11:09:25
453
原创 滑动窗口系列-寻找最小覆盖字串
总结:need容器中存放的是需要覆盖的字串,包括字符和对应的字符数量1.用最小覆盖字符串在原字符串中的首字母位置和最小覆盖字符串的长度表示最小覆盖字符串;2.左、右指针的含义是指向原字符串的左右位置上的,是原字符串的一段数据;3.window窗口中保存的是左、右指针所指数据段上符合要求的数据(在need容器中);4.右指针往右进行数据的扩大,寻找可行解;左指针往右进行数据的缩小,寻找最优解;5.指针变化的时候怎么更新window窗口中的数据,要先根据need容器判断当前指针指向的数据是否需要加
2021-11-26 21:09:48
106
原创 动态slam可能后面能用的上的东西
SOF-SLAM:一种面向动态环境的语义视觉SLAM(2019,JCR Q1,4.076)_JinLn的博客-CSDN博客首先利用语义信息得到一个相对可靠的基本矩阵F,然后通过几何约束来检测真实的动态特征。在我们的方法中,基本矩阵是将这两个信息源连接在一个统一框架中的桥梁,并且只需决定一个特征是否是动态的。首先利用SegNet得到运动先验,然后在计算从当前帧到当前帧的最后一帧的光流时,用运动先验作为掩模去除动态和潜在动态特征的对应关系。只保留可靠的对应关系,如图8所示。然后使用语义静态特征的对应而不
2021-11-17 11:26:10
1471
原创 误差状态方程与雅可比矩阵
在惯性的优化中包括p、v、q、ba、bg、外参等等优化变量 。预积分量由陀螺、加计的示数得到,以及陀螺、加计的白噪声、偏置。可以先将白噪声从预积分量中剥离出来,作为预积分量测的协方差阵;计算预积分关于偏置的雅可比矩阵,用于预积分的更新。从而能够避免重复计算预积分项。在后端优化迭代的时候,当对优化变量更新的时候,ba、bg发生了变化,那么预积分量就需要重新进行更新;同时惯性数据计算预积分量产生约束的时候,为了更加契合紧耦合的概念,预积分需要有一个权重,就把预积分协方差的倒数作为信息阵。所...
2021-11-16 14:39:36
2152
原创 预积分的理解
常见的视惯解算系统中应用到的两种传感器是相机和IMU惯性测量单元,IMU频率很高,可能有200Hz的频率,而相机的频率明显要低很多,可能只有大约30Hz。而且视觉图像帧常常会采用关键帧策略,在视觉图像信息融合的时候是会以视觉的频率为参考。在优化求解的时候,优化了关键帧i的位姿,如果直接利用IMU、加速度计示数进行积分的时候,解算的是i->j相对于世界坐标系的位姿变换,那么i后面的帧都需要重新进行积分。而预积分解算的是相对位姿,就不用全部重新进行积分。关键:如果利用两关键帧之间不同时刻的惯性、加
2021-11-15 20:57:11
4160
原创 GoogleStyle编程代码规范
https://google-styleguide.readthedocs.io/zh_CN/latest/google-cpp-styleguide/headers.html#self-contained1.4内联函数定义:当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.优点:只要内联的函数体较小, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.缺点:滥用内联将导致程.
2021-11-10 10:41:06
817
原创 二叉树的基本算法
二叉树的先序遍历就是每棵子树,都是先出现头结点、再左子树、再右子树。递归序列!!! 一定会到达这个Node节点三次,也表明了有三个位置进行Node数据的处理,前中后每个节点都是这样。先序就是第一次到达某个节点就打印中序就是第二次到达某个节点就打印后序就是第三次到达某个节点再打印。二叉树可以先去左边树上转一圈,再回到中间节点,再去右边树上转一圈,可以进行信息的整合。f(Node){ if(Node==NULL) return; // 1 ...
2021-11-09 21:19:19
1278
原创 相机模型及相关实现
/** * \brief Lifts a point from the image plane to its projective ray * * \param p image coordinates * \param P coordinates of the projective ray * 包含去畸变过程,从(畸变)图像获得像素通过内参的反变化获得畸变相机系上的畸变三维坐标再减去畸变量才是真实三维坐标点 */voidPinholeCamera::liftProjective(const.
2021-09-26 11:30:12
317
原创 基于ROS利用客户端和服务端实现C++节点和python节点间传送图像
基于ROS利用客户端和服务端实现C++节点和python节点间传送图像配置ROS下和python3通信以及配置python3可用的cv_bridge环境安装和使用参考:https://blog.csdn.net/qq_33445388/article/details/116034290sudo apt-get install ros-melodic-cv-bridge python-catkin-tools python3-dev python3-catkin-pkg-modules pyt
2021-09-17 21:28:51
965
1
原创 #743 网络延迟时间
class Solution {public: struct cmpNode //仿函数 { bool operator()(pair<int, int>& a, pair<int, int>& b) { return a.second > b.second;//最小堆的比较函数 } }; vector<int> dijkstra(int .
2021-09-15 20:52:13
64
原创 Dijkstra
// 返回节点 from 到节点 to 之间的边的权重int weight(int from, int to);// 输入节点 s 返回 s 的相邻节点List<Integer> adj(int s);// 输入一幅图和一个起点 start,计算 start 到其他节点的最短距离int[] dijkstra(int start, List<Integer>[] graph) { // 图中节点的个数 int V = graph.length; ..
2021-09-14 10:13:25
88
原创 SLAM 基础知识点和相应的理解链接
极线约束、单应矩阵、3D-2D等等(13条消息) 视觉里程计:2D-2D 对极几何、3D-2D PnP、3D-3D ICP_一抹烟霞的博客-CSDN博客vins-mono解读与实现(13条消息) VINS-mono详细解读与实现_格物致知-CSDN博客
2021-09-11 10:18:10
71
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人