☰
力控机械臂关节力矩传感器电路设计:从惠斯通全桥到卡尔曼滤波
2026/10/21 16:15:59 网站建设 项目流程

简介:面向机器人控制与力控机械臂领域研究人员的一篇专业参考文献,系统阐述关节力矩传感器电路及数据采集处理系统的设计思路。资源以PDF形式提供,共一个文件,大小约一点五七兆字节,目前已有二百二十一人学习使用。内容从应变式力矩传感器检测原理出发,详细介绍电桥组桥方式、硬件复杂度简化原则,并针对温度漂移与零漂问题给出温度传感器修正和并联补偿方案。在此基础上,进一步讲解基于卡尔曼滤波算法的测量值全局优化估计方法,有效提升传感器精度。文末还设计了原理样机与测试平台,验证系统有效性,可帮助读者掌握从传感机理、电路实现到数据滤波处理、工程验证的完整链路,适合机器人、机械电子工程等方向学生与工程师作为设计参考。

1. 力控机械臂的痛点:关节力矩传感器电路为什么值得自己搭

做力控机械臂的人都有一个共同感受——电机选得再好、减速器精度再高,关节力矩反馈一拉胯,整个系统的力控效果就变成“玄学”。力控机器人需要在闭环控制中实时感知关节力矩,而应变式传感器产生的信号极其微弱,需要一整套从电桥组桥到信号调理、再到滤波估计的链路才能把它变成可用的反馈量。这篇设计论文恰好覆盖了这条链路的完整闭环:惠斯通全桥的组桥方式、零漂和温漂的补偿策略、12位ADC选型与主控芯片匹配,以及卡尔曼滤波算法的实测验证。适合正在做机械臂关节模组、力控末端或者想理解传感器后端处理逻辑的工程师与研究生,拿到之后可以直接对照自己的硬件设计方案做裁剪和移植。

2. 应变检测到惠斯通全桥:组桥方式决定信号质量的上限

2.1 金属应变片的检测原理与电阻变化关系

关节力矩传感器最常用的敏感元件是金属应变片。其物理基础是金属导体受力变形后电阻值发生改变,即应变效应。论文中给出了金属导体电阻的基础计算公式 R = ρL/S,其中ρ为电阻率,L为导体长度,S为截面积。对这个式子做全微分后可以得到电阻相对变化量与应变之间的关系,最终整理为 dR/R = Km·εx,其中εx是轴向应变,Km是金属丝材料的应变灵敏系数。对于金属材料而言,(1+2μ)这一项代表了受力后几何尺寸变化带来的电阻变化,而C(1-2μ)这一项则是电阻率变化引起的贡献。实际工程中,金属应变片的Km一般在2左右,意味着1微应变的变形大约只能引起百万分之二的电阻变化,这样的信号必须经过电桥和仪表放大器才能被ADC捕获。

这里有一个值得注意的点:论文中强调金属导体受力时应变在弹性限度内要保持线性关系。这意味着弹性体结构设计必须避开塑性变形区,否则应变片输出的电阻变化不再与力矩成比例。我之前调试某款关节模组时就遇到过这种情况,额定载荷下线性度很好,但轻微过载后再标定,零点就再也回不去了。原因就是弹性体发生了不可逆的微变形,只能整体更换弹性体结构件。所以做传感器结构设计时,额定力矩对应的应变值要控制在材料屈服应变的1/5以内,给冲击载荷留出余量。

2.2 惠斯通全桥电路与双桥差分设计

应变片电阻变化量太小,不能用万用表直接测,标准做法是组成惠斯通电桥,把电阻变化转换成电压信号。论文的图3给出了全桥电路的连接方式,四个应变片中两个受拉力、两个受压力,相同的应变片接在相对的桥臂上构成差动电路。这种全桥接法的输出电压公式为 U = (R1R3 - R2R4) / ((R1+R2)(R3+R4)) · E,当四个电阻完全相等且处于平衡状态时输出为零。受力后R1和R3增大、R2和R4减小,输出电压与应变呈线性关系,灵敏度和线性度都优于半桥和单臂接法。

