自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(160)
  • 资源 (4)
  • 收藏
  • 关注

原创 Pure Persuit算法基础

Pure Persuit算法本身的原理不难理解,它主要基于几何原理进行的设备控制,本身不考虑太多的运动学约束。同时机器人的路径跟踪效果应该会比较依赖于预瞄点。对于曲线部分而言,如果曲率很小而预瞄点很远的话,对于曲线的跟随性应该会很差。对于直线而言,如果设备在开始时与轨迹有横向偏差,则在运动过程中机器人会逐渐收敛到曲线,但是收敛速度取决于预瞄点距离。

2024-07-23 15:22:25 918

原创 贝塞尔曲线基础

贝塞尔曲线于1962年由法国工程师皮埃尔·贝塞尔(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau于1959年运用de Casteljau演算法开发,以稳定数值的方法求出贝兹曲线。

2024-07-15 18:03:57 816

原创 ROS中不同文件之间的引用小结

在比较大的一些程序中,往往会涉及到一些不同模块的调用,如果这些东西放在一个.cpp文件内,这个文件会变的特别长,因此会使用多个文件互相引用。那么如何在ROS下进行这种不同文件下的引用呢,根据最近所学,简单记录一份笔记。

2024-07-08 20:18:40 806

原创 cartographer代码学习-扫描匹配(暴力搜索)

暴力搜索在cartographer中主要用于根据给定的预测位姿在一定范围内寻找最有可能为最优解的大体位置,但是由于它不涉及到优化内容,所以得到的结果是有一定误差的(一个分辨率栅格内),所以根据这个结果还需要调用ceres匹配方式进一步获取最优解。同时,由于它需要不断进行栅格的遍历与计算,所以它的计算量也是想对较高的,如果搜索框给的比较大但是栅格分辨率又给的比较小的话就会需要进行非常久的搜索才能得出结果。

2024-07-01 17:27:33 1103

原创 栅格地图、障碍物地图与膨胀地图(膨胀地图(二)写一张膨胀地图)

前面看完了膨胀地图相关的内容,这里根据前面看过的内容手搓一张膨胀地图试一下。

2024-06-19 18:43:11 1230

原创 栅格地图、障碍物地图与膨胀地图(膨胀地图(一))

前面看过了静态地图与障碍物地图,但是对于路径规划而言,这两个地图是不够的,还需要第三张地图,也就是膨胀地图。膨胀地图的意思还是比较好理解的,就是将地图的障碍物进行膨胀。为什么要这么操作呢,主要是考虑路径规划时,对于静态地图而言,不太好进行路径规划,因为一个栅格点虽然它可能是空闲的,但是如果它离障碍物很近的话,实际上这个点机器人是不能到达的,所以我们需要对地图按照机器人半径进行膨胀,这样子剩下的点才是真正可以运动的区域。在move_base中,膨胀地图的内容不算多,只有简单的几个函数,这里简单看一下。

2024-06-02 13:52:29 1226

原创 栅格地图、障碍物地图与膨胀地图(障碍物地图(三)写一张障碍物地图)

花了不少时间看完了障碍物地图的大致思路,这里简单根据前面的思路来写一个简易版的障碍物地图。

2024-05-14 20:57:57 525

原创 栅格地图、障碍物地图与膨胀地图(障碍物地图(二))

上一篇大致看完了障碍物地图的初始化内容以及对于传感器数据的处理,我们知道在该部分算法维护了一个ObservationBuffer,其中存储了一段时间内的点云数据。每次新的数据进来后,还会根据设定的时间参数observation_keep_time抛弃比较久远的障碍物点云。但是在看的过程中,我们也产生了一些疑惑,比如ObservationBuffer本身维护的是一系列世界坐标系下的pointcloud,它跟栅格地图之间是如何结合的?又比如在维护ObservationBuffer时,每一帧点云

2024-05-06 17:51:44 1297

原创 栅格地图、障碍物地图与膨胀地图(障碍物地图)

前面我们看完了栅格地图,知道了地图的基本数据结构,今天进一步的看一下障碍物地图。障碍物地图的存在更多是用于局部路径规划中所使用,因为大部分时候全局地图都是比较大的,那么很难保证其始终是一成不变的,所以如果我们只是按照全局地图进行路径规划,很可能会出现原有的地图中没有障碍物时,突然出现了一个障碍物,那么此时仅使用静态地图就容易出错,而同时考虑障碍物地图的话可以将这些新增的障碍物考虑进去,那么在做路径规划时就可以更好的避免一些原本不存在的障碍物阻挡设备运行的情况。

2024-04-25 18:18:11 1203

原创 栅格地图、障碍物地图与膨胀地图(栅格地图)

在ROS中,地图是非常基本的元素,特别对于2D激光SLAM而言,栅格地图可以说是必不可少的元素。机器人在需要前往目标点时,需要在栅格地图中找到一条合适的路径从当前点到达目标点,这部分内容在move_base中有了详细的接口,可以直接调用并返回路径。但是作为一名工程师,不仅要知其然更要知其所以然,正好最近重新看了下这部分的内容,在此简单对地图这块的处理简单作个笔记,以备后续翻阅。熟悉move_base的开发者会知道,在ROS中,地图大致可以分为三张:栅格地图、障碍物地图与膨胀地图。

2024-04-18 19:07:38 1753

原创 cartographer代码学习-概率栅格地图(栅格地图的更新)

在cartographer中,地图的更新是很重要的一部分内容,如何将一帧一帧的激光点云转换成子图,则是其中的核心部分。

2024-04-14 16:58:56 747

原创 cartographer代码学习-概率栅格地图(ActiveSubmaps2D与Submaps2D)

概率栅格地图是二维激光SLAM的特点,能够将环境通过地图的形式表达出来。栅格地图的实现是二维激光SLAM的一个难点三维激光SLAM形成的点云地图不需要自己手动实现点云的数据结构,PCL中有写的数据类型,直接调用就行。视觉SLAM形成的点云也可以用PCL实现。二维激光SLAM的栅格地图需要自己动手实现,目前所有的二维激光SLAM中的栅格地图都是SLAM作者自己写的,没有通用的数据结构。1.1、ActiveSubmaps2D这个对象主要在LocalTrajectoryBuilder2D这里被使用第一

2024-04-05 11:59:49 698

原创 向量法求点在直线上的投影

已知直线上两点a、b和直线外一点p,求p在直线ab上的投影点。

2024-03-28 20:10:20 749

原创 std::shared_ptr与std::make_unique在类函数中的使用

在最近学习cartographer算法的时候,发现源码中大量的使用了std::shared_ptr与std::make_unique,对于这些东西之前不是很了解,为了更好的理解源代码,因此简单学习了一下这块内容的使用,在这里简单记个笔记。

2024-03-21 23:02:07 1023

原创 cartographer代码学习-第一帧雷达数据到来时栅格地图的原点

在cartographer中,存在map与sub_map两种地图,对于每一张sub_map,它的地图原点为当前机器人所在的map坐标系下的位姿。那么对于初始化状态时,第一帧雷达数据到来时建立的第一张sub_map的原点是如何确定的?是否是默认的(0,0,0)呢?

2024-03-14 00:27:17 483 1

原创 ROS的pluginlib学习总结一

在开发中需要使用到插件,因此学习了下pluginlib的一些使用,学习的还不够透彻,先记录一下这几天的学习结果。关于ROS中pluginlib的使用主要参考的是《》与《》这两篇文章。第一篇中讲述了一个示例,第二篇是ROS官方中对于pluginlib使用的一些解释的翻译。

2024-02-25 23:18:01 946

原创 linux下485通信调试记录

linux下可以安装并使用下述串口调试工具进行串口测试

2024-01-15 13:16:48 1691 1

原创 T曲线速度控制与S曲线速度控制

从控制被控量的角度来说,T型控制曲线的被控量是其速度,加速度恒定的情况下根据需要的速度与期望的速度之间按照加速度进行增加或减少。而S型曲线的被控量其实是加加速度(jerk),在S型曲线中加速度是会随着加速周期逐步上升的,初始起步时加速度很小,因此速度变化量很小,不会引起很大的抖动,起步后加速度逐渐增加,则速度变化量随之增加,可以减少速度变化周期,提高实时性,然后到达目标速度前开始下降加速度直到加速度逐渐降到零,此时速度变化量也会比较平稳。可以看到相对于T曲线的控制,S曲线得到的速度曲线会更加平滑。

2023-12-10 21:35:12 1802

原创 如何在代码中启动与关闭ROS节点

在ROS开发中,节点的管理是很重要的一部分,其中有一些节点大部分时候用不到,只会在特定情况下被启动(比如建图节点)同时这些节点在使用完后还需要被关闭,因此我们就需要在程序中对这些节点进行启动与关闭的管理。在python中,针对这个问题ROS中可以使用roslaunch功能包解决这个问题。通过简单的几行代码就可以实现具体功能:

2023-11-29 19:47:48 2514 3

原创 mongodb使用简单文档

mongodb数据库简单使用文档

2023-11-18 21:00:00 365

原创 LPA*算法图文详解

之前我们看过了A* 算法,知道了A* 算法的基本原理,但是A* 算法的缺陷也很明显:它是离线的路径规划算法,只能一次规划出路径,但是后面路径被改变的话就无法生效了。针对这个问题,人们研究出了D* 算法。D* 算法相对于A* 也好还是Dijkstra算法也好它最大的优点就是再于它在运动过程中是实时的:在原先规划的路径上如果出现障碍物的话,会对当前路径进行新的规划,通过较短的迭代即可找到新的路径。但是它比较大的问题在于它只能处理空白路径上出现障碍物的情况,而不能处理本来是障碍物但是变成空白区域的情况。

2023-09-25 16:49:07 1937 1

原创 D*算法图文详解

前面学习了Dijkstra以及A* 算法的基本原理,对于这两种算法而言,我们都能在有解的情况下找到一条沿着起点到达终点的路径。然而,这两个算法本身都是基于静态地图的,也就是说:当机器人找到路径后开始沿着起点向终点运动的过程中,默认地图是不会发生变化的,但是实际上大部分时候我们知道地图是动态的,随时存在一个突然出现的障碍物挡在原有的路径上,那么这时候原有的路径就失效了。

2023-09-18 16:13:45 1710

原创 LRTA*(Learning-RTA*)

例如从 s 节点到 s’ 节点,假设路程g(s, s’) = 1,已知 h(s’) = 2(这个初始的时候就是已知的,代表了从该节点到目标节点的距离),那么从 s 节点访问 s’ 节点后,是对s节点的h(s)进行更新的,h(s) = g(s) + h(s’) = 1 + 2 = 3。h(s) 的设计,是为了防止之前A* 算法在搜索时陷入局部最小值,在LRTA* 搜索中,如果陷入了局部最小值,算法会根据访问附近节点的次数增加h(s),即增加总成本f(s),从而经过h(s)的多次叠加后,跳出局部最小值。

2023-09-11 11:00:06 339

原创 ARA*(Anytime A* with Provable Bounds on Sub-Optimality)代码详解

在此之前我们看完了A* 与双向A* 算法,随后我们继续看A* 的另外一种改进版本:ARA*。首先,在此之前我们先了解两个概念:WA* 与AA*。

2023-09-04 13:38:54 751 4

原创 双向A*算法

前面看最佳路径优先搜索算法的时候顺便研究了一下它的改进算法:双向最佳路径优先搜索算法。那既然有双向最佳路径优先搜索算法自然也可以有双向A* 算法。这篇文章简单看一下双向A*算法的基本原理以及代码实现。

2023-08-29 13:12:21 1701 1

原创 A*算法图文详解

A*算法最早于1964年在IEEE Transactions on Systems Science and Cybernetics中的论文《A Formal Basis for the Heuristic Determination of Minimum Cost Paths》中首次提出。其属于一种经典的启发式搜索方法,所谓启发式搜索,就在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,选择代价最少的结点作为下一步搜索结点而跳转其上。

2023-08-21 11:39:27 5993 3

原创 双向最佳路径优先搜索算法

双向最佳路径优先搜索算法最大的优点就在于它极大程度的降低了搜索的深度,可以很快的完成迭代。前一章我们讲述了最佳路径优先搜索算法,为了查看它的迭代次数,在while里面设置一个打印输出count,每迭代一次就自加一。双向最佳优先搜索相较于传统的单向搜索算法,可以大幅减少搜索范围,提高搜索效率。由于每次扩展都是在两个方向上进行,搜索空间的大小可以被双向同时扩展的方式削减一半。如下图,左侧是直接进行次搜索产生的搜索树,右侧是双向搜索的两棵搜索树,避免了层数过深时分支数量的大规模增长。即当前点到终点的代价值。

2023-08-14 15:16:33 387

原创 最佳路径优先搜索算法

本来想直接写A的,不过看完最佳路径优先搜索算法后觉得还是要先理解一下这个算法后才能更好的理解A算法,所以把这篇文章放到A*前面。最佳优先搜索算法(Best-first-searching)是一种启发式搜索算法(Heuristic Algorithm),其基于广度优先搜索算法,不同点是其依赖于估价函数对将要遍历的节点进行估价,选择代价小的节点进行遍历,直到找到目标点为止。BFS算法不能保证找到的路径是一条最短路径,但是其计算过程相对于Dijkstra算法会快很多。

2023-08-07 13:04:40 2009

原创 计算球体上一点指向球心的姿态

背景:最近有个需求,需要用相机拍摄一个物品,初始状态下相机在该物体正上方,随后相机的坐标按一定规律变化,要求它的视野中心一直固定在该物体上。回到最初的问题上,该问题可以理解为:初始状态下,相机的姿态为[0,0,0,3.14,0,0],即相机在Z轴正上方位置,相机的Z轴朝下。可以看到虽然相机的位置是一直在发生变化的,但是相机的Z轴是始终指向circle的中心的,则可以满足开始的需求。则我们可以通过两次旋转将该点转动到球体上的任意位置,因此该点的表示方式为:[其中X、Y、Z为相机在物体坐标系下的坐标,

2023-08-01 20:05:17 557

原创 cartographer学习之调参小结

cartographer使用过程中也涉及到了很多的参数调整,不同的参数对算法的影响是不同的。这里简单记录一下一些常调的参数以及一些比较重要的参数。

2023-07-26 17:04:02 1058 1

原创 cartographer学习之lua参数详解

lua文件是cartographer中用于参数配置的文件,熟悉lua文件可以让我们对cartographer有一个基础的认知,也可以更好的根据自己的设备进行产品的调试与使用,这里简单介绍一下自己的lua文件应该包含哪些内容。

2023-07-20 10:43:04 1274 2

原创 ROS之四元数、欧拉角以及旋转矩阵之间的相互转换(tf库)

在平时使用ROS时,经常需要用到各种位姿。例如机器人的pose、里程计的数据、机械臂的末端位姿等。大部分时候主要以使用四元数为主,但是四元数本身不是很直观,比如在需要对角度进行加减运算的时候就不太方便直接操作四元数而是会转换成欧拉角的形式,而当我们进行位姿间转换的时候,一般需要进行旋转矩阵进行乘法运算,这时候需要将四元数转换成旋转矩阵。在ROS中,可以使用tf库对这三者进行简单的转换。

2023-05-20 23:57:38 5896 4

原创 三维空间与位姿变换

在使用相机或者机械臂的过程中,经常会用到三维空间变换,大部分时候我们可以使用TF去获取空间中的位姿关系,但是也存在一些时候无法使用现有TF表示的情况,例如:使用相机识别工件时,已知通过图像确定了相机到工件的空间关系,此时需要将相机移动到工件正上方二次识别。假设工件坐标系为世界坐标系A,相机坐标系为工具坐标系B,则问题可以描述为在已知世界坐标系与工具坐标系之间关系以及已知目标点在工具坐标系下位姿的情况下求目标点在世界坐标系下的位姿。对于旋转而言,它不仅会影响到原来点的位置,也会影响到原来点的朝向。

2023-05-15 20:01:14 878

原创 ROS 如何用自己的电脑连接其他设备查看Rviz

这是由于目前我的rviz是开在我自己电脑上的,它需要一个ros master才能正常开启,要解决这个问题只要解决让它识别到一个局域网中的ros master并将其连接进去即可。Rviz的使用在ROS开发中是很常见的东西,有时候为了方便我们需要查看某台设备的一些数据,但是又没有一些直观的连接工具例如向日葵之类的(这些工具是要基于屏幕的,如果设备上没有屏幕是无法使用的)。那在只有ssh的情况下如何查看rviz呢?注意这里的ROS_MASTER_URI里面的地址是设备的IP,下面的ROS_IP是自己电脑的IP。

2023-05-11 10:30:02 974 3

原创 TEB算法详解 参数详解

teb算法的基本思路之前已经看完了,今天主要看一下teb算法的参数配置文件,分析一下每个配置参数的作用:teb的参数主要可以包含以下几个部分:Trajectory的参数顾名思义,就是对路径生效的一些参数,仔细看一下每个参数的作用:teb_autosize参数用于是否自动更新/插入或是删除路径中的点(初始化后的路径) trajectory.teb_autosize函数使用。teb的优化是基于g2o的,而g2o本身需要点与边的概念,这里的点就是局部路径规划的位姿点,为了保证优化的稳定性需要保证两个位姿之间距离

2023-04-21 15:16:53 6812

原创 TEB算法详解(TebLocalPlannerROS::computeVelocityCommands(3))

第一章主要分析了teb算法的准备条件,包括获取当前位姿与速度、对全局路径的裁减以获取局部路径等以及局部地图的获取等。第二章主要讲述了在获取前置条件后,如何根据前置条件进行位姿优化,teb的路径优化主要是调用了g2o优化算法,以全局路径的点以及理论上点与点之间的运动时间作为g2o的优化顶点,以距离障碍物的距离、机器人最大运动速度、点与点之间的最短路径等约束条件作为g2o的边对局部路径规划的姿态进行了优化。这一章则是主要看一下算法怎么从优化后的点位到运动输出之间的关系。

2023-04-16 23:08:50 2503

原创 TEB算法详解(TebLocalPlannerROS::computeVelocityCommands(2))

上一章主要研究了一下teb算法中局部路径规划之前的处理,包括了局部地图的处理、初始位姿、机器人当前速度以及从全局路径中如何提取出局部路径等内容。这一章继续看一下teb算法中对于局部路径规划的运动部分处理,看一下在已知上述先验的条件下算法是如何计算出一个合适的轨迹的。

2023-04-13 18:05:45 2839 7

原创 TEB算法详解(TebLocalPlannerROS::computeVelocityCommands(1))

TebLocalPlannerROS::computeVelocityCommands作为teb算法与move_base算法的接口函数,是作为teb算法的重点部分去分析的,这一节先看该算法的前半部分,也就是局部路径规划前的数据处理部分,这部分算法的基本思路如下:

2023-04-04 15:20:12 11332

原创 反光板导航SLAM(四)如何通过两个反光柱估计位姿

通常而言确定空间中的一个点的坐标需要三个点,也就是俗称的三点定位。但是在某些时候,场景内可能不一定能够采样到足够多的反光柱,比如只有两个。这个时候看起来似乎参数是不足的,毕竟机器人的参数有三个,两个方程是不够的,但是这个方程其实也不是没有解的方式,具体的解答方式继续往下看

2023-03-28 09:38:11 1747

原创 move_base代码解析(四)局部路径规划:TrajectoryPlannerROS::computeVelocityCommands

在第三章中讲述了executeCycle的总体作用,可以看到这个函数的作用主要是将全局路径规划的路径给到局部路径规划,并判断机器人是否到位,如果没有到位就调用computeVelocityCommands函数计算机器人的速度。这里也就是move_base的局部路径规划的所在之处。

2023-03-09 17:42:46 1937 1

ROS 中地图相关的示例,简单的地图发布,障碍物地图发布以及膨胀地图的发布

ROS 中地图相关的示例,简单的地图发布,障碍物地图发布以及膨胀地图的发布

2024-06-27

LPA* 算法论文原文资料

LPA* 算法论文原文资料

2023-09-23

TEB算法英文资料原文

Trajectory modification considering dynamic constraints of autonomous robots论文原文

2023-04-04

markerarray简单示例代码

里面包含了使用markerarray画直线、箭头、txt文本以及球体等多个内容,可以在rviz中对应位置显示需要的内容,便于ROS的开发显示问题。

2022-11-23

一个ROS下自定义消息使用案例,执行编译即可使用

在初学ROS时,一般都是使用的ROS标准库,包括激光电云laserscan、位姿posetamp等。这些库基本满足了我们的日常使用,但是在开发时,难免会遇到一些情况使用标准库不太合适,这时候使用自己的自定义消息格式就变得非常方便。具体文章参看:https://blog.csdn.net/YiYeZhiNian/article/details/126746166?spm=1001.2014.3001.5502

2022-09-07

ROS学习之C++读取txt点云并在rviz中显示

C++读取txt点云并在rviz中显示,操作可以https://blog.csdn.net/YiYeZhiNian/article/details/126254700?spm=1001.2014.3001.5501中查看

2022-08-19

ROS中将激光点云拟合出直线并显示

将laser的点云拟合出一条条直线并画图在rviz中显示

2022-04-23

ROS navigation 调试资源,仿真环境以及机器人

自己调试ROS navigation时用到的一些东西,包括kinetic navigation包、自己搭建的gazebo仿真地图以及机器人、基于ORB_SLAM的视觉里程计发布程序、参考用的两篇文章:ROS导航调优指南以及多层地图讲解

2022-01-07

motor_control_origin.cpp

ROS节点中使用CAN命令的简单代码示例

2021-10-25

CUDA9.0、cudnn7.0还有opencv中缺少的.i文件

里面包含了CUDA9.0、cudnn7.0以及安装opencv3.4时缺少的.i文件,东西太大不好上传,放百度云盘里了,这里是百度云盘的下载链接以及提取码

2021-01-06

空空如也

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

TA关注的人

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