GelSight触觉传感器:从原理到实战,让机器人拥有指尖感知
做机器人抓取实验的时候我遇到过一个特别典型的场景机械臂夹住一个装了水的纸杯视觉系统看得到杯子在哪但完全不知道杯子有没有被捏变形、有没有往下滑。夹持力给大了纸杯直接瘪掉给小了又滑脱。后来换了 GelSight 传感器问题一下就解开了——它不是靠“摸”出压力而是靠“看”出按压形变来反推触觉信息。这就是 GelSight 这类触觉视觉传感器的核心思路用光学原理把接触过程变成图像让触觉变得可见也让机器第一次有了接近人类手指尖的感知精度。这篇文章我会从工作原理、关键算法、硬件选型、实战搭建到常见踩坑完整走一遍 GelSight 传感器的落地路径。适合正在做机械臂抓取、灵巧手、纹理识别、表面缺陷检测的工程师也适合刚接触触觉传感器、想快速入门的学生。1. GelSight到底是什么把触觉变成图像的底层思路1.1 从指尖到“凝胶半球”GelSight 最早其实是在 MIT 的实验室里做出来的起因是研究者想获得比传统电子皮肤更高分辨率的触觉信息。传统触觉传感器靠压阻、电容或压电材料把压力变成电信号分辨率受限于阵列密度一般做到毫米级就很不错了。而 GelSight 换了一条路它用一块透明弹性体通常是硅橡胶作为接触面弹性体表面涂覆反光涂层背后是摄像头和彩色 LED——当物体按压在弹性体上时表面发生形变反光涂层随形变改变光路摄像头拍下一张“变形图”算法再根据这张图反推接触几何、力和滑动。这个思路最聪明的一点是触觉分辨率不再受限于电路布线的密度而取决于摄像头的像素分辨率。一个指甲盖大小的接触面如果用 100 万像素的摄像头理论上就能做到微米级的纹理分辨。这个量级是传统阵列传感器很难轻易做到的尤其是考虑成本的情况下。1.2 一看就懂的工作流程一台 GelSight 传感器从接触物体到输出触觉数据大概经历五个环节物体按压弹性体表面产生局部几何形变形变让表面镀层反光膜的反射角度发生变化内部不同角度的彩色 LED 提供光源相机捕捉到带颜色编码的形变图像算法通过形变图像用光度立体、标记跟踪等方法重建表面几何或估计受力输出触觉信息比如接触区域的三维形貌、接触力、滑移状态。这五步听起来不复杂但每一步都有细节。尤其是光学部分光源怎么布置、反光膜用什么材料、弹性体硬度该选多少都直接决定最终输出的信号质量。我的经验是硬件做得越扎实算法就越省心否则后期标定和滤波会让你非常难受。2. 核心技术拆解多光源、弹性体与光度立体算法2.1 为什么必须用彩色多角度光源GelSight 的原型机大多用了红绿蓝三色 LED并分别放在接触面的左、中、右三个方向。这不是为了好看而是为了让“变形”可以被定量解读。原理是弹性体表面镀层近似镜面反射。当表面平整时相机看到的是光源在镜面上的虚像一旦表面凹陷或凸起镜面法线方向发生变化相机对应像素位置的颜色就会变化——比如左倾看到红色更多右倾看到蓝色更多水平则偏绿色。这样颜色本身就成了表面梯度的编码器。用光度立体算法时表面法向量可以通过多张不同方向光照下的图像强度反算出来。GelSight 把多角度光源合成到一张图里相当于把不同光照打在同一个接触表面上再通过标定矩阵重建法向场。这部分在工程上会简化成一张标定查找表但理解其中的物理原理对排查问题很有帮助。2.2 光度立体背后的数学原理光度立体其实是很经典的计算机视觉方法。理想朗伯体表面一个像素的灰度值满足[ I_i \rho \cdot (N \cdot L_i) ]其中 (I_i) 是第 (i) 个光源下的像素灰度(\rho) 是表面反射率(N) 是表面法向量(L_i) 是光源方向。如果至少布置三个不共面的光源就可以联立方程解出每个像素的 (N)。GelSight 在实际实现时做了简化反光涂层近似镜面反射灰度值和法向的关系不完全是朗伯体模型因此常采用经验标定的方式。标定方法是使用一个已知形状的标准球或平面在接触不同角度下记录图像建立“颜色—法向”映射表。我建议你搭原型的时候不要直接上复杂算法先把标定表做准确后面重建三维形貌会顺畅很多。2.3 从图像到力标记跟踪法除了重建接触面的三维几何GelSight 还能估计切向力和滑动。做法是在弹性体内部埋入随机分布的微小标记点当物体在接触面上滑动时弹性体会产生剪切形变标记点随之位移。通过光流或特征匹配跟踪这些标记点的位移场就能计算出接触区域的剪切应力分布和整体滑动趋势。这个能力在实际抓取里非常有用。很多机器人抓取失败不是因为夹持力不够而是因为手指尖没有滑动感知无法在物体刚下滑的时候及时调整。GelSight 的标记跟踪能在亚毫米尺度上察觉到滑动的起始从而给控制回路争取到足够多的反应时间。3. GelSight的关键指标与选型考量3.1 五个必须看的关键参数选 GelSight 传感器不能只看分辨率至少要关注五个维度空间分辨率由相机像素和视场共同决定一般能做到 20~50 微米远高于电容阵列接触面积凝胶面的尺寸直接决定能感知多大范围的物体接触力测量范围与灵敏度取决于弹性体硬度和镀层材料软凝胶更灵敏但量程偏小响应时间受相机帧率限制一般推荐 30fps 以上抓取场景才够用耐久性弹性体和镀层在反复按压后会有磨损属于消耗件使用成本也要考虑。我第一台自制的 GelSight 就是没关注帧率用了普通 USB 摄像头只有 15fps结果物体快速滑动时图像全是动态模糊算法根本没法处理后来换成了支持全局快门的工业相机才算解决。3.2 GelSight与其他触觉传感器怎么选很多人在做整体方案时会纠结到底用 GelSight还是用六维力传感器还是电容式阵列以我自己的项目经验来看可以按表去选传感器类型优势局限典型场景GelSight分辨率极高、纹理/滑动感知强力精度一般、依赖光学环境抓取、纹理识别、质检六维力/力矩传感器力和力矩标定准确、响应快无法感知接触表面纹理和分布力控装配、强度控制电容式阵列直接测压力分布、无光学依赖分辨率受阵列密度限制足底压力、坐姿监测电子皮肤柔性好、可大面积覆盖信号漂移大、标定复杂人机交互、穿戴设备GelSight 不是一个“万能选项”它的强项是空间感知和滑移检测但如果你只需要一个精确的力反馈六维力传感器依然是更直接的选择。在实际系统中两者常常搭配使用——GelSight 负责“接触得怎么样”力传感器负责“用了多大力”。4. 实战从零搭建一套 GelSight 传感模块4.1 硬件清单与选型如果你也想自己搭一套 GelSight 原型核心硬件包括弹性体推荐 20~30 Shore A 硬度的透明硅胶兼顾灵敏度和回弹速度反光层气相沉积铝膜或银粉涂层太薄易破损太厚会影响图像亮度光源3~4 个不同颜色的贴片 LED红绿蓝固定在接触面外围摄像头优先选全局快门的微型工业相机分辨率至少 50 万像素透光支撑件亚克力板或玻璃保证光路清晰避免刮花。这些材料并不贵原型机成本可以控制在几百元以内。关键是装配时保证弹性体与支撑面贴合紧密不能有气泡否则气泡会直接影响反光层的平整度导致图像里出现暗斑。4.2 组装时要特别注意的三个步骤第一步弹性体浇注。将硅胶倒入模具前要抽真空排气泡。不抽真空也可以但固化后表面会有微小气孔接触时会产生大量干扰信号。我试过用针筒慢慢挤压的办法排泡效果比不上真空气室但小面积打样够用。第二步镀反光层。实验室可以用热蒸发镀膜设备但没有条件的话可以用银粉漆手工涂覆。银粉漆的问题是反射率不够均匀做定性演示没问题做精密测量还得靠镀膜。此处如果做实验建议一次多准备几片凝胶作为耗材更换。第三步光源标定。安装好 LED 后先用一块平面标准块轻压接触面观察图像颜色是否均匀。如果一侧偏色严重说明光源位置不对称需要调整 LED 角度。良好状态下平面压痕在图像中应呈现均匀的中间色。4.3 数据读取与三维形貌重建示例底层的 CMOS 相机可以直接通过 OpenCV 读取图像核心是采集“参考背景”和“接触变形图”然后做差分。下面是一段简单的 Python 示例演示如何处理原始图像并计算接触区域的像素变化量import cv2 import numpy as np # 读取参考帧未接触状态 ref_img cv2.imread(ref.png, cv2.IMREAD_GRAYSCALE) # 读取接触变形帧 contact_img cv2.imread(contact.png, cv2.IMREAD_GRAYSCALE) # 计算差分图像 diff cv2.absdiff(ref_img, contact_img) # 自适应阈值提取接触区域 _, mask cv2.threshold(diff, 30, 255, cv2.THRESH_BINARY) # 形态学去噪 kernel np.ones((3, 3), np.uint8) mask cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) # 在原图上显示 cv2.imshow(mask, mask) cv2.waitKey(0) cv2.destroyAllWindows()这只是一个基础脚本。真正的三维形貌重建还需要对颜色到法向的映射表做一个“颜色—法向查找表”流程通常是用标准半球压出已知几何变形记录颜色图像根据半球表面的理论法向量建立颜色到法向的对应关系对任意输入图像查找最接近的法向量得到整个接触面的法向场再通过法向场积分重建出表面高度图。高度图重建时我一般使用泊松方程求解方法避免简单的行积分带来的误差累积。这部分 OpenCV 自带的数据结构和库函数不够直接建议用最小二乘法优化。5. 实战应用抓取、纹理识别与品质检测5.1 机器人抓取里的滑动检测GelSight 在机器人抓取领域最成熟的落地方向就是滑动检测。传统方案通常依赖电流环判断电机堵转但电流变化滞后明显。而 GelSight 直接观测接触面的剪切位移能第一时间发现物体微小滑移。我在项目里测试过用三只平行的两指夹爪夹持不同表面粗糙度的物体在夹爪内侧各贴一片 GelSight 模块。当物体开始下滑时算法识别到切向位移场在某个方向上出现一致性增加就立刻让夹爪增大 10% 的持力。整个过程大概在 30 毫秒内完成体感上就像人手感觉到杯子要滑下意识加了点力。5.2 纹理识别与表面缺陷检测因为 GelSight 能达到微米级分辨率所以还可以当接触式显微镜用。拿它扫过一块加工金属表面重建出来的纹理图能看到微小的划痕、凹坑和车刀纹路分辨率接近低倍显微镜。实际做质检的时候不需要像科研那样重建完整高度图可以直接把“参考图”和“待检图”的灰度、频域特征做比较用简单分类器完成缺陷判定。这种方式比传统人工目检稳定也比视觉相机方案抗环境光干扰因为传感器自带密闭光路不受外部光照变化影响。另外在织物、皮革、纸张纹理识别领域GelSight 的“接触成像”模式也非常有优势。传统视觉拍平面纹理容易受到漫反射影响而 GelSight 直接接触获取微观形貌分类精度更高。我见过有人把它用到文物保护里对纸绢表面纤维状态做触摸扫描效果相当不错。5.3 具身智能里的定位与手内操作随着具身智能机器人越来越热GelSight 这类传感器逐渐成为灵巧手“指尖感知”的常见方案之一。因为它体积可以做得很小输出信息维度丰富非常适合深度强化学习做手内操作、小零件装配、柔性线束插拔等任务。我们做控制算法的时候一般会把 GelSight 输出的三维形貌图和剪切位移场当作观测输入的一部分和关节角、关节力矩一起喂给策略网络。相比只用力和位置反馈加入触觉视觉信息之后机器人对物体姿态变化和接触状态的感知显著提升。尤其是插拔 USB、堆叠积木这类精细任务成功率能提高不少。6. 常见问题与排查技巧实录6.1 装好了硬件图像却很暗怎么办这是新手常遇到的问题。原因通常是 LED 供电电流不够或反光层反射率偏低。先检查 LED 驱动电流确认在额定范围内再看弹性体材料本身在可见光波段的透过率。有些硅胶加了固化剂后透明度下降导致光线被散射图像会变得雾蒙蒙。另外还要注意相机曝光时间。 GelSight 内部光路封闭如果不希望外部自然光干扰可以在弹性体外围加一圈遮光罩然后把曝光时间调长一点。反射图像一般不需要太高的曝光5~10 毫秒基本够用。6.2 图像有暗斑或者不规则噪点暗斑基本来自弹性体表面气泡或反光层破损。气泡在浇注阶段就可以预防反光层破损则是使用耗材的自然磨损。解决办法很粗暴重新做一片凝胶。这点不要省便宜的耗材反而会拖慢整个项目进度。不规则的噪点尤其是动态闪烁则要检查供电是否稳定。单片机或电脑 USB 口电压不稳会导致 LED 亮度波动图像灰度曲线会出现周期性的变化。碰到这类问题建议外接稳压电源或将 LED 驱动改为恒流源。6.3 表面重建出来的高度图有“彩虹状”伪影这个问题多半是光源标定没做准确。GelSight 的空间分辨率虽然高但对光源位置非常敏感。如果三色 LED 分布不对称或者发光角度有差异重建时法向场就会带方向性误差高度图看起来会像被水洗过一样有渐变色的伪影。解决方式是用标准半球重新标定并且在采集标定数据时保证按压位置的重复性。最好设计一个简易的定位治具让标准球每次都压在同一个位置和角度这样标定一致性能好很多。下面把我踩过的坑整理成速查表方便你排错时对照现象原因处理方法图像整体偏暗LED 电流不足/曝光过低增加驱动电流延长曝光时间局部暗斑弹性体气泡或反光层破损重新制作凝胶面图像亮度闪烁供电不稳使用稳压恒流电源高度图伪影严重光源标定不准用标准半球重新标定固定压入位置算法实时性不足相机帧率低图像处理太过复杂换全局快门相机优化图像处理流程弹性体回弹慢硅胶硬度过低换硬度更高30~40 Shore A的硅胶7. 经验总结与后续扩展方向做久了 GelSight 相关的项目我自己最深的一点体会是这类传感器的上限其实不取决于光路有多精致而取决于你怎么把图像特征转化成可操作的控制信号。很多团队把检测精度做得很高但在机械臂集成时却发现自己不会用这些数据——因为接触状态和机械臂运动之间隔着复杂的力控策略。所以如果你正要入门我建议从一个小目标开始先用 GelSight 判断一个物体是“静止接触”还是“正在滑动”。只要这个功能稳定了后面做力控、做姿态估计、做缺陷检测都会顺理成章。千万别一上来就追高精度的三维形貌重建那是一条技术深坑很深的路线。另外还有一个小技巧想分享在数据采集时给 GelSight 的图像打上对应的机器人状态标签关节角、力矩、运动速度这组“触觉图像状态数据”的联合数据集对于后续训练神经网络非常有价值。我项目里的很多策略模型靠的就是这种带标签的触觉数据来提升泛化能力。所以从项目第一天起就做好数据规范整理后面能省下你非常多的时间。如果你有兴趣下一步还可以把 GelSight 和多模态大模型结合让机器人通过自然语言描述来理解触觉状态。比如“这个表面比较粗糙”“杯子有点滑”这是具身智能一个值得跟进的方向届时 GelSight 的数据格式与图像数据高度一致迁移起来的潜力也会更大。