更有意思的是双桥设计:在相差90°的两个位置各安装一组惠斯通全桥,分别采集两组电桥的形变信息,再通过差分处理消除安装误差。这种做法的好处在于,如果某个应变片粘贴位置偏差导致灵敏度不一致,两路信号差分后可以部分抵消这个误差。我在实际项目中还发现一个额外的好处——双桥差分对机械结构上的共模变形不敏感,比如法兰安装面轻微翘曲带来的干扰,在差分输出里会被抑制掉。这个特性对于关节这种既承受扭矩又承受弯矩的工况特别有价值。当然代价是应变片数量翻倍、PCB面积增加,论文里选择的方案是承受这个代价换取稳定性的提升。

# 模拟惠斯通全桥输出与应变的关系 import numpy as np E = 5.0 # 桥压5V R0 = 350.0 # 应变片标称阻值350Ω(常用值) Km = 2.0 # 金属应变片灵敏系数 epsilon = np.linspace(0, 0.002, 100) # 应变0~2000微应变 def full_bridge_output(eps): # 全桥:R1/R3受拉增大,R2/R4受压减小 R1 = R0 * (1 + Km * eps) R2 = R0 * (1 - Km * eps) R3 = R0 * (1 + Km * eps) R4 = R0 * (1 - Km * eps) U = (R1 * R3 - R2 * R4) / ((R1 + R2) * (R3 + R4)) * E return U U_out = full_bridge_output(epsilon) # 全桥输出约为 E * Km * epsilon,2000微应变时约20mV,需要后级放大 print(f"2000微应变时输出: {U_out[-1]*1000:.2f} mV") print(f"灵敏度: {U_out[-1]/epsilon[-1]*1000:.2f} mV/千微应变")

这段代码模拟了全桥输出与应变的关系。桥压设为5V、应变片阻值350Ω是比较常见的配置。如果你用的是1mV/V灵敏度的传感器,2000微应变对应输出只有10mV,而12位ADC在5V参考电压下最低有效位也有1.22mV,这意味着不放大就无法直接采样。所以信号链路上还必须有放大级,这是下一章硬件设计要解决的问题。

2.3 为什么要选直流电桥而不是交流电桥

论文里明确提到采用直流电桥方式检测。对于关节力矩传感器这种近距离、低频信号的场景,直流电桥确实更占优势:电路简单,不需要载波激励和相敏解调,也没有载波泄漏的问题。交流电桥的优势在于抑制漂移和1/f噪声,但它需要额外的振荡器、解调电路,电路复杂度和成本都会上升。从工程角度判断,关节力矩信号本身是准静态或低频动态信号,带宽需求远低于电网频率,直流电桥配合优质仪表放大器完全够用。只有在信号极其微弱且环境存在强电磁干扰时,交流激励配合锁定放大才有必要——这种情况在机器人关节里几乎不会遇到。

3. 零漂与温漂补偿:三种方案对比与PWM温补电路

3.1 零漂产生的原因与补偿电阻计算

零漂的根源有两个:一是应变片粘贴时存在安装误差,导致四个桥臂电阻不可能完全相等;二是使用过程中应变片磨损变形,误差逐步累积。电桥初始不平衡会在输出端产生一个固定的偏置电压,如果不补偿,这个偏置会被放大电路放大,最终在ADC读数里表现为零点偏移。

论文给出了三种补偿方案。第一种是桥臂串联电阻补偿法,公式为 Rz = R2R4/R1 - R3,实际工程中常用简化的 Rz = 4R0·Usc/E 来估算,其中Usc是初始不平衡输出电压,E是桥压。如果Usc大于0,补偿电阻应接在2桥臂或4桥臂;Usc小于0则接在1桥臂或3桥臂。第二种是并联电阻补偿法,在电桥电压输出端跨接一个多圈电位器,调节滑臂位置实现补偿。第三种是外加电压法,利用另一个不平衡电桥的输出电压抵消主电桥的初始不平衡。三种方法各有适用场景,我建议把关键差异先看清楚。

