基于 CSP 位置模式实现导纳力控贴合,整个系统的核心在于“外环力反馈 → 位置修正 → 内环位置执行”这一协同框架。下面从原理、架构、数据流、同步时序、安全机制以及伪代码流程,完整展开。

周期设定:
[力传感器补偿] → [导纳控制器] → ΔX (笛卡尔)
↓
[参考轨迹 X_ref] → (+) → X_cmd → [逆运动学(Pinocchio)] → q_cmd (关节)
↓
[CSP驱动器] → 关节位置闭环 → 实际运动
每个控制周期,从传感器读取原始数据,依次进行:
得到净接触力 Fcontact 和力矩 Mcontact,统一在工具坐标系下表示。
目标:维持法向力 Fdes(如 3N),同时切向跟随轨迹。

其中 Δx是工具坐标系下的位置修正量(沿法向主要是 Z 向)。

参考轨迹规划器输出当前时刻的期望末端位姿矩阵 Tref(4×4)。

其中 ΔR 可来自导纳力矩修正(如需调整姿态对齐法向)。
pinocchio.inverseKinematics(model, data, T_{cmd}, q_prev) 求解目标关节角 qcmd。
利用冗余度(J6小俯仰)进行零空间优化,使 J6 保持在工作范围中心。将 qcmd写入 EtherCAT 过程数据对象(PDO),在下一个总线周期下发至驱动器。
驱动器接收到新位置指令后,立即更新内部位置环给定,并开始轨迹插补(若支持插补模式)或直接跟踪。由于 CSP 是同步周期位置,驱动器会在每个周期根据最新指令计算速度前馈等,实现平滑运动。

# 初始化
model, data = load_urdf("robot.urdf") # Pinocchio
q_actual = get_joint_positions()
q_cmd = q_actual
dt = 0.001 # 1 ms
# 导纳状态
dx_adm = 0.0, dx_dot = 0.0
M, D = 2.0, 100.0 # 已调优的参数
F_des = 3.0 # 法向期望力
# 主循环,与 EtherCAT 周期同步
while running:
# -------- 1. 传感器采集与补偿 --------
F_raw, M_raw = read_ft_sensor()
F_contact, M_contact = compensate(F_raw, M_raw, q_actual, dq_actual) # 重力/惯性补偿
# -------- 2. 导纳计算 (工具坐标系Z向) --------
force_z = F_contact[2] # 假定工具Z轴向外为法向
e = F_des - force_z
# 二阶导纳
acc = (e - D * dx_dot) / M
dx_dot += acc * dt
dx_adm += dx_dot * dt
dx_adm = clamp(dx_adm, -0.005, 0.005) # 限制修正深度
# -------- 3. 参考轨迹获取 --------
T_ref = trajectory_planner(current_time) # 来自通用模板(螺旋/弓字)
# -------- 4. 位姿修正 --------
# 构建修正变换:沿工具Z轴平移dx_adm,无旋转(或根据M_contact做姿态修正)
T_corr = SE3.identity()
T_corr.translation = np.array([0, 0, dx_adm]) # 在工具系下
T_cmd = T_ref * T_corr
# -------- 5. 逆运动学 --------
q_cmd = pinocchio.inverse_kinematics(model, data, T_cmd, q_cmd,
max_iter=10, dt=dt)
# 零空间优化:保持J6居中
q_cmd = nullspace_optimization(q_cmd, weight_j6=1.0)
# -------- 6. 安全检查 --------
if any(abs(F_contact) > MAX_FORCE) or any(abs(M_contact) > MAX_TORQUE):
trigger_soft_stop()
break
# -------- 7. 发送CSP指令 --------
send_csp_command(q_cmd) # 通过 EtherCAT PDO
# -------- 8. 同步等待下一周期 --------
wait_next_cycle()
q_actual = get_joint_positions()
dq_actual = get_joint_velocities()Time 工控机(主站) 驱动器(从站)
--------------------------------------------------------------------
t0 发送 q_cmd (cycle N) 收到 q_cmd,开始位置闭环
t1 采集力传感器,执行导纳+IK 正在执行 q_cmd
t2 计算得出新的 q_cmd 正在执行 q_cmd
t3 发送 q_cmd (cycle N+1) 收到新 q_cmd,平滑过渡
...局限性与注意事项:
以上完整描述了从力感知到位置指令生成,再到驱动器执行的闭环逻辑,可直接用于工程实现。