主要内容

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

这个例子展示了如何在一个环境模型不同的机器人运动学模型和比较。

定义移动机器人运动学约束

有许多方法来移动机器人的运动学模型。所有决定车轮速度有关机器人的状态:(x yθ),因为xy -坐标和一个机器人,θ在弧度。

独轮车运动模型

最简单的方法来表示车辆移动机器人运动学是独轮车模型,这一套车轮速度绕中心轴旋转,主对其z轴。差动式驱动和自行车运动模型减少了独轮车运动学输入时提供车辆速度和车辆航向率和其他约束不考虑。

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

差动传动运动学模型

差动驱动模型使用一个后置驱动轴控制车辆速度和速率。驱动轴上的轮子可以在两个方向旋转。因为大多数低级轮移动机器人有接口命令,这个模型将再次使用车辆的速度和航向率作为输入来简化车辆控制。

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

区分独轮车的行为模型,添加一个车轮速度速度约束差动传动运动学模型

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

自行车运动模型

自行车模型轿车把机器人作为一个模型与两轴:后轮驱动轴和前轴,z轴。假设车轮下的自行车模型工作在每个轴可以建模为一个单一的、集中轮,而前轮标题可以直接设置,像一辆自行车。

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

其他模型

阿克曼运动学模型假定阿克曼转向轿车修改模型。在大多数轮式车辆,前轮不相同的轴,而是打开稍微不同的轴,以确保他们乘坐同心圆的中心车辆的转弯。这种差异在转向角叫做阿克曼转向,和通常由一个机制在实际执行车辆。从车辆和车轮运动学的角度来看,它可以执行由治疗转向角速率输入。

汽车式样= 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θ)

创建一个车辆控制器

车辆跟随一组路径点使用一个纯粹追求控制器。给定一组的锚点,机器人当前状态,和其他一些参数,控制器输出车辆速度和航向。

%定义一个控制器。每个机器人都需要自己的控制器管理员一= 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) 0(长度(unicyclePose), 1)];unicycleRot = axang2quat ([repmat((0 0 1),长度(unicyclePose), 1) unicyclePose (:, 3)));bicycleTranslations = [bicyclePose(: 1:2) 0(长度(bicyclePose), 1)];bicycleRot = axang2quat ([repmat((0 0 1),长度(bicyclePose), 1) bicyclePose (:, 3)));diffDriveTranslations = [diffDrivePose(: 1:2) 0(长度(diffDrivePose), 1)];diffDriveRot = axang2quat ([repmat((0 0 1),长度(diffDrivePose), 1) diffDrivePose (:, 3)));

接下来,所有变换的集合可以绘制和从顶部。独轮车的路径、自行车和差动式驱动机器人是红色,蓝色,和绿色。为了简化情节,只显示每十项输出。

图绘制(锚点(: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)

图包含一个坐标轴对象。坐标轴对象包含493个对象类型的补丁,线。