差动驱动机器人的路径跟踪
这个例子演示了如何控制机器人跟踪期望路径使用机器人模拟器。示例使用纯追求路径跟踪控制器来驱动一个模拟机器人沿着预定的道路。所需的路径是一组明确定义的锚点或使用路径规划(指计算路径规划在环境中不同的复杂性)。纯追求路径跟踪控制器创建一个模拟差动驱动机器人和计算控制命令跟随给定的路径。计算控制命令是用于驱动模拟机器人沿着期望的轨迹遵循基于纯追求控制器所需的路径。
定义锚点
定义一组路径点为机器人所需的路径
路径= [2.00 - 1.00;1.25 - 1.75;5.25 - 8.25;7.25 - 8.75;11.75 - 10.75;12.00 - 10.00);
设置当前位置和目标位置的机器人所定义的路径。
:robotInitialLocation =路径(1);robotGoal =路径(结束:);
假设一个初始机器人定位(机器人方向之间的角度是机器人航向和积极的轴,测量逆时针)。
initialOrientation = 0;
定义当前姿势机器人(x yθ)
robotCurrentPose = [robotInitialLocation initialOrientation]”;
创建一个机器人运动学模型
初始化机器人模型和分配一个初始姿势。模拟机器人运动学方程两轮差动驱动机器人的运动。这个输入模拟机器人的线速度和角速度。
机器人= differentialDriveKinematics (“TrackWidth”,1“VehicleInputs”,“VehicleSpeedHeadingRate”);
可视化所需的路径
图绘制(路径(:1),路径(:,2),“k - d '13)xlim ([0]) ylim (13 [0])
定义了路径跟踪控制器
基于上面定义的路径和机器人运动模型,你需要一个路径跟踪控制器驱动机器人沿着路径。创建路径跟踪控制器使用controllerPurePursuit
对象。
控制器= controllerPurePursuit;
使用上面定义的路径设置所需的路径点的控制器
控制器。路点=路径;
设置路径跟踪控制器参数。设置所需的线速度为这个示例0.6米/秒。
控制器。DesiredLinearVelocity = 0.6;
最大角速度作为饱和限制旋转速度,这是设定在2弧度/秒对于这个示例。
控制器。MaxAngularVelocity = 2;
作为一般规则,超前的距离应大于所需的线速度一帆风顺。机器人可能超前距离很大时偷工减料。相比之下,一个小超前距离会导致一个不稳定的路径跟踪行为。值为0.3 m被选为这个例子。
控制器。LookaheadDistance = 0.3;
使用路径跟踪控制器,驱动机器人所需的锚点
路径跟踪控制器的输入控制信号提供机器人,机器人的使用来驱动本身所需的路径。
定义一个目标半径,所需的机器人的最终位置之间的距离阈值和目标位置。一旦机器人在这个距离的目标,它将停止。另外,计算当前机器人位置和目标位置之间的距离。这个距离是不断地针对目标半径和检查机器人停止当这个距离小于半径的目标。
注意,太小的价值目标半径可能导致机器人错过目标,这可能会导致意外的行为在目标附近。
goalRadius = 0.1;distanceToGoal =规范(robotInitialLocation - robotGoal);
的controllerPurePursuit
对象计算机器人的控制命令。驱动机器人使用这些控制命令,直到达到目标内半径。如果您正在使用一个外部模拟器或物理机器人,那么控制器输出应该被应用到机器人和一个定位系统可能需要更新机器人的姿态。控制器运行10赫兹。
%初始化模拟循环sampleTime = 0.1;vizRate = rateControl (1 / sampleTime);%初始化图图%确定车辆帧尺寸最接近表示与plotTransforms车辆frameSize = robot.TrackWidth / 0.8;而(distanceToGoal > goalRadius)%计算控制器输出,即。,输入到机器人[v,ω]=控制器(robotCurrentPose);%得到机器人的速度使用控制器的输入韦尔=导数(机器人,robotCurrentPose, [vω]);%更新当前的姿势robotCurrentPose = robotCurrentPose +韦尔* sampleTime;%重新计算距离的目标distanceToGoal =规范(robotCurrentPose (1:2)——robotGoal (:));%更新图持有从%绘制路径的每个实例,从而保持持久而机器人网%的举措情节(路径(:1),路径(:,2),“k - d”)举行所有%情节机器人的路径转换为一组plotTrVec = [robotCurrentPose (1:2);0);plotRot = axang2quat ([0 0 1 robotCurrentPose (3)));plotRot plotTransforms (plotTrVec ',“MeshFilePath”,“groundvehicle.stl”,“父”甘氨胆酸,,“视图”,“二维”,“FrameSize”,frameSize);淡定;xlim (13 [0]) ylim(13[0])等待(vizRate);结束
随着人口、难民和移民事务局使用路径跟踪控制器
如果所需的路径点计算的路径规划、路径跟踪控制器可以以相同的方式使用。首先,可视化地图
负载exampleMaps地图= binaryOccupancyMap (simpleMap);图显示(图)
你可以计算路径
使用人口、难民和移民事务局的路径规划算法。看到路径规划在环境中不同的复杂性获取详细信息。
mapInflated = (map)复印件;充气(mapInflated, robot.TrackWidth / 2);人口、难民和移民事务局= robotics.PRM (mapInflated);人口、难民和移民事务局。NumNodes = 100;人口、难民和移民事务局。ConnectionDistance = 10;
找到一个开始和结束位置之间的路径。请注意,路径
将不同由于人口、难民和移民事务局的概率性质的算法。
startLocation = (4.0 - 2.0);endLocation = (24.0 - 20.0);路径= findpath(人口、难民和移民事务局、startLocation endLocation)
路径=8×24.0000 2.0000 3.1703 2.7616 7.0797 11.2229 8.1337 13.4835 14.0707 17.3248 16.8068 18.7834 24.4564 20.6514 24.0000 20.0000
显示的地图,地图,和最终路径。
显示(人口、难民和移民事务局);
你定义了路径跟踪控制器上面可以重用计算机器人在这张地图上的控制命令。重用控制器和重新定义路径点,同时保持其他信息一样的,用的释放
函数。
释放(控制器);控制器。路点=路径;
设置初始位置和机器人的目标定义的路径
:robotInitialLocation =路径(1);robotGoal =路径(结束:);
假设一个初始机器人定位
initialOrientation = 0;
定义当前姿势机器人运动(x yθ)
robotCurrentPose = [robotInitialLocation initialOrientation]”;
计算距离的目标位置
distanceToGoal =规范(robotInitialLocation - robotGoal);
定义一个目标半径
goalRadius = 0.1;
驱动机器人使用控制器输出给定的地图上,直到达到目标。控制器运行10赫兹。
重置(vizRate);%初始化图图而(distanceToGoal > goalRadius)%计算控制器输出,即。,输入到机器人[v,ω]=控制器(robotCurrentPose);%得到机器人的速度使用控制器的输入韦尔=导数(机器人,robotCurrentPose, [vω]);%更新当前的姿势robotCurrentPose = robotCurrentPose +韦尔* sampleTime;%重新计算距离的目标distanceToGoal =规范(robotCurrentPose (1:2)——robotGoal (:));%更新图持有从显示(地图);持有所有%绘制路径的每个实例,从而保持持久而机器人网%的举措情节(路径(:1),路径(:,2),“k - d”)%情节机器人的路径转换为一组plotTrVec = [robotCurrentPose (1:2);0);plotRot = axang2quat ([0 0 1 robotCurrentPose (3)));plotRot plotTransforms (plotTrVec ',“MeshFilePath”,“groundvehicle.stl”,“父”甘氨胆酸,,“视图”,“二维”,“FrameSize”,frameSize);淡定;xlim (27 [0]) ylim([0] 26日)等待(vizRate);结束