自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

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

2024-04-25 18:18:11 648

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

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

2024-04-18 19:07:38 1009

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

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

2024-04-14 16:58:56 451

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

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

2024-04-05 11:59:49 518

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

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

2024-03-28 20:10:20 568

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

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

2024-03-21 23:02:07 927

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

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

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

原创 ROS的pluginlib学习总结一

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

2024-02-25 23:18:01 885

原创 linux下485通信调试记录

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

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

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

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

2023-12-10 21:35:12 1179

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

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

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

原创 mongodb使用简单文档

mongodb数据库简单使用文档

2023-11-18 21:00:00 348

原创 LPA*算法图文详解

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

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

原创 D*算法图文详解

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

2023-09-18 16:13:45 1188

原创 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 256

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

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

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

原创 双向A*算法

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

2023-08-29 13:12:21 1126 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 4395 3

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

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

2023-08-14 15:16:33 290

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

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

2023-08-07 13:04:40 1592

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

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

2023-08-01 20:05:17 361

原创 cartographer学习之调参小结

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

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

原创 cartographer学习之lua参数详解

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

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

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

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

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

原创 三维空间与位姿变换

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

2023-05-15 20:01:14 781

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

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

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

原创 TEB算法详解 参数详解

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

2023-04-21 15:16:53 5562

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

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

2023-04-16 23:08:50 2114

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

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

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

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

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

2023-04-04 15:20:12 8769

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

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

2023-03-28 09:38:11 1370

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

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

2023-03-09 17:42:46 1672

原创 move_base代码解析(三)MoveBase::executeCycle

第一篇executeCb主要分析了一下move中对于传入数据的一些基本处理,该函数首先判断了传入目标点的四元数是否合理,然后将该坐标转换到世界坐标系下同时通过publisher发布该坐标用于可视化显示。随后开启全局路径规划线程以及代价地图costmap(全局路径规划在第二篇单独展开讲述),记录当前的开始时间以及规划的状态机state,最后完成这些后函数开始调用executeCycle(goal)函数执行正式的路径规划过程。这一篇则展开看executeCycle函数具体做了一些什么东西。

2023-02-28 19:51:44 715

原创 move_base代码解析(二)MoveBase::planThread

在第一章中第四步执行了planThread函数的线程启动,该步骤会调用planThread函数。该线程创建以后会因为 runPlanner_ 值为false而挂起。当executeCB中唤醒线程前一刻时runPlanner_被设置为true。在这之后就正常情况下面没有被设置为fale过所以线程被唤醒以后就不在进入等待的循环中而是一直在大循环执行,每个大循环都会调用一次 makeplan并重新把新路径装入planner_plan_容器中。

2023-02-20 10:38:21 1274 4

原创 反光板导航SLAM(三)反光柱导航开发与实验

在上一章中简单了解了VEnus算法对于反光柱导航的基本思路。其主要分为了高反点提取、高反点聚类查找中心、高反点与已知反光柱位姿匹配以及调用ceres库进行位姿优化等步骤。然后在这个算法的基础上,再进行一定的开发达到一个比较稳定且可视化的版本。简单录制一下运行效果,类似于这样:out这里使用的是自己录制的一个包,其中包含了激光数据以及里程计信息odom。

2023-02-13 10:45:52 2525 7

原创 反光板导航SLAM(二)VEnus代码浅析

上一章简单介绍了VEnus中几个主要函数的作用,这里详细展开看一下每个函数的具体思路,通过研究具体的代码我们可以简单了解VEnus中对于反光柱定位的具体流程。

2023-02-07 19:00:00 2152 31

原创 反光板导航SLAM(一)安装VEnus

这里面讲述了一个反光板导航的一个示例,主要使用的是一个开源的项目包venus,这个代码的源码是在。由于它不是一个ROS库,所以安装方式与ROS的安装方式略有不同。

2023-02-03 09:37:17 1976 4

原创 Ceres安装与卸载以及新旧版本中的问题

Ceres在SLAM优化中常常会用到,简单记录一下关于Ceres的一些问题。

2023-01-30 21:45:00 4237

原创 std::map使用方式以及注意事项(关于相同key的问题)

std::map的使用在C++开发中也是经常会用到的一些东西,这里进行一些简单的使用记录,包括如何插入、删除以及修改等。

2022-12-31 21:42:41 5478

原创 C++ 读、写、改、删除本地文件内容

在写程序的过程中,有时候需要对程序中的一些参数或者变量在本地读取、存储以及修改等,因此掌握一下C++对于本地文件的一些操作还是挺有必要的。

2022-12-22 09:09:55 9055

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关注的人

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