Carsim/Trucksim 中 60 度斜列车位自动泊车场景建模全流程 最近被问得最多的一类仿真问题居然不是高速场景而是低速泊车怎么在 Carsim/Trucksim 里做一个 60 度停车位的自动泊车场景。听上去只是把车位线旋转一个角度可真做起来会牵出坐标系、车辆模型、外部控制、传感器接入、路径规划、评价指标一大堆事。搞过几年车辆仿真的人应该都有这种感觉越简单的场景越考验对工具链的理解。这篇文章把我在类似项目上的做法整理出来围绕“60 度斜列车位”这个特定场景讲清楚 Carsim/Trucksim 中自动泊车场景建模的完整链路从车位几何定义到车辆与道路参数再到外部闭环和常见坑。适合正在做自动泊车功能开发、ADAS 仿真测试或者刚接手 Carsim/Trucksim 和自动化测试平台的人参考。1. 为什么是 60 度先想清楚这个“场景”到底要回答什么问题1.1 车位角度矩阵自动泊车测试不能只测 90 度停车位按标线方向和通道的关系大致分成三类平行车位、垂直车位、斜列车位。斜列车位里最常见的角度是 30 度、45 度、60 度其中 60 度是一个很典型的设计值。很多地下车库和地面停车场会采用 60 度斜列因为它在通道宽度和停车密度之间取了一个折中比垂直车位需要的通道宽度小比平行车位好进出车辆基本沿单向流线行驶不用频繁掉头。做自动泊车功能开发的人如果只搭 90 度垂直车位场景很容易漏掉一个关键问题车辆在 60 度车位里的目标航向角不是 0 度也不是 90 度而是一个斜角。路径规划、车辆控制、传感器视场角、后视镜视野、车内提示界面全都和这个斜角相关。所以一个完整的场景库至少应该覆盖 0 度、45 度、60 度、90 度这几类车位并且每个角度还要区分车头进入、车尾进入、左右两侧等不同子工况。在 Carsim/Trucksim 里搭 60 度车位本质上不是在“画一条斜线”而是要把这个车位变成一个可参数化、可重复、可自动生成的仿真场景。角度、车位长宽、通道宽度、起始位置、障碍物位置都应该是外部输入而不是人工在界面上拖出来的。1.2 Carsim/Trucksim 在整个仿真链条里的位置先说清楚 Carsim/Trucksim 能干什么、不能干什么。Carsim/Trucksim 的核心优势是车辆动力学仿真。它能把整车质量、轴距、轮距、转向系统、悬架、轮胎、制动、驱动、挡位这些因素建模出来响应外部给的方向盘转角、油门、刹车、挡位指令。低速泊车工况下车辆转向系统的响应、轮胎非线性、怠速蠕行、倒挡传动比这些细节恰恰是很多简单运动学模型给不了的。但自动泊车系统不是只有车辆动力学。完整的自动泊车链路包括环境感知、车位识别、路径规划、路径跟踪控制、执行器响应、人机交互。Carsim/Trucksim 对车位线、障碍物、摄像头图像、超声波雷达回波的模拟能力很弱。你可以在里面定义道路、摩擦系数、一些静态目标物但如果要做感知算法验证Carsim/Trucksim 不是最合适的工具需要外部场景软件配合或者在规划控制级用“真值车位参数”直接把车位喂给算法。所以在场景建模之前先要明确你建这个场景是为了测哪一层。是只测车辆执行层的跟踪精度还是测路径规划算法能不能在 60 度车位上规划出可行轨迹还是测从车位识别到泊入的完整功能。这三个目标的建模深度完全不同。1.3 建模目标拆分避免一上来就做重我给项目搭场景时习惯先用一张表把需求分层。这个习惯帮我省了不少无用功。验证目标需要仿真的内容Carsim/Trucksim 负责什么外部需要做什么路径跟踪控制器给定一条参考轨迹车辆能不能跟上车辆动力学、转向/制动/挡位响应轨迹生成、跟踪控制器路径规划算法在车位和通道约束下规划出轨迹车辆几何、最小转弯半径、碰撞边界车位参数、障碍物边界、规划器完整自动泊车功能车位识别到泊入完成车辆状态真值、车身信号传感器仿真、车位识别、规划、控制如果只想快速验证规划算法完全可以让 Carsim/Trucksim 输出车辆状态真值在外部用 Python 或 Simulink 实现规划控制车位边界用一组坐标点写死。如果要做感知融合再把摄像头和超声波模型加到外部环境里。这样分层Carsim 里的场景建模负担会小很多也更容易定位问题出在规划、控制还是车辆模型上。2. 60 度停车位场景建模的第一步坐标系、车位几何和道路结构2.1 走一遍 60 度车位的数学定义无论用哪种工具车位最终都要变成数字。我会定义一个全局坐标系以停车场通道中心线为 X 轴垂直于通道方向为 Y 轴坐标原点选在通道一端。假设车位朝向与 X 轴夹角为 θ那么 60 度斜列车位的 θ 一般取 60 度或 -60 度取决于车辆从通道哪个方向驶入。设车位入口中心点为 P0(x0, y0)车位深度方向单位向量 u(cosθ, sinθ)指向车位内部车位入口宽度方向单位向量 v(-sinθ, cosθ)与 u 垂直。如果车位宽度为 W深度为 L那么四个角点可以这样写入口左点P0 v·(W/2)入口右点P0 - v·(W/2)库底左点P0 v·(W/2) u·L库底右点P0 - v·(W/2) u·L举个例子假设 θ60 度P0(30, 10)W2.4 米L5.5 米那么车位的六个关键点都可以直接算出来。这个计算看起来简单但它是后面所有工作的地基。Carsim 里的道路坐标、外部规划器的输入、传感器输出的车位参数都要统一到这一套几何定义上。还要注意车辆泊入后的目标航向角不是 0 度而是 θ 方向的车位朝内角度。也就是说控制器最终要把车辆姿态从初始航向 0 度调整到航向 60 度并且车辆中心要落在车位入口中线的延长方向上。2.2 从几何到 Carsim 的道路建模Carsim 的道路建模思路和普通高精地图不太一样。它更擅长描述道路中心线、车道宽度、路拱、坡度、摩擦系数这些路面属性而不是把每一根车位标线都精确画出来。在 Carsim 里建一条模拟停车场通道的路面很简单定义一段直路设好车道数、宽度、摩擦系数再在通道中段指定一个区域作为泊车区。但要把 60 度车位标线在 Carsim 的动画界面里真实显示出来通常得借助外部三维模型或路面贴图。我的经验是如果只做规划控制和动力学验证不需要纠结标线是否可视化。算法拿到的车位参数是边界坐标不是图像里的线。你只要保证车位边界坐标和 Carsim 道路空间是同一个坐标系就能跑通闭环。如果你确实需要在仿真画面里看到清晰的车位线可以采用路面纹理贴图的方式把画好车位线的图片贴到路面上。这样画面好看而且不影响车辆动力学仿真。更准确地说Carsim 的碰撞检测能力有限真正的碰撞风险需要在外部路径规划器里用车位边界和车辆轮廓去做几何约束。2.3 Carsim 和 Trucksim 的差异点Trucksim 和 Carsim 在场景建模流程上基本一致但有一个核心差别车辆的几何尺寸和运动学特性完全不同。卡车轴距长、后悬长低速转向时内轮差比乘用车大得多。如果是半挂车还要考虑牵引车和挂车的铰接角这时候车辆的目标姿态不能只看车头还要看挂车最终是否完全进入车位。我在 Trucksim 里做类似场景时会把参考点选成挂车后轴中心或挂车车尾中心而不是牵引车后轴中心。因为自动泊车最终关心的是整个车组是否停在车位里牵引车到位了挂车可能还歪着。这个细节在 60 度斜列车位里特别明显角度越斜挂车尾部扫过的半径越大路径规划阶段必须预留更多空间。建议先用单车验证 60 度泊车逻辑再切换到 Trucksim 加挂车模型。直接上挂车会导致问题排查困难因为很难分清是路径规划问题还是车辆模型配置问题。3. Carsim/Trucksim 中自动泊车场景的落地从车辆模型到闭环控制3.1 车辆模型与低速泊车工况配置打开 Carsim/Trucksim 后第一步是选择车辆模型。我一般会用内置的乘用车模型或卡车模型然后关掉和泊车无关的子系统空气动力学、复杂热管理、高清发动机模型这些在低速泊车场景里基本不参与。保留的对象包括转向系统、制动系统、驱动系统、轮胎、悬架和挡位传动。低速泊车有几个需要注意的工况点。第一车速通常控制在 2 到 5 km/h对应约 0.6 到 1.4 m/s。在这个速度区间轮胎侧偏角很小但转向系统的摩擦和回正力矩依然明显Carsim 里的转向模型需要设置合理的转向阻尼和摩擦。第二倒挡不能靠内置驾驶员模型随便给最好由外部控制接口直接给定挡位否则车辆响应和实车不一致。第三路面摩擦系数要结合实际停车场设定。地下车库经常是环氧地坪雨天摩擦系数可能只有 0.3 左右而普通沥青路面在 0.8 以上。这些参数会直接影响低速制动和转向极限。3.2 外部控制接口与闭环时序自动泊车场景要跑起来Carsim/Trucksim 不能只在自带驾驶员模型下跑一定要让外部算法参与控制。常用的接入方式有两种一种是 Simulink 联合仿真在 Simulink 里写规划控制算法Carsim 作为被控对象另一种是把 Carsim 模型编译成动态库用 Python 或 C 程序调用适合批量自动化测试。控制周期建议分开。Carsim 的动力学求解步长一般设置成 0.5 毫秒或 1 毫秒这决定车辆状态更新的精度。路径规划不需要那么快常见是 20 到 50 毫秒一个周期路径跟踪控制通常 5 到 10 毫秒一个周期。Carsim 和外部算法之间通过变量接口交换数据输入变量一般是方向盘转角、节气门、制动压力、挡位输出变量一般是全局坐标 X、Y、Z、航向角、横摆角速度、纵向速度、侧向速度、前轮转角、挡位状态等。这里我踩过一个坑最初把 Carsim 的输出放在控制周期里直接用结果前轮转角反馈有延迟低速下控制器容易震荡。后来我把反馈信号做了低通滤波并且让控制器的更新时刻和 Carsim 的数据时间戳对齐问题才解决。3.3 传感器输入从哪里来如果你做的是规划控制级验证传感器的“输入”其实就是一段真值车位参数。可以预先算好 60 度车位的入口中心点、宽度、深度、朝向角写进一个配置文件。外部规划器在每次循环里读取车辆当前位姿结合车位参数生成路径。这种方式的好处是快问题定位清晰适合做算法初版和回归测试。如果你要验证感知融合那就不能在 Carsim 内部处理了。Carsim/Trucksim 提供的是车辆位姿和运动状态真值外部传感器仿真模块基于这个真值仿真超声波雷达的测距、摄像头图像、车位识别输出。也就是说Carsim 是“被控车辆世界”传感器模型是在它外面的另一层。这样分工之后Carsim 的职责很干净不会因为加了大量传感器模型而拖慢动力学仿真。3.4 场景运行、数据采集与回放场景跑完之后数据采集很重要。我通常会在 Carsim 里配置一组输出变量包括时间、全局坐标、航向角、后轴中心速度、前轮转角、方向盘转角、制动压力、挡位、横摆角速度。采样率至少 50 到 100 Hz泊车过程一般不到 30 秒数据量并不大。回放的时候除了看 Carsim 自带动画我还会把车辆轨迹在外部画出来叠加车位角点和通道边界。这样能很清楚看到路径规划和跟踪控制器到底是在哪个环节偏离的。Carsim 的动画适合看车辆动态姿态外部绘图适合做几何误差分析两者互补。4. 让 60 度泊车真正“自动”路径规划、低速控制和验收指标4.1 适合工程落地的几何路径规划方案在 60 度斜列车位场景里常用的路径规划方法之一是圆弧-直线-圆弧。这种方案不追求数学上的最优但工程实现简单、结果稳定适合超声波雷达这种低成本的泊车系统。车辆低速场景下可以先假设车辆遵循阿克曼转向几何忽略轮胎侧偏。最小转弯半径可以用这个公式估算R L / tan(δ)其中 L 是轴距δ 是前轮平均转角。比如一辆轴距 2.75 米、最大前轮转角 33 度的乘用车R 大约在 4.2 米左右。实际规划时不会顶着极限半径用会加一个安全系数取 4.5 到 5.5 米。规划过程大致是这样的车辆初始位置在通道中初始航向和通道方向一致目标位置在车位内部目标航向 60 度。第一步先让车辆沿圆弧从起始点转到某个中间点第二步直线或者反向圆弧调整航向第三步再沿圆弧进入车位最后直线微调。中间点的选择要满足两个约束一是所有圆弧的曲率半径大于最小转弯半径二是车辆轮廓在整个过程中不碰车位角点。60 度车位相比 90 度车位的优势是进入角更缓和规划出的路径通常不需要原地大幅度调整。但如果起始位置离库口太近、通道宽度不足一次倒车入位也会失败。这时候可以在规划器里加入“调整次数”的概念实际上就是分多段执行规划而不是一次性从起点到终点。4.2 低速跟踪控制器怎么调路径规划完之后Carsim/Trucksim 里的车辆要能跟上这条参考路径。低速泊车最常用也最好调的方案是纯跟踪加一个航向 PID。纯跟踪的速度取决于前视距离这个参数对低速场景很敏感。前视距离太小转向会很激进前视距离太大车辆会切弯太晚。我建议在泊车场景中把前视距离控制在 0.5 到 1.0 米并且根据当前车速做线性缩放。航向修正优先级要高于速度控制。最后一段进入车位时车辆不应该还以较快车速冲向库底。更合理的做法是在距离目标点还有 1 到 1.5 米时把纵向速度降到一个很低的值比如 0.2 到 0.3 m/s同时让航向控制器慢慢把误差收敛到 0 度。停车完成后再接一个自动驻车或电子手刹动作这是功能一部分也直接影响评价指标。对于卡车或者半挂车纯跟踪不能直接套用。牵引车和挂车之间的铰接角会给跟踪控制带来额外相位延迟最好在控制器里加入挂车角度反馈或者使用针对挂车运动学的专用跟踪算法。否则仿真里看着牵引车在转挂车却迟迟不跟过来控制效果会滞后一拍。4.3 评价指标怎么定才不虚一个自动泊车场景能不能用最终要看评价指标。我在项目中会记录以下几项泊车成功率、横向误差、纵向误差、航向误差、泊车时间、调整次数、最小离障碍物间隙、碰撞风险。只报一个“成功率”是不够的后几项才能反映算法质量和执行稳定性。指标建议统计方式参考阈值横向误差停车后车辆中心与车位中心线横向距离≤ 0.05 米纵向误差停车后车辆基准点与库底距离偏差≤ 0.10 米航向误差车辆轴线与车位轴线夹角≤ 1 度调整次数泊车过程中挡位切换次数≤ 2 次最小间隙车辆轮廓与车位边界最小距离≥ 0.30 米泊车时间从开始泊入到停车完成≤ 30 秒我还建议做参数化扫描。把 60 度做为基准然后让角度在 45 到 75 度之间变化车位宽度在 2.3 到 2.5 米之间变化车辆初始位置加入随机扰动批量跑几十组回归场景。这样能暴露出很多单场景看不到的问题比如有些角度下路径规划余量不足或者某个起始位置范围外的转向不够。5. 避坑清单实际项目中遇到的高频问题与排查方法5.1 Carsim 里“画不出”标准的 60 度车位标线第一次做这个场景的人很容易卡在画线上。Carsim 自带道路工具对直道、弯道、坡度支持得不错但对斜列车位标线的支持很有限。我尝试过在路面贴图里做标线、用外部三维模型导入、甚至用多个小障碍物拼出车位边界效果各有优劣。如果只是做规划控制和动力学仿真我建议不要在这上面花太多时间。把车位边界坐标写在一个外部配置文件里Carsim 里只用简单路面。算法读到车位参数后就能规划完全不影响功能验证。等到需要做视觉感知、需要摄像头图像里有真实标线时再接外部渲染工具没必要在 Carsim 内部死磕。5.2 低速下车辆抖动、控制发散低速泊车的时候车辆速度低轮胎力小制动和油门切换频繁控制输入稍有毛刺就很容易抖。我遇到过一次很典型的抖动控制器输出的转向角变化很平滑但到了 Carsim 里前轮转角反馈有高频噪声再送回控制器形成正反馈横摆角速度开始震荡。排查后确认是两个原因叠加一是 Carsim 的转向模型对高频输入敏感二是控制器没有对反馈信号做滤波。解决办法是给前轮转角反馈和控制输出都加一阶低通滤波把 Carsim 步长从 1 毫秒降到 0.5 毫秒。另外一个经验是油门和制动不要同时给低速时优先用制动控制车速油门只用来维持蠕行否则车辆会在 0 附近来回蹿。5.3 传感器真值坐标和车辆坐标搞混自动泊车仿真相较于高速场景更依赖相对位置关系。超声波雷达测的是车辆到车位边界和障碍物的距离摄像头识别出的是车位入口点相对于车身的位置。这些量最终都要换算到同一套坐标系里。我在项目里吃过一次亏外部传感器仿真使用的坐标系原点是车辆后轴中心但规划器内部一直默认使用车辆几何中心结果小车位场景里总是偏向一侧。后来把所有坐标统一成车辆坐标系并且明确规定“原点在后轴中心、X 轴朝前、Y 轴朝左”问题马上消失。不要小看这种约定场景越复杂坐标系混乱造成的隐性误差越难查。5.4 仿真表现太好实车表现太差还有一个很常见的困惑Carsim 里 60 度泊车跑得很顺怎么一上实车就各种偏原因往往在车辆模型没有标定到实车转向响应。Carsim 默认转向模型的响应速度通常比实际 EPS 系统快实车方向盘从中间位置转到一定角度时有助力曲线、转向柱扭杆柔性和系统延迟仿真里如果不加这些东西就相当于用了一个“完美转向系统”在做测试。解决办法是在 Carsim 转向模型里加入转向摩擦、转向阻尼、扭杆刚度并且用实车方向盘角阶跃响应数据去标定模型参数。低速泊车对转向响应非常敏感这一项标好了仿真结果和实车的接近程度会明显提升。最后说一点个人体会60 度斜列车位看着只是 90 度车位转了个角度但真正做下来你会发现难点几乎都集中在场景定义和系统协同上。坐标系协议、车位几何参数、控制周期、传感器接入方式这些地基一旦定错后面所有仿真结果都是空中楼阁。如果你刚上手 Carsim/Trucksim 的自动泊车场景建议先把第 2 章的车位数学定义和第 3 章的外部闭环搭通再去调路径规划和控制设备齐全以后再把角度从 60 度扩成一个参数化扫描集你会发现这个场景能做出来的测试价值远比想象中高。