强化学习双足机器人开源项目拆解:从仿真训练到真机部署

发布时间:2026/10/7 19:51:57

强化学习双足机器人开源项目拆解:从仿真训练到真机部署 去年年初我拆过一套标榜“强化学习开源框架”的双足机器人代码跑完训练、烧进固件、上电机器人站在原地疯狂抖了三秒然后啪地一声栽倒舵机齿轮当场扫了。所以这次拿到这套微小型双足鸭形机器人系统时我先没看演示视频而是直接把仿真配置、训练脚本、固件源码翻了一遍。看完之后我挺感慨终于有人把强化学习驱动的足式机器人项目按“工程可复现”的标准来做了。这套系统本质上是把深度强化学习算法、双足平衡控制、嵌入式推理、开源的硬件软件架构串成了一条完整链路。鸭子外形只是包装内核是一个端到端的强化学习策略输入IMU姿态、关节角度和足端触地信号直接输出舵机目标角度跳过传统ZMP、倒立摆那一整套需要精确建模的控制理论。适合谁参考如果你手里有一个类似的小型双足平台但怎么都走不稳或者你想搞清楚强化学习从仿真训练到真机部署到底要过哪些坎又或者你单纯想找个能改、能跑、能debug的开源机器人项目练手——这篇拆解能帮你省掉至少两个月的试错时间。1. 为什么是“一只鸭子”形态、重心与强化学习的三角关系1.1 微小型双足平台的选型逻辑市面上开源足式机器人不少四足的有Bittle、各种自研的十二自由度蜘蛛但双足的极少。原因很直接双足在静态支撑状态下就是不稳定的必须靠连续动态控制维持平衡对控制器实时性和状态估计的要求比四足高一个量级。四足摔了三条腿还能拿剩下一只撑住双足单腿支撑相本质上就是一根底部固定的倒立摆稍有侧向扰动策略必须在几十毫秒内做出修正否则就是摔。这个鸭形项目选双足而不是四足摆明了是在做一件吃力不讨好的事。但正因为吃力才有拆解价值。它的自由度配置非常克制每条腿两个自由度髋关节和膝关节各一个脚掌固定不可动外加一个用于配重和姿态微调的尾部舵机全机一共5个舵机。没有踝关节主动驱动意味着着地姿态没法微调平衡完全靠髋膝协调去“捞回来”。很多学生项目一上来就上六自由度全驱动双足踝关节、髋关节、膝关节全都要舵机结果仿真还没收敛光是URDF模型调参就花了一个月。这套鸭形机器人砍掉踝关节用一整块橡胶脚掌触地换来的是训练难度直线下降。当时我在仿真里对比过同样一套PPO训练配置全驱动双足要练到稳定行走需要1500万步而固定脚掌版本600万步就出了比较像样的步态。强化学习对动作空间极其敏感动作维数每多一维探索空间就指数膨胀。把脚掌自由度去掉本质上是把最简单的任务目标暴露给算法让策略把能力全部集中在“髋膝协调”这一个核心问题上。1.2 鸭形外观不是卖萌是重心设计的隐式先验鸭形外壳初看是个噱头等把外壳拆下来才发现它的工程意义。双足机器人最大的敌人是前后方向的姿态发散——重心稍微偏后走路就后仰策略得分出大量力矩去“捞”身体。这个项目通过把电池和控制板安置在躯干前下方、鸭头位置做成实心配重硬生生把整机质心挪到了支撑多边形前缘附近。效果很直观机器人行走时有天然的前倾趋势策略在后半程只需要用很小的修正量控制前倾速度不用做高成本的“后仰救回”。我后来在自己做的小型双足上试过同样的思路——把一块50克的配重从躯干后部挪到前部同为100Hz控制频率同样一套PPO策略前倾配重版本腿落地后躯干俯仰角的振荡幅值比后倾版本低了将近40%。这也解释了为什么这个项目的URDF模型里惯性参数不是随便填的。很多人建仿真模型时偷懒用CAD默认材质密度或者干脆全设成1导致仿真里的重心跟真机差了十万八千里训练出来策略当然到真机就失效。鸭形机器人的做法是把外壳3D模型导出质量属性直接写进URDF的inertial标签连杆质量、质心位置、转动惯量全部跟真机对齐。这一步也是整个sim2real成功的基础。1.3 开源架构的含金量能跑、能改、能查谈开源项目我关注的是它到底是“开源思路”还是“开源能跑的代码”。按我拆解的情况这套鸭形系统属于后者训练代码、仿真环境、真机推理固件全部放出而且技术栈非常主流。训练端用PPO仿真后端是MuJoCo真机端是STM32单片机上的C推理代码输入输出接口用YAML配置统一管理。这套组合的最大优势是社区浓度高。你遇到训练不收敛去GitHub搜“PPO MuJoCo”能找到成千上万个issue你遇到舵机抖动搜“STM32 servo control”同样有大量参考。我接手过用自研仿真器和私有协议传参的项目遇到问题根本没法跟社区对齐只能自己从头啃源码排查效率低到令人绝望。所以选开源架构时技术栈的社区关注度比“看起来高大上”重要得多。这个项目把每一环都选成了陌生人也能上手的主流工具这一点在足式机器人领域其实非常稀缺。2. 硬件底子舵机、重心与传感器配置的工程真相2.1 舵机选型与自由度配置为什么9g舵机就够用整机用的舵机是9g级别的微型舵机标称堵转扭矩1.5到1.8kg·cm空载响应速度约0.1到0.15秒/60度。这个参数放在足式机器人里算弱的但在这套系统里是“够用就好”的理性选择——因为真正的控制器不是舵机内部的PID位置环而是训练出来的强化学习策略。很多人以为强化学习策略在仿真里能输出任何力矩真机就一定执行得了这是最大的认知误区。真机舵机的物理约束是硬性的响应带宽决定了膝关节能在多短时间内完成一次步态摆动。仿真里如果不建模舵机速度上限策略很容易学到“要求关节在0.05秒内摆动30度”这种真机根本无法执行的动作。表现就是机器人站在原地高频抽搐像踩了电门几秒后舵机过热保护然后摔了。这套系统在仿真里比较认真地建模了舵机特性每个关节都加了速度限幅和位置死区控制周期设置为20毫秒跟真机一致。我对比过不建模速度上限的版本训练得到的策略在MuJoCo里走得飞快一上真机就原地鬼畜。从这个角度说“仿真有多真实策略就有多可部署”这句话是足式RL项目的第一铁律。2.2 重心高度、质心偏移与外壳干涉问题双足机器人的重心高度直接决定控制难度。这个项目整机高度约18厘米腿长站了一半重心大约在腿长的三分之一高度处。你可以把双足行走理解为质量块在细杆上做平衡质量块越高系统的时间常数越小系统对扰动就越敏感需要更高响应带宽的执行器。9g舵机的带宽摆在那里重心就只能做低这是机械设计和控制算法之间的第一层博弈。另一个细节是鸭形外壳与地面的干涉。双足行走时脚掌和腿部在摆动相会有明显的扫掠运动如果外壳底部的离地间隙不够行走时外壳下沿会擦到地面甚至卡住直接改变整机姿态。很多双足项目摔机就摔在“地毯边沿兜住了外壳下沿”这种不起眼的问题上。这个项目在外壳底部做了斜切倒角提高了有效通过间隙仿真里也设置了最低离地高度约束确保策略不会学到“外壳蹭地也照样走”的坏习惯。2.3 传感器配置IMU、舵机反馈与足端触地开关真机传感器配置极简一块六轴IMU三轴加速度计加三轴陀螺仪、每个舵机内带的角度反馈、每只脚掌下面的触地检测微动开关。这套配置里没有力传感器没有视觉没有编码器但足够支撑策略运行。触地检测是关键中的关键。策略在仿真里接收的是连续力值或布尔触地信号用它来切换步态相位。真机上没有力传感器用微动开关只能读到“有/无”的离散信号但这够用了——关键在于要把触地检测的延迟和抖动建模到仿真里。我实测过微动开关从物理接触到信号翻转有大概3到8毫秒延迟再加上机械弹跳信号可能抖动三到五次。仿真里如果直接把触地当成理想瞬间切换策略就会学到“在正确的时间刚好踩到正确的位置”真机上因为延迟和抖动步态相位切换时机错位表现为走路时一只脚踩空。IMU数据处理也很重要。只用加速度计会受振动噪声污染只用陀螺仪会积分漂移。这个项目在固件里用互补滤波把加速度计在低频段的姿态估计和陀螺仪在高频段的角速度估计做加权融合输出稳定的俯仰角和横滚角。很多新手一上来就想上卡尔曼滤波或者EKF但在微小型平台上先跑通互补滤波往往已经足够而且代码量小、参数直观调试成本低得多。3. 强化学习训练全流程从仿真配置到sim2real迁移3.1 仿真环境搭建与域随机化让策略“见过世面”训练环境用的是MuJoCo把URDF模型直接导入地面是标准平面通过修改地面材质参数来模拟不同摩擦系数的路面。搭建本身不复杂真正的门道在于域随机化。域随机化的核心思想是训练时随机采样一组物理参数让策略在“多样性环境”里学习这样它遇到真机时面对的未知环境就不会一脸懵。具体参数我建议至少随机这几项地面摩擦系数0.3到1.5之间均匀采样舵机力矩缩放系数0.8到1.2整机质心位置三个轴向上偏移±0.5厘米IMU测量噪声按真实传感器标定值放大1.5到3倍舵机控制延迟10到50毫秒均匀采样其中舵机控制延迟是最容易被忽视但最关键的一项。真机下行控制指令到下位机执行之间必然存在通信和计算延迟仿真里如果不建模这个延迟策略会活在一个“指令立刻执行”的理想世界里换成真机就会动作慢半拍然后摔倒。我自己的教训非常典型仿真里走得完美真机上无论怎么调都摔。后来给仿真关节控制硬加了一个固定30毫秒延迟再训练一轮真机部署后第一次行走就稳定了一大半。域随机化的另一面是不要乱随机。质心坐标可以偏移但如果你把腿长随机个10%策略学的就不是“步态”而是“无论腿长啥样凑合能走”真机反而是坏的。随机化的范围要以真实硬件误差为基准舵机安装有间隙就随机间隙量重心偏移多少就随机多少拿真机数据来标定随机范围这是域随机化能对sim2real产生正效应的前提。3.2 奖励函数设计奖励结果不奖励动作奖励函数是强化学习项目里最玄学也最核心的部分。这套鸭形机器人的奖励设计思路是“稀疏任务奖励为主密集正则化为辅”整体拆成四项速度误差奖励用高斯核函数exp(-(v_target - v_actual)^2 / 0.5)目标速度设置在0.2米每秒左右贴近真机行走速度。躯干俯仰角约束是-0.2 * pitch^2鼓励保持上身直立。双腿交替由每条腿的摆动相位差编码策略被引导去学自然的左右交替步态。另外加惩罚项舵机角加速度过大、脚掌离地高度过大、关节位置超过安全限制。这套设计最值得学的地方是它没有加任何“姿态要好看”的主观奖励。因为约束一多策略就会找到奇怪的关节配置去“苟住”奖励比如蜷着腿小碎步蹭地走——从奖励数值看速度达标了、俯仰角也稳了但姿态诡异得没法用。奖励函数设计的第一原则是你先想清楚最关心的结果是“站稳”还是“走快”只给对应奖励其他交给策略自己学。你脑补的中间路径往往是错的把策略往错误路径上逼训练出来的姿势一定难看。3.3 训练流程PPO、并行环境与训练时长算法层面用的是PPO这几乎是当前足式机器人强化学习的事实标准。PPO的实现已经非常成熟不需要懂太多数学细节但几个超参数的设置直接决定训练效果。我建议的起始配置仿真控制周期20毫秒一个episode 200步即4秒PPO的clip ratio 0.2、GAE lambda 0.95、熵系数0.01训练时开8到16个并行环境总体训练步数500万到1000万步。这个规模在单张消费级显卡上大概需要2到4个小时。训练时用TensorBoard盯每项奖励的曲线别只盯着总回报曲线猜。训练节奏的体感是这样的双足“站住不倒”大约在50万步之后能看到雏形出现稳定的行走步态要到300万步以上想达到真机部署水准则普遍需要800万步以上。如果训练到200万步还完全不会站立基本可以确定不是训练时长问题而是奖励函数设计或者URDF模型参数有Bug老老实实回去排查别开个超长训练死等。3.4 sim2real迁移策略输入输出对齐是生死线从仿真到真机是整个系统最精彩的部分。策略本质上是一个神经网络输入关节角度、角速度、IMU姿态输出目标舵机角度。部署时要做的事情就是把前向推理搬到单片机上并且确保数据语义完全对齐。第一个关键点是明确策略输出的语义。很多项目训练时输出的是关节力矩增量部署时代码里却直接当舵机目标角度写动作自然乱套。这套系统的做法是训练时输出目标角度真机舵机内部自带有位置环策略只需要给角度指令实时性压力小很多。第二个关键点是观测空间必须是“真机可测的”。如果训练时直接用了真机拿不到的信息比如质心速度真值、地面摩擦系数到了真机输入分布和训练时完全对不上策略输出就会漂移。这套系统在处理这个问题上很严格观测空间只包含IMU俯仰角、横滚角、角速度、关节角度和上一时刻动作全部是真机传感器直接可测的量。训练时如果必须用速度真值就加大量的噪声模拟真实观测误差。第三个关键点是控制频率必须严格一致。仿真里用100Hz训练真机就必须跑100Hz控制循环。有些人仿真用500Hz真机跑100Hz策略在高频控制下学到的动作拿到低频环境必然不稳定。我见过很多sim2real失败的案例排查到最后都是控制频率不一致这个低级错误。在微小型平台算力有限的情况下100Hz是平衡策略性能和MCU负载的合理选择。4. 开源架构解析代码库怎么组织、推理怎么做、怎么改造成自己的机器人4.1 代码库结构与配置分离的设计代码库顶层拆成三个目录sim、firmware、common。sim里是仿真环境、奖励函数、PPO训练脚本和模型导出逻辑firmware里是STM32上的C代码包含IMU读取、舵机控制、策略推理和上位机通信common里是URDF模型文件和YAML配置两边共享。让我眼前一亮的是“配置与代码分离”的工程习惯。连杆长度、舵机限位、重心偏移、PID参数、目标速度全部在一个YAML配置文件里训练代码和固件都读这个文件。这意味着你改了机器人结构之后不需要去翻训练代码找硬编码常量只改YAML即可。很多开源项目做不到这一点改一个连杆长度要翻半天代码非常痛苦。这个细节决定了项目“可改造性”的上限。4.2 策略推理与实时性C语言推理是底线真机部署的最大性能瓶颈是策略推理。一个典型的三层MLP每层64个神经元一次前向推理约需几万次浮点运算在STM32F4这种主频168MHz的MCU上裸跑约需2到5毫秒。加上IMU读取和舵机控制指令发送整个控制周期可以控制在10毫秒内也就是100Hz控制频率。这里有个关键提醒如果你用MicroPython或者某些带Python解释器的开发板跑推理解释器和动态分配的开销会让推理时间暴涨到几十毫秒控制频率掉到20Hz以下策略输出严重滞后真机必摔。所以真机推理必须用C或C实现。一个可行的做法是训练后把神经网络参数导出为float32数组用C语言重写一个最小的MLP前向推理函数不依赖任何第三方库。也可以用TFLite Micro进行量化但起步阶段手写MLP推理已经足够。4.3 迁移到自己的双足机器人需要改什么如果想把这套开源架构迁移到自己设计的双足机器人上要动的文件其实很少核心就四个URDF或MJCF模型换成你自己的机器人结构连杆长度、质量、惯性参数必须跟真机一致YAML配置里的舵机限位、PID参数、重心偏移和触地开关逻辑按你的硬件数据修改奖励函数里的目标速度改成你希望机器人走的速度其他主体保留firmware里的舵机控制频率、串口协议按你的实际板子调整特别提醒不要直接加载别人训练好的预训练模型。每个机器人的硬件误差、舵机响应、重心位置都不一样加载别人的模型上电大概率不是理想的鸭子步而是抽搐式摔倒。预训练模型只能当训练前的参考基准最终还是要自己训。好在训练脚本是开源的替换URDF后环境自动适应不需要改Python代码。5. 实战排查训练不收敛、真机抖动与硬件保护5.1 训练不收敛怎么办80%问题出在环境不在算法训练不收敛是问得最多的问题。很多人一上来就怀疑PPO超参数没调好但按我的排查经验80%的情况出在奖励函数或者环境定义上。排查顺序建议如下先用TensorBoard把每个奖励分量曲线拉出来看。速度误差奖励是否持续高企如果机器人根本没学会前进问题多半在动作空间设计或舵机速度限幅上。俯仰角奖励是否振荡剧烈振荡说明策略还在剧烈修正姿态没有学到平稳控制此时把熵系数调低增加角加速度惩罚。如果做到这一步还不行就把奖励项逐个删掉跑一次定位是哪个奖励让策略学歪了。另一个高频问题是URDF里的质量和惯性参数填得不合理。有些人的模型连杆质量总量不到100克仿真里机器人轻飘飘策略自然学不出稳健步态。用CAD导出真实质量属性导入URDF是排查的起点。总回报曲线一味上涨不代表策略好有可能是奖励设计里存在“刷分”漏洞。策略发现某种奇怪的关节姿势能拿高奖励但真机根本无法执行回报曲线再漂亮也白搭。5.2 真机抖动与姿态振荡的调试顺序策略在仿真里走得稳真机上站着不动却抖得厉害是经典的sim2real问题。抖动原因一般有三个层次按顺序排查第一层是控制频率不匹配。仿真用500Hz训练真机跑100Hz策略输出频率跟不上机器人姿态变化的速度机器人当然不稳。先确认仿真和真机控制频率严格一致这是最基础的检查。第二层是状态估计延迟和噪声。真机IMU的角速度数据如果没滤波噪声直接进入策略输入策略会把噪声当成真实扰动去疯狂补偿表现就是高频颤振。解决办法是给IMU角速度加一阶低通滤波截止频率设在20到30Hz效果立竿见影。第三层是舵机位置环PID太激进。有些舵机内部位置环参数默认偏“硬”小幅修正时来回震荡与策略输出叠加后形成肉眼可见的抖动。处理方法是适当降低P值或增加D值让舵机响应变得平滑。注意别调太软否则舵机跟不上策略的步态节奏。5.3 硬件保护机制摔机不可避免但要摔得安全跑强化学习策略的机器人摔机是常态硬件保护必须提前做。这套鸭形系统固件里的保护逻辑值得背诵关节角度超出安全限制立即封锁对应舵机输出防止舵机齿被掰断。机身姿态俯仰角超过45度判定为摔倒停止一切运动并进入低功耗模式。上位机串口断连超过500毫秒自动停机避免机器人带失控指令乱走。控制循环执行超时自动复位防止死循环导致舵机堵转烧毁。这些保护看着简单但真的能救命。我见过太多新手调试时不做安全防护机器人带着全功率舵机指令从桌面冲下来腿摔折、舵机烧毁、电池摔鼓包修一次硬件花掉的钱和时间远超写十行保护代码的成本。调试真机之前无论如何先把角度限制和断连保护加上。另外建议在桌面调试时用一根绳子系在机器人尾部做“安全绳”既能限制摔倒速度又不影响正常行走测试。6. 实操心得与这套架构的扩展空间整套项目跑通之后我最深的一个体会是强化学习机器人项目的坑80%不在算法理论而在工程细节。舵机延迟、IMU噪声、控制频率差异、触地开关抖动每一个看起来不起眼的因素都能让训练好的策略在真机上一秒变废。所以别急着研究更花哨的算法先把仿真与真机的“工程对齐”做到位。仿真里加30毫秒延迟、加IMU噪声、把舵机速度上限建模进去你省下的是后面几周的调试时间。还有一个体会是判断一个开源项目值不值得深入研究要看它的代码组织方式而不是demo效果。demo好看的项目很多但真正能让你改造、迁移、debug的项目一定有配置与代码分离的结构、清晰的训练与推理接口、可复现的仿真配置。这套鸭形系统的工程素养比那些看着炫酷但一改就崩的项目值钱得多。后续扩展方向也很多。可以给机器人加一个摄像头模块把强化学习从单步态控制扩展到视觉避障和步态规划合并训练也可以把行走目标改成上下台阶、小跑甚至跳跃本质上就是换URDF和奖励函数同一套训练框架换一个四足机器人URDF训练配置微调后也能跑代码层面的成本远低于从零搭建。最后分享一个小技巧每次修改仿真参数或奖励函数后别急着上真机先在仿真里连续跑100次随机初始条件和随机扰动统计成功率。如果低于90%就继续调。这个习惯帮我避免了很多次把机器人摔坏的惨剧。毕竟鸭子可以只有一只但你的舵机库存不多了。
延伸阅读

