目录
1.整体思路
所使用的软件版本如下:
Matlab 2021b:作为仿真平台,连通CarSim和PreScan,开发控制算法,处理感知数据
CarSim 2019.0:提供车辆动力学模型
PreScan 8.5.0:提供仿真场景,包括车辆、道路、虚拟传感器等,提供仿真的可视化动画
若想进行Matlab/Simulink、CarSim、PreScan的三方联合仿真,需要分别连通Matlab/Simulink与CarSim以及Matlab/Simulink与PreScan
2.Matlab/Simulink与CarSim的连通
2.1新建datasets
点击Duplicate按钮,命名为S_C_P_demo
2.2新建工作目录
在D:\carsim\carsim2019\CarSim2019.0_Data\Extensions\Simulink下新建文件夹S_C_P_demo
2.3新建Simulink模型
在S_C_P_demo文件夹下新建mdl或slx文件(博主建立的是mdl文件)
2.4Model选择Simulink
点击Model下拉页,选择Model:Simulink,即可出现Send to Simulink按钮
2.5设置工作目录和Simulink模型
点击如下按钮进行工作目录和Simulink模型的设置,工作目录见2.2节,Simulink模型见2.3节
2.6设置输入和输出
输入量 | 参数含义 |
IMP_SPEED | 车速 |
IMP_STEER_SW | 方向盘转角 |
IMP_STEER_L1 | 左前轮转角 |
IMP_STEER_R1 | 右前轮转角 |
IMP_MUX_L1 IMP_MUX_L2 IMP_MUX_R1 IMP_MUX_R1 IMP_MUY_L1 IMP_MUY_L2 IMP_MUY_R1 IMP_MUY_R1 | 左前轮的地面纵向摩擦 左后轮的地面纵向摩擦 右前轮的地面纵向摩擦 右后轮的地面纵向摩擦 左前轮的地面横向摩擦 左后轮的地面横向摩擦 右前轮的地面横向摩擦 右后轮的地面横向摩擦 |
输出量 | 参数含义 |
vx | 纵向车速 |
vy | 横向车速 |
将以下内容复制粘贴到输出量设置界面的Optional equations之中
DEFINE_OUTPUT mod1_L1 = 0; - ; mod1_L1
DEFINE_OUTPUT mod2_L1 = 0; - ; mod2_L1
DEFINE_OUTPUT mod3_L1 = 0; - ; mod3_L1
DEFINE_OUTPUT mod4_L1 = 0; - ; mod4_L1
DEFINE_OUTPUT mod1_R1 = 0; - ; mod1_R1
DEFINE_OUTPUT mod2_R1 = 0; - ; mod2_R1
DEFINE_OUTPUT mod3_R1 = 0; - ; mod3_R1
DEFINE_OUTPUT mod4_R1 = 0; - ; mod4_R1
DEFINE_OUTPUT mod1_L2 = 0; - ; mod1_L2
DEFINE_OUTPUT mod2_L2 = 0; - ; mod2_L2
DEFINE_OUTPUT mod3_L2 = 0; - ; mod3_L2
DEFINE_OUTPUT mod4_L2 = 0; - ; mod4_L2
DEFINE_OUTPUT mod1_R2 = 0; - ; mod1_R2
DEFINE_OUTPUT mod2_R2 = 0; - ; mod2_R2
DEFINE_OUTPUT mod3_R2 = 0; - ; mod3_R2
DEFINE_OUTPUT mod4_R2 = 0; - ; mod4_R2EQ_OUT MOD1_L1 = (ABS(FY_L1)/FZ_REF(1,1))*MUY_L1;
EQ_OUT MOD2_L1 = SIN(MIN(ABS(ALPHL_L1), 15/DR))*ABS(VXCENL1);
EQ_OUT MOD3_L1 = (ABS(FX_L1)/FZ_REF(1,1))*MUX_L1;
EQ_OUT MOD4_L1 = MIN(ABS(KAPPL_L1), 1)*ABS(VXCENL1);
EQ_OUT MOD1_R1 = (ABS(FY_R1)/FZ_REF(1,2))*MUY_R1;
EQ_OUT MOD2_R1 = SIN(MIN(ABS(ALPHL_R1), 15/DR))*ABS(VXCENR1);
EQ_OUT MOD3_R1 = (ABS(FX_R1)/FZ_REF(1,2))*MUX_R1;
EQ_OUT MOD4_R1 = MIN(ABS(KAPPL_R1), 1)*ABS(VXCENR1);
EQ_OUT MOD1_L2 = (ABS(FY_L2)/FZ_REF(2,1))*MUY_L2;
EQ_OUT MOD1_L2 = SIN(MIN(ABS(ALPHL_L2), 15/DR))*ABS(VXCENL2);
EQ_OUT MOD3_L2 = (ABS(FX_L2)/FZ_REF(2,1))*MUX_L2;
EQ_OUT MOD4_L2 = MIN(ABS(KAPPL_L2), 1)*ABS(VXCENL2);
EQ_OUT MOD1_R2 = (ABS(FY_R2)/FZ_REF(2,2))*MUY_R2;
EQ_OUT MOD2_R2 = SIN(MIN(ABS(ALPHL_R2), 15/DR))*ABS(VXCENR2);
EQ_OUT MOD3_R2 = (ABS(FX_R2)/FZ_REF(2,2))*MUX_R2;
EQ_OUT MOD4_R2 = MIN(ABS(KAPPL_R2), 1)*ABS(VXCENR2);
2.7设置车辆参数
2.8设置初速度
由于博主想在Simulink中更改车辆初速度,因此进行如下设置
2.9Advanced settings
勾选Advanced settings前面的方框,添加如下内容,即可不通过方向盘直接控制前轮转角
opt_steer_ext(1) 4
2.10Send to Simulink
点击Send to Simulink按钮(当在CarSim中进行修改后,也需要点击该按钮),工作目录下生成simfile.sim文件,同时在simulink中会新打开一个页面包含CarSim S-Function模块,即可表明Matlab/Simulink与CarSim连通成功
2.11CarSim S-Function
控制算法的开发过程中,需要使用CarSim S-Function模块,针对其输入和输出进行车辆控制
在Simulink库浏览器中搜索carsim,可以找到CarSim S-Function模块,在使用该模块时,双击后在Simfile name一栏中填入2.10节中生成的simfile.sim文件地址(如下图所示)
3.Matlab/Simulink与PreScan的连通
3.1新建Experiment
3.2新建道路
点击Infrastructure,点击Straight Road拖拽至中间
3.3新建车辆
点击Actors,点击Audi A8 Sedan拖拽至画面中央的道路上
3.4设置动力学模型
(1)点击车辆,右键,点击Object configuration
(2)点击Dynamics,选择User specified,选择CarSim Contact,选择2.3中建立的mdl模型,Apply,OK
(3)点击Animation,勾选Wheel displacement,Apply,OK
3.5设置虚拟传感器
(1)点击Sensor,点击Detailed,将Camera拖拽至画面中央的车辆上,松开按键
(2)点击Ground Truth,将Lane Marker拖拽至画面中央的车辆上,松开按键
Lane Marker传感器如下图所示,会沿不同纵向距离划线(一个Lane Marker传感器可设置四个纵向距离),与车道线相交,最终获取这些相交点与传感器之间的横向距离,后续利用这些数据来获取车道线相关参数。(关于该传感器的详细说明,可查看PreScan帮助文档)
3.6Parse&Build
分别点击Parse、Build和Invoke Simulink Run Mode
4.模型组成及注意事项
4.1软件打开的注意事项
Matlab/Simulink、CarSim、PreScan三方联合仿真时,需要先打开PreScan GUI,在PreScan Process Manager中Matlab一栏点击Start按钮(不能直接双击Matlab打开,否则会报错),之后打开CarSim。
4.2Simulink模型组成部分
对上图各部分进行说明:
PreScan自车信息:有关自车状态变化的信息,用于更新可视化动画中的画面
LaneMarker传感器:获取车道线相关数据,见3.5节
摄像头:摄像头传感器,可查看仿真时摄像头拍摄画面
感知信息:借由LaneMarker传感器获取的数据,进行车道线拟合,获取车道线参数
控制算法:借由横向误差控制模型,进行LQR横向控制,计算得到前轮转角
CarSim动力学模型:借由CarSim S-Function模块,进行输入、输出的设置
4.3感知信息的处理
通过PreScan中的Lane Marker传感器中的感知数据,进行车道线拟合得到车道线参数,通常会以三次多项式来描述车道线
具体的车道线拟合方法见:自动驾驶车道线拟合,由此可求得车道线参数C0到C3,后续会使用这些参数去表示车辆与车道中心线之间的误差。
4.4控制算法
本博客中采用基于车辆动力学模型的横向控制算法,具体可见:基于车辆动力学模型的自动驾驶车辆横向控制
4.5CarSim动力学模型
4.2节中图片所示的CarSim动力学模型为封装模块,点击模块左下角向下的箭头即可打开该模块,进行具体设置后的模块内部如下图所示
现对上图所示的具体部分进行说明:
①Mux模块,双击后设置为[15 8 1 1 1],对应CarSim中的26个输入
②Ground模块,15个输入变量无需设置,接地即可
③Constant模块,设置为0.8*ones(8,1),对应8个输入(前后轮的横纵向摩擦系数)
④车速
⑤左前轮、右前轮转角,暂未考虑阿克曼转向
⑥CarSim S-Function,具体见2.11节
⑦vx、vy
4.6其它注意事项
(1)每一次CarSim动力学模型更改完成后,都需要点击Send to Simulink,重新生成simfile.sim文件
(2)每一次PreScan模型更改完成后,都需要点击Parse和Build,同时在simulink模型中需要点击Regenerate按钮,同时会弹出显示Regenerate完成情况的对话框
(3)LQR离线求解:每一次在CarSim更改车辆相关参数或更改Q、R矩阵中的权重值后,都需要对如下m文件重新运行以生成新的K矩阵
cf=-145777;
cr=-119580;
m=1820;
Iz=4095;
a=1.265;
b=2.947-1.265;
k=zeros(5000,4);
for i=1:5000
vx=0.01*i;
A=[0,1,0,0;
0,(cf+cr)/(m*vx),-(cf+cr)/m,(a*cf-b*cr)/(m*vx);
0,0,0,1;
0,(a*cf-b*cr)/(Iz*vx),-(a*cf-b*cr)/Iz,(a*a*cf+b*b*cr)/(Iz*vx)];
B=[0;-cf/m;0;-a*cf/Iz];
Q=[1 0 0 0;
0 1 0 0;
0 0 1 0;
0 0 0 1];
R=50;
k(i,:)=lqr(A,B,Q,R);
end
k1=k(:,1)';
k2=k(:,2)';
k3=k(:,3)';
k4=k(:,4)';
(4)仿真频率的设置
①CarSim仿真频率设置
②PreScan仿真频率设置
点击页面中的Simulation scheduler进行频率设置
5.联合仿真结果
由于PreScan中Lane Marker传感器的精度以及在拟合时使用的拟合点较少,使得拟合得到的车道线参数呈现小幅的周期波动,从而造成车辆与车道中心线之间的距离误差呈现小幅的周期波动,后续对感知信息的处理可以再进一步优化。