该例程演示如何使用机器人运动模型控制机器人跟踪目标路径。该例程使用“Pure Persuit”路径跟踪控制器驱动仿真机器人沿着预先决定的路径运动。要求的路径时一系列的陆标,该陆标是明确定义的或者由路径规划器计算的得到。创建仿真差动机器人的“Pure Persuit”路径规划器,计算控制指令以跟踪给定路径。计算的控制指令用于驱动仿真机器人沿着要求的轨迹基于“Pure Persuit”控制器。

定义陆标

为机器人定义一系列要求路径的路标点。

path = [2.00 1.00;

1.25 1.75;

5.25 8.25;

7.25 8.75;

11.75 10.75;

12.00 10.00];

可视化要求的路径。

plot(path(:,1), path(:,2),'k--d')

xlim([0 13])

ylim([0 13])

定义机器人运动模型

当没有外部仿真器或者实际机器人可用的情况下,就需要机器人运动模型。在本例中使用的仿真运动模型,根据给定的输入,更新和返回机器人的位姿。外部仿真或真实机器人将需要定位机制以提供机器人更新的位姿。

设置当前的位置和机器人的目标位置,目标位置由路径定义。

robotCurrentLocation = path(1,:);

robotGoal = path(end,:);

假设机器人的初始方向(机器人的初始方向是机器人的航向和X轴正方向的夹角,以逆时针的方式测量)。

initialOrientation = 0;

定义机器人的当前位姿[x,y,theta]:

robotCurrentPose = [robotCurrentLocation initialOrientation];

初始化仿真机器人对象的当前位姿,仿真机器人具有两轮机器人的运动学方程。该仿真机器人对象能够基于这些运动方程和线性、角度速度输入。具备绘图的能力显示机器人的当前位置和绘制机器人的轨迹。

robot = ExampleHelperDifferentialDriveRobot(robotCurrentPose);

定义路径跟踪控制器

根据上文定义的路径和机器人运动模型,用户需要一个路径跟踪控制器以驱动机器人沿着路径运动。使用“robotics.PurePursuit”对象创建路径跟踪控制器。

controller = robotics.PurePursuit

controller =

System: robotics.PurePursuit

Properties:

Waypoints: []

MaxAngularVelocity: 1

LookaheadDistance: 1

DesiredLinearVelocity: 0.1

使用上面定义的路径为控制器设置要求的路标。

controller.Waypoints = path;

设置路径跟踪控制器的参数,本例中要求的线性速度设置为0.3m/s。

controller.DesiredLinearVelocity = 0.3;

最大角速度作为旋转速度的饱和限制,本例中设置为2rad/s。

controller.MaxAngularVelocity = 2;

作为一般规则,为了平滑的路径,向前的距离应该比要求的线性速度大。当向前距离大时,机器人可能抄近路。相反的,向前距离小可能时可能导致不稳定的路径跟踪表现。本例选择0.5m。

controller.LookaheadDistance = 0.5;

使用路径跟踪控制器,在需要的路标驱动机器人

路径跟踪控制器为机器人提供输入控制信号,机器人使用该信号驱动自己沿着要求的路径。

定义目标半径,作为机器人最终位置和要求距离阈值,一旦机器人与目标位置的距离小于该值,则停止。此外,计算机器人的当前位置和目标位置的距离,持续的比较该值与目标半径,当该距离小于目标半径的时候,机器人将会停止。注意,如果目标半径太小可能导致机器人错过目标,这可能会导致目标附近预料之外的表现。

goalRadius = 0.1;

distanceToGoal = norm(robotCurrentLocation - robotGoal);

“robotics.PurePursuit.step”函数计算控制命令给机器人,使用这些指令驱动机器人直到抵达目标半径之内。如果用户使用一个外部的仿真器或者真实机器人,那么控制器的输出需要应用到机器人,而且需要一个定位系统更新机器人的位姿。

while( distanceToGoal > goalRadius )

% Compute the controller outputs, i.e., the inputs to the robot

