摸麻将、挤牙膏,这种动作放在人身上一点都不稀奇,但放在机器人身上就是另一个难度的挑战。我们平时看到的机器人演示大多是搬运、抓取、导航和对话,真正难的是“手感”——表面硬度、摩擦、接触力、局部形变这些信息,机器人都要靠传感和控制去感知并实时反馈。最近这类触觉精细操作的内容被讨论得很多,标题里提到的李飞飞相关研究展示,想解决的正是让机器人具备类似人类的触觉闭环能力。这篇文章我想从触觉感知、力控制、视觉触觉融合、实操落地和问题排查几个角度拆一遍,适合做具身智能、机器人开发、ROS2 应用以及工业自动化方案的同学参考。
在展开细节前先给一个基本判断:这类演示价值不在“机器人会摸一张麻将”,而在于它把机器人从“能碰到”推向了“能感知碰得对不对、能用多大的力继续碰”。这个能力一旦稳定,后面接分拣、装配、护理、精细操作都会顺很多。但如果只是想看热闹,很容易低估背后的传感器、控制频率和任务设计工作量。下面按从原理到实操的顺序讲。
1. 为什么“摸麻将、挤牙膏”这类动作,比“抓杯子”难一档
1.1 抓取是刚性问题,精细操作是非刚性问题
传统机器人抓取一个杯子、一个零件,核心是解决“在哪里”和“怎么抓”。视觉定位物体位置,规划机械臂路径,然后闭合夹爪,夹紧力足够就行。这里大多数部件的形变可以忽略,接触面也相对稳定,误差容忍度在毫米甚至厘米级别。
但“摸麻将”和“挤牙膏”不是这样。麻将牌虽然本身是刚体,但摸的这个动作要求机器人在接触瞬间不推倒牌、不刮花牌面,同时要根据牌的边缘、凹凸纹理调整手指位置和压力。更接近人类的“试探性接触”,而不是简单抓取。挤牙膏就更典型:牙膏管是柔性的,内部膏体状态会变化,挤压位置差一点、力量大一点,出膏量就完全不同。机器人在这个过程中不能只靠视觉看到牙膏管,还要实时感受管壁的阻力、形状变化以及是否已经挤出。
用工程语言说,这类任务包含非刚性接触、局部形变和连续力调节,控制目标不是“到达某个位置”,而是“保持某个接触状态”。这就不是单纯运动规划问题了。
1.2 从“抓得到”到“摸得准”再到“控得住”
我习惯把机器人操作能力分成三档:
- 第一档是抓得到:物体位置固定或半固定,机器人能运动到位,夹爪能闭合。
- 第二档是摸得准:机器人接触物体后能感知接触力、接触点、表面状态,不会因为力度过大破坏物体。
- 第三档是控得住:机器人根据触觉反馈实时调整动作,完成连续任务,比如挤压、揉搓、插拔、打磨、装配。
标题里提到的“摸麻将、挤牙膏”,刚好把第二档和第三档放在一起演示了。摸麻将考的是触觉识别和边缘跟踪,挤牙膏考的是柔顺控制和连续力调节。两者都需要高频反馈,而不是执行一串预编程动作。
1.3 容易低估的细节:接触瞬间最难
不少同学自己搭过机械臂抓取,觉得相机识别加路径规划就够了。但一到精细操作,最先爆掉的就是接触瞬间。机械臂带着一定速度接近物体,接触的几毫秒内,力会突然从 0 跳到很高。如果控制频率不够,或者没有力传感器反馈,就可能直接把麻将推飞,或者把牙膏管挤爆。
这里有一个很关键的工程概念:力控不是“有力传感器就行”,而是“力传感器数据必须进入控制闭环,并且闭环频率要足够高”。很多方案视觉能到 30 帧,但力控制需要的是毫秒级采样和毫秒级指令更新。这也是为什么精细操作比单纯视觉抓取更难落地。
2. 机器人要有“手感”,背后靠的不是单个传感器
2.1 触觉传感是基础,但形态差异很大
要让机器人有手感,首先要有感知接触信息的手段。常见方案包括:
- 单点力传感器:安装在夹爪或末端,反馈接触力的合力。
- 关节力矩传感器:每个关节测量力矩变化,间接判断末端受力。
- 阵列式触觉传感器:像皮肤一样分布在手指表面,能感知接触位置和压力分布。
- 仿皮肤柔性传感器:能做形变检测,适合抓取易碎、柔性物体。
不同方案解决不同问题。摸麻将更需要阵列式触觉,因为要识别牌面纹理、边缘和接触点;挤牙膏更需要末端力控和关节力矩,因为关键在连续挤压过程中维持合适力度。
注意:不要一开始就追求“传感器又多又贵”。先明确你的任务需要哪种反馈。如果只做力控,单点力传感器加上关节力矩就够了;如果要做表面识别,再考虑阵列式方案。
2.2 力控制算法决定了“手感”的柔顺程度
传感器只是眼睛,真正决定手感的是控制算法。目前在精细操作里经常用到的力控思路有三类:
- 阻抗控制:把机器人末端看成弹簧阻尼系统,根据位置偏差计算期望力,适合柔顺接触。
- 导纳控制:把力传感器读数与设定目标作比较,调整末端速度或位置,适合接触式作业。
- 力位混合控制:在某些方向做位置控制,在其他方向做力控制,适合插孔、打磨、装配等有几何约束的任务。
挤牙膏这类任务比较适合导纳控制或阻抗控制。控制器的目标是让机器人像人手一样“感觉到阻力就停一停,感觉到太滑就加一点力”,而不是机械地按固定轨迹往下压。
2.3 视觉和触觉必须融合,不能只看一个
如果只有视觉,机器人能看到牙膏管在哪里、麻将在哪,但看不到接触力是否合适。如果只有触觉,机器人知道已经碰到了,却不知道目标在空间中大致什么位置,找起来会非常慢。
实际方案通常是:
- 视觉先做粗定位,确定目标物体大致位置和朝向。
- 机器人末端运动到接近位置,速度降低。
- 触觉或力传感器在接触后接管,做精细调整。
视觉负责“找”,触觉负责“摸”。这在两个传感器坐标系标定好之后才有效。很多人做视觉引导失败,不是模型不好,而是相机坐标系和机械臂基坐标系没有对齐,导致机器人看着位置对,实际末端的误差已经超出了接触容差。
2.4 仿真平台和真实环境要分开论证
很多团队在动手前会先用仿真平台验证算法,尤其是涉及强化学习的数据采集。常见的做法有:
- 用物理仿真器搭一个麻将桌或牙膏管模型。
- 在仿真里调试力控参数,验证算法的趋势是否合理。
- 再把策略迁移到真实机器人上。
这里要提醒一点:仿真里能跑通,不代表真机直接能用。触觉传感器的噪声、机械臂的传动间隙、表面摩擦力差异,都是仿真很难完全还原的。我的建议是仿真只用来验证控制逻辑和参数范围,真机测试仍然要从低速、低力开始。
3. 实操复现前,先确认你手上的条件能支撑哪种级别
3.1 不同目标的资源配置完全不同
同样是“机器人摸麻将挤牙膏”,学习测试、完整 Demo、接近生产环境这三类目标需要的条件差别很大。
| 目标 | 机械臂 | 传感要求 | 计算平台 | 调试重点 |
|---|---|---|---|---|
| 学习验证 | 普通六轴或四轴机械臂 | 末端力传感器或关节力矩 | 普通工控机或高性能 PC | 力控算法、接触判断 |
| 完整演示 | 重复定位精度较高的机械臂 | 末端力传感器加视觉定位 | 中高性能GPU主机 | 视觉触觉融合、任务编排 |
| 接近生产 | 高精度、低延迟机械臂 | 阵列触觉、关节力矩、外部视觉 | 实时系统或高频控制卡 | 稳定性、重复精度、故障恢复 |
如果你只是自己学习,不一定要买很贵的设备。先用带关节力矩反馈的桌面机械臂,加上一个夹爪和视觉相机,就能跑一个简化版“摸麻将”。挤牙膏会更难一些,因为柔性物体对力控频率和传感器精度要求更高。
3.2 软件环境建议按主流通用方案搭
在机器人开发里,比较常见的组合是:
- 系统:Ubuntu 或带有实时内核的 Linux 系统。
- 中间件:ROS2,负责节点通信、话题订阅和任务调度。
- 运动控制:机械臂厂商提供的驱动或 ROS2 控制插件。
- 视觉模块:OpenCV、目标检测模型或传统视觉定位。
- 仿真验证:Gazebo、MuJoCo、Isaac Sim 等平台都可以,关键在于选择适合自己机器人和传感器模型的。
不要所有环节都自己造轮子。如果机械臂厂家给了 ROS2 接口,优先用现成驱动,把精力放在触觉数据和力控闭环上。原始材料中没有给出具体版本号,落地时先确认你买的设备支持哪个 ROS2 版本,再选择对应的控制插件。
3.3 任务设计要拆成“能验证的单元”
很多人一开始就做完整流水线:识别麻将、走到桌前、摸牌、再拿起牙膏挤压。这会让问题变得很难排查,因为一旦失败,你不知道是识别问题、路径问题、接触问题还是力控问题。
建议拆成四个独立单元:
- 视觉定位单元:输入图像,输出麻将或牙膏管的坐标和朝向。
- 接近运动单元:控制机器人末端运动到目标上方固定距离。
- 接触感知单元:低速下压,用触觉或力数据判断是否接触,并记录接触力曲线。
- 精细操作单元:根据力反馈调整末端位姿,完成推牌或挤压动作。
先让每个单元单独跑通,再串起来。这样做的好处是,后面出问题可以快速定位到具体环节。
4. 怎样从零搭一个触觉精细操作闭环
4.1 第一步:用视觉定位,但别把坐标压得太死
我这里用“摸麻将”举例。视觉模块可以先识别麻将牌的位置和角度,输出一个粗略的末端目标点。注意,这里不需要把目标点算到每个像素都精确,因为触觉接触阶段会做微调。视觉只要保证机器人能够到麻将附近,并且不会碰到别的东西就行。
相机到机械臂的坐标标定要做,否则视觉坐标和机器人坐标对不上。最简单的方式是“眼在手外”,把相机固定在支架上,标定相机相对机械臂基座的变换关系。如果“眼在手上”,相机装在机械臂末端,标定逻辑会略有不同,但核心都是坐标系统一。
4.2 第二步:低速接近,触觉判断接触
接近阶段最关键的不是快,而是安全。控制机器人以较低速度向麻将牌表面移动,比如先按 5 到 10 毫米每秒的速度逼近。当力传感器读数超过一个很小的阈值,比如 1 到 2 牛,就认为已经接触。
这个阈值要根据你的传感器量程、机械臂负载和任务对象来调整。麻将是硬的,阈值可以稍微高一点;如果是软物体,阈值必须非常低。判断接触这一步,控制频率越高越稳。低频控制下,机械臂可能一下子就压过头了。
# 伪代码示例:接触检测与力控接近 while True: current_force = read_force_sensor() if current_force > contact_threshold: stop_moving() break move_along_surface_normal(speed=5) # 单位 mm/s这是一个非常简化的示意。实际运行时,还需要保护机械臂不超程、不超速,并且要处理传感器噪声。建议加滑动窗口滤波,不要用单次读数直接做判断。
4.3 第三步:设计力控参数,先小后大
接触之后,就要切换到力控模式。这时控制目标变成了“维持目标接触力”,而不是“移动到目标位置”。如果机器人要继续沿牌面滑动,就需要一边控制滑动速度,一边控制垂直方向的接触力。
常用做法是导纳控制反馈环:测量当前力与目标力的误差,把误差换算成速度或位置修正量,再发给底层运动控制。
# 伪代码示例:导纳控制核心逻辑 force_error = target_force - current_force velocity_adjustment = velocity_gain * force_error # 把调整量叠加到滑动速度上,更新末端指令 command_velocity = sliding_speed + velocity_adjustment send_motion_command(command_velocity)这个代码里,velocity_gain 很关键。调得太大,系统容易振荡,机器人会在牌面上来回抖;调得太小,接触力跟不上,摸牌动作会显得很钝。经验上先从小增益开始,观察力曲线是否平滑,再逐步增大。
4.4 第四步:用“挤牙膏”验证连续力调节能力
摸麻将更偏接触识别,挤牙膏则更偏连续力控制。如果你已经能控制接触力,可以把任务升级成“挤压牙膏管并保持出膏量稳定”。这里需要同时满足两个条件:
- 接触点位置不能偏太多,否则挤不出来或者挤飞。
- 挤压力度要能动态调整,因为牙膏管内部状态会随着挤压过程变化。
一个可行的验证方式是:先固定牙膏管,控制机器人末端从侧面接触,然后按一个非常低的速度推进。观察力传感器曲线,看看推进过程中力是线性上升,还是突然跳变。如果出现跳变,通常是接触状态发生了变化,比如管壁褶皱或者末端打滑。连续记录这一条曲线,就能判断你的力控环路到底稳不稳。
4.5 验证指标:不能只看“成功了没有”
判断一个精细操作方案是否可行,不能只看最终挤没挤出来、牌摸没摸到。建议记录以下指标:
| 指标 | 含义 | 怎么判断 |
|---|---|---|
| 接触力误差 | 实际接触力与目标力的差值 | 差值越小,力控越准 |
| 力控制响应时间 | 从力变化到机器人修正动作的时间 | 越短越好,但受限于控制频率 |
| 接触稳定性 | 连续 10 次到 20 次任务的成功率 | 低于 80% 说明参数或策略不稳定 |
| 任务耗时 | 从启动到完成的时间 | 精细化任务不能只看快,还要看准 |
| 异常情况恢复 | 打滑、接触不到、力突变时是否能安全退出 | 生产环境必须考虑 |
批量测试时,建议每次任务都保存日志,包含时间戳、位置、力数据、最后结果标记。这样出了问题可以回放,而不是等到失败后再猜原因。
5. 关键参数怎么调,调到哪里算合理
5.1 力控参数不是越硬越好
力控系统有几个核心参数:目标力、力容差、导纳增益、刚度、阻尼、滑动速度、控制周期。很多人一开始会把增益调高,觉得这样响应快。结果就是机器人一碰到东西就来回震,或者把麻将直接压飞。
一个更稳妥的顺序是:
- 先把滑动速度和接近速度降到很慢,比如 5 mm/s 甚至更低。
- 再把目标力设成传感器量程的 10% 到 20%,不要一开始就设很大。
- 导纳增益从 0.1 这样的小值开始,逐步增加。
- 每次改完参数,连续跑至少 5 次,记录力的曲线。
如果力曲线在目标值附近小幅度波动,系统是稳定的。如果出现持续振荡,立即减小增益。如果力曲线始终达不到目标值,检查是不是接近速度太慢或者电机输出受限。
5.2 采样频率和控制频率要分开看
触觉传感器的采样频率,和机器人力控回路的控制频率,是两个概念。传感器可能每秒输出几千个数据点,但底层机器人接口不一定能按这个频率接收指令。如果控制频率只能到 100 赫兹,而传感器采样是几千赫兹,中间需要做降采样和滤波,而不是直接把所有数据灌进控制循环。
判断标准:
- 控制频率至少是机械臂机械固有频率的 5 到 10 倍,才能避免明显振荡。
- 如果无法提高控制频率,就把任务速度降低,给控制回路更多响应时间。
- 低频率下做力控,宁可动作慢一点,也不要让它剧烈调整。
实际操作中,很多桌面机械臂的底层控制频率不高。遇到这种情况,建议不要强行做高动态力控,先把任务拆成慢速分段操作。
5.3 触觉传感器数据需要预处理
从传感器读取的原始数据一般不能直接用。常见处理包括:
- 低通滤波:去除高频噪声。
- 滑动平均:平滑短期波动,但会引入延迟。
- 中值滤波:处理异常毛刺更有效。
- 标定补偿:不同安装姿态下,传感器零点不一样,需要在每次启动时重新校准。
我在实测中发现,不少“力控不稳”的问题都不是算法问题,而是传感器零点漂移。机械臂换个姿态之后,末端零受力时的读数已经不是 0。如果没做零点校准,力控系统会一直以为有外力,末端会一直推着物体走。
注意:每次更换机械臂末端工具、重新安装传感器后,都要重新标定零点。不要拿上一轮的标定结果直接跑新任务。
6. 常见问题与排查链路
6.1 接触不到物体,或者接触力始终为 0
先看传感器:用双手轻推传感器,确认读数会不会变化。如果读数不变,说明传感器没接好、供电异常或通信中断。再看坐标:视觉给的目标位置是否在机械臂可达空间内。然后看速度:如果接近速度太慢或者目标位置偏了,可能一直碰不到。可以先用一个示教按钮手动控制末端,让它明确接触物体,再去看力数据。
排查顺序是:传感器读数正常吗 -> 坐标是否对得上 -> 路径是否可达 -> 速度是否过慢。
6.2 接触后力突然暴涨,一下就压坏物体
这个现象很常见,原因是接近速度过快,或者控制频率太低。机器人接触后,第一次力反馈还没进入控制循环,末端已经往前多走了几毫米。硬物体下,几毫米就会让力变得非常大。
处理方式:
- 降低接近速度。
- 在接触判断阶段就把速度限制到很低。
- 增加软限位,当力超过安全阈值时立即急停。
- 检查控制频率,不要只看传感器采样频率。
如果已经压坏两次物体,就不要继续调高速度了。先把接近速度降到一个绝对保险的值,比如 2 mm/s,跑通后再慢慢加快。
6.3 机器人接触到物体后发生抖动或振荡
振荡通常有三个来源:
- 导纳或阻抗增益过大,系统进入正反馈。
- 控制频率过低,每个控制周期都要很久才能响应力变化。
- 机械臂本身传动间隙或柔性大,末端接触时会产生额外弹性。
优先把增益降下来。如果降了还抖,就再降低速度。如果还抖,检查机械臂安装面是否稳固,桌子和固定支架是否有明显晃动。很多时候不是算法问题,是固定结构不够稳。
6.4 视觉说“碰到了”,但力传感器没有反应
这类问题一般出在坐标偏差上。视觉检测到的目标位置和机器人真实执行位置可能存在几毫米偏差。由于麻将牌有一定厚度,如果机械臂末端停在牌面上方还没真正接触,视觉上看起来“已经在物体附近”,但力传感器确实没有受到力。
解决方法是引入一个“试探作业”动作:控制末端在目标位置附近上下或左右做小范围搜索,同时监测力传感器,直到检测到接触。这个思路简单有效,非常像人用手在桌面上摸找小物件。
6.5 仿真里稳定,真机一跑就废
主要原因包括:
- 仿真里的摩擦系数、质量、惯性参数太理想。
- 传感器噪声没有被建模。
- 控制周期在仿真里远超真机。
- 机械臂动力学模型和真机存在偏差。
面对这种情况,建议先做最简单的真机接触实验,不跑完整任务。让机器人以极慢速度和恒力接触一个硬平面,记录力曲线,再和仿真对比。如果曲线趋势一致,再逐步增加任务复杂度。
7. 这些能力离落地还有多远,以及下一步怎么走
7.1 精细操作能力最可能在哪些场景先落地
从控制难度来看,工业装配、分拣、打磨、插拔线缆这类重复性高、接触过程可定义的任务,会比家庭服务更早落地。因为工业场景可以把物体固定,任务边界清晰,传感器安装和维护也更有条件。家庭环境里物体摆放混乱、光照变化大、物体种类多,触觉精细操作要解决的问题会加倍。
医疗辅助是另一个方向,但门槛更高,涉及安全认证、力控冗余和风险评估。短期内更适合作为研究和实验性项目,普通开发者可以先不用把自己卷进去。
7.2 从“单任务演示”到“可复用能力”,中间缺什么
摸麻将挤牙膏这类演示,可以证明机器人具备精细操作的基础能力。但要变成可复用能力,还需要补几块:
- 更多数据:不同材质、不同硬度、不同表面状态的物体数据。
- 更稳定的传感器:长期使用不漂移、耐磨、成本可控。
- 更通用的力控策略:不是每个物体都要重新调参数。
- 更好的仿真到真机迁移方法:减少仿真与真机的差异。
- 任务级规划能力:机器人知道什么时候该摸、该推、该挤、该停。
如果你是自己做学习项目,可以先不管后面的部分。把单任务做到 20 次内有 18 次成功,再考虑增加物体种类和场景变化。如果一上来就追求泛化能力,大概率会被问题淹没。
7.3 我的建议:先做一个只含一项硬指标的闭环
摸麻将和挤牙膏都有比较明确的量化指标。摸麻将可以看重合度、推牌偏移、接触力峰值;挤牙膏可以看挤出的长度、出膏量、管壁是否破裂。做项目时不要同时优化三个指标,选一个最关键的先死磕。
比如先盯住“接触力峰值不超过某个安全值”。只要这个指标稳定,再去增加速度。等速度和力都能控制住,再加视觉干扰。这种递进式验证,比一上来就做完整场景更能积累经验。
7.4 后续扩展方向
如果这个方向你已经跑通,可以考虑往下走:
- 接入机械臂夹爪,把单指接触扩展到多指抓取。
- 加入移动底盘,让机器人先导航到工作区,再做精细操作,把“机器人导航”和“末端操作”串起来。
- 用强化学习在仿真里训练接触策略,再迁移到真机,但这需要比较稳定的仿真模型和训练环境。
- 把整个流程封装成 ROS2 节点,方便以后复用和排查。
最终衡量这个领域进展的,不是某个演示视频多惊艳,而是机器人能不能在无人干预的情况下,连续完成几十次精细操作而不出错、不损坏物体。这也是从“AI 有了手感”这种话题,走向真实生产力时真正要面对的技术核心。