主要内容

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

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

定义带有运动学约束的移动机器人

建立移动机器人运动学模型的方法有很多种。所有这些都说明了车轮速度与机器人状态之间的关系:(x yθ),因为xy -坐标和机器人的航向,θ在弧度。

独轮车运动模型

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

独轮车= unicycleKinematics (“VehicleInputs”“VehicleSpeedHeadingRate”);

差动传动运动学模型

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

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

为了区别于独轮车模型的行为,在差动驱动运动学模型中添加一个车轮速度约束

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

自行车运动模型

自行车模型将机器人视为带有两个轴的汽车模型:一个后驱桥和一个绕z轴旋转的前桥。自行车模型的工作前提是,每个轴上的车轮可以建模为一个单一的、居中的车轮,并且前轮头可以像自行车一样直接设置。

自行车= bicycleKinematics (“VehicleInputs”“VehicleSpeedHeadingRate”“MaxSteeringAngle”π/ 8);

其他模型

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

汽车式样= ackermannKinematics;

设置仿真参数

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

路径点= [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)

创建一个车辆控制器

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

%定义控制器。每个机器人都需要自己的控制器管理员一= controllerPurePursuit (“锚点”锚点,“DesiredLinearVelocity”3,“MaxAngularVelocity”, 3 *π);controller2 = controllerPurePursuit (“锚点”锚点,“DesiredLinearVelocity”3,“MaxAngularVelocity”, 3 *π);controller3 = controllerPurePursuit (“锚点”锚点,“DesiredLinearVelocity”3,“MaxAngularVelocity”, 3 *π);

使用ODE求解器模拟模型

模型采用导数命令,更新状态。这个例子使用一个常微分方程(ODE)求解器来生成一个解。另一种方法是使用循环更新状态,如差动驱动机器人的路径跟踪

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

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

数值为每种类型的模型调用一次。导数函数计算初始状态集为的状态输出initPose.每个导数接受相应的运动学模型对象、当前机器人的位姿和控制器在该位姿的输出。

在运动控制下计算每个运动模型的轨迹[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一次看到所有轨迹的结果。

姿态输出必须首先转换为索引的平移矩阵和四元数矩阵。

unicycleTranslations = [unicyclePose(:,1:2) zeros(length(unicyclePose),1)];unicycleRot = axang2quat([repmat([0 0 1],length(unicyclePose),1) unicyclePose(:,3)]);bicycleTranslations = [bicyclePose(:,1:2) 0 (length(bicyclePose),1)];双环自行车= axang2quat([repmat([0 0 1],length(bicyclePose),1) bicyclePose(:,3)]);diffDriveTranslations = [diffDrivePose(:,1:2) 0 (length(diffDrivePose),1)];diffDriveRot = axang2quat([repmat([0 0 1],length(diffDrivePose),1) diffDrivePose(:,3)]);

接下来,所有变换的集合可以从顶部绘制和查看。独轮车、自行车和差动驱动机器人的路径分别为红色、蓝色和绿色。为了简化图,每10次输出只显示一次。

图绘制(锚点(:1),锚点(:,2),“kx - - - - - -”“MarkerSize”, 20);持有所有plotTransforms (unicycleTranslations (1:10:,:), unicycleRot(1:10:最终,),“MeshFilePath”“groundvehicle.stl”“MeshColor”“r”);plotTransforms (bicycleTranslations (1:10:,:), bicycleRot(1:10:最终,),“MeshFilePath”“groundvehicle.stl”“MeshColor”“b”);plotTransforms (diffDriveTranslations (1:10:,:), diffDriveRot(1:10:最终,),“MeshFilePath”“groundvehicle.stl”“MeshColor”“g”);视图(0,90)

图中包含一个轴对象。axis对象包含493个类型为patch, line的对象。