49.在ROS中实现local planner(2)- 实现Purepersuit(纯跟踪)算法

2023-05-16

48.在ROS中实现local planner(1)- 实现一个可以用的模板实现了一个模板,接下来我们将实现一个简单的纯跟踪控制,也就是沿着固定的路径运动,全局规划已经规划出路径点,基于该路径输出相应的控制速度

1. Pure Pursuit

Pure Pursuit路径跟随便是基于受约束移动机器人圆周运动的特性所开发出来的运动控制方式。原理十分简单,如图所示,移动机器人有一个前视的搜索半径,与机器人规划的路径有一个焦点,假设机器人从当前位置到路径焦点的运动为圆周运动。其中的前视距离便是图1中的L。根据几何关系便可以计算机器人的运动半径。
在这里插入图片描述

受约束的机器人模型(不能横向运动)可由两个控制量组成,即运动参考点的线速度v与角速度w。在极短的运行周期中,机器人都是以固定的线速度与角速度运动。因此机器人的运动可以视为圆周运动(w=0时为直线运动)。

2. 运动半径推算

如图所示的机器人便是绕着一个旋转中心进行圆周运动,于是移动机器人的运动控制可视为求解其在运动过程中的实时旋转半径。图中,r为移动机器人的旋转半径。

我们以base坐标系为例,及当前机器人为坐标原点,x轴为前方,y轴为左方,即ROS的坐标系,(x,y)为目标点, L为距离目标点的距离(前视距离),如下计算,容易求得旋转半径r

由图可得 d = r − y d = {r - y} d=ry
d 2 + x 2 = r 2 d^2+x^2 = r^2 d2+x2=r2
即: r 2 − 2 r y + y 2 + x 2 = r 2 r^2-2ry+y^2+x^2 = r^2 r22ry+y2+x2=r2
即: x 2 + y 2 = 2 r y x^2+y^2 = 2ry x2+y2=2ry
即: L 2 = 2 r y L^2 = 2ry L2=2ry
即: r = L 2 / 2 y r = L^2/2y r=L2/2y

运动半径=前视距离的平方/两倍的y

我们知道r=v/w 即我们只需要给定v/w为固定的值即可

因v与L相关 我们取一次关系
v=aL a为长数项
可得w=v/r=a*2y/L

3. 坐标转换

我们知道setPlan下发的坐标一般使用的是map坐标系,我们计算的时候需要转换为base坐标系

我们可以使用init接口提供的tf::TransformListener即可完成, (1.14.0版本后接口更新,使用新的接口)


geometry_msgs::PoseStamped PurepursuitPlanner::goalToBaseFrame(const geometry_msgs::PoseStamped& goal_pose_msg) {

#if ROS_VERSION_GE(ROS_VERSION_MAJOR, ROS_VERSION_MINOR, ROS_VERSION_PATCH, 1, 14, 0)

  geometry_msgs::PoseStamped goal_pose, base_pose_msg;

  goal_pose = goal_pose_msg;

  goal_pose.header.stamp = ros::Time(0.0);

  try {

    base_pose_msg = tf_->transform(goal_pose, "base_link");

  } catch (tf2::TransformException& ex) {

    ROS_WARN("transform err");

    return base_pose_msg;

  }

#else

  geometry_msgs::PoseStamped base_pose_msg;

  tf::Stamped<tf::Pose> goal_pose, base_pose;

  poseStampedMsgToTF(goal_pose_msg, goal_pose);

  goal_pose.stamp_ = ros::Time();

  try {

    tf_->transformPose(costmap_ros_->getBaseFrameID(), goal_pose, base_pose);

  } catch (tf::TransformException& ex) {

    ROS_WARN("transform err");

    return base_pose_msg;

  }

  tf::poseStampedTFToMsg(base_pose, base_pose_msg);

#endif

  return base_pose_msg;

}

4. 前视距离

我们不断根据当前位置,更新前视距离,通过前面的接算,给定速度

4.1 前视距离大小设置

前世距离可以根据V我们预设速度相关

  • 如果前世距离较大,相当于路径采样间隔较大,跟踪路径与规划路径的偏差会大。

  • 如果前世距离较小,机器人容易抖动

4.2 前视距离更新策略

如果当前距离路径中前视距离的点后的n个点的距离小于前世距离,则更新前视距离
即如果当前前视距离的点在路径索引为n,则判断n+m索引距离当前点位置是否小于预设前视距离值

5. 速度限制