[v, omega] = step(controller, robot.CurrentPose);

% Simulate the robot using the controller outputs.

drive(robot, v, omega)

% Extract current location information ([X,Y]) from the current pose of the

% robot

robotCurrentLocation = robot.CurrentPose(1:2);

% Re-compute the distance to the goal

distanceToGoal = norm(robotCurrentLocation - robotGoal);

end

仿真机器人使用路径跟踪控制器沿着要求的路径已经到达目标位置。如果目标路标集由路径规划器计算,路径跟踪控制器应用的样式相同。导入一个简单的地图用于计算路径。

filePath = fullfile(fileparts(which('PathFollowingControllerExample')), 'data', 'exampleMaps.mat');

load(filePath)

map = robotics.BinaryOccupancyGrid(simpleMap, 2)

map =

BinaryOccupancyGrid with properties:

GridSize: [26 27]

Resolution: 2

XWorldLimits: [0 13.5000]

YWorldLimits: [0 13]

GridLocationInWorld: [0 0]

显示地图:

show(map)

用户可以使用PRM路径规划算法计算路径。

robotRadius = 0.2;

mapInflated = copy(map);

inflate(mapInflated,robotRadius);

prm = robotics.PRM(mapInflated);

prm.NumNodes = 100;

prm.ConnectionDistance = 10;

寻找开始位置和结束位置的路径,注意,由于PRM算法的随机性,路径将会有所不同。

startLocation = [2.0 1.0];

endLocation = [12.0 10.0];

path = findpath(prm, startLocation, endLocation)

path =

2.0000 1.0000

1.5851 1.3808

4.0668 6.7417

7.0353 8.6624

12.2282 10.3257

12.0000 10.0000

显示路径:

hold on

show(prm, 'Map', 'off', 'Roadmap', 'off');

hold off

在上文定义了一个路径跟踪控制器,用户可以在本地图重新使用以计算机器人的控制指令。为了重新使用控制器和重新定义路标点,同时保持其它信息不变,使用“robotics.PurePursuit.release”函数。

release(controller)

controller.Waypoints = path;

设置当前的位置和机器人的目标位置,正如路径所定义的。

robotCurrentLocation = path(1,:);

robotGoal = path(end,:);

假设机器人的初始方向:

initialOrientation = 0;

定义机器人运动的当前位姿[x,y,theta]

robotCurrentPose = [robotCurrentLocation initialOrientation];

使用当前位姿,重新创建仿真机器人对象。

robot = ExampleHelperDifferentialDriveRobot(robotCurrentPose);

计算与目标位置的距离:

distanceToGoal = norm(robotCurrentLocation - robotGoal);

定义目标半径:

goalRadius = 0.1;

在给定的地图上,使用控制器的输出驱动机器人,直到抵达目标位置。

while( distanceToGoal > goalRadius )

% Compute the controller outputs, i.e., the inputs to the robot

[v, omega] = step(controller, robot.CurrentPose);

% Simulate the robot using the controller outputs

drive(robot, v, omega)

% Extract current location information from the current pose

robotCurrentLocation = robot.CurrentPose(1:2);

% Re-compute the distance to the goal

distanceToGoal = norm(robotCurrentLocation - robotGoal);

end