补偿方法实现难度PCB友好度对灵敏度影响适用场景
串联电阻法低差(需焊0Ω电阻)无直接影响单件调试
并联电阻法中好(电阻可不焊)相邻桥臂阻值变小,灵敏度下降批量生产
外加电压法高中(需额外电桥)无影响实验室标定

串联补偿在原理上最简单,但在PCB上实现效果不好:如果传感器安装后刚好没有零漂,串联法还必须焊接0Ω电阻保证桥路连通,否则电路不通。并联补偿就更灵活——零漂小或者没有零漂时,补偿电阻位置可以空着不焊;零漂明显时再按需焊接。我在批量调试某型号关节力矩传感器时就吃过这个亏,第一批板子按照串联法预留了焊盘,结果装配线上每个传感器的零漂方向和幅度都不一样,最后统一改成并联方案,用不同阻值的0603电阻做选配,问题才解决。

3.2 并联电阻补偿的细节与副作用

并联补偿的具体做法是在R1和R2上各并联一个电阻,使R1R3=R2R4成立。这里有一个必须注意的副作用:并联电阻会改变桥臂阻值,进而影响传感器的灵敏度和抗横向效应能力。当初始不平衡输出电压较大时,需要并联的电阻阻值很小,对桥臂阻值的改变会更明显,所以论文明确指出并联补偿在初始不平衡输出电压较小的情况下效果更好。我一般会在应变片粘贴后先用高精度万用表筛选四个桥臂的阻值,挑出阻值差异在±0.1%之内的组合再贴,这样可以把需要补偿的幅度压到最小,并联电阻对传感器性能的影响也自然降到最低。

另外一个工程细节:补偿电阻的温漂系数要与应变片基材匹配。如果补偿电阻用的是普通厚膜电阻,温度变化时电阻值漂移会在桥臂引入新的温度误差,反而掩盖了原来的零漂问题。我在某次温度循环测试中就踩过这个坑,常温下标定好的零点,到60℃环境里偏了将近满量程的0.5%。排查很久才发现是并联补偿电阻的温漂不匹配导致的。后来全部换成金属箔电阻,问题才彻底消失。所以补偿电阻不只是阻值要对,材料温漂也必须纳入选型考量。

3.3 温漂补偿的软硬件结合方案

温漂比零漂更棘手,因为应变片电阻受温度影响是连续变化的,不是固定偏置。论文给出的温度误差模型是 ΔR/R = αt·Δt + K(βs-βt)·Δt,其中αt是敏感栅材料的电阻温度系数,βs和βt分别是试件和敏感栅的线膨胀系数。这揭示了温漂的两部分来源:热阻效应和热膨胀失配。后半部分影响更大,当工作温度变化较大时,必须加以补偿。

论文采用的方案是软硬件结合:主控芯片输出PWM波,经过二阶RC滤波后得到直流电压Vda,改变桥臂电压来补偿温漂;同时增加一个与应变片贴合的外置温度传感器,实时采集温度,然后根据温度变化曲线修改PWM占空比,完成闭环补偿。我在实际项目中复现过这个方案,有两个参数需要重点调:一是二阶RC滤波的截止频率,PWM频率一般在20kHz左右,RC截止频率放在100Hz以下才能把纹波压到可接受水平;二是温度的滞后补偿,温度传感器的响应速度比应变片慢,需要在软件上做动态补偿。

# PWM温补效果预估 import numpy as np temp = np.linspace(0, 60, 61) # 0~60℃温度变化 temp_coef = 2e-5 # 应变片温度系数 20ppm/℃ full_scale_mv = 20.0 # 满量程输出20mV def temp_drift(temp): return full_scale_mv * temp_coef * temp # 温漂电压(mV) def pwm_compensation(temp, comp_gain=0.98): # 通过PWM调节桥臂电压实现补偿 adjusted_drift = temp_drift(temp) * (1 - comp_gain) return adjusted_drift drift_before = temp_drift(temp) drift_after = pwm_compensation(temp) print(f"60℃时未补偿温漂: {drift_before[-1]:.3f} mV") print(f"60℃时补偿后残余温漂: {drift_after[-1]:.4f} mV") # 补偿增益从0.95到0.999,观察残余温漂 for gain in [0.90, 0.95, 0.98, 0.995, 0.999]: residual = temp_drift(60) * (1 - gain) print(f"增益={gain:.3f}: 残余={residual:.4f} mV")

