简介本资源是经典机器人学教材《机器人建模与控制》Mark W. Spong等著2006年Wiley出版的完整课后习题答案面向高校自动化、机械电子、控制工程等专业本科生及研究生以及从事机器人算法研发与教学的工程师和教师。答案覆盖运动学正/逆解、拉格朗日动力学建模、PID与滑模控制器设计、Lyapunov稳定性分析、传感器建模与轨迹规划等核心习题每道题均含清晰推导过程与关键步骤说明有效辅助理论理解与工程验证。资源为单个PDF文件大小6.46MB排版规范、公式准确可直接打印或分章节查阅。目前已有3113人学习下载是备考复习、课程作业核对与科研建模实践的重要参考材料尤其适合需夯实机器人建模与控制底层原理的学习者。1. 机器人建模与控制一张不能只靠“背公式”通关的知识地图如果你正在啃《机器人建模与控制》Spong et al., 2006却总在习题里反复卡壳——比如推完DH参数发现末端位姿差一个旋转轴、用拉格朗日法列动力学方程时漏掉科氏项、逆运动学解出四组关节角却不知该选哪组、PID调参调到怀疑人生……那不是你数学不行而是这张知识地图没被真正“展开”。这本书不是纯理论汇编而是一套闭环工程思维训练体系从坐标系定义→运动学映射→动力学建模→控制器设计→稳定性验证每一步都必须能反向追溯、正向复现、交叉验证。它面向的不是只想考高分的学生而是未来要调试真实机械臂、写轨迹生成模块、做力控抓取或参与ROS底层开发的实践者。习题答案的价值从来不在“抄对结果”而在于暴露你在哪一环的物理直觉断了、在哪一步的数学工具用错了、在哪一类边界条件被系统性忽略。这份2006年出版却至今被全球多所高校用作研究生核心教材的资源其习题覆盖了刚体变换的几何本质、非线性系统的控制陷阱、以及从纸面模型到实际控制的鸿沟——而这正是多数人复习时最易失焦的“黑匣子区”。2. 运动学建模DH参数不是填空游戏是空间关系的翻译协议2.1 DH参数四步法为什么连Z轴方向都可能设错Denavit-HartenbergDH参数是机器人运动学建模的基石但它的本质不是一套固定表格而是一种坐标系间相对位姿的标准化描述语言。标准DH约定要求第i个连杆坐标系{ i }的Z轴沿第i个关节轴方向X轴垂直于Z_{i−1}和Z_i构成的平面指向使θ_i为正的方向原点O_i位于Z_{i−1}与X_i的交点Y轴由右手定则确定。提示当相邻两关节轴平行时Z_{i−1}与Z_i不相交此时X_i需取Z_{i−1}方向上的任意垂线——这个“任意”恰恰是错误高发区。实践中必须保证所有坐标系构成右手法则且全局一致否则后续齐次变换矩阵会系统性偏移。以PUMA560前三个关节为例典型R-R-R结构DH参数表如下单位m, rad连杆iθ_i (变量)d_ia_iα_i1θ₁d₁0π/22θ₂0a₂03θ₃00-π/2注意a₂是连杆2的长度约0.43md₁是基座到肩关节的距离约0.67m。若将α₁误设为0而非π/2则Z₀与Z₁的夹角错误导致整个T₀³计算失效——这种错误在手算时极难自查必须通过坐标系可视化验证用Matlab或Python的matplotlib绘制各坐标系原点与轴向确认Z₁确实绕X₁旋转90°后与Z₀垂直。2.2 正向运动学齐次变换链的“乘法顺序”是物理约束不是数学习惯正向运动学FK的公式T₀ᵉ T₀¹·T₁²·…·Tₙ₋₁ⁿ中矩阵乘法顺序不可交换。每个Tᵢ₋₁ⁱ描述的是“从{i−1}到{i}的坐标变换”因此必须从基座向末端依次左乘。常见错误是误写成Tₙ₋₁ⁿ·…·T₀¹这相当于把末端执行器的位姿当作基座参考系来描述结果完全失真。以二自由度平面臂为例关节1旋转关节2平移import numpy as np def dh_transform(theta, d, a, alpha): 标准DH齐次变换矩阵 ct, st np.cos(theta), np.sin(theta) ca, sa np.cos(alpha), np.sin(alpha) return np.array([ [ct, -st*ca, st*sa, a*ct], [st, ct*ca, -ct*sa, a*st], [ 0, sa, ca, d], [ 0, 0, 0, 1] ]) # 连杆1旋转关节θ₁变量d₁0, a₁0, α₁0 T01 dh_transform(theta1, 0, 0, 0) # 连杆2移动关节θ₂0, d₂变量, a₂L, α₂0 T12 dh_transform(0, d2, L, 0) T02 T01 T12 # ✅ 正确先转再移 # T02_wrong T12 T01 # ❌ 错误先移再转物理意义颠倒关键逻辑T01 T12表示“先在{0}中执行T01得到{1}再在{1}中执行T12得到{2}”符合运动链实际执行顺序。若顺序颠倒等价于假设移动关节在基座坐标系下直接平移忽略了旋转关节带来的坐标系转动——这是典型的运动学耦合误判。2.3 逆向运动学解析解的“存在性”比“求解过程”更致命逆运动学IK的目标是给定期望末端位姿T₀ᵉ求解关节变量q[θ₁,…,θₙ]ᵀ。但并非所有构型都有解析解。PUMA560的6R结构因满足Pieper准则最后三关节轴交于一点可得封闭解析解而SCARA机器人的4R结构虽简单但若任务空间指定位置超出工作空间半径则无解。IK求解的核心策略是降维消元利用T₀ᵉ的前三行前三列提取旋转矩阵R₀ᵉ结合连杆几何约束建立关于θ₁,θ₂,θ₃的三角方程利用T₀ᵉ第四列提取位置向量p₀ᵉ导出关于θ₁,θ₂的二次方程解出θ₁后代入求θ₂,θ₃再用R₀ᵉ与T₀³的旋转部分匹配解θ₄,θ₅,θ₆。易错点在于当sinθ₃≈0时即手腕奇异位形θ₄与θ₆耦合出现无穷多解此时若强行用atan2(y,x)求解会丢失解的分支信息。正确做法是引入辅助变量如令γθ₄θ₆先解γ再分解。3. 动力学建模别让“质量矩阵”变成黑箱它每一项都在讲物理故事3.1 拉格朗日法动能与势能的“微分游戏”必须严守变量独立性拉格朗日方程L K − PK为总动能P为总势能导出的动力学方程形式为D(q)q̈ C(q,q̇)q̇ g(q) τ其中D(q)为对称正定惯性矩阵C(q,q̇)q̇为离心力与科氏力项g(q)为重力项。关键陷阱在于动能K必须表达为广义速度q̇的二次型且系数仅含q不含q̇。若在计算单连杆动能时错误地将质心速度v_c写成含q̇²的函数如v_c l·q̇·cosθ再平方得l²q̇²cos²θ则∂K/∂q̇会含q̇项导致C矩阵推导错误。以单连杆旋转关节为例长度l质量m质心在中点质心位置x_c (l/2)cosθ, y_c (l/2)sinθ质心速度v_c² ẋ_c² ẏ_c² (l/2)²θ̇²动能K (1/2)m·v_c² (1/2)I·θ̇² (1/2)[m(l/2)² I]θ̇²→ 显然K是θ̇²的线性函数系数D(θ) m(l/2)² I与θ无关纯旋转。但若连杆有平移自由度如液压缸驱动则v_c会含q̇₁q̇₂交叉项此时D(q)仍只含q而C(q,q̇)q̇必然出现。3.2 牛顿-欧拉递推从末端向基座的“力流”分析更贴近硬件实现牛顿-欧拉法NE通过递推计算各连杆的加速度a_i和作用力f_i物理意义更直观向外递推Forward已知基座加速度a₀0逐连杆计算a_i含离心、科氏加速度向内递推Backward已知末端力fₙ0自由末端逐连杆计算f_i及所需关节力矩τ_i f_i · z_iz_i为关节轴单位矢量。NE法优势在于计算复杂度O(n)远低于拉格朗日法的O(n³)可自然处理外力如末端接触力fₑₓₜ、摩擦力库仑粘滞输出τ_i直接对应电机输出便于实时控制。代码实现要点伪代码# 向外递推计算各连杆质心加速度 a[0] [0,0,0]; w[0] [0,0,0] for i in range(1, n1): R_prev rotation_matrix_from_dh(q[i-1]) # {i-1} to {i} w[i] R_prev w[i-1] qdot[i]*z[i] # 角速度叠加 a[i] R_prev (a[i-1] cross(w[i-1], cross(w[i-1], r[i]))) \ cross(w[i], cross(w[i], r[i])) \ cross(wdot[i], r[i]) # 加速度含科氏项 # 向内递推计算关节力矩 f[n] [0,0,0]; n[n] [0,0,0] for i in range(n, 0, -1): f[i-1] R_prev.T (f[i] m[i]*a[i]) n[i-1] R_prev.T (n[i] I[i]w[i] cross(w[i], I[i]w[i])) \ cross(r[i], f[i-1]) tau[i] n[i-1].dot(z[i-1]) # 关节力矩 力矩矢量在关节轴投影注意cross(w[i], cross(w[i], r[i]))是向心加速度cross(wdot[i], r[i])是切向加速度科氏项隐含在a[i-1]向{i}坐标系转换时的旋转效应中——这是NE法最易漏的物理项。3.3 动力学参数辨识为什么标称值永远不够用教材中给出的连杆质量、质心位置、惯量张量均为理论值但实际加工误差、装配偏差、电缆拖拽力会导致D(q), C(q,q̇), g(q)严重偏离。动力学参数辨识IDP通过激励轨迹如多频正弦组合采集τ与q,q̇,q̈数据求解线性方程Y(q,q̇,q̈)·θ τ其中Y为已知的“辨识模型矩阵”θ为待估参数向量含m, lc_x, lc_y, lc_z, I_xx,…。辨识成功的关键激励轨迹必须充分激发所有参数即Y满秩需剔除摩擦力静/库仑/粘滞的非线性影响常采用预滤波或分段建模实验中关节编码器零点漂移会污染q̈必须用高阶微分或状态观测器估计。某实验室曾用PUMA560辨识发现标称惯量比实测值低18%导致PD控制器在高速运动时严重超调——这印证了一个血泪经验没有辨识过的动力学模型只适合仿真不适合实际控制。4. 控制器设计从PID到自适应每种方法都在妥协特定假设4.1 PID控制为什么在机器人上常“水土不服”经典PIDτ Kₚe Kᵢ∫e dt K_dė在机器人控制中面临三大硬伤非线性失配D(q)q̈项随姿态剧烈变化固定Kₚ无法兼顾全工作空间耦合干扰C(q,q̇)q̇与g(q)作为未知扰动使e(t)持续震荡微分噪声放大关节编码器量化噪声经K_d放大引发高频抖振。改进方案前馈补偿τ Kₚe Kᵢ∫e dt K_dė D(q)q̈_d C(q,q̇)q̇_d g(q)→ 将模型主导项前馈PID只校正残差微分先行对设定值微分而非误差微分抑制噪声抗饱和积分当τ达电机限幅时冻结积分器防积分饱与。4.2 计算力矩控制CTC用模型精度换控制鲁棒性CTC本质是基于模型的精确线性化τ D(q)(q̈_d Kᵥė Kₚe) C(q,q̇)q̇ g(q)其中q̈_d为期望加速度ėq̇_d−q̇, eq_d−q。其闭环误差动态为ë Kᵥė Kₚe 0特征根由Kₚ,Kᵥ决定与机器人参数无关。但代价是若D(q)估计有10%误差闭环带宽下降超30%C,g项未建模时等效为外部扰动需额外鲁棒项。4.3 自适应控制当模型不确定时“边学边控”的数学契约模型参考自适应控制MRAC构造虚拟参考模型q̈_m 2ζωₙq̇_m ωₙ²q_m ωₙ²q_d目标是使实际系统q跟踪q_m。自适应律设计为θ̇ −Γ·Yᵀ·s其中s ė αe为滑模面Y为回归向量含q,q̇,q̈等Γ为正定增益矩阵。关键约束Y必须满足持续激励PE条件——即Y(t)在时间窗口内不能长期退化为低秩。若激励轨迹单调如单频正弦Y的列向量线性相关θ̇→0导致参数冻结。实践中需注入伪随机信号如PRBS破除PE限制。5. 易错点那些教材不会明说、但习题答案里藏着的“玄学”陷阱5.1 DH参数建模坐标系原点选在关节中心还是连杆中心易漏点教材图示常将{ i }原点画在关节i处但实际定义要求O_i位于Z_{i−1}与X_i交点。当Z_{i−1}与Z_i异面时X_i需过Z_{i−1}上某点并垂直于两Z轴此时O_i未必在关节物理中心。为什么漏手绘草图时默认“关节中心坐标系原点”忽略DH定义的几何严谨性。怎么补对每个连杆严格按四条DH规则推导O_i位置用向量运算验证O_i是否在Z_{i−1}上即(O_i − O_{i−1}) × z_{i−1} 0。5.2 逆运动学解的“有效性”验证四组解为何只有一组可用易漏点解出θ₁~θ₆后直接代入FK验证T₀ᵉ却忽略关节限位如θ₂∈[−90°,90°]和自碰撞如连杆2撞到基座。为什么漏习题通常假设理想构型但真实机器人有硬限位开关和软限位保护。怎么补在验证环节增加valid True for i in range(6): if theta[i] q_min[i] or theta[i] q_max[i]: valid False; break if not check_collision(theta): valid False # 碰撞检测需几何模型5.3 动力学中的“零力矩”误区静态平衡时τ0易漏点求静态平衡q̇0,q̈0时直接令τ0忽略g(q)项。为什么漏混淆“无运动”与“无力矩”重力始终存在。怎么补静态平衡条件是τ g(q)即关节力矩必须平衡重力矩。例如水平臂末端挂重物即使不动肩关节电机仍在输出力矩。5.4 Lyapunov稳定性证明V̇0的“负定”不是数值小于0易漏点构造V (1/2)eᵀe后计算V̇ eᵀė代入ė −Kₚe得V̇ −Kₚeᵀe便认为V̇0。为什么漏eᵀe ≥ 0故−Kₚeᵀe ≤ 0仅为半负定negative semi-definite不能推出渐近稳定。怎么补需用Barbalat引理或构造V (1/2)eᵀe (1/2)q̃ᵀΓ⁻¹q̃q̃为参数估计误差证明V̇ ≤ −αV即指数稳定。5.5 传感器建模编码器分辨率≠系统定位精度易漏点用编码器脉冲数计算位置忽略齿隙、弹性变形、电机转子惯量导致的跟随误差。为什么漏习题常假设“理想传感器”但实际中0.1°编码器分辨率整机定位误差可能达1°。怎么补在运动学模型中加入关节柔性环节如弹簧-阻尼模型或用卡尔曼滤波融合编码器与IMU数据。6. 复习清单用“三遍法”榨干每道习题的工程价值6.1 第一遍裸解——限时手算暴露直觉断层不查资料、不看答案用纸笔完成一道典型题如PUMA560的IK求解。计时30分钟完成后标记卡壳点例“在解θ₁时对T₀ᵉ的r₁₃/r₂₃比值取atan2但未考虑cosθ₁符号”对照答案区分“计算错误”如矩阵乘错与“概念错误”如混淆FK/IK输入输出将错误归类到知识地图坐标系运动学动力学控制我的教训曾连续3道IK题在θ₃求解时漏掉±号翻书才发现是sinθ₃±√(1−cos²θ₃)的分支选择问题。从此我强制在草稿纸上画出θ₃的几何意义图——关节3的俯仰角明确“向上抬为正向下压为负”。6.2 第二遍代码复现——用Python/Matlab跑通全流程将手算题转化为可执行代码重点验证接口一致性DH参数表、T₀ᵉ输入、q输出格式统一数值鲁棒性用np.arctan2(y,x)替代np.arctan(y/x)避免除零物理合理性检查D(q)是否正定np.all(np.linalg.eigvalsh(D) 0)、g(q)是否随θ单调变化。推荐最小可行代码框架# robot_kinematics.py class Robot: def __init__(self, dh_params): self.dh dh_params # list of [theta, d, a, alpha] def fk(self, q): T np.eye(4) for i, (th, d, a, al) in enumerate(self.dh): T_i self._dh_matrix(th q[i], d, a, al) # θ_i含变量 T T T_i return T def ik(self, T_des): # 解析IK主逻辑返回list of solutions pass # test_puma560.py puma Robot(PUMA_DH) # 预置DH表 T_des np.array([[...]]) # 期望位姿 solutions puma.ik(T_des) for q_sol in solutions: T_check puma.fk(q_sol) print(Error:, np.linalg.norm(T_des - T_check))6.3 第三遍场景迁移——把习题答案变成你的“故障字典”将每道题映射到真实工程场景建立“问题-现象-根因-对策”映射表。例如习题编号物理问题典型故障现象可能根因快速验证法Ch4-Ex12IK多解选择错误机械臂运动路径突兀、关节超限报警未按工作空间约束筛选解在ROS中rviz显示所有解的末端轨迹观察是否进入障碍区Ch6-Ex7动力学模型漏科氏项低速平稳高速时末端抖动加剧C(q,q̇)q̇未建模施加相同q̇指令对比有/无C项前馈的τ输出差异Ch8-Ex3PID微分噪声放大关节电机高频啸叫温度异常升高K_d过大或未滤波示波器测编码器信号观察q̇噪声频谱加一阶低通滤波器我的习惯每次调试真实机械臂前打开这份字典根据当前故障现象快速定位到对应习题重读答案中的推导步骤——那些曾觉得“多此一举”的中间变量如科氏加速度的叉积顺序往往就是现场示波器里跳动的噪声源。从那以后我每次写控制器都强制走一遍“模型项-前馈项-反馈项-滤波项”四层检查哪怕只是个简单PD。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
PinMe与IPFS:革新静态网站部署的技术解析 1. 项目概述:PinMe如何革新静态网站部署 作为一名长期奋战在前端开发一线的工程师,我深知静态网站部署的痛点。传统方式需要购买服务器、配置Nginx、处理SSL证书,还要担心流量超限和DDOS攻击。最近在GitHub Trending上发现的PinMe项目&#x… · 2026/11/4 10:26:47
ESP32-S3 ADC采样率极限揭秘:APB时钟与ARM总线关系 1. 为什么我要死磕这颗芯片的ADC采样率手里攥着一块ESP32-S3的开发板,想拿它做一个音频采集前端,结果一上示波器就傻眼了:标称的采样率跑不满,波形还带毛刺。这事儿搁谁身上都窝火。我最初以为是代码写得不够精简,后来… · 2026/11/4 10:26:47
VL53L1X嵌入式驱动实战:STM32 HAL下ToF测距的生产就绪方案 简介:本资源是一套面向嵌入式初学者与STM32开发者的VL53L1X飞行时间激光测距传感器驱动实践例程,聚焦TOF传感器在智能硬件、物体检测与低功耗测距场景中的落地应用。项目基于STM32CubeMX图形化配置生成初始化代码,完整封装I2C通信、寄存器配置… · 2026/11/4 10:25:46
直流无刷电机AX BY CZ怎么划分?120°电角度与90°坐标系详解 一个叫"ax"的热搜词,把我拽回了直流无刷电机的老本行。搜这个词的人,大概率是在某张接线图或绕线图上被AX、BY、CZ三个字母组合卡住了,随后抛出这个经典问题:直流无刷电机ax by cz怎么划分,是按照垂直轴线划… · 2026/11/4 10:57:33
ZPL标签打印预览实战:Labelary渲染PNG与参数调优指南 标签打印这个行当里,ZPL 算是个绕不开的老朋友。只要用过斑马系打印机,或者对接过仓储、物流、零售后台的打印模块,大概率都跟这串以^XA开头、^XZ结尾的指令打过交道。它本质上是打印机自己能读的“母语”,描述的是标签上每一行文… · 2026/11/4 10:57:33
GOCI2波段参数与月球定标链路:辐亮度校验到ROLO模型 简介:《GOCI2 说明手册 波段信息说明》面向海洋遥感、卫星载荷标定与定量反演方向的研究人员、工程师及研究生,聚焦第二代地球同步轨道海洋水色成像仪 GOCI-II 的波段设置与辐射性能指标,帮助读者厘清短波至近红外各波段在藻华识别、悬浮颗粒… · 2026/11/4 10:57:33
从零构建AI工程能力:后端老兵的踩坑与重构实录 1. 从零搭建AI工程能力:一个后端老兵的踩坑与重构实录 "ai-engineering-from-scratch"这个标题,第一次看到的时候我愣了一下。不是因为它有多花哨,恰恰相反,它朴素得有点不像这个时代的项目名。但正是这种朴素ÿ… · 2026/11/4 10:57:33
直流无刷电机三相绕组ax by cz划分与120度电角度详解 前阵子修一台直流无刷电机,端子排上贴着 ax、by、cz 三个标签,驱动板却只标了 U、V、W。我拿着表笔对着标签发愣:这 ax、by、cz 到底按什么划分出来的?有人挂在嘴边说,三相绕组就是按垂直轴线分的,一组一组… · 2026/11/4 10:57:33
无人机水质监测系统设计与实战经验分享 1. 无人机水质监测的技术革新 最近在环境监测领域出现了一个有趣的现象:越来越多的科研团队开始采用无人机进行水质采样和监测。这种创新方法不仅解决了传统人工采样效率低、危险性高的问题,还能获取更全面的水域数据。作为一名长期从事环境监测的技术人… · 2026/11/4 10:56:32
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38