纯跟踪算法软件在环仿真(Prescan+Carsim+matlab)

1.软件环境搭建

算法平台搭建的大致思想为,首先在Prescan中搭建环境并放置传感器/或采用Prescan的simulink Self Port模块用于提取自车信息,首先在Prescan中搭建场景:

88df819c242d4323a06e9d8528c1034f.png

放置路面和如何添加轨迹的操作不是本文重点,由于控制是处于最下层,只有在定位和轨迹规划完成后才能进行运动控制,故首先需要绘制一条轨迹;

在Prescan中选择Carsim的动力学:

b251dee0b2504c41a2a5322b35eded44.png

此工程为我们用Carsim生成的动力学的模型路径,打开Prescan中的Carsim模型设置:

ff0a358655774465a32074a670251c11.png

上图为笔者自己的路径,注意此模型文件夹在Prescan中而不是在Carsim中,打开Carsim:

设置模块的输入输出:

4a229c4e37e044dd88b6157bc48c7906.png

由于我们只做横向控制,故输入只关注方向盘转角。

1bad5793893747bd8c66fc7d6cba47c3.png

输出从上到下分别为X,Y,Z的坐标,以及沿着X,Y,Z的运动速度,和Roll,Pitch,Yaw三个角度。

Prescan发送到Simulink中,配置好工程的simfile.sim路径为Carsim工程的路径:

1bfa7be0670b4610afe7e2244aa7b132.png

若要对simulink联合仿真工程中Carsim的接口进行更新,更新顺序为:首先更改Carsim的输入输出接口,然后Send to simulink即可完成对动力学接口的更新。

首先不采用carsim动力学,采用Prescan自身动力学,在simulink中添加toWorkspace模块后,运行Prescan工程:

ebe7ff7373b8400ca584391de7b73251.png

在运行完工程后,编写如下脚本将全局路径点的数据保存到workspace,为防止后面运行时,toWorkspace模块将之前已保存好的全局轨迹点覆盖,故在保存.mat数据后将simulink中toWorkspace模块删去:

path_x=pathX.Data;
path_y=pathY.Data;
save('pathInfo.mat','path_y','path_x','path_y');

在simulink中,需对carsim的输出量做如下处理:

d289b104a9d54d3a8c46eb8b3698b0cc.png

其中MuxState1模块为对Prescan的状态进行更新的模块,Carsim+Prescan的模型在环中,大致的信号流为:

c8f6368f48a54bfea83ca803760e103c.png

2.纯跟踪算法代码

在左侧的Prescan的Self Port模块中,由于Rotz的坐标系和车辆的坐标系规定相同,故使用RotZ作为车辆航向角,不使用Heading:

cc631cf080414b93916961f6627829fd.png

其中X,Y为车辆本时刻的坐标,path_x,path_y为规划轨迹,输出angel为前轮转角,steer为转向盘转角。算法代码如下:

function angle  = Puirsuite(x_t,y_t,yawDeg,x_ref,y_ref)
yaw=yawDeg*pi/180;
path_length=length(x_ref);
L=3.165;%车长
h=1.87;%车宽
curve_view_dis=4;    % 前视距离
ld=0;
arpha=0;
%%判断自车位置
 Distant=zeros(path_length,1);
 for i=1:1:path_length
     Distant(i)=(x_ref(i)-x_t)^2+(y_ref(i)-y_t)^2;
    end
 [~, Location]= min(Distant); 
%%计算预瞄点
 distance=0;
 count=1;
 for k=Location:1:path_length
       distance=distance+sqrt((x_ref(k)-x_ref(k+1))^2+(y_ref(k)-y_ref(k+1))^2); 
       count=count+1;
      if distance>=curve_view_dis         %自车与某点距离大于前视距离认为此时的点就是前视点
         break;
      end
   end  
   x_view=x_ref(Location+count);                 %找到前视点的坐标
   y_view=y_ref(Location+count);
   xpf=(x_view-x_t)*cos(yaw)+(y_view-y_t)*sin(yaw); 
   ypf=(x_view-x_t)*(-sin(yaw))+(y_view-y_t)*cos(yaw);
   ld=sqrt(xpf^2+ypf^2);                        %前视点到自车的距离  
   arpha=atan(ypf/xpf); 
   if ld== 0
      angle=0;
   else
       R = ld/(2*sin(arpha));                                 %转弯半径
      angle = atan( L/R)*(180/pi);                            %算出前轮转角
   end
     