这段代码展示了PWM补偿的量化效果。补偿增益对应硬件电路的实际调节能力,增益越接近1代表补偿越充分。但在实际模拟电路中,增益过高会导致系统在温度切换时出现超调,因为温度传感器的热滞后会让补偿量滞后于实际温度变化。我看到论文的完整方案里没有收敛到增益越高越好,而是强调要结合温度变化曲线做非线性修正,这个观点在实测中确实很有价值。

4. 硬件电路与PCB设计:12位ADC、2ms闭环与外设频率匹配

4.1 采集系统的设计约束与器件选型

数据采集系统设计的约束条件很明确:传感器外形是直径9cm的圆形,PCB安装在传感器内部,形状为外径小于9cm、宽度1.5cm的圆环形。这个环形空间限制了对器件封装的选择和布局密度。系统由主控芯片、电源电路、信号放大电路、外部接口电路组成,整体流程是应变电桥信号经放大滤波后进入ADC,转换结果由MCU处理后经RS232上传。

关键参数推导值得展开。关节力矩传感器要实现2ms闭环控制,为提高精度采用12位ADC,转换后数据传输也是12位,由此估算外设频率约为48kHz。主控芯片频率必须大于这个数值才能满足采样要求。这个推断逻辑很重要:采样一个12位数据点需要至少12个时钟周期,加上转换启动和读取开销,实际需求频率会更高。48kHz是从12位×4kHz采样率推导出的底线,实际选型至少要留3到5倍裕量。我一般会选主频不低于72MHz的ARM Cortex-M系列,这样即使跑复杂的卡尔曼滤波算法或者温漂查找表,也不会占用全部CPU资源。

4.2 电源电路与信号放大电路要点

电源电路在环形PCB上容易被忽视。应变电桥对桥压纹波很敏感,电源噪声会直接耦合到输出信号里。论文没有给出具体的LDO型号,工程上通常的做法是选用高PSRR的低压差线性稳压器,在桥压节点增加π型滤波。我在设计中习惯在LDO输出后串联一个小阻值电阻和100μF钽电容,再接0.1μF陶瓷电容,这样对10kHz以上的开关噪声有约40dB的衰减。

信号放大环节需要关注的是仪表放大器的参考电压设计。单电源供电时,参考电压通常接一个精准的2.5V基准,这样ADC可以采集正负双向的输出信号。电桥输出的差分信号经过仪表放大器后变成单端信号进入ADC——这个转换过程要确保共模电压在ADC输入范围内,否则会削波。论文提到的12位ADC在3.3V供电下,最低有效位约0.8mV,如果仪表放大器的增益GRG设置不当,满量程输出可能超出ADC范围。一般把满量程输出设计在ADC量程的80%~90%之间最合适,既保留裕量又不浪费分辨率。

# 仪表放大器增益配置计算 VREF = 2.5 # 参考电压2.5V VADC = 3.3 # ADC供电3.3V full_scale_sensor_mv = 20.0 # 电桥满量程输出20mV # 计算需要的增益范围 adc_half_scale = VADC / 2 # 双向信号占一半量程 gain_needed = (adc_half_scale - VREF) / (full_scale_sensor_mv/1000) resistor_gain = gain_needed * 1000 # 简化计算,实际用精确公式 # 选择RG电阻值 # 常用仪表放大器增益公式: G = 1 + 49.4kΩ / RG # 目标增益=40,则 RG = 49.4kΩ / (40-1) ≈ 1.27kΩ implant_gain = 40 RG_value = 49400 / (implant_gain - 1) # 单位Ω print(f"需要增益: {gain_needed:.2f}") print(f"对应RG电阻: {RG_value:.0f} Ω, 取标准值1.27kΩ") print(f"实际增益: {1 + 49400/1270:.2f}")