相关新闻

从LM393讲透电压比较器:上拉、迟滞与工程调试

从LM393讲透电压比较器:上拉、迟滞与工程调试

/* 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 9:45:32 阅读更多 →
微服务优雅停机实操:Sentinel 摘除流量与 Pod 生命周期 preStop 钩子

微服务优雅停机实操:Sentinel 摘除流量与 Pod 生命周期 preStop 钩子

微服务优雅停机实操:Sentinel 摘除流量与 Pod 生命周期 preStop 钩子在很多互联网研发团队中,发布上线一直是一件让人提心吊胆的“玄学仪式”。 代码在预发环境明明测试得滴水不漏,自动化用例全部飘绿。然而,只要运维在 Kubernete…

2026/10/7 9:45:32 阅读更多 →
OpenShell:在Windows 11上恢复经典开始菜单的完整配置指南

OpenShell:在Windows 11上恢复经典开始菜单的完整配置指南

记得 Windows 11 刚发布那会儿,办公室里有不少同事跑来问我同样一个问题:怎么把开始按钮挪回左下角,让菜单恢复成以前那种传统的双栏样式?说实话,微软这几年在开始菜单上折腾得很厉害——磁贴、推荐内容、固定区域&…

2026/10/7 9:45:32 阅读更多 →

最新新闻

SpringBoot+Vue宠物店管理系统实战:从环境配置到二次开发

SpringBoot+Vue宠物店管理系统实战:从环境配置到二次开发

每年毕业设计和课程设计的节点,都会有一批同学抱着“springbootvue宠物店管理系统(源码文档调试基础修改答疑)”这个项目来找我。压缩包解压得很顺利,一运行不是依赖缺失就是连不上数据库,文档里写了操作步骤却没说清楚…

2026/10/7 10:23:03 阅读更多 →
谁在国内做 AIGC 检测研究?机构、城市与引用量对照(2026 样本)

谁在国内做 AIGC 检测研究?机构、城市与引用量对照(2026 样本)

国内 AIGC 检测研究不是没人做,而是集中在四个城市群——清华/南开/哈工大深圳/鹏城实验室联合发布了中文基准 C-ReD,南开的检测系统已有 1000 月活用户;但中文基准的引用量与国外代表作差了 600 倍,这块蓝海才刚开垦。本文按&quo…

2026/10/7 10:23:03 阅读更多 →
ARP协议详解:原理、GNS3抓包实验与网络排障实战

ARP协议详解:原理、GNS3抓包实验与网络排障实战

做网络这一行,最绕不开的课题就是"排查通与不通"。很多刚入行的朋友一上来就ping、traceroute、翻防火墙策略,折腾半天没思路,其实有相当一部分问题的根源,就藏在一个不起眼的协议里——ARP协议。ARP协议全称Address Re…

2026/10/7 10:23:02 阅读更多 →
AWS S3 Batch Operations 基础场景实战指南:从 CreateJob 到 DeleteJobTagging 的完整操作流程

AWS S3 Batch Operations 基础场景实战指南:从 CreateJob 到 DeleteJobTagging 的完整操作流程

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地…

2026/10/7 10:23:02 阅读更多 →
AI原生架构:从AI加持到以AI为核心的系统设计

AI原生架构:从AI加持到以AI为核心的系统设计

开门见山说个反直觉的观点:绝大多数团队的AI架构,从一开始就错了。他们以为把GPT-4的API接进现有系统,加上几个提示词模板,再套一个向量数据库做检索,就算拥抱了AI。但这不是"AI Native",这是&qu…

2026/10/7 10:23:02 阅读更多 →
Linux文件系统机制解析与故障排查实战指南

Linux文件系统机制解析与故障排查实战指南

前阵子帮朋友处理一台服务器的"灵异事件":应用一直在报磁盘写满,可 df -h 一查, /data 分区明明还剩5GB多的可用空间。再执行 df -i ,才发现分区上的inode使用率已经100%——磁盘"户口本"被耗尽&#x…

2026/10/7 10:22:01 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* 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:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* 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:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* 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:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* 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 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/6 1:18:13 阅读更多 →