主要内容

smoothtrajectory.

在驾驶场景中创建平滑的、受刺激限制的演员轨迹

描述

smoothtrajectory.函数在驾驶场景中为演员创建一个平滑的、受颠簸限制的轨迹。生成的轨迹具有路径点之间的加速度平稳过渡的特点,使其能够用于生成综合惯性导航系统(INS)和全球导航卫星系统(GNSS)的测量数据insSensor系统对象™。了解更多细节smoothtrajectory.生成轨迹,看算法

Smoothtrajectory(交流路点为演员或车辆创造一个平滑的轨迹,交流,从一组路径点跟踪。演员以每秒30米的恒定速度行进。

例子

Smoothtrajectory(交流路点速度也指定行动者或车辆沿轨道前进或后退的速度。

例子

Smoothtrajectory(交流路点速度等待时间还指定演员或车辆的等待时间。使用此语法以特定的航点暂停演员或车辆。

例子

Smoothtrajectory(___名称,值使用一个或多个名称-值对和前面语法中的任何输入参数组合指定选项。例如,您可以指定行动者或车辆在每个航路点的偏航方向角或轨道上的最大挺举量。

例子

全部折叠

创建一个包含弯曲的双车道道路的驾驶场景。

场景= drivingScenario ('采样时间', 0.05);[0 0;24.2 - 27.7;50 30);lspec = lanespec (2);路(场景、roadcenters“道”, lspec);

将车辆添加到方案中。设置一条轨迹,其中车辆进入曲线时速度降低。

v =车辆(方案,“ClassID”1);航点= [2.6 1.0;23.6 24.9;45.5 28.6];速度= [9 8 9];Smoothtrajectory(v,航点,速度)

绘制场景并运行模拟。

情节(场景,“锚点”“上”“RoadCenters”“上”提前(方案)暂停(方案.Sampletime)结束

创建一个包含四个十字路口的驾驶场景。

场景= drivingScenario ('采样时间', 0.02,“StopTime”20);RoadCenters = [0 0;50 0];lanespecification = lanespec([1 1]);路(场景、roadCenters“道”, laneSpecification);道路中心= [25 25;25 -25];路(场景、roadCenters“道”, laneSpecification);

再加上小我车,它向北行驶,但在十字路口等了一秒钟。

自我=车辆(场景中,“ClassID”,1,'位置',[2 -2 0]);航点= [2 -2;17.5 -2;45 -2];速度= [5 0 5];waittime = [0 1 0];Smoothtrajectory(自我,航点,速度,Waittime);

加上一个骑自行车的人,以恒定的速度不停车地向东穿过十字路口。

自行车=演员(场景中,...“ClassID”,3,...“长度”, 1.7,...'宽度',0.45,...'高度', 1.7,...'位置',[23 23 0]);航点= [23 23;23 -23];速度= 4;SmoothTrajectory(自行车,航点,速度);

画出场景。车辆在十字路口停一秒钟,骑自行车的人过了十字路口后继续行驶。

情节(方案)提前(方案)暂停(方案.Sampletime)结束

模拟一个驾驶场景,其中汽车驱动器反向返回停车位。

创建一个驾驶场景。添加道路段以定义停车场。第一道路段定义了停车位。第二路段限定了驱动通道并覆盖第一道路段。

场景= drivingScenario;道路中心= [6 0;24 0];lmparking = [lanmarking(“无名”...repmat (laneMarking (“固体”), 1、5)...laneMarking (“无名”));lspecParking = lanespec (6'宽度',3,'标记', lmParking);路(场景、roadCentersParking“道”,lspecparking);roadcentersdriving = [12 0;18 0];lmdriving = [lanmarking(“无名”) laneMarking (“无名”));lspecDriving = lanespec (1,'宽度',18,'标记', lmDriving);路(场景、roadCentersDriving“道”, lspecDriving);

将车辆添加到驾驶场景中。

车=车辆(场景中,“ClassID”,1,'位置'(15 6 0),“偏航”, 90);

定义飞行器的轨迹。车辆向前行驶,停下来,然后倒车,直到倒车到停车位。当车辆进入停车位,它有一个偏航方向角,从它开始的地方逆时针90度。

航点= [15 -6;15 5;12 -1.5;7.3 -1.5];速度= [3;0;-2;0);smoothTrajectory(汽车、锚点、速度,“偏航”,[90 90 180 180]);

绘制驾驶场景并显示轨迹的路径点。

情节(场景,“锚点”“上”推进(场景)暂停(0.001)结束

创建一个行人在十字路口右急转弯的轨迹。

创建一个驾驶场景。添加定义十字路口的路段。

场景= drivingScenario;= [0 10;0 -10];路(场景,roadCenters);路(场景中,翻转(roadCenters 2));

在场景中添加一个行人角色。

步行=演员(情景,...“ClassID”,4,...“长度”,0.24,...'宽度',0.45,...'高度', 1.7,...'位置',[ -  9 0 0],...“RCSPattern”, (8 8;8 8],...“网”driving.scenario.pedestrianMesh,...“名字”'行人');

确定行人的轨迹。行人走近十字路口,短暂停顿,然后在十字路口右急转弯。要定义右急转弯,请在十字路口指定两个紧靠在一起的路点。对于这些航路点,指定第二个航路点与第一个航路点成90度角的偏航方向角。

路径点= [-9 0;-0.25 0;0 -0.25;0 9];速度= (1.5;0;0.5;1.5);偏航= [0;0; -90; -90]; waittime = [0; 0.2; 0; 0]; smoothTrajectory(pedestrian,waypoints,speed,waittime,“偏航”、偏航);

绘制驾驶场景并显示行人的航点。

情节(场景,“锚点”“上”推进(场景)暂停(0.001)结束

在驾驶场景中,通过安装在车辆上的INS传感器生成测量数据。根据车辆的地面真实状态绘制INS测量值,并可视化车辆的速度和加速度剖面。

创建驾驶场景

在马萨诸塞州纳蒂克的MathWorks苹果山校区加载一条驾驶路线的地理数据。

data =负载(“ahroute.mat”);拉丁= data.latitude;lonIn = data.longitude;

将路径的纬度和经度坐标转换为笛卡尔坐标。将原点设置为驾驶路径中的第一个坐标。为简单起见,假设路线的高度为0。

alt = 0;来源= [拉丁语(1),Lonin(1),Alt];[Xeast,Ynorth,zup] =拉丁龙(拉丁,Lonin,Alt,Origin);

创建一个驾驶场景。将转换后的路线原点设置为地理参考点。

场景= drivingScenario ('地理指导',起源);

根据路线的笛卡尔坐标创建一条道路。

roadCenters = [xEast yNorth z上);路(场景,roadCenters);

创建一个车辆,遵循道路的中心线。车辆以每秒4 - 5米(每小时9 - 11英里)的速度行驶,在路上转弯时减速。为了创造轨迹,使用smoothtrajectory.功能。计算的轨迹最小化了混蛋并避免了加速中的不连续性,这是建模INS传感器的要求。

egoVehicle =车辆(场景中,“ClassID”1);egoPath = roadCenters;egoSpeed = [5 5 5 4 4 4 4 4 4 4 5 5 5 5 5 5];smoothTrajectory (egoVehicle egoPath egoSpeed);

绘制场景,并从自我车后面展示一个3d视图。

情节(场景)chasePlot (egoVehicle)

创建INS传感器

创建一个接收模拟时间输入的INS传感器。通过将速度和精度测量的标准差分别设置为0.1和0.05,将噪声引入到传感器测量中。

INS = insSensor (“TimeInput”,真的,...“VelocityAccuracy”, 0.1,...'加速度', 0.05);

可视化INS测量

初始化地理播放器以显示INS测量和actor基础事实。配置播放器以显示其最后10个位置并将缩放级别设置为17。

zoomLevel = 17;球员= geoplayer(拉丁语(1)lonIn (1) zoomLevel,...“HistoryDepth”10'HardentStyle'“行”);

为模拟期间捕获的模拟时间、速度测量和加速度测量预先分配空间。

numwaypoints =长度(拉丁语);Times = Zeros(Numwaypoints,1);gtruthvelocities = zeros(numwaypoints,1);gtruthaccelerations = zeros(numwaypoints,1);传感器velocities =零(numwaypoints,1);SensorAccelerations =零(Numwaypoints,1);

模拟的场景。在仿真循环中,获取自我飞行器的地面真实状态和INS对该状态的测量。将这些读数转换为地理坐标,并在每个航路点,可视化地面真相和INS读数的地理玩家。还可以获取速度和加速度数据,用于绘制速度和加速度剖面。

nextWaypoint = 2;推进(场景)%获得自我车辆的地面真实状态。gTruth =状态(egoVehicle);获得INS传感器测量。测量= INS (gTruth scenario.SimulationTime);%将读数转换为地理坐标。[它实用,lonOut] = local2latlon (measurement.Position (1),...测量.Position(2),...measurement.Position(3),来源);%绘制地面真实位置与传感器报告位置之间的差异。reachedWaypoint = sum(abs(roadCenters(nextWaypoint,:) - gTruth.Position)) < 1; / /获取路径如果reachedWaypoint plotPosition(球员,拉丁语(nextWaypoint) lonIn (nextWaypoint),“TrackID”(1) plotPosition lonOut播放器,它实用,“TrackID”2,“标签”“英寸”%捕获模拟时间、速度和加速度。时间(1)nextWaypoint = scenario.SimulationTime;gTruthVelocities (nextWaypoint 1) = gTruth.Velocity (2);gTruthAccelerations (nextWaypoint 1) = gTruth.Acceleration (2);sensorVelocities (nextWaypoint 1) = measurement.Velocity (2);sensorAccelerations (nextWaypoint 1) = measurement.Acceleration (2);nextWaypoint = nextWaypoint + 1;结束如果nextWaypoint > numWaypoints打破结束结束

绘图速度概况

将车辆随时间变化的地面真实纵向速度与INS传感器捕获的速度测量值进行比较。

从时间矢量和速度矢量中去掉零。

Times (Times == 0) = [];gTruthVelocities(gTruthVelocities == 0) = [];sensorvelocity (sensorvelocity == 0) = [];图保存情节(次,gTruthVelocities)情节(次,sensorVelocities)标题('纵向速度剖面')包含(“时间(s)”) ylabel (“速度(米/秒)”)传说(“地面实况”“英寸”)举行

情节加速度剖面

将车辆随时间变化的地面真实纵向加速度与INS传感器捕获的加速度测量值进行比较。

gTruthAccelerations(gTruthAccelerations == 0) = [];sensorAccelerations(sensorAccelerations == 0) = [];图保存绘制(次,球核酸)图(时间,传感器)标题(纵向加速度剖面的)包含(“时间(s)”) ylabel ('加速度(m / s ^ 2)')传说(“地面实况”“英寸”)举行

输入参数

全部折叠

属于…的演员drivingScenario对象,指定为演员车辆目的。要创建这些对象,请使用演员车辆函数,分别。

轨迹点,以米为单位,指定为实值N2或N-By-3矩阵。N是路径点的数量。

  • 如果路点是一个N- × 2矩阵,则每个矩阵行表示(xy)航路点的坐标。的z- 每个航点为零。

  • 如果路点是一个N- × 3矩阵,则每个矩阵行表示(xyz)航路点的坐标。

每一个N- 航点之间的1个段定义了曲线,其曲率随长度线性变化。如果第一个和最后一个航点是相同的,则轨迹形成循环。

路径点在世界坐标系中。

例子:[1 0 0;2 7 7;3 8 8)

数据类型:|双倍的

行动者在每个航路点的速度,单位为米/秒,指定为实值标量或N元实值向量。N航路点的数量是否由路点

  • 什么时候速度是标量,在整个行动者运动过程中,速度是恒定的。

  • 什么时候速度是一个矢量,矢量值指定在每个航路点的速度。对于前进运动,指定正速度值。对于反向运动,指定负速度值。要改变运动方向,用一个路径点将正速度和负速度分开0速度。

速度被插入到路径点之间。您可以指定速度值作为0在任何路点,但你不能指定0两个连续航路点的速度。

如果没有指定速度,默认情况下,行动者以30米/秒的恒定速度行进。

例子:(10 8 9)指定10米/秒,8米/秒和9米/秒的速度。

例子:(-10 0)指定前进速度为10米/秒,改变方向时暂停,反向速度为10米/秒。

数据类型:|双倍的

参与者在每个路径点的等待时间,以秒为单位,指定为N元实值向量。N航路点的数量是否由路点

当您在航路点指定演员的非负等待时间时,演员在那个航路点暂停指定的秒数。指定非负等待时间时,必须设置相应的速度价值0.您可以设置waitime0在任何航点,但你不能设置等待时间在两个连续的路径点上达到非零值。

例子:[0 0 5 0]当它到达第三个路径点时,暂停演员5秒钟。

数据类型:|双倍的

名称-值对的观点

指定可选的逗号分隔的对名称,值论点。的名字参数名和价值为对应值。的名字必须出现在引号内。可以以任意顺序指定多个名称和值对参数name1,value1,...,namen,valuen

例子:'yaw',[0 90 90 0],'jerk',0.9

行动者在每个航路点的偏航方向角,以度数表示,由逗号分隔的对组成“偏航”和一个N元实值向量。N航路点的数量是否由路点.逆时针方向上的角是正的。

如果没有指定偏航,则每个航路点的偏航为,意味着偏航没有约束。

例子:90年[0]指定一个actor在第一个路径点的角度为0度,在第二个路径点的角度为90度。

例子:[0南]在第一个路径点指定一个0度角的角色。行动者对其在第二个航路点的偏航没有约束。

数据类型:|双倍的

演员的最大纵向混蛋,以米为单位,指定为逗号分隔的配对组成“混蛋”和大于或等于0.1的实值标量。

将震动限制在一个范围内,为人类乘客创造舒适的轨迹,设置“混蛋”在…范围内0.30.9[1]

数据类型:|双倍的

提示

  • 如果smoothtrajectory.函数无法计算一个平滑的,有脉冲限制的轨迹给定的输入参数,尝试做出这些调整的场景:

    • 延长路点之间的距离,给车辆更多的时间加速到指定的速度。

    • 在每个航路点降低速度。尝试将速度值从米/秒转换为英里/小时,以查看给定场景下的速度是否真实。例如,该算法不太可能计算出以30米/秒(约67英里/小时)的速度进行急转弯时的平滑轨迹。

    • 增加最大的混蛋。增加JERK最大值使算法能够以减少人类乘客舒适度来计算更多可能的轨迹。

算法

smoothtrajectory.函数使用梯形加速度剖面创建一个推力有限的轨迹。该轨迹在路径点之间有平滑的加速过渡,为人类乘客带来舒适的乘坐体验。该函数为每个函数计算一个单独的梯形加速度剖面N-轨迹航迹点之间有1段。

考虑一个简单的场景,一辆汽车沿着100米长的道路行驶了50米。该轨迹由一个50米的段组成,在这段段的最后,赛车必须将速度从5米/秒提高到10米/秒。弹道有一个额外的限制,其中最大纵向挺升不得超过0.5米/秒3.

场景= drivingScenario;汽车=车辆(情景);道路(情景,[0 -25; 0 75]);%M.路径点= [0 0;0 50);%M.速度= [5 10];% m / sjerk = 0.5;%m / s ^ 3smoothTrajectory(汽车、锚点、速度,“混蛋”混蛋)

鉴于这种航点段的距离,速度和混蛋约束,smoothtrajectory.功能生成三相梯形加速度配置文件:

  1. 增加线性加速度。保持震动值不大于混蛋

  2. 保持加速度不变。减跳至0。

  3. 减少线性加速度。保持震动不变值不小于混蛋

这些图形可视化的距离,速度,加速度,和挺举剖面沿该路径点段随时间的变化。加速度剖面的三个阶段形成梯形。

四块地块垂直堆叠。图1显示了距离随时间的变化。图2显示了随时间变化的速度。图3显示了随时间变化的加速度,并形成一个梯形。图4显示了随着时间推移的抽搐。

当航路点之间的速度降低时smoothtrajectory.函数以相反的顺序产生三相梯形加速度。在减小的速度情况下,加速度分布的形状是前一个图中所示的形状。

参考

[1] Bae,Il,Jaeyoung Moon和Jeongseok SEO。“为自驾驶班车提供舒适的驾驶体验。”电子产品8,不。9(2019年8月27日):943。https://doi.org/10.3390/electronics8090943.

介绍了R2021a