自动驾驶算法
文章平均质量分 65
以自动驾驶算法的工程实现为目标
Jack Ju
硕士毕业于哈尔滨工业大学控制科学与工程系,目前是一名自动驾驶工程师。
展开
-
机器学习算法——适用于提取点云障碍物轮廓的聚类算法—costmap_convert(DBSCAN聚类算法)
最近在做项目过程中,我们注意到当考虑车体轮廓去进行全局路径规划(如混合A*算法),如果仅仅将障碍物点云数据中得每一个点只当成点,会造成较大的计算时间,如若将点云聚类成圆形 线型 多边形障碍物 会提高计算效率,这是其中一个原因,另一个原因是,我们需要知道障碍物的大小,障碍物大小程度决定了我们的动态避障的方法和策略。因此我根据costmap_conventer 进行了脱ROS处理,删除了一些暂时不用的逻辑,方便项目中使用。原创 2024-06-08 18:29:35 · 868 阅读 · 0 评论 -
机器人规划控制——工程化——心得日记-20240510
遇到一个特别有趣的问题,当然最后查出来原因也感觉比较纯,就是我们机器人在行进过程中,会当前要走的路径与周围障碍物发生了干涉检测即有碰撞风险,然后会请求全局规划,我们注意到计算的局部目标点一直在远处挪,突然某一贞,生了局部的路线,即全局的路线不是从起点开始的,而是从另外很远的地方开始,但终点是对的,这样全局规划的线是错误的,但是全局规划器返回的状态是success,那局部控制器就跟踪这个有问题的全局线,进而导致机器人撞到障碍物了。生成的全局路径初始2个坐标打印,然后重新复现,采集数据,并分析。原创 2024-05-10 22:15:07 · 667 阅读 · 0 评论 -
机器人运动——全局转车辆坐标下-坐标变换
在这个示例中,globalToLocal 函数接受全局坐标点和车辆的全局坐标以及朝向作为输入,并返回相对于车辆坐标系下的坐标。2.根据车辆的朝向 theta ,对偏移量进行旋转,以得到相对于车辆坐标系下的坐标。1.计算全局坐标点 (x1, y1) 相对于车辆的偏移量;原创 2024-04-10 08:22:32 · 372 阅读 · 0 评论 -
机器人规划算法——基于A-star和CostMap膨胀地图的全局规划(附Github源码链接)
这段时间,笔者用c++写了一套机器人局部避障算法,并工程落地,机器人可以正常避障,避障所采用的技术方案是A*+TEB算法。并取得一定成果,后续还要针对复杂的场景继续优化。主要涉及到技术模块有:(1) costmap:代价地图模块,分为静态层和障碍物层以及膨胀层,静态层将读取地图信息并根据机器人内切半径进行膨胀,障碍物层是根据搭载的传感器检测到的障碍物点云并且以机器人内切圆半径进行膨胀。(2)全局规划器:这部分规划部分主要是A根据costmap规划一条路径。原创 2024-03-29 15:22:48 · 1118 阅读 · 2 评论 -
机器人干涉(碰撞)检测基础——Bresenham 直线算法
Bresenham 直线算法是一种画线算法,用于确定应选择的n维栅格中的点,以形成两点之间直线的近似值。它通常用于在位图图像中(例如在计算机屏幕上)绘制线图元,因为它仅使用整数加法、减法和位移位,所有这些在历史上常见的计算机体系结构中都是非常便宜的操作。它是一种增量误差算法,是计算机图形学领域最早开发的算法之一。称为中点圆算法的原始算法的扩展可用于绘制圆。虽然像Wu 算法这样的算法因为可以支持抗锯齿而在现代计算机图形学中也经常使用,但 Bresenham 线算法由于其速度和简单性仍然很重要。原创 2024-03-25 11:50:47 · 568 阅读 · 0 评论 -
机器人路径平滑——线性插值
请注意,这里的内插算法是一个简化示例,使用了线性插值来平滑路径上的点。实际应用中,你可以使用更复杂的算法,如B样条曲线、Catmull-Rom曲线等。这些算法可以根据需要,根据控制点和参数来计算平滑曲线。如果有任何进一步的问题,请随时提问。这段代码实现了一种简化的平滑曲线算法,使用线性插值来平滑给定路径上的点。这个内插点的坐标是前一个点、当前点和后一个点的坐标的平均值。对于每个点,我们考虑路径上的前一个点。蓝色是原始路径,红色是平滑后的曲线。中除了起始点和终止点之外的所有点。向量,用于存储平滑后的路径点。原创 2024-02-18 16:31:11 · 506 阅读 · 0 评论 -
机器人路径平滑——贝塞尔曲线
该函数使用了三阶贝塞尔曲线的公式,根据参数t(范围为0到1)、起始点p0、控制点p1和终止点p2,计算出贝塞尔曲线上的相应点的坐标。该函数通过遍历路径上的相邻三个点,将每两个点之间的线段使用贝塞尔曲线进行平滑。通过以上步骤,代码实现了使用贝塞尔曲线对给定的路径曲线进行平滑处理,得到了一条平滑的路径曲线。参数用于控制每两个路径点之间贝塞尔曲线的细分数,即将每段线段平滑成多少个小曲线段。函数计算出每个t值对应的贝塞尔曲线上的点,并将这些点存入一个新的向量中。向量中的路径点,即平滑后的路径曲线的坐标。原创 2024-02-18 14:52:36 · 1154 阅读 · 0 评论 -
valgrind being installed on Arm platform
2.在ARM的板子上运行valgrind, 程序出现valgrind Fatal error at startup: a function redirection的错误提示。查找了下,发现是因为libc或ld.so库进行过strip操作。直接安装一个debug版本的库就可以了。原创 2024-01-17 16:34:26 · 590 阅读 · 0 评论 -
【将G2O库使用交叉编译移植到arm平台】
笔者用g2o来做teb,teb中cmake时要将/home/juchunyu/workspace/Navigation_system/cmake_modules/FindG2O.cmake 的下面几行注释掉。使用g2o时只需链接g2o_ext_csparse g2o_core g2o_csparse_extension g2o_stuff这几个库。1.将suitesparse文件夹中的CXSParse里的源码替换掉g2o的EXTERNAL文件夹中的csparse。在g2o根文件夹下执行下面的命令。原创 2023-12-28 16:45:58 · 1184 阅读 · 1 评论 -
关于图像像素opencv行与列关系
(1)m4.cols表示m4矩阵的列数,对应图片像素的宽度。(2)m4.rows表示m4矩阵的行数,对应图片像素的高度。其中m4是一个矩阵,读取的图片就存在这个地方。原创 2023-12-18 14:32:14 · 809 阅读 · 0 评论 -
机器人导航地图——costmap局部地图滚动costmap_.updateOrigin理解
代价地图的一个参数,表示该代价地图的world坐标系原点(origin_x_, origin_y_)【**代价地图原点都在地图的左下角】**是否要随着机器人移动而改变。local_map是目标,它的宽度等于源中要复制的宽度cell_size_x,因为每栅格值一个字节,这个宽度也等于跨距。一是重新计算原点origin_x_/y_,方法是微调参数new_origin_x、new_origin_y,确保新原点坐标能被resolution_(0.05)整除。的实现,用于将源地图的一个区域拷贝到目标地图中。原创 2023-12-06 15:42:06 · 1777 阅读 · 0 评论 -
机器人导航地图——Obstacle层的障碍物-Bresenham算法详细解释
作者在读源代码时,遇到了下述的代码void ObstacleLayer::raytraceFreespace,不是很好理解,有很多疑惑,于是打算对此部分进行详解,并记下笔记。////clearing_observation的origin_是传感器坐标,传入//得到传感器原点在地图上的坐标if (!ox, oy);return;//我们可以在内环之外预先计算地图的点。。。我们稍后需要这些//接下来的几个判断结构实际上做的主要工作就是不断迭代传感器原点和点云中的点的连线,原创 2023-12-01 15:17:25 · 1740 阅读 · 0 评论 -
机器人导航算法——Costmap地图ROS源码解析
costmap使用了一种分层地图的技术方案,即分别考虑障碍物层/膨胀层/静态障碍物层更新对应层的地图代价信息,然后再合并到主地图中,具体见我翻译的另一篇文章《costmap文献阅读—Layered Costmaps for Context-Sensitive Navigation以上就是costmap的介绍,后续会持续更新。。。。ReferenceCostmap文献阅读——Layered Costmaps for Context-Sensitive Navigation。原创 2023-11-29 13:48:08 · 2121 阅读 · 0 评论 -
机器人算法——costmap膨胀层InflationLayer
InflationLayer没有自身的栅格地图要维护,直接在主地图上进行操作,它根据膨胀参数设置用来膨胀的“参考矩阵”,并在主地图上从障碍物出发,不断传播更新,完成对整个地图障碍的膨胀。使用计算考察点和障碍物的距离,然后判断是否在膨胀半径内,如果是,则保存到nflation_cells_中用于下一次循环中。不断的从障碍物周围”上下左右“开始膨胀,并且根据参考矩阵去计算不同距离的栅格权重。这是考察下一个点,上下左右,如果在障碍物半径内,则继续循环到上述的“如此循环即可,类似于A*算法的膨胀。原创 2023-11-28 16:59:29 · 1434 阅读 · 0 评论 -
机器人控制—代价地图Costmap的层概述
Costmap2DROS::mapUpdateLoop —— Costmap2DROS::updateMap —— LayeredCostmap::updateMap —— 每一层调用updateBounds —— 每一层调用updateCosts(核心函数)4)小车: std::vector< geometry_msgs::Point> footprint_spec_,这里得到的插件即为各层子地图。1)聚合layer的功能:LayeredCostmap* layered_costmap_原创 2023-11-21 11:13:14 · 174 阅读 · 0 评论 -
自动驾驶—MPC模型预测控制算法工程实现
Apollo中,LQR和MPC控制器都选用的单车动力学模型作为研究对象,单车动力学模型为非线性系统,但LQR和MPC控制器的目的是为了求最优控制解,在具体的优化求解时,均通过线性化方法将状态方程转化为线性方程进行求解,所以,可以说apollo中LQR和MPC控制器的研究对象均为线性系统。看过Apoll的LQR和MPC源码的朋友会知道,MPC和LQR很类似。MPC的研究对象可以是线性系统,也可以是非线性系统,只不过为了某些需求,如时效性,计算的便捷,操控性等,一般会将非线性系统转换为线性系统进行计算。原创 2023-11-28 14:31:07 · 1542 阅读 · 0 评论 -
机器人规划算法——movebase导航框架源码分析
这里对MoveBase类的类成员进行了声明,以下为比较重要的几个类成员函数。原创 2023-11-24 15:38:16 · 1176 阅读 · 0 评论 -
机器人算法—ROS TF坐标变换
tf工具包,底层实现采用的是一种树状数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助程序员在任意时间,将点、向量等数据的坐标,在两个参考系中完成坐标变换。机器人每个关节的传感和运动都是参考自身 以上面的机器人烹饪为例, 头部的视觉传感器(摄像头)参考自己, 计算出煎饼和锅距离自己的距离.相对坐标系就是一个参照物,我们在这个参照物下,来说明自己的位置和姿态。我摆了个什么造型给你看,是横着的,竖着的,躺着的,这个就是姿态。机器人的左手右手的运动又是根据自己的当前位置来控制空间坐标的移动.原创 2023-11-22 09:42:12 · 998 阅读 · 0 评论 -
机器人规划算法——将多边形障碍物离散到地图像素点上?
设多边形的顶点依次为A1,A2…An,要判断的点为P,那么分别计算向量PA1叉乘向量PA2,向量PA2叉乘向量PA3,…,向量PA(n-1)叉乘向量PAn,向量PAn叉乘向量PA1,如果这些叉乘的结果都同向的话,那么这个点就在多边形的内部。判断目标点与多边形的每条边组成的三角形面积和是否等于该多边形,相等则在多边形内部。问题一:如何判断一个点是否在多边形区域内?方法1:向量叉乘判别法。方法2:面积和判别法。原创 2023-11-10 11:23:58 · 976 阅读 · 0 评论 -
机器人控制算法——局部规划器TEB算法原理及C++可视化仿真
最近一段时间,由于项目需要,一直在做TEB算法的工程化的工作,于是就考虑写下一篇系统些的文章,作为笔记,后续自己看也方便,TEB的英文名Time elastic band”,是一种局部规划器,它的核心思想是将路径规划问题转化为一个带有时间弹性的优化问题,通过对时间弹性的控制,来实现路径的优化。原创 2023-11-06 09:12:23 · 2302 阅读 · 0 评论 -
机器人控制算法—如何使用C++读取pgm格式的栅格地图并转化为ROS地图格式的data?
近期正在做全局规划+局部动态规划的项目,目前遇到的问题是,我们如何利用C++处理pgm地图文件。即将地图信息要与像素点结合起来。所以我们需要知道地图读取和处理的底层原理,这样更好地在非ROS平台下移植。(1)data[]是按照那张地图图片的自底向上,自左至右逐个像素点存储的.我们举了一个从地图pgm读取到处理成目标地图数据格式data[] 的例子。image_x,image_y表示在图像像素坐标系中的坐标。(2) 在使用二维地图定位导航时,建好的地图文件中包括。基于地图的坐标转换到图像坐标系上。原创 2023-11-02 09:01:35 · 1299 阅读 · 1 评论 -
机器人控制算法——TEB算法障碍物检测分析
在规划路线的时,需要机器人路线附近的障碍物距离,机器人控制系统需要知道当前机器人与障碍物最短的距离。本文主要是分析如何计算机器人与障碍物的距离,如果将机器人和障碍物分别考虑成质点,机器人与障碍物的距离就很容易求解了,但是事实上,障碍物与机器人在实际工程中不可能是质点。因此,本文需要解决的是:机器人形状分别圆形、线性、多边形,障碍物也分别是圆形、线性、多边形时,二者的最小距离求解。原创 2023-10-30 11:48:55 · 1332 阅读 · 0 评论 -
机器人控制算法——TEB算法—Obstacle Avoidance and Robot Footprint Model(避障与机器人足迹模型)
对于每个障碍物(点/占用的成本图单元、线、多边形),定位计划轨迹的最接近姿态(见图)。此外,更大的障碍需要更多的连接姿势,以避免不可错过的捷径。显然,优化涉及到找到指定成本函数(目标函数)的最小成本解(轨迹)。简单地说:如果一个计划的(未来)姿势违反了与障碍物的期望分离,那么成本函数的成本必须增加。惩罚项确实是非零的,但优化器会被卡住(达到这个局部最小值),因为将相应的姿势横向移动到其中一个障碍物会进一步增加总成本。因此,优化器可能会考虑到一个小的违规(因此也会考虑到小的惩罚),以最小化整个组合成本函数。原创 2023-10-19 11:43:25 · 1910 阅读 · 0 评论 -
机器人控制算法—TEB算法文献阅读Trajectory modification considering dynamic constraints of autonomous robots
定时弹性带”转换由一系列路径指向一条明确依赖于时间的轨迹,从而能够实时控制机器人时间由于其模块化表述,该方法很容易扩展,以纳入额外的目标和限制。该问题是在一个加权多目标优化框架中提出的。大多数目标都是本地的,因为它们取决于在几个相邻的中间配置上。经典的“弹性带”使全局规划器生成的路径相对于最短路径长度变形,而避免与障碍物接触。根据诸如有限的机器人速度和加速度的动态约束的运动。这一贡献引入了一种称为“定时弹性带”的新方法,该方法明确考虑了。实际机器人的仿真和实验结果表明,该方法具有鲁棒性和计算能力。原创 2023-10-17 08:30:39 · 964 阅读 · 0 评论 -
机器人控制算法—TEB算法文献阅读Integrated online trajectory planning and optimization in distinctive topologies
设sk=[xk,yk,βk]⊺∈R2×S1表示离散机器人姿态时间点k、xk∈R和yk∈R表示机器人的平面位置,βk∈S1表示机器人的方向。离散轨迹是根据机器人姿态的序列S={S k | k=1,2,…,n}来描述的。TEB用严格正的时间间隔∆T k∈R+,k=1,2,…来扩充轨迹表示,n−1。每个时间间隔表示机器人从姿势s k过渡到其后续姿势s k+1所需的时间。具有三个姿势的示例轨迹如图1所示。原创 2023-10-16 11:25:24 · 1134 阅读 · 0 评论 -
机器人控制算法——移动机器人横向控制最优控制LQR算法
LQR最优控制利用廉价成本可以使原系统达到较好的性能指标(事实也可以对不稳定的系统进行整定) ,而且方法简单便于实现 ,同时利用 Matlab 强大的功能体系容易对系统实现仿真。车辆运动学模型是根据车辆的几何关系建立的,不考虑影响车辆运动的力。以车辆后轴中点作为研究对象,在惯性坐标系OXY下,车辆运动状态可用车辆坐标(x,y)和车身航向角。与上次不同的是,此次被控对象是移动机器人,两轮差速模型。其中,u1和u2分别是车辆的纵向和横向控制输入。分别为车辆的纵向偏差、横向偏差和航向角偏差。原创 2023-10-12 16:00:13 · 2483 阅读 · 0 评论 -
机器人控制算法——两轮差速驱动运动模型
本文主要介绍针对于两轮差速模型的逆运动学数学推导。因为在机器人控制领域,决策规划控制层给执行器输出的控制指令。(角速度),因此,我们比较关心,当底层两个驱动电机接收到此信息,如何将。我们根据上述公式,给出两轮差速模型的逆运动学数学推导,将。至此,我们给出了两轮差速模型的逆运动学数学推导,即如何将。需要指出的是,此公式也包含了曲率信息,曲率。,此曲率值,可以用于大曲率路径的前馈补偿。如上图,是两轮差速模型,我们考虑左轮。原创 2023-10-12 15:29:10 · 1969 阅读 · 0 评论 -
自动驾驶——估计预瞄轨迹YawRate
x + a2 * x^2 + a3 * x^3 ,那么现在有个需求,希望根据上述x和y的关系,去估计规划预瞄轨迹yawRate。首先CD = x,AC = y ,BD = AB = R,CD与BD相互垂直 ,AC与CD垂直。角BDA = 角BAD =90 – angle,故有角B = 2 * angle。又由于angle = arcsin(y/(x^ 2+y^ 2)^(0.5))原创 2023-09-04 16:16:40 · 1461 阅读 · 0 评论 -
自动驾驶——【规划】记忆泊车特殊学习路径拟合
【代码】自动驾驶——【规划】记忆泊车特殊学习路径拟合。原创 2023-09-01 17:48:47 · 1101 阅读 · 0 评论 -
自动驾驶——最优控制算法(LQR)工程化总结
到近段时间,真正在我们的控制器上运行最优控制算法(LQR),一步一个脚印,从开始只是知道其“控制理论”的阶段、再到对着一堆网上的资料和公式一筹莫展不知何着手、再到初步实现了LQR算法的开发(但是使用的扭矩环控制,控制的不好,而且由于各种原因被delay,迟迟无法落地),直到大上个星期,泊车平台有此LQR开发需求,又重新了开始了算法的研发,用时一个周时间完成了算法开发,然后再用一个周时间进行实车最优控制算法验证与调试,取得了很大的进展,由于执行器是转角控制的,这无疑少了很多的工作量。原创 2023-08-26 22:07:23 · 1948 阅读 · 0 评论 -
机器人控制——MPC控制(预研)
今天在读百度的MPC算法的代码。原创 2023-08-24 17:11:24 · 591 阅读 · 0 评论 -
自动驾驶——车辆动力学模型
【代码】自动驾驶——车辆动力学模型。原创 2023-08-17 13:57:47 · 792 阅读 · 0 评论 -
Apoll 多项式规划求解
【代码】Apoll 多项式规划求解。原创 2023-08-10 14:35:12 · 146 阅读 · 0 评论 -
关于两种PID算法(位置型和增量式)的linux下的C++工程实现
网上有很多关于这两种控制算法的实现,但是大多基于c语言,而且用的是c语言中的结构体,看起来比较繁琐。所以我利用c++面向对象的结构以及STL中vector容器来编写两种算法,看起来简洁多了。在编写的过程中,更深刻理解了如何在实际工程中运用PID控制算法。 话不多说,先上代码https://github.com/JackJu-HIT/PID。 关于两种算法的原理,我直接粘贴我们老师上课的课件图片了,自己打字太费劲! 上述就是位置型...原创 2020-05-30 12:25:43 · 1887 阅读 · 0 评论 -
2023-3-2-22:01随笔
去年从2022年1月3日到2023年1月份一直专注于ADAS的行车横向功能的研发与实车调试,2022年写了几篇项目经验的文章,像LQR算法(虽然和同事(志同道合,技术追求的民哥)写出的工程代码,实车逻辑可调通,性能还未抽出时间优化,未应用于公司的量产项目中,但整体框架已经有了),后续有机会,会继续致力于LQR算法工程落地研究,希望有机会!我对比过行车的控制和泊车的控制,行车的控制参数很多,泊车控制的参数相对于少了多,但是泊车涉及到的功能逻辑和内容比较多,如泊车规划就很难。2023年沉寂了好久。原创 2023-03-02 22:29:19 · 478 阅读 · 0 评论 -
自动驾驶——H无穷控制器设计——调研
H无穷控制理论与应用案例分析鲁棒H∞控制原创 2023-06-11 23:27:07 · 209 阅读 · 0 评论 -
自动驾驶——基于五次多项式螺旋线方程的换道曲线规划
已知:换道初始纵坐标y0(横向距离),换道初始航向角tan0,换道时间t,换道结束纵坐标yf,换道结束航向角tanf,车速VehSpd,曲线中点曲率q且曲率变化率为0。求解期望的规划曲线。原创 2023-06-04 23:35:43 · 1526 阅读 · 0 评论 -
Estimating the Trajectory Curvature Using Three Trajectory Points Output From Motion Planning
已知运动模块输出相邻的三个点的坐标和其对应的航向角 A,B,C,现欲求解B点曲率。原创 2023-05-23 17:21:11 · 121 阅读 · 0 评论 -
自动驾驶——Smooth Local Planning
在本模块中,我们将讨论分层运动规划器的最低级别,即局部规划器。作为提醒,局部规划器是分层规划器的一部分,它以无碰撞、高效和舒适的方式执行行为规划器所要求的机动。这导致轨迹,即在给定时间空间中的一系列点,或路径和速度剖面,即在每个点具有所需速度的空间中的点序列。然后,这个计划可以作为您在第一课程中开发的控制器的参考输入。在本模块中,我们将以我们在模块四中开发的入门反应式规划器为基础,这样它就能够处理自动驾驶运动规划问题中存在的一些细微差别。特别是,我们将从离散时间转移到连续时间,以便生成易于使用控制器跟踪的平原创 2023-05-08 22:27:33 · 1301 阅读 · 0 评论 -
自动驾驶— Planning - Udacity Self-Driving Car Engineer
在本课中,我们将探讨自动驾驶汽车如何规划穿越世界的轨迹。车辆基于高清地图、感知和预测模块的数据制定此计划。首先,我们介绍如何使用a星规划到达目的地的地图级路线。然后,我们专注于建立无碰撞的轨迹,引导我们一步一步地到达目的地。我们学习了如何使用过去的速度解耦规划或网格规划来构建这些轨迹。比较这两种方法将培养你的规划直觉以及如何使用成本函数选择轨迹。规划是开发自动驾驶汽车最困难的部分之一。原创 2023-05-03 21:21:46 · 1038 阅读 · 0 评论