主要内容

仿真移动机器人的不同运动学模型

这个例子展示了如何在一个环境中建立不同的机器人运动学模型并对它们进行比较。

使用运动控制定义移动机器人

有许多方法可以模拟移动机器人的运动学。全部决定了车辆速度如何与机器人状态有关:[x y theta], 作为xy -坐标和机器人的方向,θ.在弧度。

单轮脚踏车运动模型

表示移动机器人车辆运动学最简单的方法是用独轮车模型,它的车轮速度由围绕中心轴的旋转设定,并且可以绕z轴旋转。在不考虑其他约束条件的情况下,差分驱动和自行车运动学模型均可简化为独轮车运动学模型。

独轮车= unicycleKinematics (“VehicleInputs”“车辆淘汰头标题”);

差动传动运动学模型

差动驱动模型使用后驱动轴来控制车速和头部速率。驱动轴上的轮子可以在两个方向上旋转。由于大多数移动机器人对低级轮命令具有一些接口,因此该模型将再次使用车速和标题率作为输入以简化车辆控制。

diffDrive = differentialDriveKinematics (“VehicleInputs”“车辆淘汰头标题”);

为了与独轮车模型区分行为,在差速驱动运动学模型中添加车轮速度约束

diffDrive。wheelspeeddrange = [-10 10]*2*pi;

自行车运动模型

自行车模型将机器人视为具有两个轴的型车型:后驱动轴,以及围绕Z轴的前桥。自行车模型在假设下,每个轴上的车轮可以被建模为单个,以中心的车轮,并且可以直接设置前轮标题,就像自行车一样。

自行车=骑自行车kematics(“VehicleInputs”“车辆淘汰头标题”“maxsteringangle”,pi / 8);

其他型号

阿克曼运动学模型是一个改进的汽车模型,假定阿克曼转向。在大多数类似汽车的车辆中,前轮并不围绕同一轴转动,而是在略微不同的轴上转动,以确保它们围绕车辆转弯中心行驶在同心圆上。这种不同的转弯角度被称为阿克曼转向,并通常由一个机制在实际车辆中执行。从车辆和车轮运动学的角度来看,可以通过将转向角度作为一个速率输入来实现。

Carlike = Ackermannkwematics;

设置仿真参数

这些移动机器人将遵循一组路径点,这些路径点是为了显示不同运动学引起的一些差异而设计的。

航点= [0 0;0 10;10 10;5 10;11 9;4-5];%定义总时间和采样率Sampletime = 0.05;%采样时间[S]tVec = 0: sampleTime: 20;%时间阵列: initPose =[锚点(1)';0);%初始姿势(x y theta)

创建车辆控制器

车辆使用Pure Pursuit控制器跟随一组路径点。给定一组路径点、机器人当前状态等参数,控制器输出车速和航向率。

%定义了一个控制器。每个机器人都需要自己的控制器Controller1 = ControllePurePurepUrsuit(“锚点”锚点,“acceandlinearvelocity”3,“MaxAngularVelocity”, 3 *π);controller2 = controllerPurePursuit (“锚点”锚点,“acceandlinearvelocity”3,“MaxAngularVelocity”, 3 *π);Controller3 = ControllerPurePURSUIT(“锚点”锚点,“acceandlinearvelocity”3,“MaxAngularVelocity”, 3 *π);

使用ODE Solver模拟模型

模型使用的是模拟衍生物功能更新状态。此示例使用常微分方程(ODE)求解器来生成解决方案。另一种方法是使用循环更新状态,如图所示差动驱动机器人的路径

由于ODE求解器要求将所有输出作为单个输出提供,因此纯追踪控制器必须封装在一个将线速度和航向角速度作为单个输出的函数中。助手一个例子,exampleHelperMobileRobotController,用于此目的。示例助手还确保机器人在目标的指定半径内停止。

goalPoints =路标点(最终,:)”;goalRadius = 1;

数值对每种类型的模型调用一次。导数函数通过设定初始状态来计算状态输出.每个导数都接受相应的运动学模型对象、当前机器人姿态和该姿态下控制器的输出。

运动控制下每个运动模型的%计算轨迹[tUnicycle, unicyclePose] =数值(@ (t, y)导数(独轮车,y, exampleHelperMobileRobotController(管理员一y goalPoints goalRadius)), tVec, initPose);[tBicycle, bicyclePose] =数值(@ (t, y)导数(自行车,y, exampleHelperMobileRobotController (controller2 y goalPoints goalRadius)), tVec, initPose);[tDiffDrive, diffDrivePose] =数值(@ (t, y)导数(diffDrive y exampleHelperMobileRobotController (controller3 y goalPoints goalRadius)), tVec, initPose);

绘图结果

可以在单个绘图中轻松查看ode求解器的结果plotTransforms立即可视化所有轨迹的结果。

必须首先将姿势输出转换为翻译和四元数的索引矩阵。

单循环克拉语= [单自传克莱(:,1:2)零(长度(单循环),1)];Unicyclerot = Axang2quat([Repmat([0 0 1],长度(单自传),1)单自行车(:,3)]);双环静脉= [自行车(:,1:2)零(长度(自行车),1)];Bicyclerot = Axang2quat([Repmat([0 0 1],长度(自行车),1)自行车(:,3)]);DiffdriveRetranslations = [衍射(:,1:2)零(长度(衍射),1)];Diffdriverot = AXANG2QUAT([REPMAT([0 0 1],长度(衍射),1)差异(:,3));

接下来,可以从顶部绘制并查看所有变换集。单轮脚踏车,自行车和差动机器人的路径分别是红色,蓝色和绿色。为了简化绘图,仅显示每十个输出。

图绘图(航点(:,1),航点(:,2),“kx-”“MarkerSize”, 20);持有所有plottransforms(单程手机(1:10:结束,:),unicyclerot(1:10:结束,:),“MeshFilePath”“groundvehicle.stl”“meshcolor”“r”);plottransforms(骑自行车的话(1:10:结束,:),骑自行车镜(1:10:结束,:),“MeshFilePath”“groundvehicle.stl”“meshcolor”“b”);plottransforms(差异(差异)(1:10:结束,:),Diffdriverot(1:10:结束,:),“MeshFilePath”“groundvehicle.stl”“meshcolor”“G”);查看(0,90)

图包含轴。轴包含493个类型的贴片物体,线。