力矩控制
指令约束
直接力矩控制必要条件
力矩指令需满足不超限且连续:
直接力矩控制限制参数
xMateER3 Pro / xMateER7 Pro
| 参数 | 一轴 | 二轴 | 三轴 | 四轴 | 五轴 | 六轴 | 七轴 | 单位 |
|---|---|---|---|---|---|---|---|---|
| 力矩上限 | 85 | 85 | 85 | 85 | 36 | 36 | 36 | |
| 力矩微分上限 | 1500 | 1500 | 1500 | 1500 | 1000 | 1000 | 1000 |
xMate3 / xMate7
| 参数 | 一轴 | 二轴 | 三轴 | 四轴 | 五轴 | 六轴 | 单位 |
|---|---|---|---|---|---|---|---|
| 力矩上限 | 85 | 85 | 85 | 36 | 36 | 36 | |
| 力矩微分上限 | 1500 | 1500 | 1500 | 1000 | 1000 | 1000 |
力矩相关状态参数
- 这些状态数据均可在实时模式下获取。可以通过设置并调用
startReceiveRobotState()接口订阅数据,接着在控制周期内调用getStateData()接口获取其实时数值。
| 数据名 (fieldName) | 类型 | 单位 | 含义说明 | 补充 |
|---|---|---|---|---|
tau_m | ArrayXD | Nm | 关节力矩 / 连杆端传感器力矩反馈 | 传感器的纯反馈值,不包含摩擦力。 |
tau_c | ArrayXD | Nm | 指令关节力矩 | SDK 发送的指令值。需要加上重力补偿等参数才是系统中最终的力矩下发值。仅在打开实时模式控制之后有效。 |
tau_filtered_m | ArrayXD | Nm | 滤波后关节力矩 | 对连杆端反馈关节力矩 tau_m 的滤波结果。仅在打开实时模式控制之后有效。 |
tau_vel_c | ArrayXD | Nm/s | 指令力矩微分 | tau_c 的微分值。仅在打开实时模式控制之后有效。 |
tau_ext_base | Array6D | Nm | 基坐标系中外部力矩 | 仅在打开实时模式控制之后有效。 |
tau_ext_stiff | Array6D | Nm | 力控坐标系中外部力矩 | 仅在打开实时模式控制之后有效。 |
theta_m | ArrayXD | rad | 电机位置 | 电机端的位置反馈。 |
theta_vel_m | ArrayXD | rad/s | 电机位置微分 | 电机端的速度反馈。 |
motor_tau | ArrayXD | Nm | 电机转矩 | 电机实际反馈的转矩,包含摩擦力。该反馈值可通过乘以减速比,折算得关节反馈力矩 (即通过电机力折算的连杆端力矩)。 |
motor_tau_filtered | ArrayXD | Nm | 滤波后电机转矩 | 对电机反馈转矩的滤波结果,也是最终发送的指令。可使用 setFilterFrequency 进行滤波参数的设置。仅在打开实时模式控制之后有效。 |
常见问题
直接力矩控制下坠
力矩控制效果与机械臂硬件状态、负载参数、力控模型精度直接相关。
-
先做验证(两种方式二选一)
- 开启拖动并按住拖动按键,观察机械臂是否能维持静止(不上飘、不下坠)。
- 运行 RL 力控相关指令,确认是否可正常使用。
若上述验证异常,通常存在力控模型误差。
-
处理建议
- 若存在模型误差:
- 准确设置负载质量与质心(不可粗估)。
- 通过HMI界面或者SDK的
calibrateForceSensor接口执行力传感器标定,通过SDK控制机器人运动时建议程序中调用calibrateForceSensor接口,每次运动前标定一下力传感器,具体可以参考零力矩控制。
- 若力控模型正常:
- 优先检查发送力矩指令是否合理。
- 零力矩控制机器人发飘原因:通过力矩控制时,控制器底层补偿了摩擦力和重力,伺服实际执行的指令为摩擦力+重力+sdk发送的指令力矩。由于静摩擦力没有精确的数学模型,力矩补偿不到位可能会导致机器人运动,可尝试调节摩擦力补偿系数解决。
- 若存在模型误差:
-
调试建议
- 首次联调建议从低幅值、低变化率开始,逐步增大指令。
- 控制回调中避免阻塞和耗时操作,防止周期抖动影响力矩闭环稳定性。
- 与网络波动叠加时,优先直连并保持链路简单。
力矩接口getEndTorque获取的外部力矩波动大
可以使用模型库进行上层的计算,模型库的接口说明可以参考模型库使用
// 1. 读测量力矩(可直接用 getEndTorque 的 joint,或实时 tau_m)
fc.getEndTorque(ref_type, tau_m, tau_ext_ctrl, cart_t, cart_f, ec);
// 2. 读当前关节角、速度(也可以实时获取)
auto q = robot.jointPos(ec);
auto dq = robot.jointVel(ec);
// 3. 模型算重力(静止时可只用 gravity 分量)
// 注意:侧装需要使用重力方向接口设置方向setGravityDirection(double gx, double gy, double gz);
std::array<double, DoF> trq_full{}, trq_iner{}, trq_cor{}, trq_g{};
model.getTorqueNoFriction(q, dq, zeros, trq_full, trq_iner, trq_cor, trq_g);
// 4. 自己算外部力矩(可按场景选择补偿深度)
std::array<double, DoF> tau_ext{};
for (int i = 0; i < DoF; ++i)
tau_ext[i] = tau_m[i] - trq_g[i]; // 静止:扣重力
// tau_ext[i] = tau_m[i] - trq_g[i] - trq_cor[i]; // 运动中:再扣科氏
// 5.可使用模型库model.jacobian获取雅各比,也可以自己计算,并增算法规避奇异
笛卡尔外力Fext=(JT)-1−tau_ext;