更多相关文章

2026/10/7 19:46:56

网安人才缺口爆发,零基础怎么上车?看这篇

你是不是也遇到过这种情况:想学网络安全,但打开搜索引擎,信息铺天盖地、东一块西一块,根本不知道从哪开始? 看了一堆教程,装了十几个工具,三个月过去,还是只会"看"不会&qu…

2026/10/7 19:46:56

Qorvo PAC系列高集成电机控制方案:从选型到FOC实战

1. 从一颗芯片说起:为什么电机控制方案正在被重新定义搞电机控制的人都有一个共同的痛点:一个看似简单的BLDC或PMSM驱动方案,拆开BOM一看,MCU、栅极驱动、运放、比较器、LDO、Buck、电流采样、保护逻辑……零零散散二三十颗料&…

2026/10/7 19:46:56

CC6926集成式电流传感器:50A-400A宽量程与加强绝缘设计实战

1. 从50A到400A:CC6926到底解决了什么痛点第一次拿到CC6926的规格书时,我正为一个工业伺服驱动器的电流采样方案发愁。项目要求单板覆盖50A到400A的宽量程,同时必须满足加强绝缘,而板子空间已经被压缩到极限。传统方案要么用分流器…

2026/10/7 20:31:59

AI Agent营销技能包实战:从零搭建可复用的marketingskills

1. 从"marketingskills"这个标题说起:它到底想解决什么问题第一次看到"marketingskills"这个标题,我脑子里蹦出来的不是某个具体工具,而是一类正在快速成型的东西——给 AI Agent 用的技能包。结合热搜词里那一串 Claude…

2026/10/7 20:31:59

WMS与WCS任务下发代码包:出库入库接口对接与重试对账实战

简介:本资源为WMS与WCS系统对接的通信代码示例,聚焦仓储管理系统中WMS向WCS下发任务的JSON报文格式与字段定义,面向自动化立体库、智能仓储方向的开发人员与集成工程师。资源以cmd指令区分入库、出库、移库三类业务,并完整给出seq…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/7 8:18:33

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/6 17:46:51

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

ESP32免重刷固件:浏览器直接修改NVS键值实现WiFi配置更新

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

SAP HANA查询结果导出CSV:避开乱码、性能与权限的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:05:03

数字后端Placement阶段Density与Congestion控制实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