已知姿态映射

这个例子展示了如何创建一个地图的环境使用距离传感器读数和机器人姿势的差异驱动机器人。您创建创建一个地图从范围传感器读数模拟使用rangeSensor宾语。该differentialDriveKinematics运动模型模拟驱动围绕基于速度命令房间中的机器人。该rangeSensor给出了基于所述机器人的姿态,因为它遵循的路径范围的读数。

参考地图及图表

加载一组示例二进制占用网格exampleMaps,包括simpleMap,这本实施例中使用。

加载exampleMaps.mat

使用以下命令创建引用二进制占用映射simpleMap分辨率为1。显示图形并保存图形的句柄。

refMap = binaryOccupancyMap(simpleMap,1);refFigure =系数('名称''SimpleMap');显示(refMap);

创建一个分辨率为10的与所选地图尺寸相同的空地图。显示图并保存图的句柄。按地图的大小锁定坐标轴。

[mapdimx,mapdimy] =尺寸(simpleMap);MAP = binaryOccupancyMap(mapdimy,mapdimx,10);mapFigure =系数('名称'“未知的地图”);显示(地图);

初始化运动模型和控制器

产生差分驱动器的运动的运动模型。运动模型表示模拟差分驱动机器人的运动。该模型采用左右车轮速度或线速度和角速度用于机器人标题。在这个例子中,使用的车辆的速度和航向率VehicleInputs

diffDrive = differentialDriveKinematics (“VehicleInputs”“VehicleSpeedHeadingRate”);

创建一个单纯追求控制器。该控制器产生用于模拟机器人的速度输入以跟随期望的路径。设置所需的线速度和最大角速度,第二分别在每米每秒弧度和指定。

控制器= controllerPurePursuit (“DesiredLinearVelocity”2,“MaxAngularVelocity”,3);

设置距离传感器

创建10米的最大范围的传感器。基于给定的姿势和地图这个传感器会模拟范围读数。参考地图使用具有该范围内传感器,以模拟在未知环境收集传感器读数。

传感器= rangeSensor;sensor.Range = [0,10];

创建计划的路径

创建通过地图收集范围传感器读数来驱动路径。

路径= [4 6;6.5 - 12.5;4 22;12 14;22日22;16日12;20 10;14 6;22 3];

绘制的参考地图图形的路径。

图(refFigure);保持图(路径(:,1),路径(:,2),“邻”);保持

将路径设置为纯跟踪控制器的路径点。

控制器。路点=路径;

按照路径和环境地图

根据设定的路径的初始姿势和最终目标位置。用于存储当前姿态和跟踪迭代的索引创建全局变量。

initPose = [路径(1,1)的路径(1,2),PI / 2];目标= [路径(结束,1)路径(端,2)]';姿势(:,1)= initPose';

使用提供的辅助函数exampleHelperDiffDriveControl。该辅助函数包含导航主循环的路径,让读数范围,并绘制了环境。

exampleHelperDiffDriveControl功能有以下流程:

  • 扫描使用所述范围传感器和当前姿势参考地图。这是模拟正常范围的读数在一个未知的环境中驾驶。

  • 更新与读数范围地图。

  • 获得从单纯追求控制器的控制命令把车开到下一个航点。

  • 基于控制指令计算机器人运动导数。

  • 基于导数增加机器人的姿态。

应该可以看到机器人驱动空的映射和周围墙壁填充作为范围传感器检测它们。

exampleHelperDiffDriveCtrl(diffDrive,控制器,initPose,目标,refMap,地图,refFigure,mapFigure,传感器)

目标位置到达

差动传动控制功能

exampleHelperDiffDriveControl功能有以下流程:

  • 扫描使用所述范围传感器和当前姿势参考地图。这是模拟正常范围的读数在一个未知的环境中驾驶。

  • 更新与读数范围地图。

  • 获得从单纯追求控制器的控制命令把车开到下一个航点。

  • 基于控制指令计算机器人运动导数。

  • 基于导数增加机器人的姿态。

函数exampleHelperDiffDriveControl(diffDrive,ppControl,initPose,目标,MAP1,MAP2,FIG1,fig2,激光雷达)sampleTime = 0.05;%的样品时间[s]t = 0: sampleTime: 100;%时间阵列姿势=零(3,numel(T));%构成矩阵姿势(:,1)= initPose';%设定重复率R =码率控制(1 / sampleTime);从图中得到坐标轴ax₁= fig1.CurrentAxes;ax2 = fig2.CurrentAxes;对于IDX = 1:numel(t)的位置姿势=(:,IDX)';currPose =位置(1:2);%end如果pathfollowing的车辆已经到达的0.2M公差范围内的目标位置DIST =范数(goal'-currPose);如果(dist < 2) disp(“目标位置到达”打破;结束通过传感器测量更新地图图(2)[范围,角度] =激光雷达(位置,MAP1);扫描= lidarScan(范围,角度);validScan = removeInvalidData(扫描,'RangeLimits',[0,lidar.Range(2)]);insertRay(MAP2,位置,validScan,lidar.Range(2));显示(MAP2);%运行纯追踪控制器和转换输出至车轮速度[VREF,WREF] = ppControl(姿势(:,IDX));执行正向离散积分步骤(:,idx), [vRef wRef];pose (:,idx+1) = pose (:,idx) + vel*采样时间;%更新可视化plotTrvec = [pose (1:2, idx+1);0);plotRot = axang2quat([0 0 1 pose (3, idx+1)]);删除最后一个机器人的图像,以防止显示多个机器人如果IDX> 1项= GET(AX1,“孩子们”);删除(项目(1));结束积%到机器人的已知地图plotRot plotTransforms (plotTrvec ',“MeshFilePath”“groundvehicle.stl”“视图”'2D'“框架尺寸”1,“父”、ax₁);在新地图%阴谋机器人plotRot plotTransforms (plotTrvec ',“MeshFilePath”“groundvehicle.stl”“视图”'2D'“框架尺寸”1,“父”,ax2);%等待以适当的速率进行迭代WAITFOR(R);结束结束