轨迹规划 | 图解纯追踪算法Pure Pursuit(附ROS C++/Python/Matlab仿真)

news2024/10/5 4:27:34

目录

  • 0 专栏介绍
  • 1 纯追踪算法原理推导
  • 2 自适应纯追踪算法(APP)
  • 3 规范化纯追踪算法(RPP)
  • 4 仿真实现
    • 4.1 ROS C++仿真
    • 4.2 Python仿真
    • 4.3 Matlab仿真

0 专栏介绍

🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。

🚀详情:图解自动驾驶中的运动规划(Motion Planning),附几十种规划算法


1 纯追踪算法原理推导

纯追踪算法(Pure Pursuit, PP)参考了人类驾驶行为,其基本思想是:在待跟踪路径上设置预瞄点(goal-ahead),通过简单的几何方法驱动机器人跟踪预瞄点,随着机器人运动,预瞄点动态移动直至抵达目标位置。

给定路径点 P = { p 0 , p 1 , ⋯   , p g } \mathcal{P} =\left\{ \boldsymbol{p}_0,\boldsymbol{p}_1,\cdots ,\boldsymbol{p}_g \right\} P={p0,p1,,pg}。根据纯追踪算法设置的固定预瞄距离 L L L选择预瞄点

p l = p i ∈ P    s . t . ∥ p i − 1 − p r ∥ 2 2 < L    a n d ∥ p i − p r ∥ 2 2 ⩾ L \boldsymbol{p}_l=\boldsymbol{p}_i\in \mathcal{P} \,\,\mathrm{s}.\mathrm{t}. \left\| \boldsymbol{p}_{i-1}-\boldsymbol{p}_r \right\| _{2}^{2}<L\,\,\mathrm{and} \left\| \boldsymbol{p}_i-\boldsymbol{p}_r \right\| _{2}^{2}\geqslant L pl=piPs.t.pi1pr22<Landpipr22L

其中 p r \boldsymbol{p}_r pr是最接近机器人当前位置的路径点。

当规划时间间隔 Δ t → 0 \varDelta t\rightarrow 0 Δt0时,可认为机器人线速度 v v v和角速度 ω \omega ω不变,因此其转向半径 R = v / ω R={{v}/{\omega}} R=v/ω是定值,即机器人进行圆周运动。

在这里插入图片描述

如图所示,根据几何关系可得

L sin ⁡ 2 α = R sin ⁡ ( π / 2 − α ) ⇒ R = L 2 sin ⁡ α \frac{L}{\sin 2\alpha}=\frac{R}{\sin \left( {{\pi}/{2}}-\alpha \right)}\Rightarrow R=\frac{L}{2\sin \alpha} sin2αL=sin(π/2α)RR=2sinαL

确定曲率半径后,对于差速轮式移动机器人而言,可根据下式计算当前的控制指令

