自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 资源 (3)
  • 收藏
  • 关注

原创 使用LQR做轨迹跟踪

之前的轨迹跟踪的方法有些问题,最近换了LQR,具体的实现太细的理论也有人写过了,去看一下LQR、欧拉法、黎卡提相关的知识就好,区别是修改了一下模型,网上的大部分都是阿克曼模型的,我们是双轮差速的,然后重写了控制的类,主要调用部分自己的代码不方便给出来还用的网上的。U LQRController::LimitSpeed(U control_value) 删了,这块是怕实际车反馈、控制达不到加的。以下是仿真视频,绿色线是给定轨迹,红色点是控制机器人走的位姿。最后如果嫌弃走起来在拐角处线速度有停顿可以把。

2024-02-18 16:51:42 1008

原创 双轮差速模型机器人通过线速度、角速度计算机器人位姿

可能非常小,导致非线性部分数值不稳定, 因此可以对以上部分做泰勒级数展开,我们只做一阶泰勒展开。),短时间内t内,机器人在线性部分和非线性部分的增量为。已知上一时刻机器人位置P_OLD (x,y,),机器人当前时刻的线速度和角速度(v,

2023-10-31 13:04:55 529

原创 无偏估计协方差和运行协方差

在我们计算里程计的协方差时,由于只需要关心短时间里程的数据,所以通常取N个数据计算它们的协方差就行,不需要取之前所有的数据,所以此时用无偏估计和滑动估计都可以。无偏估计: 无偏估计是一种估计协方差的方法,它考虑了所有可用的数据点,并提供了无偏的估计结果。这种方法考虑了所有数据点,通过均值对每个数据点与均值的离差的乘积来计算协方差。其中,N是数据点的总数,X和Y分别是两个随机变量的数据,X̄ 和 Ȳ 分别是它们的均值。其中,N是数据点的总数,X和Y分别是两个随机变量的数据,X̄ 和 Ȳ 分别是它们的均值。

2023-10-23 14:29:06 613

原创 Ubuntu18.04 Teamviewer远程卡通过xorg创建虚拟屏幕

重启后默认进虚拟屏幕,此时如果接上hdmi是没有显示的,如果需要hdmi有显示,需要修改刚刚新增的文件名。

2023-10-18 09:31:47 524 1

原创 Cpp-netlib部分移植到20.04(更新boost版本)

1. xxx-cpp-netlib部分移植到20.04, 由于1.7以下的boost 都是用的io_service,1,7以上用的io_context,所以要把 websocketpp部分换掉 从这里拉一下代码。然后把原来代码里的三个头文件扔进去,websocket_client.h,websocket_fwd.h,websocket_server.h ,主要注意一下有没有改动,我还没看。这里就自己看看就好,手滑进来的可以不用浪费时间看了。这个是适配了boost的版本的。其他没了,做的时候再说。

2023-07-28 17:55:41 144

原创 linux中查询对应线程的线程id

linux中查询对应线程的线程id

2023-04-21 15:33:26 1320

原创 Ubuntu进emergency mode 解决方案

Ubuntu进emergency mode 解决方案

2023-03-17 17:36:37 240

原创 单线激光雷达检测玻璃并把玻璃内的点插值替换为墙体

rt

2023-02-15 16:55:57 478 2

转载 RealsenseD435驱动

realsense d435驱动 sop

2022-10-24 11:36:10 428 3

转载 linux中ulimit的作用

一、作用Linux对于每个用户,系统限制其最大进程数。为提高性能,可以根据设备资源情况,设置各linux 用户的最大进程数。ulimit主要是用来限制进程对资源的使用情况的,它支持各种类型的限制,常用的有:内核文件的大小限制进程数据块的大小限制Shell进程创建文件大小限制可加锁内存大小限制常驻内存集的大小限制打开文件句柄数限制分配堆栈的最大大小限制CPU占用时间限制用户最大可用的进程数限制Shell进程所能使用的最大虚拟内存限制有个疑问:服务器资源是有限制

2022-05-27 08:36:09 6379

原创 ORB-SLAM2 LoopClosing.cc 读代码

这块是看其他地方的时候看到了,所以提前来先写点,这篇写不完会拖几天,先能写多少写多少一、计算当前关键帧和上一步闭环候选关键帧Sim3变换/** * @brief 计算当前关键帧和上一步闭环候选帧的Sim3变换 * 1. 遍历闭环候选帧集,筛选出与当前帧的匹配特征点数大于20的候选帧集合,并为每一个候选帧构造一个Sim3Solver * 2. 对每一个候选帧进行 Sim3Solver 迭代匹配,直到有一个候选帧匹配成功,或者全部失败 * 3. 取出闭环匹配上关键帧的相连关键帧,得到它们的地.

2022-05-26 18:45:37 172

原创 ORB-SLAM2 ORBmatcher.cc读代码一

这块是看其他地方的时候看到了,所以提前来先写点,这篇写不完会拖几天,先能写多少写多少一、单目初始化中用于参考帧和当前帧的特征点匹配/** * @brief 单目初始化中用于参考帧和当前帧的特征点匹配 * 步骤 * Step 1 构建旋转直方图 * Step 2 在半径窗口内搜索当前帧F2中所有的候选匹配特征点 * Step 3 遍历搜索搜索窗口中的所有潜在的匹配候选点,找到最优的和次优的 * Step 4 对最优次优结果进行检查,满足阈值、最优/次优比例,删除重复匹配 * Step

2022-05-24 18:00:44 354 1

原创 ORB-SLAM2 Frame.cc部分读代码 三

这块代码终于快看完了,还剩单目、RGBD 帧的初始化,计算RGBD的立体深度,像素坐标反投影到3D坐标 这几块了,这一章都写完。一、计算RGBD图像的立体深度信息void Frame::ComputeStereoFromRGBD(const cv::Mat &imDepth) //参数是深度图像void Frame::ComputeStereoFromRGBD(const cv::Mat &imDepth) //参数是深度图像{ /** 主要步骤如下:.对于彩色图像中..

2022-05-24 13:43:04 372

原创 ORB-SLAM2 Frame.cc部分读代码 二

一、计算去畸变图像的边界void Frame::ComputeImageBounds(const cv::Mat &imLeft)void Frame::ComputeImageBounds(const cv::Mat &imLeft) { // 如果畸变参数不为0,用OpenCV函数进行畸变矫正 if(mDistCoef.at<float>(0)!=0.0) { // 保存矫正前的图像四个边界点坐标: (0,0) (cols,0) (.

2022-05-23 18:31:19 552

原创 ORB-SLAM2 Frame.cc部分读代码 一

写这块的原因是开始看到ORB的特征匹配,这块会同时和Frame.cc,ORBmatcher.cc,Tracking.cc,LoopClosing.cc相关,这篇先讲与Frame.cc相关的部分,后面再把Frame.cc 补全,其他部分也是一样。一、双目帧的构造函数Frame::Frame(const cv::Mat &imLeft, const cv::Mat &imRight,....)Frame::Frame(const cv::Mat &imLeft, const .

2022-05-20 10:58:33 457

原创 ORB-SLAM2 Tracking 部分读代码三

一、检查上一帧中的地图点是否需要被更换 void Tracking::CheckReplacedInLastFrame()void Tracking::CheckReplacedInLastFrame(){ for(int i =0; i<mLastFrame.N; i++) { MapPoint* pMP = mLastFrame.mvpMapPoints[i]; //如果这个地图点存在 if(pMP) {

2022-05-18 15:29:14 392

原创 ORB-SLAM2 Tracking 部分 读代码 二

接着上面的开始讲,剩下的先从构造开始一 、Tracking的构造函数先贴代码Tracking::Tracking( System *pSys, //系统实例 ORBVocabulary* pVoc, //BOW字典 FrameDrawer *pFrameDrawer, //帧绘制器 MapDrawer *pMapDrawer, //地图点绘制器

2022-05-18 14:38:37 755

原创 ORB-SLAM2 Tracking 部分读代码一

这里没有从构造开始说,这篇当草稿,想到哪里写哪里,刚开始看应该会有写错的,在意的别看一、通过恒速模型使用上一帧的地图点来跟踪当前帧bool Tracking::TrackWithMotionModel(){ // 最小距离 < 0.9*次小距离 匹配成功,检查旋转 ORBmatcher matcher(0.9,true); // Update last frame pose according to its reference keyframe // Cr

2022-05-16 17:46:47 719

原创 ORB-SLAM读代码

自己用,后面看多少接着再补ORB-SLAM2读代码 先只看 Tracking单看 mono_tum.cc 中间各种文件打开及opencv调用的部分不说mono_tum.cc 中 ORB_SLAM2::System 进System.cc构造 先初始化追踪线程,调用 new Tracking(this, //现在还不是很明白为什么这里还需要一个this指针 TODO ...

2022-05-12 15:38:53 174

原创 简单的卡尔曼滤波器

讲到这里还是得感谢苏博,一开始我是稀里糊涂的,跟着他学了会,有一点明白了。为啥要讲这个呢?别人做了个底盘,结果odom反馈老有问题,没办法了,滤个波吧。讲一下前提: matlab的版本是linux 2015b的,其他的话会搞 bag2mat(这个怎么用的我也写了个教程)或者你有本事把要看的数据丢表格里都行。代码一会丢出去,我写的不好,不怎么专业。插个嘴,整篇都是用Matlab写的,看完的话自己移植到其他平台上也蛮简单的。基础: 1. 得会把表格或者.mat文件导入到Matlab里,点

2022-04-28 15:36:31 260

原创 将ROS的包提取给Matlab用

1.下载 bag2mat工具。https://github.com/neufieldrobotics/bag2mat这个一会我单独传上去2.解压后放在工作空间下,使用catkin_make进行编译。mkdir -p your_project_path/srccd your_project_path/srccatkin_init_workspacecd ../到 your_project_pathcatkin_make编译的时候缺什么下什么3. source devel

2022-04-28 15:05:40 679

原创 imu标定

这里主要会写低端MEMS IMU通过imu_tk进行标定,然后写一下拿到 校准参数后怎么使用我用的是imu_tk做标定的,下载链接这里GitHub - Neil-Oyoung/imu_tk: ROS Wrapper for imu_tk(这是ros版的,要c++版的github上直接搜)一、imu_tk使用流程编译不说了(这里依赖QT4,我还没有去掉),只记录使用教程,imu的标定主要会求加速度计和陀螺仪的确定误差bias,scale,misalignment,以及随机误差noise和ran..

2022-04-20 08:40:25 2517 4

原创 结构光与TOF的对比区别

根据使用场景判断使用机构光还是tof的相机。一、概述结构光(Structuredlight),通常采用特定波长的不可见的激光作为光源,它发射出来的光带有编码信息,投射在物体上,通过一定算法来计算返回的编码图案的畸变来得到物体的位置和深度信息,镜头需要定制镜头或者特殊镜头设计。光飞行时间法(TOF),利用测量光飞行时间来取得距离,简单来说就是,发出一道经过处理的光,碰到物体以后会反射回来,捕捉来回的时间,因为已知光速和调制光的波长,所以能快速准确计算出到物体的距离。相对结构光方案,TOF的3D

2022-04-13 11:15:38 6212

原创 Cartograoher后端之PoseGraph2D中的线程池与工作队列

到了这里要开始讲Cartographer各部分与线程池和工作队列相关的地方了,这部分分为添加线程池的构造、添加工作队列、处理工作队列等。这里没讲全,重要一点的部分后面会单独开个专栏去讲,后面的专栏主要偏向实际应用时补充的功能,会比较贵,不喜勿喷,都是花时间弄的,熟人直接找我就行了不收费的。PoseGraph2D中线程池的构造thread_pool_由 MapBuilder构造时传入, thread_pool_的构造时传入最大线程个数的参数。一、添加工作队列AddWorkItemcon.

2022-04-09 11:26:00 363 1

原创 Cartographer后端之Ceres优化

看这篇之前,要是一点都没看过 Ceres ,看一下这里 ,都写在注释里,直接看注释Ceres优化库_羊狗狗一只2022年的博客-CSDN博客cartographer后端的优化由两部分组成一、Ceres_scan_matcher_2d.cc中的Match方法这里主要对激光算出来的概率、平移、旋转做优化,优化的部分主要为推测出来的,其中针对激光数据同时优化,第二部分对计算的x,y和预估的x,y进行优化,第三部分对计算的和预估的进行优化。1.通过激光数据对优化部分 problem.Ad

2022-04-09 11:15:09 2341 1

转载 Ceres优化库

这里直接给别人写的链接,这些看完大概能会用了,太细节的东西后面有空了,找个时间细写吧。Problem类Ceres详解(一) Problem类_yuntian_li的博客-CSDN博客_addresidualblockCostFunctionCeres详解(二) CostFunction_yuntian_li的博客-CSDN博客_ceres costfunction最小二乘问题构建与求解Ceres详解(三)最小二乘问题构建与求解_yuntian_li的博客-CSDN博客_ceres 最

2022-04-09 10:42:46 512

原创 Cartographer后端之PoseGraph2D二

这部分主要开始讲代码了,以下接口可根据需要自行修改,由于公司原因,只讲官方源码,自己做的地方等哪天想不起来自己看把,写的这些基本都是怕之后很久不做忘了。一、参数部分类型PoseGraph2D是从类PoseGraph派生而来的,而PoseGraph又继承了接口类PoseGraphInterface。类PoseGraph和类PoseGraphInterface都是抽象类,定义了很多纯虚函数,并没有定义任何成员变量。而PoseGraph2D则是用于2D建图的实现,下表列举了它的成员变量。 我们所关心的

2022-04-09 10:32:31 597

转载 Cartographer后端之PoseGraph2D一

这部分比较多,后面会分两块单独来说明,我们先简单的说明算法原理和各个类中变量的意义,再在之后的文档中解释各个方法的意义。这块很多都抄了这里无处不在的小土(因为他写的太好了)。对象map_builder在它的构造函数中就用类型PoseGraph2D例化了对象pose_graph, 它是后端完成闭环检测以及全局优化的关键对象。在研究该对象之前, 我们还是先回到Cartographer的总体框架上来,总体了解一下Global SLAM的任务。 下图是从总体框图中抠下来的关于Global SLAM的框图。原图中

2022-04-09 10:15:14 766

原创 Cartographer之前后端入口GlobalTrajectoryBuilder

这部分的功能是将前端的子图、位姿信息给后端进行闭环检测和全局优化。下面解析代码,只分析2D情况下的LocalTrajectory2D和PoseGraph2D类。1.构造函数 GlobalTrajectoryBuilder/** * @brief GlobalTrajectoryBuilder的构造 * @param local_trajectory_builder 记录了轨迹跟踪器,是前端的核心类型 * @param trajectory_id 轨迹索引 * @param pose_

2022-04-09 10:07:26 452

原创 Cartographer前端之local_trajectory_builder_2d.cc

其中红色框圈起来的则是local_trajectory_builder_2d所处理的所有内容和流程,其输入仅为激光数据(点云)、odometry,Imu DATA。而经过一系列处理后输出结果为cartographer定义的InsertionResult结果类,包含了时间戳、当前机器人位置、submap及在世界坐标的位置、激光点云结合等。即经过前端处理可以得到一系列的submap,如此后续其他模块可将submap进行后端处理拼接形成整个地图。整体处理流程如下:1.激光原始数据预处理融合转换成...

2022-04-08 17:34:09 1664

转载 Cartographer前端之real_time_correlative_scan_matcher_2d

cartographer的几个scanmatcher这里说的蛮好的,但是real_time_correlative_scan_matcher这是没有用到高/低分辨率地图以及分支定界算法的。(也可能是我没看明白)先看一下这个文档!!!!!!!!Real-Time Correlative Scan Matching完全解析(CSM帧匹配算法)总的来说real_time_correlative_scan_matcher就是给定先验位置、点云、概率地图、搜索边界然后打散点通过概率地图的得分和再获取最..

2022-04-08 17:18:36 1202 2

原创 Cartographer前端之位姿推测器pose_extrapolator.cc

pose_extrapolator 主要用于融合里程、IMU和历史位置的输出,目前我用的版本是 2021.05.07 master branch,在旧的tag 0.2.0上是有ukf的,后来的版本没有ufk了。cartographer 算法中提供了一个位置和姿态估计器,其主要作用是在前端匹配时作为预测位置的输入,即可认为是匹配的初始位置和姿态。在前面已经详细讲解了前端scan math的三种方法,其中前端的优化匹配和相关匹配一定程度上依赖于初始位姿,因此获取预测位置十分重要。获取预测的位置方式有许多

2022-04-08 16:50:00 1299

原创 Cartographer基础之Scan、Node、Submap、Trajectory

一、Cartographer 中 scan、node 、submap、trajectory之间的关系每条trajectory由多个submap组成,每个submap由多个node组成,每个node由一帧或多帧scan得到。二、SCANScan 通过LocalTrajectoryBuilder2D::AddRangeData( const std::string& sensor_id, const sensor::TimedPointCloudData& unsync

2022-04-08 16:26:11 1671 1

原创 C++基础之仿函数和lambda表达式

一、仿函数我们先从一个非常简单的问题入手,来了解为什么要有仿函数。假设我们现在有一个数组,数组中存有任意数量的数字,我们希望能够统计出这个数组中大于 10 的数字的数量,你的代码很可能是这样的:...

2022-04-08 16:00:40 6842 1

转载 C++基础之std::map

Cartographer中要用到这里,之前都是直接用,了解不深,现在补,这里是纯搬的,手写一遍加深印象,源地址如下:参考 std::map 容器使用详细说明_学之之博未若知之之要知之之要未若行之之实的博客-CSDN博客_std::map使用概述:Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织.

2022-04-08 15:36:04 31193

原创 Cartographer总览

本文目的大概的讲一下整个代码框架,本来是想尽量这一篇写详细一点,后来时间不够了,而且一篇太长了阅读太难受,后面拆成了好多章去讲,这篇主要是拆官方文档,之后的篇章东西我也没有很透彻,有错误的地方欢迎指正。从这章开始,借鉴了很多大佬的精华:1.无处不在的小土2.南北粉面馆3.火种源码的机器人4._Leveon下面开始解读代码一、算法概述官方文档(这里要翻墙,基本下面也就是照着官方文档说的,可以把下面当成官方文档的翻译)Cartographer 可以被视为两个独立但相关

2022-04-08 15:07:45 4437 2

原创 Cartographer环境配置

以下除日志部分和我自己有关外,其他都是开源的一、配置依赖环境sudo apt-get install -y google-mock libboost-all-dev libeigen3-dev libgflags-dev libgoogle-glog-dev liblua5.2-dev libprotobuf-dev libsuitesparse-dev libwebp-dev ninja-build protobuf-compiler python-sphinx ros-kinetic-tf2-e

2022-04-08 13:59:54 506

Matlab 卡尔曼滤波

帖子下https://blog.csdn.net/YGG12022/article/details/124474623?spm=1001.2014.3001.5501 的代码

2022-04-28

把ros下的bag转换成.mat数据

ts

2022-04-28

ceres-solver-1.14.0

ceres-solver-1.14.0

2022-04-08

空空如也

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

TA关注的人

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