matlab定义机器人位置,ROS与Matlab语言入门教程-差动机器人的路径跟踪相关推荐

  1. c语言中结构体数组的引用,【C语言入门教程】7.2 结构体数组的定义和引用

    7.2 结构体数组的定义和引用 当需要使用大量的结构体变量时,可使用结构体定义数组,该数组包含与结构体相同的数据结构所组成的连续存储空间.如下例所示: struct student stu_a[50] ...

  2. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  3. 2017年Go语言入门教程-徐培成-专题视频课程

    2017年Go语言入门教程-3763人已学习 课程介绍         Go语言入门教程,只要你懂中文都可以看的懂本套教程,为任何想学习Go语言研制的教程. 课程收益     让任何人都可以轻松掌握G ...

  4. GO语言入门教程(二)

    Hello,各位小伙伴,在接着之前发表的Go语言系列教程之投石问路之后,我们大致了解了一下Go语言的发展史和Go语言的优势,另外我也带着小伙伴进行了Go语言环境的安装和常用命令的介绍.接下来我们就正式 ...

  5. 小白都能看懂的C语言入门教程

    文章目录 C语言入门教程 1. 第一个C语言程序HelloWorld 2. C语言的数据类型 3. 常量变量的使用 4. 自定义标识符#define 5. 枚举的使用 6. 字符串和转义字符 7. 判 ...

  6. 计算机语言中的逻辑型数据,零基础易语言入门教程(五)之逻辑型数据类型

    在上篇文章给大家介绍了零基础易语言入门教程(四)之数据类型,上篇针对数值到文本类型知识,今天给大家介绍下逻辑型数据. 具体方法和步骤如下所示: 1.逻辑型数据非真即假: 首先申请一个局部变量(A)类型 ...

  7. iOS开发之c语言入门教程

    苹果作为移动互联的高端品牌,iOS操作系统也被用户公认为是最好用的移动互联网操作系统.据了解,曾一度拒绝为iOS平台对出浏览器的火狐在今年5月份的时候,他们却食言了.今天,Mozilla宣布iOS版F ...

  8. c语言5基础教程,[简001]《极简C语言入门教程》共5章

    Saturday,May 18,2019 ---Andy ###目录: 前言 第一章 数据类型 1.1 数据类型 1.2 宏定义.常量.变量(一般和指针型) 第二章 格式化输入输出 2.1 输入 2. ...

  9. c语言入门教程文库,C语言入门教程(全集)课件

    C语言入门教程(全集)课件 01123364105 Y N p AB X=0? YN P1 A A P2 a a b b Y Y N N y n A B P A A B X=0? 3 a97 3 U ...

最新文章

  1. Altium.Designer的学习视频 分享~~
  2. Hybris Commerce Cloud backoffice的一些使用截图 - home工作中心
  3. 阿里云产品头条(2017年12月刊)
  4. leetcode - 813. 最大平均值和的分组
  5. Android Service基本使用
  6. Atitit mybatis返回多个数据集总结 目录 1.1. 配置handleResult接受,但是只有第一个select语句的结果 1 2. 配置resultMap ok 1 2.1. 调
  7. vue页面中样式修改子组件的样式
  8. 指标权重确定方法之熵权法
  9. ei加声调怎么加_大班拼音ei的教案
  10. 拳打电脑管家,脚踢金山毒霸,3分钟用Python撸一个杀毒软件
  11. oracle 18c,Oracle 18c
  12. 迅雷快车旋风链接转换成普通链接工具
  13. 阅读笔记:Poison Over Troubled Forwarders: A Cache Poisoning Attack Targeting DNS Forwarding Devices
  14. html表格填充空白单元格,Excel表格数据录入:怎么快速填充所有空白单元格?
  15. _access()函数
  16. PMP项目管理 | 项目质量管理
  17. 超定线性方程组Ax=b极小L1范数求解——MATLAB/Python实现
  18. lammps教程:in文件结构详解以及一个比较实用的in文件模板
  19. 付呗聚合支付快速教程 基础篇①——基本介绍和配置
  20. ERPS环网络端口角色

热门文章

  1. 如何解决本地虚拟机安装宝塔面板访问面板后台打不开?
  2. MFC操作——设置静态文本 大小 字体格式 颜色
  3. 计算机二级考点210109,顶伯试卷管理与组卷系统
  4. 网络猫只有计算机和机顶盒两个口,光猫为什么有千兆口和百兆口,两个不同的接口?二者有什么区别?...
  5. 前端js的数字转化为字符串相互转化
  6. Image Formation Pipeline --- 从2D到3D(二)
  7. 字符串系列② -- 替换空格
  8. 软件测试面试了十几家公司,全是这种“套路题”
  9. 深入浅出- ABP 多租户
  10. 自适应进化极限学习机SaDE_ELM程序源码和使用方法