{ v t = v d ω t = v t / R \begin{cases} v_t=v_d\\ \omega _t={{v_t}/{R}}\\\end{cases} {vt=vdωt=vt/R

在机器人局部坐标系中,设机器人与预瞄点的纵向误差为 e y e_y ey,则

R = L 2 2 e y ⇔ κ = 2 L 2 ⋅ e y R=\frac{L^2}{2e_y}\Leftrightarrow \kappa =\frac{2}{L^2}\cdot e_y R=2eyL2κ=L22ey

相当于一个以横向跟踪误差为系统误差的比例控制器,如图所示。增大 L L L有利于降低超调,但会产生稳态误差;减小 L L L能够加快动态响应速度,但容易引起振荡。

在这里插入图片描述

2 自适应纯追踪算法(APP)

为了在跟踪振荡和较慢收敛间取得可接受的权衡,自适应纯追踪算法(Adaptive Pure Pursuit, APP)根据运动速度自适应调整预瞄距离

L t = l t v t + L 0 L_t=l_tv_t+L_0 Lt=ltvt+L0

其中 l t l_t lt是前瞻增益,表示将 v t v_t vt向前投影的时间增量; L 0 L_0 L0是最小预瞄距离。

3 规范化纯追踪算法(RPP)

考虑到机器人始终以期望速度 运动并不合理,尤其是在狭窄区域、急转弯等不完全可见工作空间,动态调整机器人速度有利于提供更高质量的行为表现。规范化纯追踪算法(Regulated Pure Pursuit, RPP)引入了修正启发式等进行自适应调整。举例而言,曲率启发式,目的是放慢机器人在部分可观察环境的速度,以提高盲转弯时的安全性。其中最大曲率阈值 提供了急转弯位置的速度缩放。

v t ′ = { v t    , κ ⩽ κ max ⁡ κ max ⁡ κ v t    , κ > κ max ⁡ v_{t}^{'}=\begin{cases} v_t\,\, , \kappa \leqslant \kappa _{\max}\\ \frac{\kappa _{\max}}{\kappa}v_t\,\, , \kappa >\kappa _{\max}\\\end{cases} vt={vt,κκmaxκκmaxvt,κ>κmax

可以根据应用需求设计更多启发式

4 仿真实现

4.1 ROS C++仿真

核心代码如下所示

bool RPPPlanner::computeVelocityCommands(geometry_msgs::Twist& cmd_vel)
{
  ...
  
  double vt = std::hypot(base_odom.twist.twist.linear.x, base_odom.twist.twist.linear.y);
  double L = getLookAheadDistance(vt);

  getLookAheadPoint(L, robot_pose_map, prune_plan, lookahead_pt, theta, kappa);
  double lookahead_k = 2 * sin(_dphi(lookahead_pt, robot_pose_map)) / L;

  // calculate commands
  if (shouldRotateToGoal(robot_pose_map, global_plan_.back()))
  {
    ...
  }
  else
  {
    double e_theta = regularizeAngle(_dphi(lookahead_pt, robot_pose_map));

    // large angle, turn first
    if (shouldRotateToPath(std::fabs(e_theta), M_PI_2))
    {
      cmd_vel.linear.x = 0.0;
      cmd_vel.angular.z = angularRegularization(base_odom, e_theta / d_t_);
    }

    // apply constraints
    else
    {
      double curv_vel = _applyCurvatureConstraint(max_v_, lookahead_k);
      double cost_vel = _applyObstacleConstraint(max_v_);
      double v_d = std::min(curv_vel, cost_vel);
      v_d = _applyApproachConstraint(v_d, robot_pose_map, prune_plan);

      cmd_vel.linear.x = linearRegularization(base_odom, v_d);
      cmd_vel.angular.z = angularRegularization(base_odom, v_d * lookahead_k);
    }
  }

  return true;
}

在这里插入图片描述

4.2 Python仿真

核心代码如下所示

def plan(self):
    lookahead_pts = []
    dt = self.params["TIME_STEP"]
    for _ in range(self.params["MAX_ITERATION"]):
        # break until goal reached
        if self.shouldRotateToGoal(self.robot.position, self.goal):
            return True, self.robot.history_pose, lookahead_pts

        # get the particular point on the path at the lookahead distance
        lookahead_pt, _, _ = self.getLookaheadPoint()

        # get the tracking curvature with goalahead point
        lookahead_k = 2 * math.sin(
            self.angle(self.robot.position, lookahead_pt) - self.robot.theta
        ) / self.lookahead_dist

        # calculate velocity command
        e_theta = self.regularizeAngle(self.robot.theta - self.goal[2]) / 10
        if self.shouldRotateToGoal(self.robot.position, self.goal):
            if not self.shouldRotateToPath(abs(e_theta)):
                u = np.array([[0], [0]])
            else:
                u = np.array([[0], [self.angularRegularization(e_theta / dt)]])
        else:
            e_theta = self.regularizeAngle(
                self.angle(self.robot.position, lookahead_pt) - self.robot.theta
            ) / 10
            if self.shouldRotateToPath(abs(e_theta), np.pi / 4):
                u = np.array([[0], [self.angularRegularization(e_theta / dt)]])
            else:
                # apply constraints
                curv_vel = self.applyCurvatureConstraint(self.params["MAX_V"], lookahead_k)
                cost_vel = self.applyObstacleConstraint(self.params["MAX_V"])
                v_d = min(curv_vel, cost_vel)
                u = np.array([[self.linearRegularization(v_d)], [self.angularRegularization(v_d * lookahead_k)]])
        
        # update lookahead points
        lookahead_pts.append(lookahead_pt)

        # feed into robotic kinematic
        self.robot.kinematic(u, dt)
    
    return False, None, None

在这里插入图片描述

4.3 Matlab仿真

核心代码如下所示

while iter < param.max_iteration
	iter = iter + 1;
	
	% break until goal reached
	if shouldRotateToGoal([robot.x, robot.y], goal, param)
	    flag = true;
	    break;
	end
	
	% get the particular point on the path at the lookahead distance
	[lookahead_pt, ~, ~] = getLookaheadPoint(robot, path, param);
	
	% get the tracking curvature with goalahead point
	lookahead_k = 2 * sin( ...
	    atan2(lookahead_pt(2) - robot.y, lookahead_pt(1) - robot.x) - robot.theta ...
	) / getLookaheadDistance(robot, param);
	
	% calculate velocity command
	e_theta = regularizeAngle(robot.theta - goal(3)) / 10;
	if shouldRotateToGoal([robot.x, robot.y], goal, param)
	    if ~shouldRotateToPath(abs(e_theta), 0.0, param)
	        u = [0, 0];
	    else
	        u = [0, angularRegularization(robot, e_theta / param.dt, param)];
	    end
	else
	    e_theta = regularizeAngle( ...
	        atan2(lookahead_pt(2) - robot.y, lookahead_pt(1) - robot.x) - robot.theta ...
	    ) / 10;
	    if shouldRotateToPath(abs(e_theta), pi / 4, param)
	        u = [0, angularRegularization(robot, e_theta / param.dt, param)];
	    else
	        % apply constraints
	        curv_vel = applyCurvatureConstraint(param.max_v, lookahead_k, param);
	        cost_vel = applyObstacleConstraint(param.max_v, map, robot, param);
	        v_d = min(curv_vel, cost_vel);
	        u = [
	                linearRegularization(robot, v_d, param), ...
	                angularRegularization(robot, v_d * lookahead_k, param) ...
	        ];
	    end
	end
	
	% input into robotic kinematic
	robot = f(robot, u, param.dt);
	pose = [pose; robot.x, robot.y, robot.theta];
end

在这里插入图片描述

完整工程代码请联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1669644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Embedding技术学习

可能很多人并没有关注Embedding技术&#xff0c;但实际上它是GPT非常重要的基础&#xff0c;准备的说&#xff0c;它是GPT模型中理解语言/语义的基础。 【解释什么是Embedding】 对于客观世界&#xff0c;人类通过各种文化产品来表达&#xff0c;比如&#xff1a;语言&#x…

上下左右翻转照片以及标注信息扩充数据集

目录 前言&#xff1a; 示例项目数据结构&#xff1a; 源代码&#xff1a; 运行代码后生成的项目结构&#xff1a; 效果&#xff1a; 前言&#xff1a; 使用yolo训练模型时&#xff0c;遇到数据集很小的情况&#xff08;一两百张&#xff09;&#xff0c;训练出来的模型效…

部品图纸管理系统-部品图纸管理系统推荐

部品图纸管理系统-部品图纸管理系统推荐&#xff1a; 彩虹图纸管理系统是一种专门用于管理部品图纸和相关文档的软件系统。该系统旨在提供一个集中、协同、统一和高效的平台&#xff0c;以便企业能够轻松地存储、组织、查询、审批和共享部品图纸。 以下是彩虹图纸管理系统通常具…

关于【python中启动web服务后发送post请求时报错“500 Internal Server Error”的问题】

关于【python中启动web服务后发送post请求时报错“500 Internal Server Error”的问题】 问题描述 在原有的conda虚拟环境中运行项目的web服务时运行正常&#xff0c;换到一个配置好的新的虚拟环境中运行同样的项目代码时就报错“500 Internal Server Error”。 解决方案&…

Request请求数据 (** kwargs参数)

目录 &#x1f31f;前言&#x1f349;request入门1. params2. data3. json4. headers5. cookies6. auth7. files8. timeout9. proxies10. allow_redirects11. stream12. verify13. cert &#x1f31f;总结 &#x1f31f;前言 在Python中&#xff0c;发送网络请求是一项常见的任…

企业微信hook接口协议,ipad协议http,同步消息记录

同步消息记录 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信limit是int每次返回大小seq是int查询下标 请求示例 {"uuid":"ecb033af-6fcd-4ec2-880e-41f070b65eaf","limit":1000, "seq":1…

led灯哪个品牌质量好?分享五款耐用又护眼的护眼台灯

led灯哪个品牌质量好&#xff1f;在LED照明日益普及的今天&#xff0c;选择一款质量上乘、耐用且护眼的LED台灯显得尤为重要。本文将为大家推荐五款备受好评的护眼台灯品牌&#xff0c;这些品牌凭借其卓越的照明效果、舒适的视觉体验以及优质的售后服务&#xff0c;成为了市场上…

根据特定条件在列表中加一列操作,符合此条件时此列才会展示

我们想要列表中有一列数据在A环境打开是显示的&#xff0c;在B环境打开则不显示&#xff0c;这里B环境表示为默认环境 1、不能直接用环境判断加在列表的前面&#xff0c;否则其他环境会出现空格情况 constructor(props) {super(props)const columns [{ title: 姓名, dataInd…

英语口语打分和纠正的开发引擎

英语口语打分和纠正的开发引擎包括但不限于以下几种&#xff0c;这些引擎利用了深度学习、大数据分析等先进技术&#xff0c;能够对发音准确度、流利度、完整度、韵律特征等进行全方位评价和纠正。开发者可以根据自己的需求选择合适的引擎进行集成&#xff0c;以提升英语口语学…

PSO-SVM多变量回归预测|粒子群算法优化支持向量机|Matalb

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

【Tello无人机】实物轨迹跟踪控制

上一篇介绍了Tello无人机仿真环境中的飞行控制&#xff0c;本篇将介绍tello无人机在物理系统中的轨迹跟踪&#xff0c;实现实物无人机的速度控制。本文采用的无人机为Tello TT&#xff0c;TELLO Talent由飞行器和拓展配件两部分组成。飞行器配备视觉定位系统&#xff0c;并集成…

618有哪些值入手的好物?盘点618值得选购好物清单

马上就要618大促了&#xff0c;要说618期间优惠力度最大的那肯定还是家电、数码这一类型的&#xff0c;下面就给大家整理了几款值得入手的家电数码好物&#xff01; 好物推荐一、西圣Mike无线领夹麦克风 真的强烈推荐西圣Mike无线领夹麦克风&#xff01;市场上某些制造商可能…

hadoop yarm你知道吗?

一、概念 Hadoop YARN&#xff08;Yet Another Resource Negotiator&#xff09;是Hadoop 2.x版本中的一个重要组件&#xff0c;用于资源管理和作业调度。它是Hadoop的第二代资源管理器&#xff0c;取代了Hadoop 1.x版本中的MapReduce作业调度器。 通俗地理解它的作用有点像一…

如何训练一个大模型:LoRA篇

目录 写在前面 一、LoRA算法原理 1.设计思想 2.具体实现 二、peft库 三、完整的训练代码 四、总结 写在前面 现在有很多开源的大模型&#xff0c;他们一般都是通用的&#xff0c;这就意味着这些开源大模型在特定任务上可能力不从心。为了适应我们的下游任务&#xff0c;…

高效快速 推荐这款服务器同步软件

服务器数据同步是为了确保在不同的服务器或数据中心之间能够保持数据的一致性和可用性&#xff0c;选择一款合适的服务器同步软件&#xff0c;可确保数据完整性、提高服务质量和满足业务需求的重要手段。 服务器数据同步的痛点主要包括&#xff1a; 1、数据一致性&#xff1a;…

SQL-递归查询

运行环境&#xff1a; Mysql8以上&#xff0c;递归查询功能在8以上版本被正式引入 一、SQL递归查询的概念 递归指的是通过调用函数或过程或自身来解决问题的方法&#xff0c;常用于一些具有规律性循环的操作。SQL递归查询是基于一组初始数据&#xff0c;通过递归查询&#xf…

Redis继续(黑马)

Redis持久化 RDB与AOF RDB记录是二进制数据&#xff0c;Redis停机时会触发保存&#xff0c;名称&#xff1a; dump.rdb 缺点&#xff1a;间歇式复制可能存在宕机数据更新丢失 AOF 记录的写操作命令&#xff0c;每秒记录一下&#xff0c;也存在数据更新丢失的可能&#xff0c;相…

【class6】人工智能初步(选择一个合适的监督学习算法。)

【昨日内容复习】 进行监督学习时&#xff0c;第一个步骤是提取数据集的文本特征和对应的标签。 提取文本特征的具体步骤如下&#xff1a; STEP1. 构造词袋模型&#xff0c;提取数据集中的文本特征 STEP2. 使用toarray()函数&#xff0c;将X转换为一个NumPy数组&#xff0c;方…

【5月13日】YesPMP众包平台最新项目

YesPMP众包平台5月13日最新项目&#xff0c;有感兴趣的用户查看项目接单&#xff0c;甲乙方无障碍沟通。 1.查看项目&#xff1a;分析一款PC端登录协议及收发消息 2.查看项目&#xff1a;《中华历史漫画》 3.查看项目&#xff1a;图像算法 …

什么是CCRC?做什么用的?

CCRC&#xff08;中国网络安全审查认证和市场监管大数据中心&#xff09;原名为中国网络安全审查技术与认证中心&#xff0c;也被称为中国信息安全认证中心&#xff08;ISCCC&#xff09;。 该中心是经中央机构编制委员会办公室批准成立的&#xff0c;其主要职责是依据国家法律…