尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

强化学习与控制理论:同源异流,如何工程结合?

强化学习与控制理论:同源异流,如何工程结合? 很多人第一次接触强化学习Reinforcement LearningRL时脑子里冒出的第一个问题不是“Q-learning 怎么更新”而是“这东西和自动控制到底什么关系”控制工程师会问我已经有 PID、MPC、LQR 了调得好好的为什么还要搞强化学习算法工程师会反问控制理论那一套数学模型太严格了真实环境根本建不出来RL 不建模不也能学这两种提问方式恰恰暴露了当前 AI 与自动化两个领域之间最深的割裂RL 和控制理论研究的其实是同一类问题但各自用了完全不同的话语体系、数学工具和评估标准。这篇文章我想做的就是把这个割裂讲清楚。我们不是简单地把“RL 属于机器学习控制属于自动化”这种话重复一遍而是从底层原理出发看看贝尔曼方程和最优控制里的哈密顿-雅可比-贝尔曼HJB方程如何同源看看策略迭代、值迭代和动态规划之间存在怎样的对应再看看从控制理论视角理解 RL能帮我们避开哪些训练陷阱。读完后你应该能回答三个问题RL 和最优控制的边界到底在哪里谁更通用。控制理论里的稳定性、鲁棒性概念为什么对 RL 训练有实实在在的指导价值。如果我想把 RL 用在一个真实控制任务比如机器人、无人机、运动控制上第一步该怎么设计最容易死在哪里。1. 这篇文章真正要解决的问题先说一个我在社区里经常看到的现象。很多人上手 RL 时习惯于把问题抽象成一个 Gym 环境定好状态和动作调一下奖励函数然后丢给 PPO 去跑。跑出来效果好就说“RL 很强大”跑不出来就怀疑是“奖励没有设计好”或者“超参数没调对”。但控制工程师看到这套流程会觉得非常危险。因为他们知道一个反馈控制系统能不能稳定工作不只是“目标函数设得好不好”的问题还涉及系统可控性、可观性、采样周期、执行器饱和、时延、扰动抑制、稳态误差……这些东西RL 社区里很少有人系统性地去讨论。反过来RL 研究者看控制理论也会觉得头疼。LQR 虽然解析解漂亮但需要精确的线性模型MPC 能处理约束但每一时刻都要在线求解优化问题自适应控制能应对参数不确定性但前提是对象结构已知。真实场景中很多系统的物理模型根本写不出来或者写出模型后参数误差大到无法使用。于是两个群体经常相互否定。但我认为更准确的判断是强化学习和控制理论不是两套对立的方法而是同一个“闭环决策问题”在“模型是否已知”和“环境是否简单”两个维度上的不同解法。当模型已知、维度不高、约束清晰时控制理论几乎总是更优选择。它有稳定性保证、实时性强、可解释性好。当模型未知、环境复杂、无法手工建模时RL 可能是唯一可行的路径。它用数据代替微分方程用策略网络代替显式控制器。最理想的做法是把两者结合用控制理论保证底层的安全与稳定用 RL 处理上层的高层决策和模型偏差。这篇文章适合三类读者正在学习 RL但感到算法像黑盒想从底层理解“为什么 RL 能学习控制策略”的人。有控制理论基础想了解 RL 和自己知识体系之间联系的控制工程师。打算把 RL 落地到真实机器人或工业系统但担心训练发散、奖励难设计、安全无法保证的工程人员。2. 核心概念与术语对照RL 与控制理论说的是同一件事吗如果你分别打开一本强化学习教材和一本最优控制教材你会发现两者的章节结构几乎可以一一对应只是名词不同。先看最基础的框架。强化学习术语控制理论术语含义智能体Agent控制器Controller做决策的主体环境Environment被控对象/过程Plant被控制的外部系统状态 (s)状态 (x)系统当前的情况动作 (a)控制输入 (u)施加给系统的信号奖励函数 (r(s,a))代价函数/目标函数 (J)对决策好坏的评价策略 (\pi(a|s))控制律 (u K(x))从状态到动作的映射折扣因子 (\gamma)折扣/时间偏好未来收益的权重价值函数 (V(s))值函数/最优值函数从当前状态出发的期望收益回报Return累积代价一段时间的总收益探索Exploration激励信号/扰动输入试探未知信息这个表格值得多看几遍。很多人学 RL 时以为自己在学“机器学习的一个分支”但实际上RL 的核心数学结构和最优控制几乎同构。为什么这么说我们看最优控制里最经典的有限时域问题给定系统动态[ x_{k1} f(x_k, u_k) ]选择一个控制序列 (u_0, u_1, \dots, u_{T-1})最小化累积代价[ J \sum_{k0}^{T-1} g(x_k, u_k) \phi(x_T) ]而在强化学习中我们最大化累积折扣奖励[ G_t \sum_{k0}^{\infty} \gamma^k r_{tk1} ]如果把奖励 (r) 看成负的代价 (g)把折扣因子 (\gamma) 看成对远期收益的衰减这两个问题本质上都在解决同一件事在动态系统上做序列决策优化某个长期目标。真正导致两者分道扬镳的核心不是目标函数的形式而是对环境动态 (f) 的假设。最优控制假设 (f) 已知或者至少已知结构。这样可以用解析方法、数值优化方法求解。强化学习假设 (f) 未知只能通过与环境的交互获得样本用数据估计最优策略。这就是 RL 被称为“无模型”时的真正含义——不是说系统不存在模型而是决策者不假设自己知道模型。3. 从控制理论视角看 RL贝尔曼方程与动态规划其实是同一套东西如果你学过最优控制一定会记得贝尔曼最优性原理Bellmans Principle of Optimality一个最优策略的子策略对于从中间状态出发的子问题也一定是最优的。基于这个原理可以写出离散时间最优控制的动态规划递归式[ V_k(x_k) \min_{u_k} \left[ g(x_k, u_k) V_{k1}(x_{k1}) \right] ]而在强化学习中我们写的是贝尔曼最优方程[ V^(s) \max_a \left[ r(s,a) \gamma V^(s) \right] ]两个式子放在一起你就能明白为什么我说它们是同一套思想当前状态的价值等于当前收益加上未来状态价值的折现然后对动作取最优。连续时间下的对应关系同样清晰。最优控制中有 HJB 方程[ 0 \min_u \left[ g(x,u) \nabla_x V(x) \cdot f(x,u) \right] ]强化学习社区里很多人没有意识到值迭代算法在连续状态空间下的极限形式就是在求解 HJB 方程。策略迭代算法对应的则是策略评估加策略改进的交替过程和最优控制里的策略迭代方法如出一辙。这意味着什么如果你熟练掌握动态规划你其实已经掌握了 RL 的骨架。RL 算法社区里那些看似新颖的改进很多都是在动态规划框架上换一种“近似”方式值迭代 函数近似 DQN 家族算法。策略迭代 函数近似 Actor-Critic 算法。策略评估 蒙特卡洛采样 无模型预测。策略改进 梯度上升 策略梯度算法。理解这个关系非常重要因为当你训练 RL 时遇到“值函数发散”或“策略振荡”的问题本质上是在近似求解一个动态规划问题时引入了函数近似误差而不是什么神秘魔法。从控制理论角度这给 RL 研究者一个很好的提醒不要只在算法层面打补丁要回到底层去看问题的结构。值函数为什么发散因为贝尔曼算子是压缩映射收敛性有保证但当你用神经网络近似 (V) 时这个压缩性质在函数空间中未必保持。于是你需要目标网络、经验回放这些工程技巧来让近似过程更稳定。反过来控制工程师看到 RL 的探索机制也会觉得很眼熟。RL 中的探索Exploration实际上是在系统上施加激励信号目的是收集数据来辨识系统。这和系统辨识理论里的“持续激励条件”persistent excitation是同一个概念输入信号必须足够丰富才能激发系统所有模式才能学到可靠的模型或策略。4. 从 RL 视角看控制无模型方法真正改变了什么前面的讨论容易让人产生一个误解既然 RL 和最优控制这么像是不是 RL 只是最优控制的一个退化版本不是。RL 真正改变的东西是切断了“先建模、后设计”的线性流程。传统控制的设计流程是先建立被控对象的数学模型然后用模型分析稳定性、可控性最后设计控制器。这个流程的优点是理论成熟、可证明、可验证缺点是建模这一步往往需要大量专业知识和实验成本而且模型一旦不准确后续所有设计都可能失效。无模型 RL 则采用了一条完全不同的路径直接通过闭环交互数据学习控制器不显式建模。它背后的假设是只要我能收集足够的“状态-动作-奖励”样本最优化过程本身可以隐含地捕捉系统的动态特性。这种思路在控制系统非常复杂、无法解析建模时尤其有吸引力机器人足式运动地面接触、柔性关节、摩擦特性都非常复杂手工建模困难。游戏和仿真环境状态空间巨大但可以用模拟器批量采样。推荐系统/广告竞价所谓“环境”本身就是用户行为根本无法写出微分方程。能源/电力调度包含大量非线性、随机性和约束精确模型难以维护。所以正确的新视角是RL 不是要取代控制理论而是把控制理论的应用边界从“模型可知”扩展到了“模型未知但可交互”。与此同时RL 社区也正在从控制理论中吸取养分来解决自身最头疼的问题。第一个是稳定性。RL 训练出来的策略一个常见问题是“看起来在训练集上表现很好但换一个初始状态或一个扰动就完全崩溃”。这正是控制理论里鲁棒稳定性的问题。近年来出现的 Lyapunov-based RL、控制屏障函数Control Barrier Function与 RL 结合的方法本质就是把“策略必须让系统渐近稳定”这条约束直接加入训练过程。第二个是采样效率。无模型 RL 是出了名的“数据饥渴”。控制理论的视角会提醒你如果系统动态结构部分已知为什么要全部用数据去学于是出现了“基于模型的 RL”MBRL和“混合控制学习”方法用已知物理规律建模已知部分用神经网络学习未知残差再用 MPC 做底层控制。这种方案在实际机器人项目中已经展现出远优于纯无模型 RL 的样本效率。第三个是安全约束。最优控制里的约束 MPC 天然处理好状态和输入约束RL 原生优化的是无约束奖励。但现实系统几乎都有执行器饱和、状态禁区、安全距离等限制。把 RL 与控制理论结合常见的做法是分层架构上层 RL 输出参考轨迹底层安全控制器CBF/MPC确保约束不被突破。可以说控制理论和 RL 的结合正在从“互相嫌弃”走向“互相借用工具”。这可能是当前这个领域最有价值的方向之一。5. 一个最小实例用与 LQR 相同的代价函数做 Q-learning讲了这么多理论联系还是需要一个能验证理解的实例。这里我们选一个足够简单的环境一维线性系统加二次代价。传统上这类问题用 LQR 可以解析求解。我们故意不用 LQR 解析解而是用 Q-learning 数值逼近然后对比两者得到的控制器效果。这个对比能直观展示 RL 与最优控制在“同一问题”上的差异。5.1 问题设定考虑离散线性系统[ x_{k1} a x_k b u_k w_k ]其中 (a1.0)(b0.5)(w_k) 是均值为零、方差很小的噪声。代价函数采用二次型[ J \sum_k (q x_k^2 r u_k^2) ]取 (q1.0)(r0.1)。这是一个标准的一维 LQR 问题最优反馈增益可以通过求解 Riccati 方程得到。5.2 文件结构我们先建立如下文件结构rl_control_demo/ ├── lqr_q_learning.py ├── compare_controller.py └── README.md5.3 离散 LQR 解析解对照基准文件lqr_q_learning.py# 文件路径rl_control_demo/lqr_q_learning.py import numpy as np def lqr_gain(a, b, q, r): 离散时间一维 LQR 最优反馈增益 x_{k1} a*x_k b*u_k J sum(q*x^2 r*u^2) 返回 u -K*x 中的 K p q for _ in range(1000): # 代数 Riccati 方程迭代求解一维 p_next q a * a * p - (a * b * p) ** 2 / (r b * b * p) if abs(p_next - p) 1e-12: p p_next break p p_next k (a * b * p) / (r b * b * p) return k if __name__ __main__: a, b, q, r 1.0, 0.5, 1.0, 0.1 K lqr_gain(a, b, q, r) print(fLQR 最优增益 K {K:.4f})运行python lqr_q_learning.py预期输出LQR 最优增益 K 2.7023这个 K 的含义是控制器采取 (u_k -2.7023 x_k) 时代价 (J) 在已知线性模型下是最小的。5.4 Q-learning 数值逼近现在假设我们不知道 (a)、(b)只能通过与系统交互来学习。我们将状态离散化到区间 ([-3, 3])动作离散到集合 ({-3.0, -1.5, 0.0, 1.5, 3.0})。用 Q-learning 逼近最优值函数。# 文件路径rl_control_demo/lqr_q_learning.py (续) import numpy as np # 环境参数 A 1.0 B 0.5 Q 1.0 R 0.1 # 离散状态与动作 STATE_MIN, STATE_MAX -3.0, 3.0 NUM_STATE_BINS 21 state_bins np.linspace(STATE_MIN, STATE_MAX, NUM_STATE_BINS) actions np.array([-3.0, -1.5, 0.0, 1.5, 3.0]) # Q 表初始化 q_table np.zeros((NUM_STATE_BINS, len(actions))) def state_to_index(s): return np.clip(np.digitize(s, state_bins) - 1, 0, NUM_STATE_BINS - 1) def reward(x, u): # 二次代价取负变成奖励 return -(Q * x**2 R * u**2) def step(x, u): noise np.random.normal(0.0, 0.05) x_next A * x B * u noise r reward(x, u) return x_next, r # Q-learning 超参数 alpha 0.1 gamma 0.95 epsilon 0.3 episodes 2000 max_steps 50 for ep in range(episodes): x np.random.uniform(-2.0, 2.0) for t in range(max_steps): s_idx state_to_index(x) if np.random.rand() epsilon: a_idx np.random.randint(len(actions)) else: a_idx np.argmax(q_table[s_idx]) u actions[a_idx] x_next, r step(x, u) s_next_idx state_to_index(x_next) # Q-learning 更新 td_target r gamma * np.max(q_table[s_next_idx]) q_table[s_idx, a_idx] alpha * (td_target - q_table[s_idx, a_idx]) x x_next # 从 Q 表提取策略 def learned_policy(x): s_idx state_to_index(x) return actions[np.argmax(q_table[s_idx])] print(Q-learning 训练完成。) for x_test in [-2.0, -1.0, -0.5, 0.0, 0.5, 1.0, 2.0]: print(fx{x_test:5.2f} - u{learned_policy(x_test):6.2f})运行后你会看到学习到的策略在状态为负时输出正动作、状态为正时输出负动作整体呈现“负反馈”趋势。虽然不是完美线性但已经逼近 LQR 的行为模式。5.5 对比验证闭环响应文件compare_controller.py# 文件路径rl_control_demo/compare_controller.py import numpy as np from lqr_q_learning import lqr_gain, learned_policy, state_to_index, actions, q_table A, B, Q, R 1.0, 0.5, 1.0, 0.1 K lqr_gain(A, B, Q, R) # 模拟闭环从 x2 开始看状态是否快速收敛到 0 def simulate(controller, steps10, x02.0): x x0 traj [x] for _ in range(steps): if controller lqr: u -K * x else: u learned_policy(x) x A * x B * u traj.append(x) return traj lqr_traj simulate(lqr) rl_traj simulate(rl) print(步数 LQR状态 RL状态) for t, (x_lqr, x_rl) in enumerate(zip(lqr_traj, rl_traj)): print(f{t:4d} {x_lqr:8.4f} {x_rl:8.4f})预期结果中LQR 因为是在精确模型上求得的解析最优收敛更快Q-learning 因为离散化误差和训练不充分收敛稍慢但最终也能把状态拉回零点附近。这个差异恰恰说明了 RL 与最优控制的核心区别一个用模型换最优性一个用数据换通用性。判断训练是否成功的标准很简单看闭环轨迹是否单调收敛到 0且没有发散振荡。如果 Q-learning 训练后还出现持续振荡通常原因是状态离散化太粗、动作集合过密或过疏、学习率过高。6. 真实工程中的落地ROS 2 Control 与 RL 的结合方式从玩具例子里得到的结论不能直接搬到真实系统。真实控制系统的实现还面临采样周期、消息通信、安全保护、故障切换等问题。这里以 ROS 2 Control 为例说明 RL 策略如何嵌入一个标准机器人控制系统。ROS 2 Control 是 ROS 2 生态中的一个控制器管理框架负责管理底层控制器、硬件接口和实时控制循环。它的核心是controller_manager可以加载多个 controller每个 controller 通过CommandInterface和StateInterface读写硬件资源。要把 RL 策略放进去通常有两种接入方式。第一种是“代理方式”用 RL 生成控制命令但底层仍然保留安全保护控制器。在 ROS 2 Control 中你可以把 RL 写成一个 controller与其他 controller 同时加载通过state_interfaces获取关节状态通过command_interfaces输出关节力矩或速度指令。这样做的优点是实时性可控因为 RL 推理仍然在 deterministic 的计算图中。下面是一个 controller 配置片段# 文件路径rl_controller_config.yaml controller_manager: ros__parameters: update_rate: 100 # 控制周期 100Hz rl_joint_controller: type: rl_controllers/RLJointController ros__parameters: joints: - joint1 - joint2 state_interfaces: - position - velocity command_interfaces: - effort policy_path: /path/to/policy.pth safety_velocity_limit: 0.5 safety_torque_limit: 5.0 # 如果超出安全限制则切换到 fallback 控制器 enable_safety_fallback: true fallback_controller: effort_controllers/JointGroupEffortController这里关键的设计是enable_safety_fallback。真实系统中RL 策略的输出不应直接作用在硬件上而是经过一个安全层校验。这个安全层可以是简单的速度/力矩限幅也可以是更严格的 CBF 约束。一旦 RL 输出超出安全范围控制器管理节点就切换到备用控制器避免机器人损坏。第二种方式是“高层规划 底层 MPC/PID”。RL 不看原始关节状态而是接收上层目标比如里程计目标、视觉特征输出底层控制器的参考信号。这个分层结构和传统的“规划 跟踪控制”架构完全一致只是把上层规划从规则/优化方法换成了 RL 策略。实际项目中更推荐第二种方式。原因很简单底层动力学控制对实时性和稳定性要求极高无模型 RL 直接输出高频力矩极易在仿真到现实迁移Sim-to-Real时因为模型差异而失败。底层保留 MPC/PID可以确保至少局部稳定RL 负责处理高层决策的不确定性和复杂性这正好发挥它的优势。7. 常见问题与排查思路以下问题是我认为 RL 应用于控制任务时最常遇到的整理成排查表。问题现象可能原因排查方式解决方案训练时奖励一直很低不增长奖励信号过于稀疏智能体无法获得有效学习信号绘制奖励曲线和 td-error 曲线检查是否出现常量区域设计密集奖励或使用奖励塑形但不能过度改变最优策略状态值发散到极大值近似值与贝尔曼迭代不兼容函数逼近误差被放大查看 Q 值曲线是否单调爆炸增加目标网络更新周期降低学习率考虑使用双 Q 网络策略在训练末期出现振荡学习率过高或策略改进步长过大查看策略输出的均值和方差曲线降低学习率增大 batch size引入梯度裁剪仿真里效果好真机上完全不行仿真与真实环境的模型误差、时延、执行器特性差异对比仿真和真机在相同输入下的响应系统辨识校正仿真参数加入随机化先用底层 PID/MPC 兜底RL 只做上层决策控制频率太高RL 推理跟不上神经网络推理耗时超过控制周期统计单次推理耗时减小网络结构使用 TensorRT/AutoML 加速或降低 RL 控制频率并让底层控制器平滑插值出现瞬时冲击力矩动作输出跳变过大记录 action 曲线看是否存在尖峰对动作增量做限幅或在奖励中加入动作变化率惩罚项系统不稳定但奖励没有明显下降奖励函数没有惩罚危险状态观察状态轨迹是否发散增加状态安全边界惩罚或引入安全层强制校正这里的核心排查思路是请先确认你的 RL 问题被正确建模了再谈算法调参。很多“训练失败”并不是 PPO 或 SAC 的问题而是状态表示没有包含足够信息、动作空间定义不合理、奖励函数引导错误。举例来说如果你训练一个机器人站立任务状态只给关节角度不给关节角速度那么马尔可夫性就不满足——智能体无法仅从当前状态判断系统运动趋势训练自然失败。控制工程师一眼就能看出这对应“状态不可观”RL 社区有时却会反复调参而忽略了问题根源。所以在设计 RL 控制系统时先像控制工程师一样检查状态是否包含足够信息来预测系统下一步变化动作空间是否覆盖了实际可执行的控制输入采样周期与控制周期是否匹配奖励函数是否连续、可区分、且不与安全约束冲突是否存在环境时延时延是否已在状态中建模8. 最佳实践与工程建议基于上面的分析我给出几条实际工程中值得固化的建议。8.1 从“已知部分建模未知部分学习”开始不要把问题一股脑丢给无模型 RL。对你的系统做一个结构化分析哪些动态可以用物理方程近似哪些参数不确定哪些动态完全未知正确做法是搭建一个“灰盒”模型已知物理结构写成方程未知残差用神经网络拟合然后基于这个模型做训练和规划。这种思路比纯无模型 RL 样本效率高一个数量级也比纯机理建模更贴近真实系统。8.2 先保证安全性再追求性能真实系统里安全约束是第一条准则。RL 策略在训练过程中会不断试探边界这在仿真环境里无所谓在真实系统上可能导致事故。推荐的分层架构底层PID/MPC 或 CBF保证状态约束和执行器安全。上层RL 策略输出参考值/目标值不直接作用在危险执行器上。监控层实时监控状态是否接近安全边界一旦触发就切换到备份控制。8.3 用控制指标评价 RL 策略而不是只看奖励RL 训练时通常用 reward 作为优化目标但工程验收时应该用控制指标上升时间、超调量、稳态误差、扰动抑制能力、鲁棒性。奖励函数只是中间媒介不是最终目标。因此建议在训练环境中同时记录这些控制指标每 N 个 episode 计算一次并打印。# 示例记录控制指标 def evaluate_control_metrics(controller, env, episodes10): overshoots [] settling_times [] steady_errors [] for _ in range(episodes): obs env.reset() done False peak 0.0 steady_error None while not done: action controller(obs) obs, reward, done, info env.step(action) peak max(peak, abs(obs)) steady_error abs(obs) overshoots.append(max(0.0, peak - env.goal)) settling_times.append(env.t) steady_errors.append(steady_error) return { mean_overshoot: np.mean(overshoots), mean_settling_time: np.mean(settling_times), mean_steady_error: np.mean(steady_errors), }8.4 控制随机种子和评估协议RL 训练随机性很大。实验时固定每个环境的随机种子会影响结果可复现性但更重要的是一套固定的评估协议每次评估用相同初始状态集合、相同扰动模式、相同随机噪声。不要让“碰巧某次训练效果好”成为结论用多随机种子取中位数或均值。8.5 重视延时的建模真实系统中从传感器采集到执行器输出必然存在时延。很多 RL 策略在仿真中表现优异一上真机就振核心原因之一就是仿真没有建模时延。建议在仿真环境中加入固定或随机时延让策略学会对延迟状态做出应对。控制理论中的 Smith 预测器和状态观测器思想在这里非常值得借鉴。9. 总结与后续学习方向这篇文章从头到尾在讲一件事强化学习与控制理论不是两个互不相干的领域而是同一个闭环决策问题在不同假设下的两种解法。从数学结构看动态规划和贝尔曼方程把两者连在了一起从应用场景看模型已知时控制理论更优模型未知时 RL 提供了一条新路径从工程实践看分层结合、安全兜底、灰盒建模是把 RL 落地到真实控制系统的可行方案。如果你想把这条学习路径继续走下去我建议按下面顺序延伸掌握经典最优控制LQR、MPC、动态规划、HJB 方程。这是理解 RL 理论基础的捷径。学习无模型 RL 骨干算法DQN、PPO、SAC、TD3重点关注它们与动态规划的关系。研究基于模型的 RLMBRL理解为什么在控制任务中稍微利用一点模型信息就能极大提升样本效率。关注稳定性与安全性的交叉方向Lyapunov-based RL、控制屏障函数、鲁棒 RL。在仿真环境如 MuJoCo、Isaac Gym中练习再逐步迁移到真实系统。坚持这条路线最大的收获是你不会再被算法名词困住。当你看到一个新发表的 RL 算法时第一反应不是“这又是个新 trick”而是“它改的是策略评估、策略改进还是探索机制它在控制理论里对应的改动是什么”——到这个层面你离真正掌握这个领域就不远了。建议收藏这篇文章碰到实际项目里“奖励不涨”“策略震荡”“仿真到现实失败”这些问题时再回来对照第 7 节的排查表过一遍。
返回列表