
简介面向自动驾驶与智能车辆控制方向的学习者这份资料聚焦Carsim与MATLAB/Simulink联合仿真结合模型预测控制MPC实现汽车沿预设路径点精确跟踪并输出可视化运行视频。内容系统覆盖整车动力学建模、路径规划、控制器设计、闭环接口配置与实时仿真验证适合已有一定Simulink基础、希望进阶学习MPC路径跟踪的车辆工程专业学生或工程师。压缩包共9个文件约119KB结构紧凑。Chap5.mdl与Chap_36.m为Simulink主模型与脚本可对照运行理解MPC控制逻辑func_Model_linearization_Jacobian.m承担模型线性化与雅可比矩阵推导cpar与sim文件配置Carsim车辆工程参数mat文件提供参考轨迹数据README与license便于快速上手。已有179人学习下载。通过研读这套完整工程读者能掌握Carsim与Simulink的数据交互方式、MPC控制器搭建与参数调整技巧学会利用预设路径点实现高精度路径跟踪为自动驾驶路径规划与控制研究提供可复现的实践范例。1. 为什么路径点跟踪项目都在用 CarSim Simulink MPC 这个组合提到“实用 CarSim 进行仿真Simulink 基于 MPC 进行汽车的控制使得汽车按照给定路径点进行运行生成视频”我第一反应是这是一套典型的智能车辆横纵向控制 Demo。手里有一串路径点可能是高精度地图采的也可能是规划算法给的现在要让车在 CarSim 这种高保真动力学软件里贴着这些点走同时把过程录成视频。很多人以为难点在 MPC 算法实际上真正让人翻车的是 CarSim 和 Simulink 的接口、路径点坐标变换以及 MPC 内部预测模型这三者之间微小的不一致。下面按我实际做过的方案把原理、联合仿真环境、MPC 实现、常见坑和视频生成一次讲透。这套流程适合正在做智能车仿真、毕设或入门自动驾驶控制的人。2. 先把原理理顺CarSim 给什么MPC 算什么路径点怎么变成参考误差2.1 CarSim 是“车辆动力学黑匣子”但接口必须双向打通CarSim 的价值在于它不要求你懂轮胎魔术公式、悬架铰接点也不要求你手写整车动力学微分方程而是给你一个经过大量实车标定的高保真车辆模型。它通过 Simulink 的 S-Function 或者内置的 CarSim 车辆模块对外提供输入输出通道你给前轮转角、油门、制动它给你位置、速度、横摆角、横摆角速度、轮速等一系列信号。在 Simulink 里CarSim 只是被控对象控制算法是外面包裹的闭环CarSim 内部求解器自己跑每个控制周期通过接口交换一次数据。这里要特别明确一个原则MPC 实际上不直接“看”绝对位置它只认误差。CarSim 输出的全局 X/Y 坐标是给参考路径模块用的MPC 内部用的是车身坐标系下的横向位置误差、航向误差。所以联合仿真的第一步不是写控制器而是先定义接口变量。常见做法是在 CarSim 中勾选输出通道Vx、Vy、Yaw、YawRate、X、Y输入通道至少要有 Imported_Steer前轮转角、Imported_Throttle油门、Imported_Brake制动。具体变量名随 CarSim 版本略有区别但逻辑一致。比变量名更要紧的是单位CarSim 内部长度用米速度用 m/s 还是 km/h 取决于输出通道配置稍不留神MPC 的增益就会全线偏移。为什么选 CarSim 而不是直接在 Simulink 里搭一个自行车模型因为自行车的横向动力学模型太理想轮胎侧偏刚度、载荷转移、路面附着这些非线性因素被甩掉以后MPC 调得再漂亮放到实车上也会偏。CarSim 把非线性底子补上你只需要在 MPC 内部用一个简化线性模型做预测两者一粗一细正好是工程上常见的“模型失配但可控”格局。配合 Simulink 的 MPC 工具链调参和部署都顺畅。2.2 MPC 模型预测控制预测时域、控制时域、约束和代价函数MPC 每次控制周期做一件四步循环的事基于当前状态用预测模型向前推 N 步在 N 步内求解一个最优控制序列目标函数包含跟踪误差和控制量惩罚同时把控制量、控制增量、输出值限制作为约束写进优化问题解完后只取序列中的第一步施加给被控对象下一周期重新优化。这就是滚动时域优化。预测时域 PredictionHorizon 决定“看多远”控制时域 ControlHorizon 决定“有多少次出手机会”权重矩阵 W 决定“更在意误差小还是转向平顺”。在路径跟踪场景里被控量是前轮转角状态量通常选横向误差 e_y、航向误差 e_psi、横向速度误差和横摆角速度误差。推导状态空间方程时常用一个简化的车辆横向动力学模型把纵向速度 vx 看作已知时变参数。也就是说在每个控制周期根据当前车速在线更新模型矩阵再用线性 MPC 求解这就是工程里常用的 Linear Time-Varying MPC。它比非线性 MPC 好调也比固定模型准确。代价函数通常写成J sum( ||e||²_W_e ||δ||²_W_delta ||Δδ||²_W_rate )其中 W_e、W_delta、W_rate 分别是对误差、控制量幅值、控制量变化率的权重。调 MPC 时很多人上来就调权重其实应该先把预测时域和控制时域定下来采样时间 20ms 时预测时域 20 步对应向前看 0.4 秒这个时间窗口要覆盖车辆的转向响应特性控制时域太小会显得“算计短视”太大会让优化变量变多、计算量变大。一般先取预测时域 p20、控制时域 m2 或 m3再看效果。2.3 路径点跟踪全局路径、投影点与前轮转角的关系给定一串路径点 (x_i, y_i)首先要做的是把它变成连续可求导的参考线。最简单的方法是计算相邻点之间的航向角并累加弧长这样 MPC 就能知道每一步期望的航向和曲率。下面这段 MATLAB 代码我在做这个需求时经常用% 路径点预处理从离散点算参考航向角和弧长 path_x [0 2 4 6 8 10]; % 示例路径点 X 坐标 path_y [0 0.2 0.5 0.8 1.2 1.8]; % 示例路径点 Y 坐标 % 相邻点航向角单位 rad ref_yaw atan2(diff(path_y), diff(path_x)); % 弧长累加后续可按弧长插值 s cumsum([0; hypot(diff(path_x), diff(path_y))]); % 航向角补最后一个点保持长度和路径点一致 ref_yaw [ref_yaw; ref_yaw(end)]; % 用 spline 对 x、y 分别插值让路径更平滑 s_interp linspace(0, s(end), 500); x_interp spline(s, path_x, s_interp); y_interp spline(s, path_y, s_interp);逻辑说明atan2(diff(y), diff(x)) 算的是每个直线段的方向角它是分段常数直接拿给 MPC 当参考会带来不连续的跳变所以最后用 spline 按弧长插值并重新求导得到连续航向。参数说明spline 插值点数量 500 不是固定值要根据路径长度和仿真步长来取保证两个插值点之间的间距不大于车辆一帧走的距离否则在高速工况下会漏掉关键曲率变化。实际运行时控制器不能只看最近路径点往往用预瞄距离 Lp 或者预瞄时间 Tp 去路径上取一个预瞄点让车辆追踪那个点能有效抑制蛇形。这个参数后面在避坑章节还会再提。路径点预处理的输出不只是参考航向还应该包含参考位置和参考曲率MPC 内部如果有前馈项可以直接用曲率算出稳态前轮转角减轻反馈压力。3. 搭好联合仿真环境从 CarSim 车辆模型到 Simulink 控制回路的最小系统3.1 第一步CarSim 车辆模型配置与接口变量定义打开 CarSim 之后在 Main Interface 里新建一个 Simulation运行时选择 Simulink模型类型一般选 Simulink Model。CarSim 会生成一个带有 S-Function 的 .mdl 或 .slx 文件文件名通常是车辆模型名称。这一步有个老坑CarSim 安装时如果没选对 MATLAB 版本生成的模型导入 Simulink 后运行会报 Invalid MEX-file。所以安装 CarSim 前先查版本兼容列表常见做法是 CarSim 版本要跟 MATLAB 主版本匹配不要用太旧的 CarSim 去连新 MATLAB。接着进入 Vehicle 菜单在输入输出通道里把要用的信号加满。下表是常用的通道配置供参考方向信号名含义单位输出Vx纵向车速m/s输出Vy侧向车速m/s输出Yaw横摆角rad输出YawRate横摆角速度rad/s输出X / Y全局坐标m输入Imported_Steer前轮转角rad 或 deg输入Imported_Throttle节气门开度0~1输入Imported_Brake制动主缸压力MPa 或 0~1注意 CarSim 每个版本的单位标注不一定跟表里一致生成模型后到 Simulink 里看 S-Function 的端口顺序和单位不要只依赖 GUI。设置完以后点 Send to SimulinkCarSim 会把一个包含车辆模型 S-Function 的 Simulink 模型生成好这个模型就是你的被控对象。如果生成模型里没有看到输入端口检查一下 CarSim 主界面的 Import 通道是否已经激活很多版本默认只开油门不开转向导致 Simulink 里加不了前轮转角输入。3.2 第二步Simulink 模型结构被控对象、控制器、参考输入联合仿真模型我习惯按四个模块组织参考路径生成模块、误差状态计算模块、MPC 控制器模块、CarSim 车辆模块。CarSim 模块在 Simulink 里长什么样不重要重要的是它的输入输出端口顺序必须和你定义的通道一致。误差状态计算模块是很多人忽略的。CarSim 输出的是全局 X、Y、Yaw、Vx、VyMPC 控制器需要的是横向误差 e_y、航向误差 e_psi 和它们的变化率。所以要在误差计算模块里根据当前车辆位置从参考路径上找最近点或预瞄点计算参考航向 ref_yaw 和参考位置然后用实际值减参考值。这个逻辑我用 MATLAB Function 块实现过很多次核心代码长这样function [ey, epsi] compute_error(x, y, yaw, path_x, path_y, ref_yaw, Lp) % 计算与所有路径点的最近距离 dx path_x - x; dy path_y - y; dist hypot(dx, dy); [~, idx] min(dist); % 从最近点开始沿路径向前累积距离找到预瞄点 s_cum cumsum([0; hypot(diff(path_x), diff(path_y))]); s_now s_cum(idx); s_target s_now Lp; idx_p find(s_cum s_target, 1, last); if isempty(idx_p) || idx_p length(path_x) idx_p length(path_x); end x_ref path_x(idx_p); y_ref path_y(idx_p); yaw_ref ref_yaw(idx_p); % 转换到车身坐标系横向误差 目标点相对车位置在车身横向的分量 dx_car x_ref - x; dy_car y_ref - y; ey dy_car * cos(yaw) - dx_car * sin(yaw); epsi atan2(sin(yaw - yaw_ref), cos(yaw - yaw_ref)); end这段代码的 ey 定义依赖预瞄点和后面 MPC 状态方程里 e_y 的含义必须完全一致。如果你在 MPC 里定义的是“距参考轨迹最近点的横向偏离”那这里用最近点而不是预瞄点如果你用预瞄点就一致用预瞄点。这个一致性决定闭环正负号我有一次因为这里不一致MPC 输出一直在帮倒忙车越跑越偏。3.3 第三步联合仿真步长、求解器与外部模式的参数设置CarSim 内部求解器可以变步长但和 Simulink 联合仿真时一般用固定步长。常见采样时间取 0.001s 或 0.002s 作为 Simulink 基础步长MPC 控制周期设为 0.01~0.02s也就是每 5~10 个基础步长触发一次控制更新。这样做是因为 CarSim 车辆动力学对步长敏感控制频率太高不仅计算量大还会放大转向噪声。在 Simulink 求解器设置中Type 选 Fixed-stepSolver 选 ode4 或 ode5步长填 0.001。CarSim 的 S-Function 会自己处理内部积分所以外部步长不需要特别小。如果跑实时性验证可以在 CarSim 中打开 External Mode让 CarSim 车辆模型作为外部进程跑但这对电脑性能要求高我们做离线仿真和后期视频时通常不开。Simulink 外部模式更适合 HIL 和实车快速原型不是纯离线仿真的必选项。初始化参数我一般放在一个 MATLAB 脚本里方便批量调参% 联合仿真初始化脚本 Ts 0.02; % MPC 控制周期 20ms Tsim 20; % 仿真时长 20s vx_ref 10; % 期望巡航速度 m/s Lp 5; % 预瞄距离单位 m UnitConv_deg2rad pi/180; % 转角单位转换参数说明Ts 决定 MPC 块的采样频率和 Simulink 基础步长是整数倍关系Tsim 只用于 From Workspace 参考信号生成Lp 先用经验值 5m后面按车速和路径曲率调整。注意 CarSim 输入前轮转角如果用的是 deg而 MPC 输出 rad就要在连接处乘 UnitConv_deg2rad 或除这个细节经常让人查半天。仿真时长不是越长越好先跑 5s 验证建模正确性再拉满 20s可以明显缩短排错周期。4. 用 MPC 把路径点压成转向指令Simulink 里的控制器实现4.1 为什么用线性时变 MPC 而不是非线性 MPC非线性 MPC 理论上能把 CarSim 的整车非线性特性建模进预测模型精度更高但代价是每次优化都是非线性规划求解慢、初值敏感、联合仿真时容易卡死。路径跟踪场景最关键的指标是控制周期内能不能算完而不是预测模型有多精致。所以工程上更常用线性时变 MPC预测模型用线性状态空间方程在每个控制周期根据当前车速更新矩阵把非线性当模型失配交给反馈去克服。在 Simulink 里Model Predictive Control Toolbox 的 MPC Controller 块直接支持线性时变模型你只需要在工作区准备好一个 mpc 对象然后在块参数里引用它。如果你熟悉 nlmpc也可以用它做非线性 MPC但调参门槛明显高新手很容易在“预测模型不收敛”和“求解超时”之间反复横跳。我一般先把线性 MPC 跑通再看误差曲线决定有没有必要上非线性 MPC。4.2 在 MATLAB 里用命令行搭建一个 MPC 控制器对象假设 CarSim 输出给你的是车辆横向运动状态MPC 内部用一个小车横向动力学模型。下面这段代码以恒速工况为例建立一个横向误差模型状态选横向位置误差 e_y、横摆角误差 e_psi、横向速度误差和横摆角速度误差输入是前轮转角 delta。% 车辆基本参数可以从 CarSim 车辆参数页读到 m 1573; % 整车质量 kg Iz 2873; % 绕 z 轴转动惯量 kg.m^2 lf 1.15; % 质心到前轴距离 m lr 1.45; % 质心到后轴距离 m Cf 80000; % 前轮侧偏刚度 N/rad Cr 80000; % 后轮侧偏刚度 N/rad vx 10; % 当前纵向车速 m/s % 状态矩阵横向误差 e_y, 航向误差 e_psi, 横向速度误差, 横摆角速度误差 A [0 1 0 0; 0 0 0 1; 0 0 -(CfCr)/(m*vx) -(lf*Cf-lr*Cr)/(m*vx); 0 0 -(lf*Cf-lr*Cr)/(Iz*vx) -(lf^2*Cflr^2*Cr)/(Iz*vx)]; B [0; 0; Cf/m; lf*Cf/Iz]; C eye(4); D zeros(4, 1); plant ss(A, B, C, D); % 创建 MPC 控制器 Ts 0.02; % 控制周期 PredictionHorizon 20; ControlHorizon 2; mpcobj mpc(plant, Ts, PredictionHorizon, ControlHorizon); % 权重设置MV 转角幅值MVRate 转角变化率OV 各状态权重 mpcobj.W struct(MV, 0.1, MVRate, 0.5, OV, [1 1 0.1 0.1]); % 转向约束幅值 ±0.5 rad变化率 ±0.2 rad/s mpcobj.MV struct(Min, -0.5, Max, 0.5, ... RateMin, -0.2, RateMax, 0.2);逻辑说明这个状态空间模型来自经典车辆横向动力学方程把车看作一个刚体轮胎侧偏特性线性化。Ceye(4) 表示所有状态都可测CarSim 输出经过误差计算模块后正好能给出这 4 个状态。mpc 对象默认会在每个采样周期读取 plant 的当前参数如果你在循环里用 setmpcobj 更新 A、B 矩阵就能变成线性时变 MPC。参数说明PredictionHorizon20 在 Ts0.02s 时意味着看 0.4sControlHorizon2 意味着只优化未来两组转角这是横向控制的常见起点。转角约束 ±0.5 rad 大约 28 度覆盖多数中低速工况RateMax 限制转向速率防止 CarSim 里的转向机构跟不上。4.3 在线更新参考路径并通过 Simulink MPC Controller 块接入MPC Controller 块在工作区里引用 mpcobj运行后默认参考输入是常量。但路径跟踪的参考横向误差和航向误差都是 0因为这个误差状态已经包含了参考信息。换句话说参考信号是一条全零向量。真正发生变化的是误差状态计算模块输出的 ey 和 epsi这两个量进入 MPC 块的测量输入。在 Simulink 模型里测量端口接一个信号向量 [ey; epsi; d_ey; d_epsi]参考端口接 4 维全零向量。如果 CarSim 只输出 Vx、Vy、Yaw、YawRate差分出来的横向速度误差和横摆角速度误差可以直接用 YawRate而横向速度误差在恒速大半径工况下可以近似为 0这样能省去一组微分。我习惯保留完整状态让 MPC 的预测模型和白盒一致。路径点在线更新方式有两种。一种是在 Simulink 里用 Signal From Workspace 直接读预先生成好的时间序列参考位置适合固定路径另一种是用 MATLAB Function 块实时根据车辆位置计算预瞄点再把预瞄误差传给 MPC。第二种更接近真实自动驾驶但计算负担在 Simulink 里代码要控制好循环次数别把路径点数组整个遍历太多遍。我的做法是先把路径点按最近点快速定位再只在局部窗口内搜索这样每步只需要几次 hypot 计算。4.4 MPC 权重与预测时域的调参顺序调参顺序比参数本身更重要。我一般是先固定 Ts、PredictionHorizon、ControlHorizon再设约束最后调权重。以下是起点值不是最优值参数起点值调整方向Ts0.02s缩小会提高控制精度但增加计算量PredictionHorizon20增大让轨迹更平稳但响应变慢ControlHorizon2增大提升灵活性但更容易振荡W.MV0.1增大则转角更小跟踪变慢W.MVRate0.5增大则转向更平顺但过大会甩尾W.OV(1)W.OV(2)1增大横向误差和航向误差权重跟踪更紧MV.Min/Max±0.5 rad按实际前轮极限调整MVRate.Min/Max±0.2 rad/s按转向电机速度限制调整调参时先跑一段直线或大半径圆弧看横向误差曲线是否收敛再跑 S 弯看超调和振荡。如果蛇形先加 MVRate 惩罚而不是加 OV 权重因为蛇形多半是控制增量变化太剧烈。如果过大弯道跟不上先减 MVRate 或增大 ControlHorizon同时检查预瞄距离。MPC 是黑匣子但误差曲线不会撒谎它比视频更能说明问题。5. 避坑与排查CarSim Simulink MPC 联合仿真的 6 条血泪经验5.1 CarSim 仿真模型没有输出位置坐标现象CarSim 模块运行正常转向也有响应但 Simulink 里看不到 X、Y 坐标变化路径跟踪模块直接失去参考。原因CarSim 的输出通道里没有勾选全局位置 X、Y或者勾选了但单位选择错误。很多默认车辆模型只输出 Vx、Ay、YawRate不包含绝对位置因为 CarSim 内部有时候只关心车辆自身运动。解决回到 CarSim GUI在 Output Channels 里添加 X、Y并确认输出单位是米而不是千米。生成 Simulink 模型后打开 S-Function 参数看输出端口数量是否变化必要时重新 Send to Simulink。这个坑能让你查一小时但解决起来就是一条勾选。5.2 MPC 控制器初始报错“Plant model mismatch”现象MPC 块在仿真开始时报模型维度不匹配或者状态初值赋值失败。原因MPC 对象里的 plant 输入输出维度和 Simulink 块实际连接的信号线数量不一样。比如 plant 是单输入但你把 MPC 块接到了油门和转角两路信号上或者 plant 是 4 状态但测量信号只有 2 维。解决先用 size(mpcobj) 检查控制器维度再对比 Simulink 模型里的信号线。测量端口需要拼接成列向量绝对不能用多条标量线直接连到同一个端口。用 Mux 或 Vector Concatenate 合成一维信号。初始状态缺省值一般是 0如果 CarSim 里有初始横摆角要把它换算成误差初值并写到块参数 Initial states 里否则开始的几秒控制量会有一个明显跳变。5.3 路径点明明给了车却跑出蛇形现象跟踪直路还行一进弯道就开始左右振荡或是在两个路径点之间明显切弯。原因常见有两个。第一参考路径点太疏插值后航向角不连续MPC 跟踪的是一条带折角的参考线第二预瞄距离 Lp 太小控制器盯着脚下一点转向响应过快。解决先用 spline 对路径点加密保证相邻参考点间距小于 0.1m 或车速乘以控制周期的两倍。再把 Lp 按车速调整经验公式 Lp max(2, vx * 0.5)10m/s 时预瞄距离 5m。如果蛇形还在检查 MPC 的 MVRate 权重是否太小尝试从 0.5 加到 1 或 2。5.4 联合仿真跑得比真实还慢视频录制时卡到怀疑人生现象Simulink 仿真的实时速度远低于 1跑 10 秒仿真要等一分钟录视频时更卡。原因Simulink 基础步长太小MPC 优化在每个控制周期都做导致 CPU 满载。另外一个隐藏原因是 CarSim 的动画输出一直在实时刷新画面拖慢了整个联合仿真。解决离线仿真阶段把 CarSim 动画关掉或把 Data 文件保存为回放模式先跑完把仿真结果写到 .mat 或 .par 文件再离线做动画和视频。Simulink 步长可以先固定到 0.001sMPC 控制周期 0.02s如果 MPC 块计算耗时超过控制周期的一半考虑把预测时域从 20 降到 15。算力不够时关闭 CarSim 的高频输出通道只保留控制器需要的信号。5.5 生成视频画面与误差曲线对不上现象视频里车已经回到路径中心但误差曲线显示还有 0.3m 偏差或者动画里的时间轴和 Simulink 波形时间轴错位。原因CarSim 的动画录制和 Simulink 的 To Workspace 数据记录了不同步长的结果尤其 CarSim 动画按内部积分帧录制Simulink 数据按控制步长记录两边的时间起点还不一致。解决在 CarSim 里设置动画输出步长让它等于 MPC 控制周期 Ts也就是 0.02s。Simulink 侧用相同步长把 XY、时间戳写进数组。生成视频前先画一条“车实际位置 vs 路径点”的俯视轨迹确认首末端时间对齐再做动画。这个步骤是保证视频可信度别省。提示联合仿真里的“玄学”问题十有八九是单位、时间戳和信号维度不一致造成的。这三样排查完再考虑模型失配和调参。6. 最后一步把仿真过程录成视频还能顺手做误差曲线视频生成可以用 CarSim 自带的动画录制也可以在 MATLAB 里用 VideoWriter 重绘轨迹。CarSim 自带动画做出来是 3D 视图适合汇报展示MATLAB 后处理做出来是 2D 俯视轨迹加误差变化适合调试分析。我一般先在后处理脚本里确认表现再回到 CarSim 录 3D 动画。% 用 MATLAB 后处理生成路径跟踪视频 v VideoWriter(path_tracking.avi); v.FrameRate 30; open(v); figure(Color,w); for k 1:10:length(t) clf; plot(path_x, path_y, k--, LineWidth, 1.5); hold on; plot(trace_x(1:k), trace_y(1:k), r-, LineWidth, 1.2); axis equal; grid on; xlabel(X / m); ylabel(Y / m); title(sprintf(t %.2fs, t(k))); frame getframe(gcf); writeVideo(v, frame); end close(v);这段代码从 Simulink 的 To Workspace 里取时间向量 t、实际轨迹 trace_x/trace_y每隔 10 个数据点画一帧。FrameRate30 保证播放流畅step10 是采样抽帧如果 Ts0.02s那么每 0.2s 一个画面适合 20s 的仿真。逻辑说明后处理方式不会因为 CarSim 动画卡顿拖累仿真而且可以随时调整视角和展示内容。参数说明每隔 10 帧取一个画面是保守做法如果你要快速预览可以改成 50。验证跟踪效果不要只靠眼睛看视频。我会在同一个脚本里计算横向误差 RMS 和最大误差一个路径跟踪控制器横向误差 RMS 在 0.1~0.2m 以内算合格0.5m 以上就要回去调 MPC 或预瞄距离。最后用这段脚本生成一个带轨迹和误差曲线的图片和视频一起放到仿真报告里比单发一个视频更能说明问题。我最早做这套东西的时候只顾着录视频误差曲线一团糟好在后来养成“先数据后视频”的习惯。这比任何调参口诀都管用先看横向误差是不是收敛再看视频里车是不是贴线最后再决定要不要继续调。希望帮到你。本文还有配套的精品资源点击获取