假如你操作过机械臂,或者在工厂里调试过用于精密装配、抛光的机器人,一定碰到过这种怪事:明明让机械臂空载停在空中,周围啥也没碰,可力传感器上的读数却显示有好几牛顿的力,甚至还带着不小的扭矩。这种感觉就像你闭着眼伸手,总觉得有人在轻轻推你——对机器人来说,这种“错觉”可是个大麻烦。
这个“错觉”的源头,正是我们今天要聊的六维力传感器标定与重力补偿。简单说,六维力传感器就像机械臂的“神经末梢”,能同时感知三个方向的力(Fx, Fy, Fz)和三个方向的力矩(Mx, My, Mz)。但问题就出在,这个“神经”太敏感了——它分不清哪些力是它自己“身体”(比如末端的夹爪、工具)的重量造成的,哪些才是真正的外力。如果想让机械臂实现“柔性控制”,比如轻轻贴着曲面打磨,或者小心翼翼地把零件插进孔里,连自己有多重都搞不清楚,后面的力控算法根本就没法用。
我自己在调试高精度装配时就吃过这个亏。当时机械臂抓着一个气动夹爪去装精密轴承,按道理应该是零接触力对准,可传感器老是报错,说有什么侧向力。折腾了半天才发现,问题不在控制程序,而是传感器读数里“掺和”进了夹具本身重力在不同姿势下产生的分力。如果不把这些“杂音”去掉,你的机械臂就像拿着一把不准的秤,永远没法感知真实的世界。
所以,这篇文章就是来手把手教你搞定这件事的:怎么用最小二乘法,让机械臂摆几个不同的姿势,一次性把传感器的零点、末端工具的重心位置,甚至安装时的小角度偏差都算出来,最后实现精准的重力补偿,让传感器只反馈我们关心的“外部力”。整个过程不需要啥昂贵的校准设备,核心就是数学和编程。我会尽量用大白话把原理说透,再附上能直接运行的Python代码。不管你是学机器人的学生,还是现场干活的工程师,都能跟着一步步做出来。
先把问题拆开:力与力矩里到底藏着啥?要解决问题,我们得先搞清楚传感器读数里到底混进了哪些东西。当你把六维力传感器装在机械臂末端,再装上工具(比如夹爪、焊枪、打磨头)后,传感器测到的原始数据其实是个“大拼盘”。
2.1 这个大拼盘里有三样东西:
第一,传感器自己的零点漂移。就像电子秤空着的时候也可能显示几克,力传感器也有自己的零点偏差,我们叫它 (Fx0, Fy0, Fz0, Mx0, My0, Mz0)。第二,末端工具的重力产生的力和力矩。这是最大的捣乱分子。工具的重力 G 作用在它的重心上,而重心在传感器坐标系里的位置是 (x, y, z)。重力不光会直接分出三个方向的分力 (Gx, Gy, Gz),而且因为重心不在传感器原点(有个力臂),还会产生重力矩 (Mgx, Mgy, Mgz)。第三,才是我们真正关心的外部接触力/力矩,记作 (Fex, Fey, Fez, Mex, Mey, Mez)。
所以,传感器原始读数 (Fx, Fy, Fz, Mx, My, Mz) 可以写成:力方向上:Fx = Gx + Fx0 + Fex (Fy、Fz 同理)力矩方向上:Mx = Mgx + Mx0 + Mex (My、Mz 同理)
我们厦门力晟传感器的目标,就是在没有外部接触(也就是 Fex、Mex 这些都等于零)的标定阶段,通过变换机械臂的姿势(这样重力在传感器坐标系里的方向就会变),把前两项(零点和重力效应)的所有参数都算出来。等真正干活的时候,再从原始读数里实时把它们减掉,剩下的就是干干净净的外部力了。