尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CarSim与Simulink联合仿真:Driver Model与5个Driver Sensors闭环控制实战

CarSim与Simulink联合仿真:Driver Model与5个Driver Sensors闭环控制实战 开车摸过方向盘的人都知道真实驾驶员的操作不是一组设定好的信号而是根据路况、车速、车身姿态不断修正的闭环过程。上一轮carsim与simulink联合仿真学习笔记里我还在用固定的油门和转向输入跑开环工况车辆虽然能按我给的信号走但稍微加点速度误差、路面扰动轨迹就开始飘。这次把目标直接推进到driver model仿真让驾驶员模型自己去看路、修正、操作而C-class车模上那5个driver sensors就是驾驶员感知车辆状态的核心反馈通道。这篇文章我不会讲太多花哨的东西重点就三件事C-class车模怎么选、怎么配driver model仿真中5个driver sensors到底代表什么、怎么接进Simulink以及从开环切换到闭环之后我自己踩过的几个坑和调参思路。适合正在做车辆动力学联合仿真的研究生、工程师或者刚把carsim和simulink连通、想进一步做驾驶员闭环控制的人。1. 为什么这次要折腾driver sensors1.1 上一阶段打好的底子上一篇笔记结束时我其实只做通了最基本的数据通路CarSim负责解算车辆动力学Simulink负责给控制信号。用今天的话讲那还是个开环玩具——我把方向盘转角一路接到CarSim的输入通道车辆就按固定转角转圈油门给多少它就加速到多少整个过程没有反馈车辆到底处于什么状态Simulink侧其实是盲的。那种模式的局限非常明显。速度一高车辆对转向输入的响应就会因为轮胎侧偏特性发生变化同样的方向盘转角在不同车速下转弯半径完全不同。开环仿真里我根本感知不到这种变化只能一遍遍试参数效率很低。1.2 从开环到闭环这场仿真的目标是什么所以这次学习的核心目标就一个字闭。让驾驶员模型能实时看到车速、横摆角速度、横向偏差这些状态量再根据状态误差去修正转向、油门和制动操作。这样才像人开车而不是放录像。在CarSim里做闭环驾驶员仿真最关键的一步就是把车辆状态反馈给驾驶员模型。反馈通道里有一类信号特别重要就是driver sensors。它虽然不是某个传感器硬件而是CarSim输出的五路驾驶员相关信号但作用等价于真车上驾驶员通过手脚感知到的车辆反馈——转向盘反馈、油门执行情况、制动执行情况、档位实际位置、离合器状态。1.3 看了几篇论文之后我选择了C-Class为什么选C-class车模老实说最初想用更简单的车型但翻了CarSim自带数据库和相关论文之后发现C-Class几乎是做driver model仿真的默认选项。原因有三。第一C-Class的整车参数非常中庸轴距、轮距、质心高度、簧载质量都在中级轿车的典型区间不会像跑车那样对转向输入极度敏感也不会像SUV那样侧倾大得离谱适合验证一般性的驾驶员控制算法第二它的悬架K特性、C特性在CarSim里标定得比较完整稳态回转、变道、制动等工况都能跑出合理响应第三论文里用C-Class做基准车型的案例多参数和现象都有参照出了问题容易判断是算法的问题还是车辆模型的问题。2. C-Class车模的配置清单与应用判断2.1 C-Class车型在CarSim数据库里的定位在CarSim的主界面里C-Class属于基础车型库通常在Vehicle分类下可以找到。它不是某个具体品牌车型而是一组能代表中型轿车这一类车辆的参数集合。数据库里包含车身、动力总成、制动系统、转向系统、轮胎、悬架等各个子系统。我用它做联合仿真时第一步不是改参数而是把整车参数页面整体过一遍。CarSim的车辆参数是通过左侧树形菜单组织起来的每个子系统是一个页面页面里的参数又可以分为刚性参数和特性曲线两类。刚性参数包括质量、质心位置、轴距、轮距这些特性曲线包括悬架刚度、阻尼、轮胎侧偏特性等。2.2 必须检查的车辆参数项虽然C-Class默认参数已经比较合理但有几个位置我建议动手之前就确认否则后面仿真报出奇怪的结果回溯起来非常费劲。整车质量和质心位置默认设置下C-Class整备质量通常在1.5吨上下质心高度在0.5米量级。如果后面要修改载荷工况记得同步调整转动惯量否则车辆动态响应会失真。轮胎模型CarSim自带多种轮胎模型我通常用内置的Internal Tire Model而不是第三方魔术公式轮胎。内置模型的参数是跟C-Class匹配好的联合仿真步长下更稳定。转向系统做driver model仿真时方向盘转角输入直接进转向系统模型。C-Class默认配置里转向传动比、转向柱摩擦、助力特性都比较典型不需要动。制动系统制动主缸压力到轮缸压力的映射关系是纵向驾驶员控制必须关心的参数。C-Class默认的制动模型线性度不错适合做基于PID的制动控制。传动系统做手动挡模型时需要关注离合器传递能力曲线、各档位速比和换挡时序。这些参数决定了driver sensors里的Gear和Clutch信号是否合理。2.3 为什么默认参数是第一选择很多朋友做联合仿真上来就想把车辆参数改成自己理想中的样子结果模型跑出来的现象和理论对不上最后找原因发现是参数改出了一堆自洽性问题。我的建议是第一遍跑通全流程绝对不要改任何车辆参数就用C-Class默认配置。默认参数最直接的优点是靠谱。CarSim官方用这套参数做了大量标定和验证跑标准工况的仿真结果和实车测试趋势一致。第一步就改参数等于把仿真可信度的根基动摇了后面不管算法出什么问题都很难界定是控制问题还是车辆参数问题。我自己就是在用默认参数跑通第一版driver model之后才开始逐步调整悬架刚度和整车质量做对比实验的。3. Driver Model仿真的核心五个driver sensors的来龙去脉3.1 先把概念分清driver model、driver controls、driver sensors这套仿真里最容易把人绕晕的就是这几个名词。driver model驾驶员模型是实现人开车逻辑的算法模块既可以是CarSim内置的也可以自己在Simulink里搭。driver controls驾驶员控制指令是驾驶员模型输出的操作量对应CarSim的输入通道比如方向盘转角、油门开度、制动压力、档位、离合器。driver sensors驾驶员传感器是CarSim从车辆模型里提取出来、反映驾驶员操作实际执行结果的状态量。三者的关系可以这样理解driver model是大脑driver controls是大脑发出的指令driver sensors是手脚和身体反馈回来的执行结果。做闭环仿真就是要让大脑能同时看到指令和结果不断修正差异。3.2 五个传感器的具体含义与读取方式标题里的5 driver sensors对应到C-class车模的典型手动挡配置指的是下面这五个传感器信号CarSim输出变量典型含义单位方向盘转角Steer_SW驾驶员施加的方向盘角度包含左右方向deg油门踏板开度Throttle油门踏板的实际开度比例0~1制动主缸压力Brake_MC制动系统主缸压力反映制动力度MPa档位Gear当前实际接合的档位无量纲整数离合器踏板位置Clutch离合器踏板行程比例0~1这五个信号里方向盘转角、油门、制动是任何驾驶员模型都必须反馈的核心量档位和离合器则是在手动挡模型里需要额外关心的量尤其在起步、换挡、减速停车这些瞬态工况它们是否平稳直接决定仿真是否可信。在CarSim端这些信号没做特殊配置之前不会自动出现在Simulink里。需要在CarSim的输出变量配置页面通常叫Output或I/O Channels里把它们添加进去并指定输出到联合仿真接口。添加完成后这些信号的排列顺序就是Simulink侧接收向量时的索引顺序。3.3 通道顺序错位我踩过的一个典型坑这里就牵出一个我实际踩过的坑。第一次做联合仿真时我在CarSim输出配置里依次添加了Vx、Vy、Yaw_Rate、Steer_SW、Throttle、Brake_MC、Gear、Clutch觉得顺序没问题。但到了Simulink里用Selector逐个取信号时发现Brake_MC读出来的数值怎么都对不上还在0到0.3之间乱跳而真实踩下制动时这个值应该稳步上升到几MPa。排查了半天最后发现是CarSim输出变量页面里有一个默认隐藏的变量排在中间导致实际输出向量比我以为的多了一路所有信号索引整体往后错了一位。我在Simulink里按我以为的顺序取值自然全乱了。这个教训让我养成了一个习惯无论CarSim界面里显示的顺序看起来多么直观在Simulink侧接上CarSim S-Function模块后先用一个Display或Scope模块把输出向量完整拉出来看一遍对照CarSim输出配置逐个数确认每一个索引位置对应哪个变量然后再做Selector切片。3.4 验证传感器信号是否对劲的土办法通道顺序确认后还有一个问题怎么知道这五个传感器信号本身是对的纯看数字容易麻木我推荐一个很土但很有效的办法——在Simulink里做一组开环阶跃。具体操作是给CarSim的转向输入一个固定角度的阶跃油门给某个恒定开度档位和离合器按手动挡操作序列给指令然后在Scope里同时观察Steer_SW、Throttle、Brake_MC、Gear、Clutch这五个信号的变化。正常情况下Steer_SW应该快速跟随输入指令并稳定在目标值附近Throttle保持恒定开度Brake_MC在未踩制动时接近0Gear按照档位命令跳变Clutch在换挡期间出现踩下-释放的波形。如果哪个信号的变化趋势和理论不符一定是配置出了问题趁早查不要等到闭环仿真发散时才手忙脚乱。4. Simulink侧建模接口、换算与最小闭环框架4.1 CarSim S-Function与信号进出配置CarSim与Simulink联合仿真的标准连接方式是在Simulink模型里放置一个CarSim S-Function模块根据版本不同可能显示为CarSim或VS Commands这个模块承载了CarSim整车模型的全部动力学解算。S-Function模块通常有两组端口输入端口Import接收来自Simulink的控制指令对应CarSim的输入通道比如IMP_STEER_SW、IMP_THROTTLE、IMP_BRAKE_MASTER_CYL、IMP_GEAR、IMP_CLUTCH。输出端口Export输出CarSim解算结果也就是CarSim输出配置里添加的那些变量。联合仿真时CarSim主界面的Run方式需要设置为与Simulink联合并在CarSim里指定要使用的Simulink模型路径。每次修改CarSim配置后需要在Simulink里重新运行一次CarSim S-Function的初始化让它加载最新的参数文件否则很容易出现明明改了参数仿真结果却不变的问题。4.2 单位换算和时序同步不可忽略CarSim内部解算使用国际单位制但输出变量为了迎合工程习惯有些用km/h有些用deg这就导致Simulink侧收到的信号单位不统一。比如Vx如果配置成km/h做纵向控制时不换算成m/sPID参数会非常难调。我的习惯是在Simulink的CarSim S-Function输出端口之后立刻接一组Gain模块做单位换算把km/h转m/s把deg转rad把MPa转Pa。统一单位之后再进入控制逻辑后面调参数时脑子不会乱。时序同步这个问题也要重视。Simulink仿真步长和CarSim内部步长是两个概念。CarSim的动力学解算使用变步长积分但通过S-Function与Simulink交换数据时数据是离散的Simulink的采样步长决定了数据交互的节奏。步长太大控制量更新太慢高速工况容易发散步长太小仿真时间暴涨效率太低。我自己做C-Class的driver model仿真通常用固定步长0.001秒既保证稳定性又不会慢到难以接受。4.3 一个可用的最小横向控制框架搭建闭环Simulink模型时我没用太复杂的驾驶员模型用的是经典的预瞄-跟随框架便于理解也便于排查问题。这个框架的思路是每个控制周期里驾驶员把视线放到前方某个预瞄距离处计算出当前位置与预瞄点之间的横向偏差和航向偏差然后根据偏差计算期望的方向盘转角。具体到Simulink里我大致是这样搭的从CarSim输出里取Vx、Yaw_Rate、Station、Lateral偏差这几个状态量。根据当前车速和预瞄时间计算预瞄距离读取预瞄点处的路径横向坐标。用比例-微分控制计算期望方向盘转角。把期望转角限幅后写到CarSim的转向输入通道。这套框架的优势在于控制器的物理意义非常直观。Kp大了转向响应快但容易振荡Kd大了系统稳定但转向变迟钝。调参时能很清楚自己在动什么。4.4 纵向速度跟随的简单实现横向控制管方向纵向控制管速度。我在做C-Class速度跟随时的做法是目标车速和当前车速的误差进一个PID控制器输出一个宏观的加速/减速需求然后根据这个需求决定踩油门还是踩制动。这里有两条路可以走。简单做法是误差为正就输出油门开度误差为负就输出制动压力中间设一个死区避免油门和制动频繁切换。进阶做法是用一条Map表把速度误差映射成油门开度和制动压力的组合模拟真实驾驶员对不同速度误差的操作力度差异。我没有一上来就上Map表因为Map表里的标定数据需要大量实验来攒第一版还是先用的带死区的PID。等闭环跑稳了再逐步加入Map表来优化跟车平顺性。需要注意的是纵向控制输出要经过限幅和变化率限制。真实驾驶员踩油门不会一瞬间从0踩到1Simulink里直接这样输出会让车辆纵向加速度剧烈跳变。加一个Rate Limiter或者一阶惯性滤波模拟驾驶员的肌肉响应特性车辆行为会自然很多。5. 联调阶段实录从发散到稳定的调参过程5.1 第一跑就发散了定位思路把最小的闭环框架搭好后我第一次跑联合仿真结果非常符合预期地发散了。车速还没到20km/h方向盘转角就开始来回猛打车辆轨迹扭成麻花。遇到发散先不要急着调PID。我第一个动作是回看前面提到的开环阶跃结果确认五个driver sensors和车辆状态反馈都正常。然后才把注意力放到控制环节上。那次发散的根源最后定位在预瞄距离设置上——车速低的时候预瞄距离设得太远驾驶员模型看到的前方路况和当前状态差距太大纠偏力度过猛形成振荡。调参顺序我后来固定成这样的套路先调横向再调纵向横向里先调预瞄距离再调PID增益纵向里先调死区再调PID增益。一次只动一个参数改完看仿真曲线不要同时动三个否则出了问题根本定位不到是谁引起的。5.2 转向振荡和驾驶不自然的参数调整第二种常见问题是仿真不发散但驾驶行为特别不自然典型症状是方向盘转角频繁换向像是驾驶员在抖舵。这种情况我会优先检查传感器信号的噪声和量化问题。CarSim输出信号本身比较干净但如果Simulink侧做了滤波滤波器的相位延迟可能让驾驶员模型看到的信号滞后于真实状态导致控制器总是晚半拍纠偏结果就是来回修正。解决方式是减少滤波阶数或者适当降低控制增益。另一个调参经验是增益的优先级大于滤波。很多时候觉得信号脏就去滤波其实是增益太高导致的高频振荡被误判成信号噪声。先把比例增益降下来看高频分量是否消失再考虑滤波。5.3 仿真步长和效率问题闭环联调还有一个绕不开的问题仿真速度。C-Class模型加driver model闭环之后每个仿真步长的计算量明显增大跑一个几十秒的工况可能要等好几分钟。我的经验是不要全程用同一个步长。调试阶段用0.001秒的固定步长跑保证稳定确认算法没问题之后可以尝试放宽到0.002秒但一定要对比两者输出曲线的差异确认没有明显失真再正式使用。如果实在需要长时程仿真还有一个技巧把那些不参与控制回路的信号从CarSim输出配置里暂时移除减少S-Function的数据交换量。等需要查看结果时再加回来仿真速度会有可感知的提升。5.4 几个容易忽略但关键时刻救命的设置最后分享几个我在联调中被救过命的设置项篇幅不长但每一条都是拿时间换来的。CarSim S-Function模块的初始化方式每次修改CarSim参数后在Simulink里要把S-Function重新初始化CtrlD更新模型否则加载的还是旧参数。求解器类型Simulink里求解器选择固定步长离散求解器如ode4或ode5不要用连续变步长否则和CarSim的数据交换时间点对不齐。档位和离合器信号在起步工况的特殊性做手动挡仿真时起步阶段离合器的滑摩过程对车辆纵向冲击影响极大如果只控油门不管离合器车辆会猛蹿一下。简化处理时可以让离合器按固定速率释放但要想模拟真实起步离合器信号必须纳入控制逻辑。输出变量的单位统一做闭环控制前把CarSim输出的所有车速、角度、压力信号统一换算成一套单位制我推荐全部换成m/s、rad、Pa调PID参数时会轻松一个量级。说回到这次的学习笔记我最大的体会是driver model仿真本身不难难的是从开环能跑到闭环跑稳这一步的转变。5个driver sensors看起来只是五个信号但把它们正确地接进Simulink、理解每个信号背后的物理含义、再让控制逻辑对这些信号做出合理响应这个过程把车辆动力学和控制系统真正串在了一起。下一步我打算把预瞄-跟随框架换成更接近真实驾驶员行为的最优预瞄模型再引入转向手感反馈那时候driver sensors里的横向力类信号就得派上更大的用场了。
返回列表