主要内容

ackermannKinematics

汽车式转向车辆模型

描述

ackermannKinematics创建一个类似汽车的车辆模型,使用Ackermann转向。这个模型代表了一辆车,两个车轴之间有距离,轴距.车辆的状态被定义为一个四元素矢量,[X y],与全球xy-位置,单位为米。的xy-position位于后桥中间。标题,θ.,和转向角度,ψ以弧度指定。的车辆航向是在后轴的中心限定。角弧度给出。要计算时间派生状态为模型,用导数功能与输入转向命令和当前的机器人状态。

创建

描述

例子

kinematicModel= ackermannKinematics创建具有默认属性值的Ackermann运动学模型对象。

kinematicModel= ackermannKinematics(名称,值)将附加属性设置为指定值。您可以以任何顺序指定多个属性。

属性

全部展开

轴距指前轴和后轴,以米为单位指定的之间的距离。

车辆速度范围是两元件载体,其提供了最小和最大车速,[MinSpeed MaxSpeed,单位为米每秒。

对象功能

导数 车辆状态的时间导数

例子

全部收缩

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

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

有许多方法来移动机器人的运动学模型。所有决定了车轮速度如何与机器人状态:(x yθ), 作为XY-坐标和机器人的航向,θ.在弧度。

独轮车运动模型

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

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

差分驱动运动模型

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

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

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

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

自行车运动模型

所述的自行车模型将机器人作为汽车状模型具有两个轴:一个后驱动桥,和一前桥,大约z轴匝。假设在每个车轴的车轮可以被建模为一个单一的,中心轮下的自行车模型的工作原理,并且该前轮标题可以直接设置,像自行车。

自行车= bicycleKinematics (“VehicleInputs”“VehicleSpeedHeadingRate”“MaxSteeringAngle”,PI / 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)

创建一个车辆控制器

这些车辆遵循使用纯追踪控制器一套航路点。给定一组路点,机器人的当前状态,以及一些其他的参数,所述控制器输出的车辆速度和航向率。

%定义控制器。每个机器人都需要自己的控制器管理员一= 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)

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

模拟使用阿克曼转向,在其转向角的限制的移动机器人模型。在模拟过程中,该模型保持最大转向角达到转向限制之后。看到转向饱和度的效果,你比较两个机器人,一个用没有任何转向限制转向角的限制和其他的轨迹。

定义模型

定义Ackermann运动学模型。在这种类似汽车的模型中,前轮之间的距离是给定的。为了确保它们是同心圆,车轮有不同的转向角度。当转向时,前轮以转向角度变化率接收转向输入。

汽车式样= ackermannKinematics;

设置仿真参数

设定移动机器人遵循恒定的线速度,接收恒定的转向速率作为输入。对受约束的机器人进行长时间仿真,以验证转向饱和。

velo = 5;%恒定的线速度psidot = 1;恒%左转向率%定义的总时间和采样率Sampletime = 0.05;%采样时间[S]timeEnd1 = 1.5;%无约束机器人仿真结束时间timeEnd2 = 10;%受限机器人仿真结束时间tVec1 = 0: sampleTime: timeEnd1;%时间阵列的无约束机器人tVec2 = 0:sampleTime:timeEnd2;%受限机器人时间数组initPose = (0, 0, 0, 0);初始姿态(x y)

为ODE求解器创建选项结构

在这个例子中,你通过一个选项结构作为ODE求解器的参数。的选项结构包含有关转向角度限制的信息。创建选项结构,使用活动选择odeset创建的事件函数,detectSteeringSaturationdetectSteeringSaturation设置最大转向角度为45度。

,以说明如何定义detectSteeringSaturation, 看定义事件函数在这个例子的最后。

选择= odeset (“事件”, @detectSteeringSaturation);

用ODE求解器模拟模型

接下来,使用导数功能和ODE求解,数值,解决了模型和产生的溶液。

%模拟无约束机器人[t1,pose1] = ode45(@(t,y)derivative(carLike,y,[velo psidot]),tVec1,initPose); / /初始化%模拟受约束的机器人[t2,pose2,te,ye,ie] = ode45(@(t,y)derivative(carLike,y,[velo psidot]),tVec2,initPose,options);

检测转向饱和

当模型到达转向限制,它会注册事件的时间戳。它采取达到极限的时间存储在te

如果TE “转向角度极限达到”;str2 =“秒”;Comp = str1 + te + str2;disp (comp)结尾
转向角极限达到0.785秒

模拟约束机器人的新的初始条件

现在以积分结束前受约束机器人的状态作为第二次仿真的初始条件。修改输入向量以表示转向饱和度,即设置转向速率为零。

saturatedPsiDot = 0;饱和后转向%率CMDS = [腭saturatedPsiDot];%命令向量tVec3 = TE:sampleTime:timeEnd2;%的时间向量pose3 = pose2(长度(pose2):);[t3,pose3,te3,ye3,ie3] = ode45(@(t,y)derivative(carLike,y,cmds), tVec3,pose3, options);

阴谋的结果

绘制机器人使用的轨迹阴谋和存储在数据姿势。

图(1)情节(pose1 (: 1), pose1 (:, 2),“——r”“线宽”2);持有;图([pose2(:,1); pose3(:,1)],[pose2(:,2); pose3(:,2)],‘g’);标题('弹道X-Y')包含('X') ylabel ('是')传说(“无约束机器人“约束机器人”“位置”“西北”)轴平等的

图中包含一个坐标轴。标题为轨迹X-Y的轴包含两个类型为line的对象。这些对象分别代表无约束机器人和受约束机器人。

达到转向极限后,无约束机器人沿曲率半径减小的螺旋轨迹运动,约束机器人沿曲率半径恒定的圆形轨迹运动。

定义事件函数

设置事件函数,使积分在第4状态theta等于最大转向角度时终止。

函数[state, isterterminal,direction] = detectSteeringSaturation(t,y) maxSteerAngle = 0.785;%最大转向角(pi / 4弧度)state(4) = (y(4) - maxSteerAngle);当第4状态theta等于最大转向角度时,%发生饱和事件isterminal (4) = 1;事件发生时,集成终止方向(4)= 0;%双向终止结尾

参考文献

林奇、凯文·M和弗兰克·c·帕克。现代机器人技术:机械、计划和控制第1版,马萨诸塞州剑桥:剑桥大学出版社,2017。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和C ++代码。

在R2019B中介绍