上篇讲了编码器在测速、测距和闭环控制中的应用,从脉冲信号到物理量的转换、速度估计方法、PID反馈控制、编码器-IMU融合。今天从运动传感器转到力觉传感器——力/力矩传感器是机器人"触觉"的核心,让机器人从"能动"变成"能感知接触"。

面试时候被问"力传感器怎么用在机器人上",很多人会说"测力的大小"。但面试官想听的是更工程化的内容:力传感器有哪些类型?应变片原理是什么?六维力传感器怎么解耦?力控有哪些策略?在ROS2中怎么处理力传感器数据?

力传感器的类型和应用场景

机器人领域常用的力传感器有几种,每种适用于不同的场景。

应变片式力传感器:最经典、最常用。原理是金属或半导体材料在受力时会发生形变,形变导致电阻变化,通过惠斯通电桥把电阻变化转换成电压信号。这种传感器精度高、线性度好、技术成熟,工业机械臂的关节力矩传感器基本都是应变片式的。缺点是应变片会蠕变(长时间受力后零点漂移),温度变化也会影响测量精度。

压电式力传感器:利用压电材料(石英、压电陶瓷)在受力时产生电荷的效应。特点是动态响应极好(固有频率高),适合测量快速变化的力。但压电传感器不能测静态力——电荷会慢慢泄漏,所以只适合动态力测量。常用在冲击测试、振动分析等场景。

电容式力传感器:通过测量电容变化来感知力。灵敏度高,可以做得很小,适合微型力传感器。但电容式传感器对寄生电容敏感,信号调理电路比较复杂,工业环境中电磁干扰会影响测量。

光学式力传感器:用光纤布拉格光栅(FBG)或者视觉方式测量形变。优点是抗电磁干扰,可以在强电磁场环境下工作。缺点是成本高、温度交叉敏感、解调设备贵。目前主要在科研领域使用,工业应用还不多。

import numpy as np

class StrainGageForceSensor:
    """应变片式力传感器模型"""
    def __init__(self, rated_capacity, sensitivity_mv_per_v, 
                 bridge_voltage=5.0, adc_resolution=24):
        self.rated_capacity = rated_capacity  # 额定力(N)
        self.sensitivity = sensitivity_mv_per_v  # 灵敏度(mV/V)
        self.bridge_voltage = bridge_voltage  # 电桥电压(V)
        self.adc_resolution = adc_resolution  # ADC位数
        
        # 满量程输出电压(mV)
        self.full_scale_output = sensitivity_mv_per_v * bridge_voltage
        # 每个ADC计数对应的力(N)
        self.force_per_count = rated_capacity / (2**adc_resolution)
    
    def read_force(self, adc_raw, tare_offset=0):
        """读取力值
        adc_raw: ADC原始读数
        tare_offset: 去皮偏移量
        """
        force = (adc_raw - tare_offset) * self.force_per_count
        return force
    
    def apply_calibration(self, raw_force, calibration_matrix):
        """应用校准矩阵(线性补偿)"""
        return calibration_matrix * raw_force

六维力传感器的解耦

六维力传感器(也叫六轴力传感器)能同时测量三个方向的力(Fx, Fy, Fz)和三个方向的力矩(Mx, My, Mz)。它是力控抓取、柔顺装配、人机协作等场景的核心传感器。

六维力传感器的难点在于维间耦合——施加Z方向的力时,X方向的应变片也会感受到信号。解耦就是用校准矩阵把各维度的原始读数转换成真实的力和力矩值。

标定流程通常是:固定传感器,依次在每个维度施加已知大小的力或力矩,记录所有六个通道的输出。这样可以得到一个6x6的耦合矩阵。实际使用时,把原始读数向量乘以耦合矩阵的逆矩阵,就得到解耦后的六维力。