一般机器人小车,线速度是>0的即,只能前进,无法后退。这就需要我们新增当前前视点角度判断, 如果角度超过90,即在车的后方。可以对速度修正强制旋转

  auto target_yaw_diff = atan2(goal.pose.position.y, goal.pose.position.x);  // 当前目标点相对机器人的角度
  
.... // 计算半径 速度

    // 当前目标点相对机器人的角度 相差较大(即目标点在机器人后面), 需要直发角速度(即原地旋转), 转向目标点
    if (target_yaw_diff > PI*0.5) {
      cmd_vel.linear.x = 0;
      cmd_vel.angular.z = 0.8;
    } else if (target_yaw_diff < -PI*0.5) {
      cmd_vel.linear.x = 0;
      cmd_vel.angular.z = -0.8;
    }

6. 完成判断

我们在前视点到达规划路径的最后一个时,且当前点与该最后一点距离差小于预设的容忍差,强制输出0速度

  if (got && l < GOAL_TOERANCE_XY) {
    goal_reached_ = true;
    cmd_vel.angular.z = 0;
    cmd_vel.linear.x = 0;
  }

7. 测试

  • 修改move_base配置文件move_base_params.yaml
# base_local_planner: "dwa_local_planner/DWAPlannerROS"
base_local_planner: pure_pursuit_local_planner/PurepursuitPlanner

dwa_local_planner/DWAPlannerROS—>pure_pursuit_local_planner/PurepursuitPlanner

  • 启动模拟器
pibot_simulator
  • 启动rviz
pibot_view

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

