官方示例 :https://sdurobotics.gitlab.io/ur_rtde/examples/examples.html#forcemode-example
目录
- 1.API解释
-
- [forceMode - 进入并配置力控模式](#forceMode - 进入并配置力控模式)
- [forceModeStop - 退出力控模式](#forceModeStop - 退出力控模式)
- [forceModeSetDamping - 配置力控阻尼系数](#forceModeSetDamping - 配置力控阻尼系数)
- [forceModeSetGainScaling - 配置力控增益缩放](#forceModeSetGainScaling - 配置力控增益缩放)
- 2.使用示例
1.API解释
这四个 API 是工业机械臂力控模式(Force Mode) 的核心接口,主要用于让机械臂在指定坐标系下对环境施加可控的力 / 力矩,而非单纯的位置控制(如示教器的点到点运动)。这类接口广泛应用于装配、打磨、插拔、抓取等需要与环境物理交互的场景。

forceMode - 进入并配置力控模式

- 函数功能:让机械臂进入力控模式,指定 "力控的参考坐标系、哪些轴允许柔顺运动、要施加的目标力 / 力矩、坐标系变换规则、运动限制",是力控模式的核心配置入口。返回bool表示配置是否成功(true= 成功,false= 参数非法 / 机械臂状态异常)。
- 参数说明 :


- 典型使用场景 :
装配:让 Z 轴柔顺,施加 5N 的向下力,将轴套压入轴承;
打磨:让 X/Y 轴刚性(保持打磨路径),Z 轴柔顺(施加恒定打磨力)。
forceModeStop - 退出力控模式

- 核心功能 :
终止力控模式,将机械臂恢复到默认的位置 / 速度控制模式(如正常的 MoveJ/MoveL 运动)。返回bool表示退出是否成功。 - 关键说明 :
必须显式调用:若未调用,机械臂会一直保持力控模式,即使完成力控任务也不会自动退出;
紧急场景:机械臂碰撞、力控异常时,调用该接口可快速恢复位置控制,避免危险;
退出后:机械臂会停止当前力控运动,保持当前 TCP 位置(或按程序继续执行后续位置指令)。
forceModeSetDamping - 配置力控阻尼系数

-
核心功能 :
设置力控模式下的阻尼系数,控制机械臂在柔顺轴上的 "运动缓冲特性"------ 阻尼越高,机械臂在无外力时减速越快,运动越 "稳重";阻尼越低,运动越 "顺滑"(但可能震荡)。返回bool表示配置是否成功。
-
参数详解 :

-
调参建议 :
打磨 / 抛光:阻尼设为0.1~0.3(避免机械臂因接触面振动而震荡);
软接触装配:阻尼设为0.01~0.05(保证运动柔顺,避免压坏工件)。
forceModeSetGainScaling - 配置力控增益缩放

-
核心功能 :
缩放力控模式的 "力控增益"------ 增益越高,机械臂对 "实际力与目标力的偏差" 响应越灵敏(调整位置的速度越快);增益过低则响应迟钝,过高易导致不稳定(如碰撞时抖动)。返回bool表示配置是否成功。
-
参数详解 :

-
调参建议 :
硬表面推紧(如金属工件装配):缩放系数设为0.5~0.8(避免因响应过快导致碰撞);
软材质接触(如泡沫 / 橡胶):缩放系数设为1.0~1.2(保证力控精度);
禁止设为>1.5:大概率导致机械臂抖动、力控不稳定,甚至触发安全保护。
2.使用示例
cpp
// 1. 配置力控参数(进入力控前先设置阻尼和增益)
robot.forceModeSetDamping(0.1); // 设阻尼0.1(打磨场景)
robot.forceModeSetGainScaling(0.8); // 设增益缩放0.8(硬接触)
// 2. 定义力控参数
std::vector<double> task_frame = {0.5, 0.2, 0.4, 0, 0, 0}; // 任务帧位置(0.5,0.2,0.4),姿态与基系一致
std::vector<int> selection_vector = {0,0,1,0,0,0}; // 仅Z轴柔顺(力控)
std::vector<double> wrench = {0,0,10,0,0,0}; // Z轴施加10N向下的力
int type = 2; // 任务帧固定不变
std::vector<double> limits = {0,0,0.03,0,0,0}; // Z轴最大速度0.03m/s
// 3. 进入力控模式
bool success = robot.forceMode(task_frame, selection_vector, wrench, type, limits);
if (success) {
// 4. 力控执行(如保持5秒)
sleep(5);
// 5. 退出力控模式
robot.forceModeStop();
}
