Jack Ju
硕士毕业于哈尔滨工业大学控制科学与工程系,目前是一名自动驾驶工程师。
展开
-
机器学习算法——适用于提取点云障碍物轮廓的聚类算法—costmap_convert(DBSCAN聚类算法)
最近在做项目过程中,我们注意到当考虑车体轮廓去进行全局路径规划(如混合A*算法),如果仅仅将障碍物点云数据中得每一个点只当成点,会造成较大的计算时间,如若将点云聚类成圆形 线型 多边形障碍物 会提高计算效率,这是其中一个原因,另一个原因是,我们需要知道障碍物的大小,障碍物大小程度决定了我们的动态避障的方法和策略。因此我根据costmap_conventer 进行了脱ROS处理,删除了一些暂时不用的逻辑,方便项目中使用。原创 2024-06-08 18:29:35 · 945 阅读 · 0 评论 -
机器人规划算法——基于A-star和CostMap膨胀地图的全局规划(附Github源码链接)
这段时间,笔者用c++写了一套机器人局部避障算法,并工程落地,机器人可以正常避障,避障所采用的技术方案是A*+TEB算法。并取得一定成果,后续还要针对复杂的场景继续优化。主要涉及到技术模块有:(1) costmap:代价地图模块,分为静态层和障碍物层以及膨胀层,静态层将读取地图信息并根据机器人内切半径进行膨胀,障碍物层是根据搭载的传感器检测到的障碍物点云并且以机器人内切圆半径进行膨胀。(2)全局规划器:这部分规划部分主要是A根据costmap规划一条路径。原创 2024-03-29 15:22:48 · 1215 阅读 · 2 评论 -
机器人干涉(碰撞)检测基础——Bresenham 直线算法
Bresenham 直线算法是一种画线算法,用于确定应选择的n维栅格中的点,以形成两点之间直线的近似值。它通常用于在位图图像中(例如在计算机屏幕上)绘制线图元,因为它仅使用整数加法、减法和位移位,所有这些在历史上常见的计算机体系结构中都是非常便宜的操作。它是一种增量误差算法,是计算机图形学领域最早开发的算法之一。称为中点圆算法的原始算法的扩展可用于绘制圆。虽然像Wu 算法这样的算法因为可以支持抗锯齿而在现代计算机图形学中也经常使用,但 Bresenham 线算法由于其速度和简单性仍然很重要。原创 2024-03-25 11:50:47 · 613 阅读 · 0 评论 -
关于图像像素opencv行与列关系
(1)m4.cols表示m4矩阵的列数,对应图片像素的宽度。(2)m4.rows表示m4矩阵的行数,对应图片像素的高度。其中m4是一个矩阵,读取的图片就存在这个地方。原创 2023-12-18 14:32:14 · 836 阅读 · 0 评论 -
机器人控制——MPC控制(预研)
今天在读百度的MPC算法的代码。原创 2023-08-24 17:11:24 · 658 阅读 · 0 评论 -
机器人控制算法——移动机器人横向控制最优控制LQR算法
LQR最优控制利用廉价成本可以使原系统达到较好的性能指标(事实也可以对不稳定的系统进行整定) ,而且方法简单便于实现 ,同时利用 Matlab 强大的功能体系容易对系统实现仿真。车辆运动学模型是根据车辆的几何关系建立的,不考虑影响车辆运动的力。以车辆后轴中点作为研究对象,在惯性坐标系OXY下,车辆运动状态可用车辆坐标(x,y)和车身航向角。与上次不同的是,此次被控对象是移动机器人,两轮差速模型。其中,u1和u2分别是车辆的纵向和横向控制输入。分别为车辆的纵向偏差、横向偏差和航向角偏差。原创 2023-10-12 16:00:13 · 2585 阅读 · 0 评论 -
机器人控制算法—如何使用C++读取pgm格式的栅格地图并转化为ROS地图格式的data?
近期正在做全局规划+局部动态规划的项目,目前遇到的问题是,我们如何利用C++处理pgm地图文件。即将地图信息要与像素点结合起来。所以我们需要知道地图读取和处理的底层原理,这样更好地在非ROS平台下移植。(1)data[]是按照那张地图图片的自底向上,自左至右逐个像素点存储的.我们举了一个从地图pgm读取到处理成目标地图数据格式data[] 的例子。image_x,image_y表示在图像像素坐标系中的坐标。(2) 在使用二维地图定位导航时,建好的地图文件中包括。基于地图的坐标转换到图像坐标系上。原创 2023-11-02 09:01:35 · 1380 阅读 · 1 评论 -
机器人控制—代价地图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 · 201 阅读 · 0 评论 -
机器人算法——costmap膨胀层InflationLayer
InflationLayer没有自身的栅格地图要维护,直接在主地图上进行操作,它根据膨胀参数设置用来膨胀的“参考矩阵”,并在主地图上从障碍物出发,不断传播更新,完成对整个地图障碍的膨胀。使用计算考察点和障碍物的距离,然后判断是否在膨胀半径内,如果是,则保存到nflation_cells_中用于下一次循环中。不断的从障碍物周围”上下左右“开始膨胀,并且根据参考矩阵去计算不同距离的栅格权重。这是考察下一个点,上下左右,如果在障碍物半径内,则继续循环到上述的“如此循环即可,类似于A*算法的膨胀。原创 2023-11-28 16:59:29 · 1473 阅读 · 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 · 2207 阅读 · 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 · 1234 阅读 · 1 评论 -
机器人路径平滑——线性插值
请注意,这里的内插算法是一个简化示例,使用了线性插值来平滑路径上的点。实际应用中,你可以使用更复杂的算法,如B样条曲线、Catmull-Rom曲线等。这些算法可以根据需要,根据控制点和参数来计算平滑曲线。如果有任何进一步的问题,请随时提问。这段代码实现了一种简化的平滑曲线算法,使用线性插值来平滑给定路径上的点。这个内插点的坐标是前一个点、当前点和后一个点的坐标的平均值。对于每个点,我们考虑路径上的前一个点。蓝色是原始路径,红色是平滑后的曲线。中除了起始点和终止点之外的所有点。向量,用于存储平滑后的路径点。原创 2024-02-18 16:31:11 · 540 阅读 · 0 评论 -
自动驾驶—MPC模型预测控制算法工程实现
Apollo中,LQR和MPC控制器都选用的单车动力学模型作为研究对象,单车动力学模型为非线性系统,但LQR和MPC控制器的目的是为了求最优控制解,在具体的优化求解时,均通过线性化方法将状态方程转化为线性方程进行求解,所以,可以说apollo中LQR和MPC控制器的研究对象均为线性系统。看过Apoll的LQR和MPC源码的朋友会知道,MPC和LQR很类似。MPC的研究对象可以是线性系统,也可以是非线性系统,只不过为了某些需求,如时效性,计算的便捷,操控性等,一般会将非线性系统转换为线性系统进行计算。原创 2023-11-28 14:31:07 · 1566 阅读 · 0 评论 -
机器人控制算法——局部规划器TEB算法原理及C++可视化仿真
最近一段时间,由于项目需要,一直在做TEB算法的工程化的工作,于是就考虑写下一篇系统些的文章,作为笔记,后续自己看也方便,TEB的英文名Time elastic band”,是一种局部规划器,它的核心思想是将路径规划问题转化为一个带有时间弹性的优化问题,通过对时间弹性的控制,来实现路径的优化。原创 2023-11-06 09:12:23 · 2416 阅读 · 0 评论 -
ROS下自己手写了一个卡尔曼滤波器以及一些参数的说明
因为要平滑IMU的加速度计输出的数据,包括x,y和z轴的加速度,所以这里我只用了三维。按照自己对卡尔曼滤波的理解自己写了个c++工程,如果有错误请指出。 项目源码:https://github.com/JackJu-HIT/KalmanFilter 下面代码就是核心:预测+测量更新。Eigen::MatrixXd kalman_filter::predictAndupdate(Eigen::MatrixXd x,Eigen::MatrixXd z){ if(!i...原创 2020-08-02 20:59:19 · 2415 阅读 · 3 评论 -
自动驾驶算法(几个项目集锦)---粒子滤波、卡尔曼滤波定位、传感器融合等相关算与ROS下具体实现(附Linux下C++工程github链接)【干货】
因为好几个小工程项目是在假期2020年4月份-2020年6月份学习完成的,包括激光雷达和毫米波雷达融合的项目、粒子滤波定位的项目、无迹卡尔曼滤波算法、轨迹控制预测等,重新每一个都写一篇博客太多了,最近课题也有点忙。Ps:昨天刚进行完华为2021届的自动驾驶算法工程师一面二面,不太好~接下来几个月要努力了! 我把工程源码上传到Github中,下面是项目名称及其对应的c++工程源码地址,如果你想了解原理,网上很多相关原理博客,具体细节按照源码就可以,很多我写了详细的注释。...原创 2020-07-09 12:07:33 · 2026 阅读 · 1 评论 -
自动驾驶算法(一)--基于朴素贝叶斯分类器的汽车行为预测(Linux 下c++工程代码)
因为考虑要交《模式识别》这门课的报告,而且我的研究方向还不是机器学习相关的,所以最近就上网查了些关于自动驾驶汽车中涉及到模式中分类器的相关资料,然后就有了现在这篇文章。一种简单的基于贝叶斯分类器对汽车周围情况的分类预测。你读这篇文章会发现很多都是我个人的见解,由于我不是搞机器学习,所以如果哪里错了请纠正指出。 还是和上一次一样,先给上代码https://github.com/JackJu-HIT/Prediction-self-driving-car- 什么...原创 2020-05-31 15:42:49 · 3465 阅读 · 1 评论 -
关于两种PID算法(位置型和增量式)的linux下的C++工程实现
网上有很多关于这两种控制算法的实现,但是大多基于c语言,而且用的是c语言中的结构体,看起来比较繁琐。所以我利用c++面向对象的结构以及STL中vector容器来编写两种算法,看起来简洁多了。在编写的过程中,更深刻理解了如何在实际工程中运用PID控制算法。 话不多说,先上代码https://github.com/JackJu-HIT/PID。 关于两种算法的原理,我直接粘贴我们老师上课的课件图片了,自己打字太费劲! 上述就是位置型...原创 2020-05-30 12:25:43 · 1905 阅读 · 0 评论 -
2023-3-2-22:01随笔
去年从2022年1月3日到2023年1月份一直专注于ADAS的行车横向功能的研发与实车调试,2022年写了几篇项目经验的文章,像LQR算法(虽然和同事(志同道合,技术追求的民哥)写出的工程代码,实车逻辑可调通,性能还未抽出时间优化,未应用于公司的量产项目中,但整体框架已经有了),后续有机会,会继续致力于LQR算法工程落地研究,希望有机会!我对比过行车的控制和泊车的控制,行车的控制参数很多,泊车控制的参数相对于少了多,但是泊车涉及到的功能逻辑和内容比较多,如泊车规划就很难。2023年沉寂了好久。原创 2023-03-02 22:29:19 · 491 阅读 · 0 评论 -
用m语言实现ACC状态机—练习
9、当ACC状态从On变为Standby,则SetSpd记录上一次值并保持,如状态重新变为On,则SetSpd显示为记录的上一次数值。11、ACC状态从On变为Standby时,Dist记录最后一次的值,如状态重新变为On,则Dist显示为之前最后一次的值。10、ACC状态首次变为On时,Dist默认为“远”,通过按下Gap按键可以使Dist依次变为“中”、“近”、“远”。6、当ACC状态为On时,踩下油门踏板时,ACC状态变为Standby,抬起油门踏板后,ACC状态重新跳为On;原创 2023-03-28 23:36:02 · 455 阅读 · 0 评论 -
自动驾驶——基于五次多项式螺旋线方程的换道曲线规划
已知:换道初始纵坐标y0(横向距离),换道初始航向角tan0,换道时间t,换道结束纵坐标yf,换道结束航向角tanf,车速VehSpd,曲线中点曲率q且曲率变化率为0。求解期望的规划曲线。原创 2023-06-04 23:35:43 · 1598 阅读 · 0 评论 -
Estimating the Trajectory Curvature Using Three Trajectory Points Output From Motion Planning
已知运动模块输出相邻的三个点的坐标和其对应的航向角 A,B,C,现欲求解B点曲率。原创 2023-05-23 17:21:11 · 150 阅读 · 0 评论 -
自动驾驶——离散系统LQR的黎卡提方程Riccati公式推导与LQR工程化
考虑根据实车的情况去标定此参数,从理论和工程层面去理解,如果增大Q、减小R,则此时控制系统响应速度比较快速(比较剧烈),直观反映方向盘打得又快幅度又大。如果增大R减小Q,则此时控制系统的响应速度慢,方向盘打得比较慢(比较温柔)。之前写过连续系统的黎卡提方程Riccati推导,但是考虑到实际工程落地使用的是离散系统,于是又进行了离散黎卡提方程Riccati的公式推导。工程化落地,就是使用公式(2-14)实时计算控制率K,进而得到最优的控制输入,达到最有控制的效果,需要注意的是Q和R矩阵的选取。原创 2023-05-02 16:53:41 · 2336 阅读 · 0 评论 -
自动驾驶—PID的积分饱和及处理方法
位置式PID在积分项达到饱和时,误差仍然会在积分作用下继续累积,如果一旦误差开始反向变化,系统就会需要一定时间从饱和区退出,所以在积分项的输出达到最大和最小时,要停止积分作用,并且要有积分限幅和输出限幅。原创 2023-05-02 11:35:15 · 1094 阅读 · 0 评论 -
自动驾驶—两轮差速机器人基于PID控制下轨迹跟踪
机器人轨迹跟踪一般有两种方式,一是基于PID,二是基于MPC模型预测控制方法。本文主要介绍了PID控制,这里我只采用了航向角的控制,对速度没有控制,因为,我认为,小车只要能到达目标点即可,复杂的我后续再分析分析以及还有在无人驾驶中比较有名的·MPC控制。 因为是在Matlab做的实验验证,首先你需要一个建立一个两轮差速模型,详情见我上一次的机器人差速模型博客:https://blog.csdn.net/qq_40464599/article/details/107176589;...原创 2020-07-09 22:46:03 · 24576 阅读 · 28 评论 -
自动驾驶——ADAS车道线方程推导
很长时间,对ADAS中的控制方程不求甚解,在高校读书的时候也没使用过这种方式。而且下述公式在我之前的技术博客提到多次,今日就彻底把它说明白了吧。对公式(8)的手写推导如下:上述公式(8)的推导精度不够,特补充如下。原创 2022-12-07 19:01:45 · 3160 阅读 · 5 评论 -
自动驾驶——平均道路曲率计算
最近在研究自动驾驶横向控制,实际项目中,由于感知检测到的车道线曲率不准确甚至发生曲率跳变,导致突然大幅度打方向盘,于是,研究了下控制侧对感知的曲率处理是否有提升的空间。写此博客以记录学习到的技术。道路曲率的计算方法如下,也给出了数学上的推导。我们在使用的时候,当X距离很小时,通过采样点计算,即可求出平均道路曲率,用于后续的前馈弯道控制。20221207 00:57:06 鞠春宇原创 2022-12-07 00:58:44 · 2557 阅读 · 5 评论 -
自动驾驶——自动泊车之平行泊车位学习
由于项目需求,开始介入APA自动泊车辅助系统学习,网上找了些资料,Github搜到了相关泊车仿真代码,链接如下。公式8求解最大转弯的最大半径,公式是如何推导出来的?对于此代码,基本看懂了,但是也有部分感觉不是十分懂得,迭代求解弧1的半径和圆心在代码里的实现----合理吗?2022-10-16 13:44:00 鞠春宇。然后有搜到了一篇论文链接在。暂时先这样,还没吃午饭呢。原创 2022-10-16 13:51:48 · 2153 阅读 · 5 评论 -
K-Means聚类算法---C++
在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图4所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。原创 2022-09-05 11:13:45 · 3027 阅读 · 0 评论 -
自动驾驶——自动控制方法总结
工程中所使用的PID算法原理和上述一致,但是会更具有工程性,考虑的因素更多,在学校里所学的P/I/D就三个参数,看起来很容易,很简单。实际上并不是如此,我们的pid参数会考虑不同的车速段查表啊、不同的转角差查表啊、不同的道路曲率查表啊、不同的偏离速度查表啊、不同的横向距离查表,总之是看实车的运行效果,是复杂点,但是很有效。笔者进入该行业不到一年,所接触的控制方法主要是PID算法,LQR算法笔者已经和同事一起开发出最初的版本,后续还要优化,在优化中,不断提高自己的工程能力和研发工程师应该具有的经验。.....原创 2022-08-14 23:10:55 · 2382 阅读 · 0 评论 -
20220814-LQR算法实施落地
最近一直忙于实车交付的功能项目开发,今天拿出时间对之前的基于我们的平台所开发的LQR算法,实车测试,今天终于跑通了,尽管扭矩环还存在些问题(发出的请求扭矩有点小,原因还在调查中),但是LQR所计算的目标方向盘转角是正常的,也就意味着之前做的里卡提方程求解在我们计算能力不是很大的MCU是可以实施的。下周再进行优化,争取初步实现基本控制目标。最近没写博客,一是工作太忙,二是心在她那。...原创 2022-08-14 20:53:33 · 634 阅读 · 4 评论 -
估计自车轨迹曲率的方法
在分析ADAS横向控制代码时,PID控制的输入端是当前车的轨迹和规划给的目标轨迹的横向误差,所以需要通过自车的传感器Yawrate和SteerAngle,去计算,去估计自车轨迹的曲率,看源代码,然后通过方程近似求解出自车目前的横向距离。估计自车的轨迹的曲率一般有两种方式。我们注意到这两种方式的使适用场景不一样,所以实际工程中需要给二者在不同车速度段做一个比例查表,融合二者的信息,在高速的时候,方法一置信度高故给的比例大,低速度段的时候,方法二的置信度高,给它的比例就会大。...原创 2022-08-01 18:50:59 · 2607 阅读 · 1 评论 -
机器学习—使用Gradient Descent预测房价—c++实现
之前写了一篇梯度下降的c语言实现,听吴恩达机器学习的入门课,于是考虑自己写一个简易的机器学习的例子。我们打算做一个model为f(x)=W*x+B这样简单的模型。背景可以理解为房子的面积对应不同的价格。x为房子的面积,纵坐标为房价。............原创 2022-07-29 16:30:33 · 720 阅读 · 0 评论 -
机器学习—梯度下降Gradient Descent Optimization—c语言实现
然后计算(x1(0),x2(0))(x1(1),x2(1))(x1(2),x2(2))…,再计算f(x1(0),x2(0)),f(x1(1),x2(1)),f(x1(3),x2(3)),当f(x1(k+1),x2(k+1))-f(x1(k),x2(k))值很小时,(x1(k+1),x2(k+1))就是此时的最优解。通过此迭代公式去计算x(0),x(1),x(2),x(3),…x(k+1)=x(k)-Y*(2*x(k)-10),其中Y是学习率,一般取0-1之间的数。.........原创 2022-07-27 15:02:12 · 1049 阅读 · 0 评论 -
自动驾驶-LQR工程实现(调研)
根据上述的伪代码逻辑,一步一步实现离散黎卡提方程的求解,离散黎卡提方程具体可参考https//en.wikipedia.org/wiki/Algebraic_Riccati_equation。后面如果应用到实际工程需要用c语言实现此算法。和我的github仓库。笔者用C实现的代码(部分).....................原创 2022-07-03 11:51:44 · 1565 阅读 · 0 评论 -
自动驾驶-使用QR分解求矩阵逆——c工程实现【Github源码链接】
因为最近的工程项目需要用到矩阵求逆的算法,开发的所基于的平台不可以使用任何矩阵库,考虑此,于是准备自己用c语言不借用任何矩阵库去实现矩阵求逆。为什么要写这篇文章?因为笔者之前也打算网上搜索下然后修改下,但是发现网上的要么所给的代码不全,要么用伴随矩阵求,要么写清原理,到底是基于什么理论公式写的代码,踩了一些坑,但幸运的是实现了矩阵求逆,于是就写下了这篇文章跟大家分享一下,同时也作为自己的技术笔记。以下工程的求矩阵逆的c语言代码优化可使用的完整版参见我的github链接。...................原创 2022-07-16 19:34:31 · 1087 阅读 · 0 评论 -
自动驾驶-最优控制方法LQR的C语言工程实现【附Github源码链接】
最近一直在致力于LQR的c语言工程实现,从LQR工程实现的调研到使用QR求矩阵逆,再到今天的LQR的C语言的实现,从底层一步一步去写算法,这种感觉让我回忆起在哈工大读硕期间,和算法能力非常强的泽哥合作时,他将复杂的空间三维立体路径规划问题,一步一步拆分成可用计算机语言去处理的逻辑,我在他的引导下顺利完成了代码的编写,对他的算法能力甚是佩服。是每天在重复做调参?要想矩阵逆,首先要QR分解,然后再求上三角矩阵的逆,这些具体的算法如果不懂没关系,但是要能看懂所给的数学结论,然后用这些数学结论的公式去编写代码。..原创 2022-07-19 00:22:06 · 2645 阅读 · 5 评论 -
自动驾驶-动力学模型-状态空间法A矩阵----c语言实现【附Github源码链接】
在实现最优控制的过程中,发现状态空见表达式还需要离散化处理,因此为了使最优控制LQR算法尽快落地,又写了个针对于汽车动力学模型的状态空间表达式的离散化处理程序,也是用C语言实现的。按照上述公式,写了如下的代码,完整代码请参见我的github仓库。........................原创 2022-07-20 21:09:46 · 1405 阅读 · 9 评论