49.在ROS中实现local planner(2)- 实现Purepersuit(纯跟踪)算法 的相关文章

  • 为了安装caffe 安装opencv

    cmake D CMAKE BUILD TYPE 61 RELEASE D CMAKE INSTALL PREFIX 61 home lab248 anaconda2 D INSTALL PYTHON EXAMPLES 61 ON D IN
  • 腾讯轻量云服务器控制台详细介绍及建站操作图文教程

    腾讯轻量应用服务器控制台与腾讯云服务器不同 xff0c 轻量应用服务器主要是在控制台上集成了大部分建站功能 xff0c 通过简单点击几次鼠标就可以轻松建站 xff0c 易学易用 不过对于没接触过的新手来说 xff0c 还是有点陌生的 xff
  • 腾讯云轻量应用服务器快速搭建一个专属网盘

    一 前言 xff1a 云盘我想大家接触的一定不会少 云盘很好地解决了文件存储和共享的问题 xff0c 但随着大量云盘厂商的退出 xff0c 剩余的云盘服务也越来越少 有些云盘虽然上传速度快 xff0c 但是下载速度较慢 xff0c 不开通会
  • 使用腾讯云轻量应用服务器搭建一个简洁漂亮的目录

    前言 作为一个摄影爱好者 xff0c 会经常做一些图片的分享 xff0c 前端时间在网上看到了一个非常好看的目录 xff0c 这里给大家分享一下怎么样通过腾讯轻量应用服务器来搭建 官方介绍 files photo gallery是一款简洁漂
  • 玩转服务器-博客两件套之绝佳的Markdown写作平台CodiMD

    前言 大家都很羡慕博主的高产 xff0c 纷纷问我有什么技巧 我的回复是手熟 xff0c 多写 xff0c 那么多写就需要一个比较好的工具 xff0c 所以我这里给大家介绍一个在线markdown文档平台 xff0c 让大家可以随时书写文档
  • 玩转服务器-博客两件套之开源的一文多发平台ArtiPub

    玩转服务器 博客两件套之开源的一文多发平台ArtiPub 前言 上次给大家介绍了 xff0c 博主在线的markdown文档平台 xff0c 让大家可以随时书写文档和博客 xff0c 那么很多朋友在很多平台都看到了我的文章 xff0c 我是
  • 使用acme.sh申请Let‘s Encrypt免费的SSL证书

    使用acme sh申请Let s Encrypt免费的SSL证书 说明 xff1a Let s Encrypt 是一个由非营利性组织 互联网安全研究小组 xff08 ISRG xff09 提供的免费 自动化和开放的证书颁发机构 xff08
  • win7操作系统下laravel/homestead在SSH auth method: private key卡住提示Warning: Connection reset. Retrying的解决方案

    将VirtualBox兼容模式改为win7 勾选以管理员身份运行 安全里面各组个用户全部编辑好权限并勾选 电脑开机后优先双击VirtualBox启动后在执行git命令行进行启动
  • 为什么用了索引,SQL查询还是慢?

    原文链接cnblogs com jackyfei p 12122767 html 经常有同学疑问 xff0c 为什么有时候一个SQL语句使用了索引 xff0c 为什么还是会进入到慢查询之中呢 xff1f 今天我们就从这个问题开始来聊一聊索引
  • 腾讯云轻量应用服务器器使用技巧-腾讯云OrcaTerm的上传下载

    前言 xff1a 上传下载是WebShell中不可或缺的功能之一 xff0c 也是我在日常管理过程中经常使用操作 这里就跟着博主的视角来揭秘 xff0c 腾讯云OrcaTerm的上传与下载 对比 博主对比了一些shell的应用 xff0c
  • C语言strtok函数

    strtok是C语言用于分割字符串的函数 xff0c 需要include lt string h gt 第一次使用时第一个参数传入待分割的字符串 xff0c 第二个参数传入分割符号 第二次使用时第一个函数传入NULL 第二个参数传入分割符号
  • CSS | 置换元素(可替换元素)

    文章目录 置换元素 定义 常见置换元素 固有尺寸 非置换元素 注意 若文章有任何纰漏或未涉及你想了解的内容 欢迎在评论提出 我会尽最快速度回复 置换元素 定义 置换元素是具有固有尺寸 intrinsic dimensions 浏览器根据其标
  • 人体姿态估计综述(Human Pose Estimation Overview)

    主流数据集整理 xff1a http blog csdn net qq 36165459 article details 78332172 Part1 xff1a Single Person Pose Estimation 2015 年之前
  • 1到100的二进制表示

    1 61 1 2 61 10 3 61 11 4 61 100 5 61 101 6 61 110 7 61 111 8 61 1000 9 61 1001 10 61 1010 11 61 1011 12 61 1100 13 61 11
  • 画格子

    题目描述 画一些小格子 xff0c 如下所示 xff1a MAKEAMERICA AKEAMERICAG KEAMERICAGR EAMERICAGRE AMERICAGREA MERICAGREAT ERICAGREATA RICAGRE
  • golang -----------字符串(rune,string,type)

    一 内存布局 字符串在Go语言内存模型中用一个2字长的数据结构表示 它包含一个指向字符串存储数据的指针和一个长度数据 因为string类型是不可变的 xff0c 对于多字符串共享同一个存储数据是安全的 切分操作str i j 会得到一个新的
  • HTTP中GET,POST和PUT的区别

    一 HTTP中定义了以下几种请求方法 1 GET xff1b 2 POST xff1b 3 PUT xff1b 4 DELETE 5 HEAD xff1b 6 TRACE xff1b 7 OPTIONS xff1b 二 各个方法介绍 xff
  • B树,B+树,红黑树应用场景笔记

    一 B树的应用 1 B树大量应用在数据库和文件系统当中 它的设计思想是 xff0c 将相关数据尽量集中在一起 xff0c 以便一次读取多个数据 xff0c 减少硬盘操作次数 B树算法减少定位记录时所经历的中间过程 xff0c 从而加快存取速
  • 使用 Gitee 进行代码管理

    为什么使用 Gitee 这里推荐使用 Gitee 进行代码管理 Gitee 和 Github 最大的区别在我看来就是私有库的免费 xff0c 在 Github 上建立私有库是需要收费的 xff0c 而在 Gitee 上建立私有库是不需要收费
  • kubernetes的Kube-proxy的iptables转发规则

    概念 kube proxy 实际上并不起一个 proxy 的作用 xff0c 而是 watch 变更并更新 iptables xff0c 也就是说 xff0c client 的请求直接通过 iptables 路由 如果kube proxy通

