Task

本次实验才采用“Follow the carrot 算法去跟随定义好的路径。控制的目标点在机器人行走的路径上,距离机器人是个常数距离。机器人计算自己的方向角和目标点角度之间的相差度数。控制这个差角为0.
为了在探测时候能够用这个算法,路径需要在实时更新并且需要配合避障,因为在探测时候路径计算的并不精确,机器人有碰撞到障碍物的可能性。

算法

位置和向量

向量的模:

||v||=x2+y2−−−−−−√(vector-norm)

||\boldsymbol{v}||=\sqrt{x^{2}+y^{2}}\tag{vector-norm}
点乘,加法,减法:

v⋅a=(xva;yva)(mult-vector)

\boldsymbol{v}\cdot a = (x_{v}a;y_{v}a)\tag{mult-vector}

v+u=(xv+xu;yv+yu)(add-vector)

\boldsymbol{v}+\boldsymbol{u} = (x_{v}+x_{u};y_{v}+y_{u})\tag{add-vector}

v−u=(xv−xu;yv−yu)(add-vector)

\boldsymbol{v}-\boldsymbol{u} = (x_{v}-x_{u};y_{v}-y_{u})\tag{add-vector}

处理输入输出

控制机器人采用Twis消息类型
从激光输入进来的数据可以用来避障
输入Path的消息格式:

std_msgs/Header header
geometry_msgs/PoseStamped[] poses
std_msgs/Header header
geometry_msgs/Pose pose
geometry_msgs/Point position
geometry_msgs/Quaternion orientation

本次实验中只有x、y坐标下的位置,路径存储在一个队列对象MyPoint中,你可以仅仅为每一个在poses向量中的元素建立一个新的MyPoint类的对象,然后添加到路径队列中。每次添加新的控制点需要删掉之前的点。在这种情况下,每一次循环路径都会改变,每次都是跟随最新的路径。将每一个路径变换带Odometry坐标下。

路径

移除掉前面的点存储在lastRemoved中。之后需要移除掉路径上被认为已经到达的点,这一步要防止机器人沿着路径后退。
把移除掉的点存储在lastRemoved中。如果没有点移除掉机器人首先去lastRemoved的移除点,否则机器人在lastRemoved和 路径前端之间的线段上寻找目标点。

控制点(control point)

控制点是路径上线和弧的插值点。为了避免计算和选择插值点,估计目标点方法如下:

d=||l⃗ −a⃗ +s⃗ ⋅2−i+v⃗ ||(approx-condition)

d=||\vec{l}-\vec{a}+\vec{s}\cdot2^{-i}+\vec{v}||\tag{approx-condition}

l⃗ \vec{l}:上一次从路径上移除掉的点
s⃗ \vec{s} = f⃗ −l⃗ \vec{f}-\vec{l} f⃗ \vec{f}:是路径队列的首部值
v⃗ \vec{v} : 前一次迭代的贡献值??
a⃗ \vec{a}:机器人坐标
dd: 目标和机器人之间的距离
ii : 迭代次数

如果d小于targetDistance,s⃗ \vec{s},v⃗ \vec{v}相加

v⃗ i+1=v⃗ i+s⃗ i⋅2−i(approx-passed)

\vec{v}_{i+1}=\vec{v}_{i}+\vec{s}_{i}\cdot2^{-i}\tag{approx-passed}

大概迭代10次你会有一个精确的(∼2−10⋅||s⃗ ||\sim2^{-10}\cdot||\vec{s}||)目标点的估计值:
t⃗ =l⃗ +v⃗ (target-point)\vec{t}=\vec{l}+\vec{v}\tag{target-point}
如果机器人距离路径很远,可能要移除的不仅仅是第一个距离大于targetDistance的点,v⃗ \vec{v}保持为0,机器人朝向第一个被移除的点的移动。

如果路径点之间相距比较远,机器人所处的位置如图所示,机器人会找到两个插值点,有可能会导致机器人后退。简单的解决方法是把目标点设置为:移除点和路径队列首项之间的线段 与 过机器人原点的法线 的交点
xv=||a⃗ −l⃗ ||⋅cos(φf⃗ −l⃗ −φa⃗ −l⃗ )||s⃗ ||⋅xs(intersection-x)x_{v} = \frac{||\vec{a}-\vec{l}||\cdot\cos(\varphi_{\vec{f}-\vec{l}}-\varphi_{\vec{a}-\vec{l}})}{||\vec{s}||}\cdot x_{s}\tag{intersection-x}
yv=||a⃗ −l⃗ ||⋅cos(φf⃗ −l⃗ −φa⃗ −l⃗ )||s⃗ ||⋅ys(intersection-y)y_{v} = \frac{||\vec{a}-\vec{l}||\cdot\cos(\varphi_{\vec{f}-\vec{l}}-\varphi_{\vec{a}-\vec{l}})}{||\vec{s}||}\cdot y_{s}\tag{intersection-y}
φf⃗ −l⃗ \varphi_{\vec{f}-\vec{l}}是f⃗ ,l⃗ \vec{f}, \vec{l}之间的角度,φa⃗ −l⃗ \varphi_{\vec{a}-\vec{l}}是a⃗ \vec{a},l⃗ \vec{l}之间的角度

角速度

φ=φt−a−α,(target-angle)\varphi=\varphi_{\boldsymbol{t}-\boldsymbol{a}}-\alpha,\tag{target-angle}

ω=k⋅φ

\omega=k\cdot\varphi
k是常值1/t(t 是返回0值的时间),k越大对路径变化的反应越快速,但是太大会导致不稳定,建议设置为2。

避障