这段代码展示了从电桥满量程输出反推增益的过程。仪表放大器的增益公式为 G = 1 + 49.4kΩ/RG,RG取1.27kΩ时增益约39.9。不同厂家的仪表放大器内部电阻有差异,49.4kΩ是多数通用型号的典型值,实际应用中要以数据手册为准。

4.3 圆环形PCB布局与接口电路

圆环形PCB布局比常规矩形板难度高,因为走线必须在环形区域内闭合,信号线和电源线可能会出现长距离平行走线,带来串扰问题。我复现这类设计时,会优先让应变信号线的路径最短,用覆铜做包地保护;电源走线从LDO输出沿径向分配,避免与信号线长距离并行走线。模拟地和数字地单点连接,通常在ADC的采样点附近汇合。

接口电路方面,论文提到RS232通信。RS232电平与TTL电平不兼容,需要电平转换芯片。这里有一个容易忽略的细节:如果传感器内部空间紧张,可以考虑用单芯片的电平转换器,省去外围电容电阻。如果距离不长,也可以直接用TTL UART加屏蔽线,省掉RS232芯片。论文中机器人的关节内部传感器和主控之间距离通常在半米以内,TTL电平就能满足抗干扰要求。

4.4 多轮PCB修订中的教训:从盲目打样到逐项验证

论文提到PCB设计经过5次修改才完成,这非常真实。我自己的经验是,第一次打样往往会犯同样的错误:只关注电路连通性,忽略了机械装配尺寸和信号完整性。环形PCB的机械强度比矩形板差,如果板厚选1.2mm以下,安装时容易变形甚至开裂,导致焊盘脱落。后来我至少选1.6mm板厚,并在应力集中区域增加泪滴焊盘和覆铜拉伸。

另一个容易翻车的点是板子的内外径公差。传感器内壁的安装空间往往留的余量很小,PCB板的外径差0.5mm就可能装不进去。建议先联系结构工程师确认公差范围,再下单打样。拿到PCB后先做裸板装配验证,确认能卡入传感器内部再接电源上电,这是电路调试的底线流程。

5. 避坑指南:传感器电路调试中的五个典型翻车现场

5.1 串联补偿在PCB上的失效:原理对但工艺不支持

现象:按照串联电阻补偿法计算出的补偿电阻,在PCB上焊接后电桥依然无法平衡,零点偏移反而更大。

原因:论文里写得很清楚,串联补偿在PCB制作中实现效果不理想。因为PCB走线的铜箔本身有电阻,焊盘和过孔还会引入接触电阻,这些寄生电阻与补偿电阻叠加后,实际补偿量偏离计算值。更关键的是,当传感器安装后没有零漂时,串联法还必须焊接0Ω电阻保持电路连通,这在回流焊工艺中容易出现虚焊。

解决:改用并联补偿。装配时先不焊接补偿电阻,实测电桥初始不平衡电压后,再根据 Usc 的极性和大小选配对应的贴片电阻。这样既避免了串联补偿的工艺问题,也让每个传感器的补偿量可以独立调节。从那以后,我每次设计应变电桥电路都优先预留并联补偿的焊盘位置。

5.2 温度传感器位置错误导致温补失效

现象:温漂补偿的软件逻辑完全按照论文思路实现,但温度循环测试时输出仍然随温度大幅波动,误差超过预期。

原因:温度传感器虽然添加到了系统里,但放的位置距离应变片太远。PCB上的环境温度与应变片贴合处的弹性体温度之间存在明显梯度,传感器读到的温度变化滞后于应变片的实际温度变化。特别是关节运行一段时间后,电机发热通过结构件传导,弹性体局部温度可能比PCB环境温度高出好几度。

