很多人做Carsim和Simulink联合仿真时,最容易卡住的地方不是车辆模型本身,而是驾驶员模型(Driver Model)和那一堆传感器配置到底该怎么理解、怎么配合。上一期笔记我们把联合仿真的基本数据流捋了一遍,这期直接聚焦一个非常典型的场景:用自带的C-Class车模,开启Driver Model仿真,并把5个Driver Sensors彻底讲明白。适合正在啃Carsim教程、想搞清楚内部驾驶员模型到底在做什么,又不想只看英文Manual的人。
1. 项目概述:这次仿真到底在做什么
1.1 为什么是C-Class车模
Carsim自带模板里有好几类车型,从A-Class小轿车到E-Class三厢轿车,再到SUV、轻型卡车都有。我选C-Class作为这次联合仿真学习笔记的载体,原因很实际:C-Class车模的参数处于“中间地带”,轴距适中、悬架参数典型、整车质量合理,既不会像小车型那样动态响应太敏感,也不会像卡车那样自重大、惯性强,非常适合用来验证驾驶员模型这类控制逻辑。
从参数角度看,C-Class自重约1.4吨上下,发动机功率、制动系统、轮胎模型都有一套比较标准的默认设置。这套参数如果你不刻意去改,跑起仿真来数据非常“规整”,不会因为某个悬架K特性过于极端导致车辆在低速工况下就开始发散。
另外,Carsim官方在联合仿真示例里,默认使用C-Class作为演示车型的情况也非常多,网上能找到的教程、PPT、答辩报告里大部分用的都是它。这意味着如果你遇到问题想搜解决方案,用这个车型去复现别人的步骤,踩坑的概率会小很多。
1.2 Driver Model仿真解决什么问题
Driver Model在Carsim里解决的是一个非常实际的问题:在没有真人驾驶员的情况下,让车辆模型自动完成“按设定路径行驶”和“按目标车速行驶”这两个基本操作。
你可能会问,既然Carsim都能直接设置车辆从起点跑到终点,为什么还要单独搞一个驾驶员模型?这就是关键了。Carsim的仿真工况可以设定车辆的运动轨迹,但那是“目标”,车辆本身需要通过油门、制动、转向这几个执行器来“追”这个目标。如果不启用Driver Model,车辆就是一根在指定道路上滑行的“哑巴”,它不会主动去修正方向,也不会因为前面车速设定变化而自动踩刹车或加油。
Driver Model就像一个虚拟驾驶员,它通过“看”前方的路径点、“感知”当前车速,然后输出对应的转向盘转角和油门/制动踏板指令,实时控制车辆。这在做ADAS算法验证、底盘控制策略开发时特别重要,因为你总得有个“开得还行的驾驶员”作为对照组,去比较你的算法和人类驾驶行为的差异。
1.3 Carsim与Simulink联合仿真的整体架构
联合仿真这件事,一句话概括就是:Carsim负责算车辆动力学,Simulink负责跑你写的控制算法或信号处理逻辑。两边通过一个S-Function接口互相交换数据。
具体到这次仿真的场景,数据流是这样的:
Simulink侧可以给Carsim下发目标车速、目标路径偏差修正指令等;Carsim把车辆当前状态,包括横摆角速度、纵向车速、侧向加速度、方向盘转角这些信号,通过输出端口送回Simulink。这5个Driver Sensors就属于Carsim回传的典型信号,它们反映了虚拟驾驶员在某一时刻“看到”和“感受到”的车辆状态。
整个架构搭建好之后,你可以非常方便地在Simulink里查看传感器数据、写一个简单的观测器、做数据记录,甚至在后面接一个横向控制算法来替代Carsim内置驾驶员模型,这算是从“仿真入门”到“算法验证”的一个必经台阶。
2. 仿真前置工作:环境准备与接口配置
2.1 软件版本与运行环境搭建
在做联合仿真之前,有几个环境问题必须提前确认,不然跑起来各种报错会让你怀疑人生。
首先,Carsim和MATLAB/Simulink版本之间的兼容性。我用的是Carsim 2019.0配合MATLAB R2020b,这个组合跑起来比较稳。早几年用8.02版本的时候,配MATLAB R2016a也是经典组合,很多老教程都是基于这个版本写的。如果你用的版本太新或者太旧,接口文件生成时容易出现编译器报错或者找不到S-Function的问题。
其次,编译器这块一定要提前配好。Simulink在调用Carsim生成的C代码时,需要系统里有可用的C编译器。Windows环境常见的选择是MinGW-w64或者Microsoft Visual C++。我在第一次配置时就是吃了没装编译器的亏,Simulink报错提示找不到编译器,折腾了半天才发现是MATLAB的mex -setup没配置。
配置完成之后,记得在MATLAB里把Carsim的Simulink接口目录加到搜索路径中。通常Carsim安装目录下会有一个/simulink/文件夹,里面有官方提供的S-Function封装模块,不添加路径的话Simulink根本找不到这个模块,这一点新手非常容易忽略。
2.2 Carsim侧配置:车辆模型、道路与工况
Carsim侧的工作是整个联合仿真的“地基”,Simulink这边做得再花哨,Carsim那边车辆模型或场景没选对,仿真结果也是空中楼阁。
打开Carsim主界面后,第一步是新建或选择一个工程文件。我建议直接在默认数据库里复制一份已有的C-Class模型,保持车辆动力学相关参数不变,只修改你需要研究的变量,这样能最大程度上排除模型本身的问题。
第二步,在Run Control页面里设置仿真工况。这里要关注两个选项卡:一个用于设置道路几何和参考路径,另一个用于设定车辆初始速度、换挡策略等初始条件。做Driver Model仿真时,路径设置非常关键,你可以选择Carsim自带的测试道,也可以手动定义一条包含直线、弯道和变道段的路径。
第三步,就是在Procedure里找到Driver Model的控制选项。这里可以设置目标车速、驾驶员风格(激进/保守)、预瞄距离等参数。这个配置直接决定了虚拟驾驶员的行为特征,也是我们这篇博文后面要重点展开的内容。
2.3 Simulink侧接口:S-Function与输入输出通道对应
Carsim和Simulink打通的物理链接,是通过一个叫“Carsim S-Function”的模块实现的。
在Carsim的Interface设置中,需要指定使用Simulink作为外部接口,并选择Simulink模型文件路径。生成之后,你会在Simulink模型里看到一个大黄色块,这个S-Function模块内部通常包含一个可配置的IO参数界面,双击它能打开Carsim的导入导出通道设置。
这里有一个非常容易混淆的点:Carsim的导入通道(Import Channels)是指Simulink发往Carsim的信号,比如目标加速度、方向盘转角指令等;导出通道(Export Channels)是指Carsim发往Simulink的信号,比如车速、横摆角速度等。我们这次要关注的5个Driver Sensors,都属于导出通道。
建议仿真开始前,先在Carsim的IO Channels列表里把你需要的信号全部勾选好,统一放在一个命名的输出通道列表里(比如Driver_Sensors)。这样回到Simulink里用Bus Selector选信号时,一眼就能看出哪些传感器信号可被使用。
3. 核心内容:5个Driver Sensors逐个拆解
3.1 传感器列表与信号通道说明
Carsim中的Driver Model并不是一个简单查表模型,它内部有一套驾驶员感知机制,这套机制依赖若干外部传感器输入来形成闭环控制。我们在联合仿真中常用的5个Driver Sensors分别是:
| 传感器名称 | 典型信号通道名 | 单位 | 作用 |
|---|---|---|---|
| 横向路径预瞄偏差 | D_Path_Preview | m | 反映驾驶员目光所及之处的路径横向偏差,是转向控制的主要输入 |
| 纵向车速 | Vx | km/h或m/s | 车速反馈信号,用于速度跟踪控制 |
| 侧向加速度 | Ay | g或m/s² | 衡量车辆横向动态强度,影响驾驶员对舒适性和安全性的判断 |
| 横摆角速度 | Yaw_Rate | deg/s或rad/s | 描述车辆绕垂直轴的旋转速度,是转向动态的核心反馈 |
| 方向盘转角 | Steer_L1 | deg | 驾驶员转向指令的直接体现,也是验证控制逻辑是否正确的重要信号 |
这5个传感器并不完全都是车辆“自带”的物理传感器,有一部分是从车辆动力学状态推算出来的虚拟传感器信号。比如横向路径预瞄偏差,它是根据预瞄点和当前车辆航向计算出来的一个虚拟量,在实车上并没有一个叫“预瞄偏差传感器”的硬件,但在Carsim里,它被建模成一个可供驾驶员模型直接使用的信号通道。
3.2 每个Sensor的含义、作用与联动关系
首先要重点理解的是横向路径预瞄偏差。Carsim内置驾驶员模型采用的是经典的单点预瞄跟随思路:驾驶员不是盯着车头正前方,而是看着前方一段距离的路径点,根据那个点与自己当前行驶方向的横向偏差来决定打多少方向。这个预瞄距离跟车速强相关,车速越快,预瞄距离通常越长。
然后是纵向车速传感器。这个信号直接决定了驾驶员模型的“车速闭环”。如果Carsim里设定的目标车速是60km/h,车辆当前Vx低于60,驾驶员会加大油门;高于60,则会松油门甚至踩刹车。这个闭环实质上是一个速度误差的比例积分控制。
侧向加速度传感器和横摆角速度传感器之间的关系更像是一对“兄弟”。横摆角速度反映了车辆转得多快,侧向加速度则反映了车辆在转弯时承受的横向力。二者在稳态转向时满足Ay ≈ Vx × Yaw_Rate这个近似关系。如果仿真中这两条曲线相差特别大,那多半是车辆处于明显的瞬态响应阶段,比如刚切入弯道的那一瞬间。
最后一个方向盘转角传感器,虽然它看起来像是一个“执行器指令”而非“感知信号”,但在驾驶员模型闭环里,它是驾驶员感知自己打了多少方向的重要反馈。没有这个信号,驾驶员模型就不知道自己已经输出多大转向角,也就无法形成闭环修正。
这5个传感器联动的场景,就像人开车一样:眼睛看着前方预瞄点,如果发现偏了,就修正方向盘;同时余光扫一眼车速表,如果快了就松油门,慢了就补一脚;身体感受到的侧向加速度和横摆运动,则让驾驶员知道当前车辆的动态极限,从而调整转向和制动的剧烈程度。
3.3 传感器信号在Simulink中的读取与处理方式
在Simulink中读取这5个传感器信号,最常见的做法就是通过Bus Selector模块从Carsim S-Function的输出总线上把对应信号挑出来。
我之前在构建模型时,习惯先把所有传感器的原始信号按单位转换统一处理好,比如把横摆角速度从deg/s转成rad/s,方便后续做数值运算。这个环节看似简单,但如果疏忽了,后面的控制算法计算出来的结果就会错得离谱。
还有一个值得注意的点:Carsim输出的信号在Simulink里往往是带物理单位的变量,但Simulink本身不强制单位一致,所以你得自己在心里(或在信号命名里)标明单位。建议在信号线命名时直接带上单位后缀,比如Vx_kph、YawRate_degps,这样模型越搭越复杂的时候,维护起来会轻松很多。
4. 实操过程:从零开始跑通一个完整仿真
4.1 Step 1-3:Carsim端的模型准备
这一步我们进入实际操作环境。我以Carsim 2019.0版本和MATLAB R2020b为例,把整个流程按步骤拆分。
第一步,在Carsim主界面新建一个数据库,选择预设的C-Class车型。在车辆模型配置页面里,确认车辆类型为“Class C Hatchback”或类似的预设模板。这一步不要修改任何悬架、轮胎、转向系统参数,保持默认。
第二步,进入Run Control页面配置工况。在“Road”选项卡里,我建议先选择一段简单的双车道变线工况,比如Double Lane Change。这种工况对驾驶员模型的路径跟踪能力要求适中,跑出来的曲线既能看出控制效果,又不会因为难度太高而发散。初始速度设置为60km/h,路面附着系数保持默认的0.85。
第三步,在“Procedure”选项卡里启用Driver Model。在Carsim的驾驶员模型设置界面,找到目标车速输入框,填60。驾驶员风格如果没有特殊需求就选Normal。预瞄距离可以先用默认值,后面我们再根据曲线调整。
4.2 Step 4-6:Simulink端模型搭建
车辆和工况都设置好之后,重点转到DTO(Data Transfer Operations)配置。打开Carsim的“Simulink”界面设置,勾选“Use Simulink for co-simulation”,然后指定一个输出用的Simulink模型文件名。
第四步,配置IO通道。这一步非常关键,我建议专门新建一个输出变量集合,把这5个Driver Sensors全部拉进去:
D_Path_PreviewVxAyYaw_RateSteer_L1
在Carsim的变量列表里,搜索这些信号名并添加到输出通道中。同时,如果你希望Simulink向Carsim发送目标车速,也别忘了在输入通道里增加一个Target_Speed变量。
第五步,打开MATLAB/Simulink,新建一个空白模型,然后从Carsim安装路径的Simulink库中拖入“Carsim S-Function”模块。这个模块通常在安装目录下的simulink文件夹里,可以手动添加到Simulink库浏览器中,也可以用addpath命令把目录加进去后直接用Carsim搜索。
第六步,连接信号和观测模块。从Carsim S-Function的输出端引出一个Bus Selector,把5个传感器信号分别拉出来,接上Scope或者To Workspace模块。如果后续要做控制算法,建议在S-Function的输入端通过Bus Creator把目标车速等控制量组合后送入。
4.3 Step 7:仿真运行与结果分析要点
一切接好后,在Simulink模型点一下运行,Carsim的S-Function会自动调用Carsim的求解器进行计算。第一次运行通常会比之后慢一些,因为需要编译生成C代码和可执行文件。
运行结束后,重点观察横摆角速度和侧向加速度两条曲线。在双移线工况下,横摆角速度应该会出现两次明显的正负交替趋势,这对应车辆先向左变道再向右变道。侧向加速度的峰值如果控制在0.3g到0.5g之间,说明虚拟驾驶员的驾驶风格属于相对稳健的类型,如果超过0.7g,就要检查一下是不是预瞄距离设置得太小了。
至于横向路径预瞄偏差,它的均值理论上应该趋近于0,但会在变道过程中出现短暂的正向或负向尖峰,这个尖峰的大小反映了路径跟踪的动态误差。正常情况下,在沥青路面上,这个偏差峰值不应超过0.3米。
仿真完成后,别忘了在Carsim的Plot页面里查看车辆实际轨迹和目标参考轨迹的重合度。两条线贴合得越好,说明驾驶员模型的路径跟踪能力越强。如果出现明显振荡或轨迹发散,就去调整预瞄距离和驾驶员反应时间。
5. 常见问题与排查技巧实录
5.1 联合仿真最容易踩的坑
联合仿真这东西,十次报错有八次不是算法问题,而是环境或配置问题。
第一种典型问题:Simulink点击运行后提示“Unable to open S-Function”之类的错误。这一般不是因为模块坏了,而是因为MATLAB搜索路径里没有包含Carsim的S-Function库和相关DLL文件。解决办法是把Carsim安装目录下的simulink和bin目录通过addpath添加到MATLAB路径中,并保存路径设置。
第二种典型问题:Carsim S-Function模块在运行时报出“Invalid MEX-file”。这个多半是编译器配置错误。到MATLAB命令行执行mex -setup,重新指定一个可用的编译器即可。如果系统里装了多个版本的Visual Studio,需要选择与MATLAB版本兼容的那个。
第三种典型问题:仿真能跑但结果荒谬,比如车速竖着冲上天或者横摆角速度爆炸。这通常是输入输出信号单位或通道对应关系搞错了。比如你本想把Simulink侧的目标速度50km/h发给Carsim,但Carsim里那个输入变量单位是m/s,50直接进去就相当于180km/h,结果自然飞了。
5.2 参数调优的实用经验
关于预瞄距离,我的经验是:低速工况下预瞄距离短一些,比如30km/h时设5到8米,转向更灵敏,路径偏差小;高速工况下预瞄距离要拉长,120km/h时设20到30米,否则驾驶员模型会过于“神经质”,方向修正频繁,车辆横摆角速度会出现颤振。
驾驶员反应时间也值得留意。Carsim内置驾驶员模型里有一个时间延迟参数,模拟人从“感知”到“操作”的延迟。默认值通常在0.1到0.2秒。如果你发现方向盘转角输出曲线出现周期性的高频小幅振荡,可以先试试把这个延迟略微调大一点。
速度控制增益则要遵循“先比例后积分”的思路。先单独加大比例增益,看车速误差是否快速收敛且没有明显超调,再小步加入积分项消除稳态误差。我一般把比例增益设在0.5左右起步,积分增益设在0.1以内,再根据曲线逐步微调。
如果你在仿真过程中发现横向预瞄偏差一直无法收敛到零附近,不妨先检查一下参考路径本身是不是有跳变。有些自定义路径在拼接处产生了一个突变的横向偏移量,这种非连续路径会导致驾驶员模型无论如何控制都追不上,因为它本质上是在跟踪一条“物理上不可能平滑通过”的线。
最后再分享一个小经验:跑联合仿真时,Simulink的求解器步长设置尽量和Carsim内部仿真步长相匹配。我习惯在Simulink里把求解器设置为固定步长,步长控制在1毫秒。用变步长(比如默认的ode45)也不是不行,但在信号经过S-Function的零阶保持器后,数据流的平滑性会差一些,表现在Scope里就是曲线出现阶梯状,影响你对控制质量的判断。