绿色区域:设置机器人速度为原先的80%,误差角度设置为:

φ=−0.3⋅sign(β)(avoid-front)

\varphi=-0.3\cdot sign(\beta)\tag{avoid-front}
蓝色区域:设置机器人速度为原先的60%,误差角度设置为:

φ=−0.2⋅sign(β)(avoid-side)

\varphi=-0.2\cdot sign(\beta)\tag{avoid-side}
红色区域:设置机器人速度为原先的60%,误差角度设置为:

φ=−0.3⋅sign(β)(avoid-front)

\varphi=-0.3\cdot sign(\beta)\tag{avoid-front}

code

https://github.com/will1991/rosintrodution

CMakeLists.txt

6. ROS编程入门--路径跟随(Trajectory following)相关推荐

  1. 5. ROS编程入门--航迹推算(dead reckoning)

    TASK 这篇教程主要是测量机器人的里程计误差的,让机器人重复的走固定的路线,在这里我让机器人走正方形,比较机器人的起始位置(理想状态是重合的) 以及 局部里程计(机器人自身测算得)和全局里程计的的位 ...

  2. ROS编程入门(C++ 及 思路)

    使用Autolabor官方入门教程,笔记内容为注意事项 首页 - Autolabor开源ROS机器人底盘 - 官方网站 ________________________________________ ...

  3. ROS编程入门教程(全过程示例代码)

    ROS系统目前主流语言为C++/Python , Python需要安装vscode, 所以本文使用C++ .编译使用catkin (catkin和rosbuild都能用) 首先创建工作空间(worki ...

  4. 【OpenCV学习】 《OpenCV3编程入门》--毛星云 01 邂逅OpenCV(OpenCV基本概念与基本架构) ROS系统上的运用(python实现)

    对 <OpenCV3编程入门>第一章的学习笔记:理解什么是计算机视觉,什么是OpenCV,以及其中的联系等等. PS:此书为2014年出版,opencv的版本和接口也与现在有些不一致了,作 ...

  5. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用

    [一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...

  6. 免费领,自动化控制编程入门到开挂学习路径(附教程和软件工具)

    大家好,我是华山自控编程的朱老师,很多同学都在讨论上位机运动控制卡与机器视觉编程的问题,今天写了干货,希望可以帮助到你们! 一.入门上位机编程的疑问解答 1.自动化控制编程分哪几个方向? 答:自动化控 ...

  7. python机器人编程教程入门_机器人操作系统(ROS)入门必备:机器人编程一学就会...

    原标题:机器人操作系统(ROS)入门必备:机器人编程一学就会 ROS经过十几年的发展,已经得到了极大的推广和应用,尤其是在学术界.卡耐基梅隆大学机器人研究所的大部分实验室都是基于ROS编程的,现在所在 ...

  8. ROS入门21讲 | ROS机器人入门教程 【简明笔记】

    古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 文章目录 ROS核心概念 ROS命令行 工作空间与功能包 订阅与发布 发布者 Publisher 订阅者 Subscriber 话题消息的自 ...

  9. ROS从入门到放弃——安装Moveit及其使用

    ROS从入门到放弃--安装Moveit及其使用 1. 安装流程 2.小测试前的准备 3. 小测试 4. Move Group Python Interface 4.0 辅助函数 all_close(g ...

  10. MAYA API插件编程--入门篇

    MAYA API插件编程--入门篇 作者:华文广          日期:2010.11.28 我们知道,MAYA是一个基于结点的插件式软件架构,这种开放式的软件架构是非常优秀的,它可以让用户非常方便 ...

最新文章

  1. NFS服务基本配置及使用
  2. 测试工具之Jmeter(各部件简单介绍)
  3. 基于以太坊网络的智能合约开发、部署和测试(入门)
  4. NOI.AC-保镖【贪心,对顶堆】
  5. oracle关联分组查询,oracle中关联查询、分组查询
  6. 修改hadoop中yarn的webui中显示的任务时间为中国时间
  7. 计算机桌面亮度调整,接近完美:如何调整计算机屏幕的亮度?如何调整计算机屏幕的亮度[graphic]...
  8. Matlab的对角阵、三角阵,矩阵变换:矩阵的转置、旋转、翻转、求逆、方阵的行列式、矩阵的秩求解
  9. 滤波器原理及其作用计算机网络,三种滤波器的工作原理
  10. Java 开发微信公众号(订阅号)
  11. 职称英语 计算机哪报名,职称计算机考试报名
  12. Linux里怎么打开pt文件,在 Linux 上安装 transmission 进行远程 PT 下载
  13. 如何在自己的应用中打开支付宝客户端
  14. Android字体的适配问题
  15. Excel妙用-公式结果我都要
  16. Django06 后台管理
  17. Floyd AcWing 854. Floyd求最短路
  18. Task2 数据分析
  19. 从数据标准到数据库设计:解决基础数据标准落地的最后一公里难题(上)
  20. 陈远:兴趣是永远的老师

热门文章

  1. word应用:快速删除页眉横线
  2. [转]字号、pt、px、inch、cm 之间的关系及对照表
  3. 新浪微博登陆页面html代码,仿新浪微博登陆邮箱提示效果的js代码
  4. 痴情人, 浮生梦(上)
  5. 怎么用计算机打游戏视频,如何录制电脑上正在玩的游戏视频
  6. cmake gcc target specific option mismatch
  7. 批量图片压缩解决方案之Imagine
  8. java 以2为底的对数_如何计算Java中以整数为底的对数2?
  9. 激光雷达--C16镭神16线三维激光雷达使用
  10. 使用腾讯云服务器搭建自己网站应该怎么做