Force Control contact behavior

Hi there, I am currently trying to use an IRB6700 for a stiffness testing application. At first the robot should generate contact between its tool and the part while maintaining a given contact force for a few seconds. Then it should drive further into the part with a fixed velocity, e.g. 2 mm/s, until it reaches another predefined contact force in tool-z-direction. After that the robot should ramp down from this force with the same velocity from before and stop at the starting point.

I’ve tried different ways of programming for this, but in the end I always end up with some problem. Currently I am working with the procedure below:

!Achieve contact with part
FCRefForce\Fz:=10;
FCCondForce\ZMax:=10,60;
FCAct t_data\WObj:=w_data\ForceFrameRef:=FC_REFFRAME_TOOL;
FCSetDampingTune 9E+09,9E+09,4000,9E+09,9E+09,9E+09;
FCRefStart;
FCCondWaitWhile;
WaitTime \InPos, 5;
FCRefStop;

!Ramp up to desired force
FCRefForce\Fz:=500;
FCCondForce\ZMax:=500,60;
FCSetDampingTune 9E+09,9E+09,12000,9E+09,9E+09,9E+09;
FCRefStart;
FCCondWaitWhile;
FCRefStop;

!Ramp down to starting point
FCRefForce\Fz:=1;
FCCondForce\ZMin:=1,60;
FCSetDampingTune 9E+09,9E+09,24,9E+09,9E+09,9E+09;
FCRefStart;
FCCondWaitWhile;
FCRefStop;

Waittime 1;
FCDeact;

I’ve tried to use the FCRefForce in combination with the Damping Tune to set a fixed TCP speed, but the robot still speeds up or slows down during the procedure. I’ve also tried FCRefLine to ramp down, but the force starts oscillating near zero.

Does someone know how to do this in force control mode? The ideal process should look like a perfect triangle in the TuneMaster.

The core issue is that FCRefForce is a force controller it adjusts velocity to maintain a force setpoint, so you can’t get a fixed TCP velocity from it directly. For a triangle profile with controlled velocity, the right approach is to use regular MoveL motion for the loading/unloading phases and use force conditions as the exit trigger.

Here’s the structure I’d recommend:

! Phase 1: Make contact at 10N and hold 5s (your current code is fine here)

FCRefForce\Fz:=10;

FCCondForce\ZMax:=10, 60;

FCAct tdata\WObj:=wdata\ForceFrameRef:=FC_REFFRAME_TOOL;

FCSetDampingTune 9E9,9E9,4000,9E9,9E9,9E9;

FCRefStart;

FCCondWaitWhile;

WaitTime\InPos, 5;

FCRefStop;

! Phase 2: Drive into part at fixed velocity (2mm/s) until 500N

FCCondForce\ZMax:=500, 60;

FCRefStart;

MoveL pDeep, v2, fine, tool\WObj:=wdata; ! pDeep far enough that force stops it first

FCRefStop;

! Phase 3: Ramp down at same velocity deactivate FC before reaching zero

FCDeact;

MoveL pStart, v2, fine, tool\WObj:=wdata;

The key insight for Phase 3: don’t use force control to ramp back down just FCDeact and drive back with MoveL. Force control near zero is inherently unstable and causes the oscillation you saw with FCRefLine. The velocity-controlled MoveL gives you the clean downslope on the triangle. Let the robot’s natural compliance handle the force decrease.

One tip: define pDeep far enough in the Z direction that FCCondForce\ZMax:=500 will always stop the motion before reaching it.