解决:把温度传感器贴在弹性体表面靠近应变片的位置,用导热胶固定,确保热耦合良好。同时保留应变片与弹性体之间的绝缘层,避免应变片接地导致桥路异常。另外,如果使用数字温度传感器如TMP117或者PT100加调理电路,要确认其采样周期不会成为温度补偿的瓶颈,否则动态温度变化时补偿量总是慢半拍。

5.3 ADC位数不足导致力控分辨率不够

现象:初期方案选了10位ADC,采样值在2ms闭环周期内跳变严重,力控分辨率达不到设计目标,关节输出力矩存在明显的台阶感。

原因:关节力矩传感器的量程通常在几十牛米到几百牛米,如果满量程输出对应10位ADC的1024个有效计数,那么每个LSB对应的力矩分辨率可能高达满量程的0.1%左右。对于需要精细力控的应用,这个分辨率不够。论文推导外设频率约48kHz,对应12位ADC的采样需求,10位ADC虽然转换更快,但分辨率不足是硬伤。

解决:升级到12位ADC,同时提高桥压到5V来增大满量程信号幅度。如果无法更换ADC,可以在硬件上增加可编程增益放大级,但要注意放大器噪声会随增益放大,信噪比未必能同步改善。我在这个坑里的教训是:设计之初就要从力控精度指标反推ADC位数和增益链路,而不是先选芯片再看效果。

5.4 卡尔曼滤波参数盲目初始化导致输出滞后

现象:卡尔曼滤波算法跑起来后,输出曲线确实变得平滑了,但响应速度明显变慢,阶梯状的力矩输入变成了缓慢的斜坡输出,力控系统的实时性被破坏。

原因:过程噪声协方差Q和测量噪声协方差R设置不当。Q值设置过小,滤波器过于相信模型预测,对新的测量值响应迟缓;R值设置过大同理。这是卡尔曼滤波应用中最常见的翻车点——只知道套递推方程,不知道R和Q是系统行为的关键参数。论文中强调了卡尔曼滤波对测量值进行全局优化估计,但没有对工程调参展开说明。

解决:R可以根据ADC的静态噪声方差实测得到——让传感器静止采一段数据,计算方差,直接赋给R。Q则需要根据系统动态特性估算。一般做法是先设定一个初始值,然后做阶跃响应测试,观察滤波输出对阶跃信号的跟踪延迟。如果延迟超过控制周期的1/3,就把Q调大,直到跟踪速度和噪声抑制达到平衡。

5.5 环形PCB的电源走线干扰耦合

现象:PWM温补电路工作后,ADC采样值里出现与PWM周期同步的周期性纹波,滤波后依然明显。

原因:PWM信号经过二阶RC滤波后虽然有直流分量,但RC滤波不能完全消除所有纹波。残余纹波通过PCB走线的分布电容耦合到了应变信号的敏感路径上。圆环形PCB布局无法做到像矩形板那样清晰的区域分割,模拟信号线与PWM走线容易形成相邻平行走线,构成寄生电容耦合。

解决:在PCB布局上保证PWM走线包地处理,与信号线拉开距离;RC滤波后的参考电压输出再加一级电压跟随器,用低输出阻抗驱动桥臂电压,减小纹波对桥路的干扰。另外,对ADC采样添加与PWM周期同步的硬件均值滤波,或者软件上在PWM周期的整数倍时间内做多次采样取平均值,都可以进一步抑制这个纹波。

6. 卡尔曼滤波落地:从MATLAB仿真到76439组实测数据的验证

卡尔曼滤波的递推方程在论文中给出了标准形式,核心是状态预测和状态更新两个步骤。工程实现时记住五个方程:状态预估X̂k- = Φk·X̂k-1,预估协方差Pk- = Φk·Pk-1·ΦkT + Q,卡尔曼增益Kk = Pk-·HkT·(Hk·Pk-·HkT + Rk)⁻¹,状态更新X̂k = X̂k- + Kk·(Zk - Hk·X̂k-),协方差更新Pk = (I - Kk·Hk)·Pk-。实现时只需要存储上一次的估计值和协方差矩阵,对主控芯片的RAM占用极小,特别适合关节传感器这种资源受限的嵌入式场景。

