资讯动态

六维力传感器在机器人柔顺控制中的应用:阻抗与导纳控制实践

发布时间:2026/8/5 16:59:35 来源:尧图企业网站定制
1. 项目概述从“硬碰硬”到“刚柔并济”的进化在机器人或精密机械臂的末端装上一个六维力/力矩传感器然后让它去完成一个看似简单的任务——比如拧紧一个瓶盖或者将一块电路板精准地插入卡槽。如果你只是用传统的位置控制编程告诉它“以多大的力、多快的速度、沿着哪条精确的轨迹”去执行结果往往会让你失望。要么是瓶盖拧花了要么是电路板的引脚被压弯。原因很简单现实世界不是理想的数字模型存在微小的位置误差、零件的公差、以及无法预知的微小扰动。这时候阻抗控制和导纳控制这两种基于力交互的策略就登场了。它们不再是让机器人“一根筋”地走到某个点而是让它学会“感受”环境像人的手臂一样根据接触力的大小和方向动态调整自己的“刚度”和“阻尼”实现一种柔顺、安全的交互。这个项目就是围绕如何利用六维力/力矩传感器提供的实时力反馈来实现这两种高级控制模式的一次深度实践。简单来说你可以把机器人末端想象成你的手。阻抗控制好比是你主动伸出去的手你心里预设了手的“软硬”程度比如握鸡蛋时很轻柔推门时很用力当手碰到物体时会根据接触力的大小自动产生一个微小的位移或姿态调整。导纳控制则更像是你的手被动地接受引导当有外力比如别人推你的手作用时你的手会根据这个力的大小和方向产生一个相应的运动。前者是“以位移响应力”后者是“以力产生位移”。而这一切感知的基础就是那个能同时测量三个方向力和三个方向力矩的六维力/力矩传感器它是机器人获得“触觉”的关键器官。这个项目适合所有对机器人高级控制、力控交互、精密装配、医疗康复机器人等领域感兴趣的工程师和研究者。无论你是想解决工业场景下的柔顺装配难题还是探索人机协作的安全交互理解并实现基于六维力传感器的阻抗/导纳控制都是一个无法绕过的核心技能。接下来我将拆解从传感器数据解读到控制环路实现的完整链条分享我在实际调试中踩过的坑和总结出的经验。2. 核心思路与方案选型为什么是“六维”与“阻抗/导纳”在深入代码和参数之前我们必须先理清两个根本问题第一为什么必须是六维力/力矩传感器第二在阻抗和导纳之间如何根据应用场景做选择这直接决定了整个系统的架构和性能天花板。2.1 六维传感器的不可替代性很多初学者会问我只需要测量接触力用一个一维的力传感器不行吗或者用多个一维传感器组合答案是对于需要复杂力交互的场景不行。六维传感器提供的是一个完整的空间力矢量信息Fx, Fy, Fz, Mx, My, Mz。这至关重要原因有三解耦接触状态当机械臂末端工具比如一个抓手或一个打磨头与物体接触时产生的力通常不是纯轴向的。一个斜向的接触可能同时产生压力和剪切力甚至伴随扭转力矩。仅测量单一方向的力会丢失绝大部分交互信息导致控制系统误判。例如在插轴入孔的任务中你需要同时感知轴向的插入阻力和径向的卡滞力矩由不对心引起才能做出正确的调整。计算作用点通过六维力/力矩信息结合末端工具已知的几何模型可以反算出接触力在工具上的作用点。这对于像抛光、去毛刺这类需要控制接触区域和压力分布的应用至关重要。你知道力的大小还得知道力作用在哪里。实现真正的柔顺阻抗/导纳控制的目标是让末端呈现期望的动力学特性质量-阻尼-刚度。这需要在笛卡尔空间三维位置三维姿态进行控制。因此我们需要对应六个自由度的力/力矩反馈才能独立地控制每个方向上的“软硬”程度。想象一下你希望机器人在Z方向上下很柔软以缓冲冲击但在X、Y方向水平保持刚性以维持稳定这就需要独立的六维力感知和控制。注意六维传感器价格昂贵且安装要求高需串联在末端法兰和工具之间。务必确保传感器量程覆盖你的最大预期负载并留有一定余量。安装时要保证传感器受力轴线与机械臂末端坐标系对齐否则需要进行复杂的坐标变换和力矩补偿这会引入额外误差。2.2 阻抗控制 vs. 导纳控制内在逻辑与选型指南这是两种看似相似、实则内核迥异的控制哲学。选择哪一种取决于你的硬件能力和任务需求。阻抗控制的核心公式是M * Δẍ D * Δẋ K * Δx F_ext。这里M、D、K是你设定的期望惯性、阻尼和刚度矩阵Δx是实际位置与期望位置的偏差F_ext是传感器测量的外部接触力。这个公式描述了一个“虚拟的弹簧-质量-阻尼系统”。当有外力F_ext作用时这个虚拟系统就会产生位移偏差Δx。控制器的工作就是计算出这个Δx然后让位置控制器去跟踪“期望位置 Δx”。优点对力传感器的噪声和延迟相对不敏感。因为力信号是作为“目标”输入到阻抗模型的模型本身有一定的滤波和缓冲作用。实现上它是在位置控制环的外层增加了一个力反馈环通常更稳定。缺点需要高性能、高带宽的位置控制器。因为最终的执行机构是位置环如果位置环的响应跟不上阻抗模型计算出的位移指令整体性能就会受限。在与非常刚性的环境接触时可能需要极高的位置控制精度。典型场景工业装配如齿轮啮合、插板、与人协作机器人需要对外力做出柔顺反应、轮廓跟踪如用恒力打磨曲面。导纳控制的核心公式是F_ext M * ẍ_d D * ẋ_d K * x_d。注意这里F_ext是测量值而x_d、ẋ_d、ẍ_d是需要求解的期望位移、速度和加速度。控制器根据测量到的力F_ext直接解算出机器人末端应该产生的运动指令位移、速度或加速度。优点能产生非常直接和快速的位置响应。因为它直接将力映射为运动指令绕过了内环位置控制器的动态限制在应对快速变化的外力时可能更敏捷。缺点极度依赖力传感器的质量和信号质量。传感器任何的噪声、延迟或漂移都会直接转化为不受控的运动抖动或偏移容易引发系统不稳定。它对环境的刚性也更敏感。典型场景直接示教人手直接牵引机器人运动、力引导在精密手术中医生施加的微小力被精确放大为器械运动、与高动态环境交互。我的选型经验对于绝大多数工业应用和稳定性要求高的场景我推荐从阻抗控制入手。它的稳定性更好调试更直观。导纳控制更像一个“性能怪兽”但驯服它需要极好的硬件高精度、高带宽、低噪声的力传感器和伺服系统和精细的参数整定。在项目中我通常先实现阻抗控制作为基础在需要极低延迟的力引导场景下才会考虑挑战导纳控制并且一定会加上严格的力信号滤波和饱和限幅。3. 系统搭建与核心环节实现理论清晰后我们进入实战环节。一个完整的基于六维力传感器的控制系统通常包含以下几个核心模块传感器信号处理、坐标变换、阻抗/导纳模型计算、以及与机器人控制器的集成。3.1 硬件连接与传感器信号处理首先将六维力传感器安装在机械臂末端法兰和工具或手爪之间。通过电缆将传感器连接到其配套的放大器或数据采集卡再通过以太网如EtherCAT或实时总线如CANopen连接到上位机通常是工控机或实时系统。第一步原始信号读取与零漂补偿传感器输出的原始信号通常是经过放大的电压值或数字值。你需要根据传感器厂家提供的标定矩阵将其转换为物理单位N, Nm的力和力矩。这一步最关键的操作是“清零”。在机器人处于静止、末端未接触任何物体的“自由空间”状态下连续采集一段时间如5秒的力/力矩数据计算其平均值。这个平均值就是当前的零漂Offset。后续所有读数都应先减去这个零漂。# 伪代码示例零漂补偿与单位转换 import numpy as np # 假设 raw_data 是从总线读取的6维原始数组 # calibration_matrix 是从传感器标定文件加载的6x6矩阵 # offset 是预先采集并保存的零漂向量 def process_ft_sensor(raw_data, calibration_matrix, offset): # 转换为物理量 ft_physical calibration_matrix raw_data # 零漂补偿 ft_compensated ft_physical - offset return ft_compensated # 单位[Fx, Fy, Fz, Mx, My, Mz]实操心得零漂会随温度和时间缓慢变化。在生产环境中我通常会设计一个“自动清零”按钮或程序段。在确保安全的前提下让机器人运动到一个固定的“零位”自由空间自动执行零漂采集和更新。切勿在传感器受力状态下清零否则会导致控制逻辑完全错误。第二步低通滤波力传感器信号中不可避免含有高频噪声来自电机振动、结构共振等。直接将其输入控制环路会引起振荡。必须进行低通滤波。我常用的是一阶低通滤波器或巴特沃斯低通滤波器截止频率根据你的控制周期和任务动态性来设定。对于大多数慢速交互任务频率10Hz将截止频率设在20-50Hz是个不错的起点。class FirstOrderLowPass: def __init__(self, cutoff_freq, control_period): dt control_period RC 1.0 / (2 * np.pi * cutoff_freq) self.alpha dt / (RC dt) self.prev_value 0.0 def update(self, new_value): filtered self.alpha * new_value (1 - self.alpha) * self.prev_value self.prev_value filtered return filtered # 对6个通道分别实例化滤波器 ft_filters [FirstOrderLowPass(cutoff_freq30.0, control_period0.002) for _ in range(6)] filtered_ft np.array([f.update(val) for f, val in zip(ft_filters, ft_compensated)])3.2 坐标变换将力映射到正确的控制空间这是最容易出错的一步。传感器测量到的力/力矩是作用在传感器坐标系下的。而我们的阻抗/导纳模型通常在机器人末端工具坐标系TCP或笛卡尔基坐标系下定义。因此必须进行坐标变换。力矢量变换力矢量是自由矢量在不同坐标系间变换只需要旋转。F_tcp R_sensor_to_tcp * F_sensor其中R_sensor_to_tcp是从传感器坐标系到工具坐标系的旋转矩阵这由你的机械安装几何关系决定可以通过“四点标定法”或工具标定获得。力矩矢量变换力矩矢量的变换不仅涉及旋转还涉及力作用点变化带来的附加力矩。M_tcp R_sensor_to_tcp * M_sensor P_tcp_sensor × (R_sensor_to_tcp * F_sensor)其中P_tcp_sensor是从工具坐标系原点到传感器坐标系原点的位置矢量在工具坐标系下表示×表示叉乘。为什么这步至关重要如果你忽略了力矩变换中的叉乘项当工具不是对称结构或传感器不安装在末端时你计算出的力矩信息将是错误的。这会导致机器人在接触时产生错误的旋转补偿比如在推一个物体时末端却发生了不必要的扭转。3.3 阻抗控制环路的实现细节我们以更常用的阻抗控制为例拆解其实现步骤。假设我们已获得在工具坐标系下滤波后的接触力/力矩F_ext_tcp。步骤1定义期望阻抗参数这不是一组固定的数而是一组6x6的对角矩阵假设各自由度解耦分别代表在X, Y, Z, Rx, Ry, Rz方向上的期望质量(M)、阻尼(D)、刚度(K)。例如# 期望阻抗参数 (对角矩阵) M_d np.diag([5.0, 5.0, 5.0, 0.5, 0.5, 0.5]) # 质量/惯性平移单位kg旋转单位kg*m^2 D_d np.diag([80.0, 80.0, 80.0, 10.0, 10.0, 10.0]) # 阻尼Ns/m 或 Nms/rad K_d np.diag([800.0, 800.0, 800.0, 100.0, 100.0, 100.0]) # 刚度N/m 或 Nm/rad刚度K决定了“软硬”。K值越大产生单位位移需要的力越大机器人表现得越“硬”。与环境接触时通常希望设置较小的K值以避免产生过大接触力。阻尼D决定了运动的“顺滑”程度。D值过小系统会振荡D值过大系统响应迟钝。通常根据临界阻尼公式D_critical 2 * sqrt(M * K)来初选。质量M通常设置为一个较小的值如1-10kg以模拟轻巧的末端动力学。在位置控制模式中有时可以忽略设为0因为机器人本体的惯性已经很大。步骤2计算位置偏差根据阻抗模型公式M * Δẍ D * Δẋ K * Δx F_ext我们需要解出位置修正量Δx。在离散控制中一个常见且稳定的方法是将其视为一个二阶微分方程并采用数值积分求解。更工程化的方法是使用导纳形式的内核即把阻抗模型看作一个导纳关系由力F_ext产生运动Δx。我们可以简化处理在控制频率足够高时忽略加速度项或将其并入阻尼项主要用PD模型来近似Δx K^{-1} * (F_ext - D * Δẋ)其中Δẋ可以用上一次的Δx差分得到。为了更精确我会实现一个完整的二阶离散积分器。def impedance_control_step(F_ext_tcp, dt, M_d, D_d, K_d, prev_delta_x, prev_delta_x_dot): 计算基于当前接触力的位置修正量 F_ext_tcp: 工具坐标系下的6维力/力矩 dt: 控制周期 返回: delta_x (位置修正), delta_x_dot (速度修正) # 简化计算解算加速度偏差 # M_d * delta_x_ddot D_d * delta_x_dot K_d * delta_x F_ext_tcp # 离散化求解 delta_x_ddot delta_x_ddot np.linalg.inv(M_d) (F_ext_tcp - D_d prev_delta_x_dot - K_d prev_delta_x) # 积分得到速度和位置 delta_x_dot prev_delta_x_dot delta_x_ddot * dt delta_x prev_delta_x delta_x_dot * dt # 可选对delta_x进行限幅防止修正量过大 delta_x np.clip(delta_x, -0.01, 0.01) # 例如限制在±1cm内 return delta_x, delta_x_dot步骤3生成最终位置指令机器人的底层位置控制器通常由机器人厂商提供接收一个绝对的目标位姿。因此最终的指令是X_command X_desired Δx其中X_desired是原本规划好的笛卡尔空间路径点如果没有路径可能就是上一个指令点或当前位置。然后将X_command发送给机器人的位置伺服接口。步骤4重力与惯性力补偿一个至关重要的细节是传感器测量到的F_ext_tcp不仅包含环境接触力还包含工具自身的重力和机器人运动产生的惯性力。我们必须将其补偿掉才能得到真正的“外部接触力”。重力补偿在工具坐标系下根据工具的质量、质心位置和当前姿态下的重力方向计算出重力在传感器上产生的力和力矩然后从原始读数中减去。惯性力补偿如果机器人运动加速度很大还需要根据工具的质量和角加速度计算惯性力和惯性力矩并进行补偿。这部分计算较复杂在低速应用中有时可以忽略。避坑指南重力补偿不准确是导致力控抖振或稳态误差的最常见原因。务必精确测量或辨识工具的质量和质心。一个实用的方法是让机器人以多种不同姿态静止记录传感器读数这些读数理论上就是工具重力在不同方向的分量通过多组数据可以反算出质量和质心。4. 参数整定与调试实战阻抗控制参数M, D, K的整定是决定性能好坏的关键。这不是一个纯数学问题而是一个结合了模型、经验和反复测试的工程过程。4.1 调试环境搭建与安全准备安全第一在调试力控程序时必须做好物理隔离和软件限位。物理在机器人工作区域加装安全围栏调试时人员站在围栏外。末端使用柔软、易变形的工具如海绵块进行初始接触测试。软件在控制程序中设置严格的位置、速度和力阈值。一旦超过立即触发保护性停止。例如设置接触力阈值如20N超过则停止运动限制阻抗控制产生的最大位置修正量Δx。调试步骤自由空间测试让机器人在无接触情况下运行。此时理论上F_ext应为零补偿后Δx也应为零。观察末端是否有不期望的“蠕动”或振荡。这可以检验你的零漂补偿、重力补偿和滤波器参数是否合适。静态接触测试让机器人末端缓慢接触一个固定、刚度已知的平面如一块硬质平板。编程让它向平面方向以低速移动。观察接触发生后F_ext的变化以及机器人是否按照预期的柔顺性由K决定停止或反弹。绘制力-位移曲线看其斜率是否接近你设定的K值。动态交互测试进行简单的交互任务如用恒力按压表面、沿表面滑动等。4.2 参数整定经验法则刚度K起点从较小的值开始。对于与刚性环境接触K值可能在200-1000 N/m之间对于需要非常柔顺的交互如与人接触可能低至50 N/m或更小。调整增大K值机器人更“硬”抵抗位置扰动的能力更强但接触力冲击更大。减小K值更“软”但可能显得“绵软无力”定位精度下降。在装配任务中通常需要较小的K值来吸收位置误差。阻尼D起点使用临界阻尼公式D_critical 2 * sqrt(M * K)计算理论值作为起点。对于平移自由度M取1-5kg对于旋转自由度M取0.1-0.5 kg*m^2。调整这是抑制振荡的关键参数。如果机器人接触后产生“颤抖”或持续振荡说明阻尼不足需要增大D值。如果机器人运动响应明显变慢、迟滞像在“糖浆”中运动说明阻尼过大需要减小D值。我的经验是实际使用的D值通常略大于临界阻尼计算值过阻尼这样系统更稳定虽然响应稍慢一点。质量M在大多数基于位置控制器的阻抗控制实现中M的影响较小甚至可以设为零或一个很小的值。因为它主要影响加速度响应。如果你设置了较大的M值会让系统感觉“笨重”响应变慢。一个实用的调试流程表现象可能原因排查与调整方向自由空间下末端抖动1. 力传感器零漂不准或漂移2. 滤波器截止频率过高3. 重力补偿误差大1. 重新执行精确的零漂采集。2. 降低低通滤波器截止频率如从50Hz降至20Hz。3. 重新标定工具质量与质心。接触时产生剧烈振荡1. 阻尼D太小2. 刚度K太大3. 控制周期过长或通信延迟大1. 大幅增加阻尼系数D。2. 适当减小刚度K。3. 检查控制循环频率确保高于100Hz优化通信链路。接触后反应迟钝像被粘住1. 阻尼D太大2. 滤波器截止频率过低3. 位置修正量Δx被过度限幅1. 逐步减小阻尼系数D。2. 适当提高滤波器截止频率。3. 检查并放宽Δx的限幅值。沿表面滑动时力波动大1. 表面摩擦不均匀或传感器噪声2. 阻抗参数在切向和法向未解耦3. 期望力设置不合理1. 检查传感器信号增加滤波确保接触表面平整。2. 分别调整切向X,Y和法向Z的刚度/阻尼。3. 对于恒力滑动可能需要引入积分项I来消除稳态误差。不同姿态下力控表现不一致重力补偿不准确这是最典型的标志。必须重新进行精确的工具动力学参数质量、质心、惯性张量辨识。4.3 高级技巧自适应与混合控制基础阻抗控制调试稳定后可以考虑更高级的策略来提升性能刚度调度让刚度参数K根据任务阶段动态变化。例如在接近阶段保持高刚度以快速定位在接触瞬间切换到低刚度以实现柔顺在保持接触时再适当增加刚度以维持稳定。力/位混合控制这是更强大的范式。在笛卡尔空间的某些方向如法向进行力控制阻抗控制而在其他方向如切向进行位置控制。这需要将传感器测量的力分解到不同的控制子空间。例如在抛光任务中法向压向表面采用力控制保持恒压切向沿表面移动采用位置控制跟踪轨迹。加入积分项在阻抗模型中加入积分项即K_i * ∫Δx dt可以消除稳态力误差实现真正的“恒力”控制。但积分项要谨慎使用必须加抗饱和限幅否则容易导致系统不稳定。5. 常见问题排查与性能优化实录即使按照上述步骤操作在实际部署中你依然会遇到各种棘手问题。下面是我在多个项目中总结出的“故障排查清单”和优化技巧。5.1 力信号相关的问题问题1力读数存在周期性尖峰或抖动。排查首先区分是电气噪声还是机械振动。让机器人完全静止观察信号。如果静止时信号平稳运动时出现抖动很可能是机械振动通过结构传递到传感器。解决机械检查传感器安装是否牢固所有螺栓是否按厂家要求扭矩拧紧。在传感器与法兰/工具之间使用高质量的硬化钢垫片避免使用软性垫片。优化机器人轨迹减少急停急启。电气确保传感器供电稳定信号线远离电机动力线使用屏蔽线并做好单端接地。软件进一步降低低通滤波器的截止频率。可以尝试使用陷波滤波器专门滤除已知的共振频率可以通过频谱分析找到。问题2力读数存在缓慢漂移温漂。排查这是六维力传感器的常见现象尤其是应变片式传感器对温度敏感。解决如果传感器支持温度补偿确保启用该功能。实现周期性的“在线零漂更新”。在任务循环中设计一个状态判断逻辑当机器人处于自由空间且持续一段时间如0.5秒内力和力矩的方差小于某个阈值时自动更新零漂值。这能有效抑制慢速漂移。保持工作环境温度相对稳定。5.2 控制性能相关的问题问题3系统在接触瞬间发生“冲击”或“反弹”。原因这通常是因为机器人在接触前的运动速度太快而阻抗控制的响应速度有限来不及“软化”。解决降低接近速度在接近预期接触点前将机器人的移动速度降低。引入接触检测与状态机编程实现一个简单的状态机。在“接近”状态使用普通位置控制一旦检测到接触力超过一个很小的阈值如2N立即切换到“接触”状态并启用阻抗控制。这样可以在非接触阶段快速运动在接触阶段柔顺交互。使用变阻抗在检测到接触的瞬间瞬间将刚度K值从一个中等值切换到目标小值可以实现“软着陆”。问题4在约束表面如导槽上运动时产生持续振荡。原因这可能是因为机器人的本体位置控制带宽与阻抗控制带宽不匹配或者环境约束引入了额外的动力学。解决降低阻抗控制带宽通过减小刚度K和/或增大质量M降低你期望的阻抗动态响应频率使其低于机器人位置环的带宽。检查各自由度耦合你可能只在一个方向如法向设置了柔顺但机器人在切向运动时由于结构耦合或坐标变换误差在法向产生了不必要的力进而被阻抗环响应。确保你的阻抗参数矩阵是对角的并且各方向参数独立可调仔细调试解耦。考虑环境动力学如果环境本身有弹性如一个可弯曲的导轨那么你是在与一个“弹簧-质量-阻尼”系统交互。这时整个闭环系统变得更复杂可能需要进一步调整参数或使用更高级的控制器。5.3 从实验到部署的工程化考量当在实验室调试成功后要部署到实际产线或产品中还需考虑鲁棒性你的代码必须能处理各种异常如传感器断线、数据超限、通信超时等。要有完善的故障检测和安全停机逻辑。参数易配置不要将M、D、K等参数硬编码在代码里。应该将其设计为可外部配置如通过配置文件、UI界面便于现场工程师根据不同的工件和任务快速调整。性能监控与日志实现关键数据的实时记录如指令位置、实际位置、接触力、阻抗输出等。当出现问题时这些日志是分析原因的唯一依据。可以设置触发条件当力超限或振荡发生时自动保存前后一段时间的高速日志。与上层规划集成阻抗控制通常只是一个底层“伺服”模块。它需要与上层的任务规划器如“寻找孔位”、“插入”、“旋紧”紧密配合。设计清晰的状态接口和命令接口让上层系统可以方便地启用/禁用力控、切换阻抗参数集。实现稳定、高性能的基于六维力传感器的阻抗/导纳控制是一个融合了多学科知识的工程。它要求你对机器人学、控制理论、信号处理甚至机械设计都有一定的理解。这个过程没有银弹需要大量的耐心和反复的实验。但一旦掌握你就为机器人打开了“触觉”这扇大门使其能胜任的工作范围得到了质的飞跃。从我个人的经验来看成功的秘诀在于细致的建模重力补偿、坐标变换、谨慎的参数整定从小开始逐步调整以及全面的安全防护软件限幅、状态监测。每一次调试中观察到的现象无论是好的还是坏的都是加深你对系统理解的最佳教材。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价