随机推荐

  • kube-proxy ipvs模式详解

    一 kube proxy 开启 ipvs 1 环境准备 xff1a 测试环境为kubernetes集群 xff0c 一台master节点 xff0c 一台node节点 集群网络使用flanneld搭建 注意 xff1a master节点上也
  • k8s部署Traefik

    Ingress ingress是从kubernetes集群外访问集群的入口 xff0c 将用户的URL请求转发到不同的service上 Ingress相当于nginx apache等负载均衡方向代理服务器 xff0c 其中还包括规则定义 x
  • (1)webpack介绍

    一 webpack简介 webpack 61 Web Package xff0c webpack是一个现代JS应用程序的静态模块打包器 xff08 module bundler xff09 模块 xff08 模块化开发 xff0c 可以提高
  • MAML: meta learning 论文分析

    https zhuanlan zhihu com p 57864886 一 Meta Learning 简述 Meta Learning xff08 即元学习 xff09 是最近比较火的研究方向 xff0c 其思想是learning to
  • Oracle数据库权限

    Oracle数据库权限基本认识 一 oracle权限 ORACLE系统提供三种权限 xff1a Object 对象级 System 系统级 Role 角色级 权限分类 1 系统权限 xff1a 系统规定用户使用数据库的权限 xff08 系统
  • 解决:rospack depends 报错: could not find python module 'rosdep2.rospack'. is rosdep up-to-date

    这个问题全部如下 xff1a Traceback most recent call last File 34 home suli local lib python2 7 site packages rosdep2 init py 34 li
  • Ubuntu系统日常崩溃之-terminal打不开

    我也不记得干了什么 xff0c 莫名其妙的terminal就打不开了 xff0c 不只是通过快捷键打不开 xff0c 反正各种都打不开 xff0c 每次点击terminal xff0c 它会出现在任务栏上面 xff0c 之后鼠标就变成圆圈转
  • ARM交叉编译工具链

    为什么要用交叉编译器 xff1f 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序 xff0c 比如在PC平台 xff08 X86 CPU xff09 上编译出能运行在以ARM为内核的CPU平台上的程序 xff
  • 最近发现有很多人一直在问苹果ID双重认证怎么关闭。

    最近发现有很多人一直在问苹果ID双重认证怎么关闭 xff1f 其实我想说大家都粗心了 xff0c 双重认证是和ios版本没有关系的 xff0c 无论什么IOS版本开通的双重认证都是可以关闭的 https support apple com
  • QT - QT中配置MSVC编译环境 以及 VS中配置QT开发环境

    本文主要记录一下如何在 QT5 14 2 中配置 MSVC2017 构建套件 xff0c 以及在VS2017中配置QT的开发环境 开发环境为 Win10 43 QT5 14 2 43 Visual Studio 2017 1 VS2017安
  • Mysql启用only_full_group_by模式

    Expression 3 of SELECT list is not in GROUP BY clause and contains nonaggregated column userinfo t long user name which
  • 配置opencv3.1+caffe

    为了配置caffe做reid这是官方的入口 caffe reid https github com zlmzju caffe tree reid caffe install http caffe berkeleyvision org ins
  • reEFInd(refind)引导Windows+deepin双系统

    本文已迁移至 xff1a https www aflyingfish top articles 7fdc1ca8cf58
  • Kubernetes(K8S)一

    K8S 之前写了docker发现 docker只能在单机部署 docker部署分布式系统还是很麻烦 所以就有了K8S K8S全称Kubernetes xff08 读音 库波奈第丝 xff09 可以把K8S理解为一个在docker基础上进一步
  • 安装Docker Desktop报错WSL 2 installation is incomplete的问题(解决报错)

    WSL 2 installation is incomplete报错如下图所示 xff1a 处理方法 xff1a 1 安装Hyper V虚拟服务 2 安装 适用于 Linux 的 Windows 子系统 xff08 wsl2 xff09 3
  • 如何区分主键和外键以及主表和从表

    转自 xff1a https www cnblogs com miniSimple p 12275861 html 文章导读 xff1a 在后面跟其他数据库做对比的时候 xff0c 这个是其中一个点 xff08 关系型数据库 xff09 把
  • 使用客户端连接 Mysql 出现Error no. 1251错误

    错误详情信息 ERROR 1251 client does not support authentication protocol requested by server consider upgrading Mysql client 问题
  • linux下启动mariadb数据库

    在linux下启动数据库时 xff0c 出现如下错误 span style color rgb 79 79 79 text align justify ERROR 2002 HY000 Can 39 t connect to local M
  • 【编译原理】实验二 词法分析程序

    一 实验标题 xff1a 词法分析程序 二 实验目的 xff1a 学习和掌握词法分析程序构造的状态图代码化方法 三 实验内容 xff1a xff08 1 xff09 阅读已有编译器的经典词法分析源程序 xff08 2 xff09 选择一个编
  • 49.在ROS中实现local planner(2)- 实现Purepersuit(纯跟踪)算法

    48 在ROS中实现local planner xff08 1 xff09 实现一个可以用的模板实现了一个模板 xff0c 接下来我们将实现一个简单的纯跟踪控制 xff0c 也就是沿着固定的路径运动 xff0c 全局规划已经规划出路径点 x