lite_slam - ScanContext
参考网址:peitianyu/lite_slam (github.com)
scan_context | 某飞行员的随笔 (peitianyu.github.io)
ScanContext代码流程1234567891011- 构建KeyFrame(id, pose, key, scan_context) - 输入(id, pose, scan)MakeScanContext构造scan_context - 这里key使用scan_context在ring方向上pca构造- AddKeyFrame添加关键帧用于之后的匹配- DetectLoopClosure()寻找回环id并输出回环坐标- 关键: * scan_context构建 * key构建 * nanoflann构建kdtree并搜索key * AlignScanContext()对齐scan_context获得先验坐标
原理简述12341. 将距离分成60份,角度分成60份,组成60*60矩阵,然后对距离pca化得到60维向量2. 通过kdtree搜索key找到回环3. 通过对齐60*60矩阵找到粗匹配,距离偏差与角度偏差,得 ...
lite_slam - PoseGraphOptimize
参考网址:peitianyu/lite_slam (github.com)
versatran01/graphslam: graphslam (github.com)
参考文献1A Tutorial on Graph-Based SLAM
GraphOptimize1234- 使用了Cholesky分解加速- 优化方向: - 由于使用的是scan_points具有角度不变性,因此可以将3 * num的H,降低为2 * num,降低计算量 - 加入残差判断
流程123456789void AddVertex(const uint &id, const Eigen::Vector3f &pose); // 添加顶点 std::map<uint, Eigen::Vector3f> vertexvoid AddEdge(const uint &from_id, const uint &to_id, const Eigen::Vector3f &measurement, const Eigen::Matrix3f &info_ma ...
滤波-互补滤波
参考网址 (139条消息) 一阶互补滤波_求索_free的博客-CSDN博客_一阶互补滤波
互补滤波基本公式123new_data = a * new_data + (1 - a) * last_data;// a为时间常数,可以通过两次采样时间来确定a = T / (T + dt);
非阻塞检测键盘
参考网址 (138条消息) 嵌入式linux:getchar() 非阻塞_起点的博客-CSDN博客_getchar 非阻塞
程序1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192//由于getchar() 函数会一直阻塞,网上搜到下面的函数来实现非阻塞的读取。实际使用的时候只需要调用kbhit() 函数即可。其他函数没有看是什么意思#include <stdio.h>#include <string.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>#include <termios.h>#include <unistd.h>st ...
vscode配置cmake调试
参考网址: (137条消息) Ubuntu下VsCode和CMake联合调试C++工程_还没想好~的博客-CSDN博客
(137条消息) Ubuntu下VSCode+Cmake配置开发环境_Stone_OverLooking的博客-CSDN博客
步骤安装gdb12# Unable to start debugging. Launch ...... apt-get install gdb
cmake配置12345# 设置编译模式set( CMAKE_BUILD_TYPE "Debug" )set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")add_definitions(-std=c++11)
编译123mkdir buildcd buildcmake .. && make -j8
...
C++编译问题
error: extra qualification (136条消息) c++ extra qualification_沈纵情的博客-CSDN博客_extra qualification
error: extra qualification ‘int_item::’ on member ‘to_editor’ [-fpermissive]
将int_item::去掉即可
MinUnit - C
参考网址https://mp.weixin.qq.com/s/CklfQPoyvJCKv8ohu-oqOw
例程12345// minunit.h#define mu_assert(message, test) do { if (!(test)) return message; } while (0) #define mu_run_test(test) do { char *message = test(); tests_run++; \ if (message) return message; } while (0) extern int tests_run;
12345678910111213141516171819202122232425262728293031323334353637// test.cc #include <stdio.h> #include "minunit.h" int tests_run = 0; int foo = ...
shenlan_vio_course:03IMU预积分
参考网址 cggos/shenlan_vio_course: 深蓝学院《视觉SLAM进阶:从零开始手写VIO》第一期 (github.com)
imu预积分解析
多传感器融合定位理论基础(十一):IMU预积分模型及应用 - 知乎 (zhihu.com)
【Momenta Paper Reading】第七期 预积分(Preintegration)_哔哩哔哩_bilibili
关于imu预积分理解1231. 由于imu在关键帧内,无法标定零偏,所以无法更新imu状态量[R, p, v, b]2. 需要通过其他手段更新imu(视觉,或者激光等), 所以形成了紧耦合3. 通过更新离散化,即可得到与状态量间残差[dR, dp, dv]
具体推导
shenlan_vio_course:02IMU标定
参考网址 cggos/shenlan_vio_course: 深蓝学院《视觉SLAM进阶:从零开始手写VIO》第一期 (github.com)
【传感器标定】IMU - 知乎 (zhihu.com)
误差来源
标定方法
Allan方差标定imu_utils
原理: 多传感器融合定位理论基础(三):惯性器件误差分析 - 知乎 (zhihu.com)
梯度下降迭代优化标定 Kyle-ak/imu_tk (github.com)
shenlan_vio_course:01四元数与李代数更新估计值
参考网址 cggos/shenlan_vio_course: 深蓝学院《视觉SLAM进阶:从零开始手写VIO》第一期 (github.com)
代码1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950#include <iostream>#include <Eigen/Core>#include <Eigen/Geometry>#include <sophus/so3.cpp>/** * @brief Eigen::UnitRandom(), ref: http://planning.cs.uiuc.edu/node198.html * @return */Eigen::Quaterniond unit_random() { double u1 = rand() / double(RAND_MAX); // [0, 1] double u2 = rand() / double(RAND_ ...