end

算法详解如下:首先采用for循环遍历当前车辆位置和所有点之间的距离,并找出距离本车最近的点,将其索引记为Location,在定位的基础上将Location+1的路径索引点作为当下进行一次控制的基础点。

d5eeec9bdb27429380313836cc6d38d1.png

在此基础上,从基础点像后续的规划路径点进行遍历,选择距离大于eq?l_d的点作为预瞄点。由上图的几何关系不难得到:

eq?%5Csigma%20_f%3Darctan%28%5Cfrac%7BL%7D%7BR%7D%29

故要求前轮转角,实际上就是求图中跟踪算法的跟踪半径R,由以下式子确定:

eq?sin%5Calpha%20%3D%5Cfrac%7Be_y%7D%7Bl_d%7D

eq?e_y的确定,涉及到世界坐标系与车辆坐标系的转换,纯跟踪算法确定的车辆坐标系原点为车轮右后轮的坐标,即图中点A的坐标。首先将世界坐标系原点移动到A点有:

f67929c968a147de91e84da85eb45c12.png

将坐标变换表示为矩阵如下:

eq?%5Cbegin%7Bpmatrix%7D%20%7Bx%7D%27%5C%5C%20%7By%7D%27%20%5Cend%7Bpmatrix%7D%3D%5Cbegin%7Bpmatrix%7D%20cos%20%5Cvarphi%20%26sin%5Cvarphi%20%5C%5C%20-sin%5Cvarphi%20%26%20cos%5Cvarphi%20%5Cend%7Bpmatrix%7D%5Cbegin%7Bpmatrix%7D%20%7Bx_r-x_h%7D%5C%5C%20%7By_r-y_h%7D%20%5Cend%7Bpmatrix%7D

最后,需要仿真工程和源码的,可关注我私信领取。

 

 

 

 

 

 

 

 

 

 

 

 

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
CarsimMatlab和Prescan都是用于车辆动态仿真的工具。Carsim是一种车辆动力学仿真软件,用于模拟车辆在不同道路和行驶条件下的运动行为。它模拟了车辆的动力系统、车辆控制系统和驱动境,并提供了准确的车辆动态性能分析结果。 Matlab是一种数学计算和仿真软件,以其强大的数值计算和仿真能力而闻名。它可以与Carsim结合使用,用于分析和处理Carsim模拟结果,并进行更加复杂的算法开发和优化。 Prescan是一种先进的虚拟仿真平台,用于汽车感知、控制和测试。它可以生成逼真的虚拟境,并模拟车辆在其中的行驶过程。Prescan还可以与CarsimMatlab进行集成,使车辆动力学仿真与实际境感知和控制系统交互更加紧密。 通过CarsimMatlab和Prescan的联合仿真,我们可以更加准确地模拟和分析车辆在不同场景下的行驶情况。首先,我们可以使用Carsim进行车辆动力学仿真,得到车辆在不同驾驶条件下的动态性能,如加速度、制动距离等。然后,我们可以将Carsim模拟结果导入Matlab进行进一步分析和处理,比如开发车辆控制算法,优化车辆性能等。最后,我们可以将Matlab开发算法与Prescan进行集成,模拟车辆在虚拟境中的感知和控制过程,以及与其他交通参与者的交互。 通过CarsimMatlab和Prescan的联合仿真,我们可以更好地理解车辆动力学行为,开发更准确和高效的车辆控制系统,并进行更加全面的场景测试和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值