class SixAxisForceSensor:
    """六维力传感器解耦"""
    def __init__(self, coupling_matrix):
        """
        coupling_matrix: 6x6耦合矩阵(标定得到)
        """
        self.coupling_matrix = np.array(coupling_matrix)
        self.decouple_matrix = np.linalg.inv(self.coupling_matrix)
        self.tare = np.zeros(6)  # 去皮值
    
    def set_tare(self, readings):
        """去皮:记录当前读数作为零点"""
        self.tare = np.array(readings)
    
    def read_force_torque(self, raw_readings):
        """读取解耦后的六维力/力矩"""
        raw = np.array(raw_readings) - self.tare
        ft = self.decouple_matrix @ raw
        return ft  # [Fx, Fy, Fz, Mx, My, Mz]

标定时的关键细节:加载点要精确已知,加载方向要尽量对准传感器坐标系(否则引入额外误差),每个维度至少标定5个力值点来验证线性度。好的六维力传感器线性度误差在0.1%FS以内,维间耦合误差在1%FS以内。

安装六维力传感器时要注意几点。传感器通常安装在末端执行器和最后一个关节之间,这样能测量到末端受到的所有外力和力矩。安装面的平面度要好,螺丝拧紧力矩要按厂家要求来,否则预紧力不均匀会影响测量精度。每次安装后都要重新做去皮操作,消除安装应力带来的零偏。

面试中怎么聊

面试官问力/力矩传感器,按这个顺序回答:先说力传感器的类型(应变片、压电、电容、光学)和各自适用场景,再说六维力传感器的解耦原理和标定流程,然后说力控策略(阻抗、导纳、直接力控),最后说在ROS2中的集成方式。

如果面试官追问"阻抗控制和导纳控制有什么区别",你可以说:阻抗控制是"位置→力"的关系,直接控制力矩输出,需要力矩控制的底层接口。导纳控制是"力→位置"的关系,输出位置修正量叠加到位置指令上,普通位置控制机器人就能实现。导纳控制更通用、更容易实现,但动态性能不如阻抗控制。对于需要快速力响应的场景(比如高速打磨),用阻抗控制。对于需要柔顺交互的场景(比如人机协作),导纳控制就够了。

如果面试官追问"力传感器的采样频率应该设多少",你可以说:力控环的频率一般要高于位置控制环。因为力的变化比位置快——接触瞬间力的建立时间可能只有几毫秒。通常力控环1000Hz,位置环100-500Hz。如果力传感器采样频率不够(比如只有100Hz),可以用插值或者预测的方式提高力控环的输入频率,但效果不如直接提高传感器采样率。

分享一个我在项目中调试六维力传感器的经历。当时给一台协作机械臂装了一个ATI的六维力传感器做力控打磨。一开始传感器读数在静止状态下就有很大的漂移,特别是Fz(Z方向力)每隔几分钟就漂移几牛顿。排查后发现两个问题:第一,传感器和机械臂末端之间的安装法兰有轻微变形,导致预紧力不均匀,每次机械臂运动时法兰的微小形变会耦合到力读数中。我们换了一个更厚的法兰并严格按照厂家要求的力矩拧紧螺丝,问题改善了一半。第二,传感器对温度敏感,打磨过程中电机发热导致末端温度升高,传感器的零偏随温度变化。我们开启了传感器的温度补偿功能,同时每隔10分钟做一次自动去皮(在已知无外力的姿态下重新校准零偏),漂移问题基本解决了。这个经历告诉我,力传感器的精度不只是传感器本身的事,安装质量、温度管理、标定流程都会影响最终效果。

下一篇讲GPS/RTK定位原理——室外机器人的定位方案。从室内传感器转到室外定位,这是移动机器人走出仓库的关键。


如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。

「机器人软件开发面试·从入门到精通」连载系列 上一篇:第160篇 编码器应用——测速、测距和闭环控制中的使用 下一篇预告:第162篇 GPS/RTK定位原理——室外机器人的定位方案

有任何问题欢迎评论区留言,我会尽量回复。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