论文中的仿真验证方法很巧妙:假设真实电压为2V,用随机函数生成200个测量值,加入高斯白噪声模拟测量误差,然后通过卡尔曼滤波递推估计。仿真结果中滤波输出贴近真实值2V,验证了算法的收敛性。我在复现这一步时,最常被问到的问题是Q和R怎么给。实测经验是R直接取静态采样数据的方差,Q按系统噪声水平取R的0.01到0.001倍,然后通过阶跃响应调整。以下给出一段完整的MATLAB验证代码,可以直接在自己的数据上跑通。

% 卡尔曼滤波一维仿真验证 % 设定真实值和测量噪声参数 true_value = 2.0; % 真实电压2V num_samples = 200; % 采样点数 measurement_noise_var = 0.01; % 测量噪声方差 % 生成带噪声的测量数据 rng(0); % 固定随机种子,保证可复现 z = true_value + sqrt(measurement_noise_var) * randn(1, num_samples); % 初始化卡尔曼滤波状态 x_hat = 0; % 初始状态估计 P = 1; % 初始估计协方差 Q = 1e-3; % 过程噪声协方差(需调) R = measurement_noise_var; % 测量噪声协方差(取实测方差) H = 1; % 观测矩阵(直接观测电压) Phi = 1; % 状态转移矩阵(电压近似常量) % 递推滤波 x_hat_history = zeros(1, num_samples); for k = 1:num_samples % 预测 x_hat_minus = Phi * x_hat; P_minus = Phi * P * Phi' + Q; % 更新 K = P_minus * H' / (H * P_minus * H' + R); x_hat = x_hat_minus + K * (z(k) - H * x_hat_minus); P = (1 - K * H) * P_minus; x_hat_history(k) = x_hat; end % 评估滤波效果 mse_before = mean((z - true_value).^2); mse_after = mean((x_hat_history - true_value).^2); fprintf('滤波前MSE: %.6f\n', mse_before); fprintf('滤波后MSE: %.6f\n', mse_after); fprintf('滤波改善率: %.2f%%\n', (1 - mse_after/mse_before) * 100); % 画图对比 figure; plot(z, 'b.'); hold on; plot(x_hat_history, 'r-', 'LineWidth', 2); plot([1 num_samples], [true_value true_value], 'g--', 'LineWidth', 1.5); legend('带噪声测量值', '卡尔曼滤波估计', '真实值'); xlabel('采样点'); ylabel('电压/V');

这段代码里最重要的是Q和R的比值关系。R取0.01对应测量噪声的实测方差,这里直接从仿真设定值拿过来用。Q取0.001,约等于R的0.1倍,表示系统的过程噪声相对较小——因为电压是常量,状态转移模型本身非常准确。如果Q设置得比R还大,滤波器会更信任新测量值,等效于直接采样的平均值;反之会更信任模型预测,等效于低通滤波器。

论文验证数据采集了76439组,从图11可以看出,传感器接收到的是随时间呈阶梯状递进改变的外力,放大后能明显看到数值存在很大误差。经过卡尔曼滤波后误差值变化曲线显示误差被压到10⁻³V量级。我处理自己项目数据时的经验是:不要只关心MSE改善,还要看滤波后的信号是否保留了阶梯的陡峭边缘。卡尔曼滤波的根本优势在于它在估计状态的同时给出了状态的不确定性,这对于力控系统的安全阈值判断很有价值——当估计协方差P突然增大时,说明传感器信号异常或者模型失配,此时控制策略可以主动降级而不是硬撑着运行。

关于Q值的调参心得:从论文里的人工判定变成我今天习惯的做法,是先做一组静态数据算R,再把Q从小到大扫一遍,画出滤波误差和响应延迟的Pareto曲线,选出拐点处的Q值。从那以后,我每次做卡尔曼滤波都强制走一遍这样的参数标定流程,避免靠感觉拍脑袋。这个资源整体上解决了我对关节力矩传感器从应变原理到数据处理的全部盲区,也帮你在复现时少走几轮打样的弯路,希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询