
在工具不接触任何物体的静止状态下,传感器测得的就是工具重力产生的静力与静力矩。
需要求解的未知数:标量质量 m,质心坐标 r_com=[x_c,y_c,z_c]T
将Mg=r_com×F_g写成关于待求向量 p=[m,mxc,myc,mzc]T的线性方程。对于每个姿态 i,有:

其实更简单的做法是只用力矩方程来求解,因为力方程已经包含在力矩方程中,方法如下:

这个同时包含 m 和 r_com 不够线性。更好的线性化方法是把 m 和 m·r_com 看作独立变量。

这样我们就得到了关于 S 的线性方程组,而质量 m 可以从力方程单独求解,或联合求解。
推荐的最稳定方法:
同时使用力和力矩方程,构造一个统一的线性系统,直接最小二乘求解 p=[m,Sx,Sy,Sz]T。

由于末端可以达到多种倾斜姿态,但本身不能改变工具轴相对于世界 Z 轴的倾斜,只有两个俯仰关节能做到。因此你必须充分活动这两个俯仰关节,让工具的重力方向在传感器坐标系下产生显著变化。
姿态选择原则:
推荐姿态序列(传感器 Z 轴默认为工具指向):
注意:记录每个姿态的关节角,用于正运动学计算旋转矩阵 R。
对每个姿态 i:
将数据记录成表:
姿态 | 关节角度 (q1..qn) | F_raw_avg (N) | M_raw_avg (Nm) |
|---|---|---|---|
1 | ... | [fx1,fy1,fz1] | [mx1,my1,mz1] |
2 | ... | ... | ... |
使用正运动学,根据 q_i 计算传感器坐标系相对于机器人基坐标系的齐次变换矩阵。提取旋转部分 R_i。确保基坐标系 Z 轴竖直向上(或向下,需与重力方向定义一致)。一般设定基坐标系为Z 轴向上,重力方向为base_g=[0,0,−g]T
使用 Python或 MATLAB 编写辨识脚本。
import numpy as np
g = 9.81 # 可更精确
# 采集数据:列表 forces_raw (Nx3), moments_raw (Nx3), R_list (Nx3x3)
N = len(forces_raw)
A = np.zeros((N*6, 4))
b = np.zeros(N*6)
for i in range(N):
R = R_list[i]
# 重力在传感器系下的单位方向 * g
v = g * R.T @ np.array([0, 0, -1]) # 若基座标系Z向上
# v = g * R.T @ np.array([0, 0, 1]) # 若Z向下,根据你的定义调整
# 力方程
A[6*i:6*i+3, 0] = v # 对应质量 m
b[6*i:6*i+3] = forces_raw[i]
# 力矩方程 (S × v = -[v]_× S)
V_cross = np.array([[0, -v[2], v[1]],
[v[2], 0, -v[0]],
[-v[1], v[0], 0]]) # 这是 -[v]_×
A[6*i+3:6*i+6, 1:4] = V_cross
b[6*i+3:6*i+6] = moments_raw[i]
# 最小二乘求解
p, residuals, rank, s = np.linalg.lstsq(A, b, rcond=None)
m = p[0]
S = p[1:4]
r_com = S / m
print(f"辨识质量 m: {m:.3f} kg")
print(f"辨识质心 r_com: [{r_com[0]:.4f}, {r_com[1]:.4f}, {r_com[2]:.4f}] m")注意重力方向:如果实际安装传感器后,在工具竖直向下时,力读数 Z 分量约为 +mg,说明传感器坐标系 Z 轴向下,此时重力在基坐标系的表示应为 [0, 0, g](若基座Z向上)或需调整符号。可通过一个已知姿态手动验证符号,否则辨识结果会出错。简单验证:让工具竖直向下,传感器力读数应接近 [0, 0, m*g] 或 [0, 0, -m*g],据此决定 u_g 符号。

完成上述流程后,就得到了精确的 mm 和 rcom。将它们写入重力补偿模块,从此六维力传感器将成为一个纯净的“接触力感知器官”,为你后续的导纳贴合、接触检测打下坚实基础。