Hi,
I'm commissioning a LBR IIWA cobot. I have being getting plenty of knowledge from this website, but I'm currently stuck.
I'm trying to implement collision detection on the java program (I have an AMF already enabled on the Safety Configuration with 30Nm).
This topic was already discussed in:
1- LBR iiwa - start/resume application by gesture control (link)
2- Resume program after collision detection (link)
I'm trying to do a combination of both of these programs. I got it working with the code shown on the 1st link, but I want to use JointTorqueCondition instead of createSpatialForceCondition as it has done on the 2nd link. This is the code that I'm trying to implement:
Below my Collision program
public void setCollisionDetection(){
bCollision = true;
JointTorqueCondition jt1 = new JointTorqueCondition(JointEnum.J1, -collisionForce, collisionForce);
JointTorqueCondition jt2 = new JointTorqueCondition(JointEnum.J2, -collisionForce, collisionForce);
JointTorqueCondition jt3 = new JointTorqueCondition(JointEnum.J3, -collisionForce, collisionForce);
JointTorqueCondition jt4 = new JointTorqueCondition(JointEnum.J4, -collisionForce, collisionForce);
JointTorqueCondition jt5 = new JointTorqueCondition(JointEnum.J5, -collisionForce, collisionForce);
JointTorqueCondition jt6 = new JointTorqueCondition(JointEnum.J6, -collisionForce, collisionForce);
JointTorqueCondition jt7 = new JointTorqueCondition(JointEnum.J7, -collisionForce, collisionForce);
ICondition collisionCondition = jt1.or(jt2, jt3, jt4, jt5, jt6, jt7);
_collisionObserver = getObserverManager().createConditionObserver(collisionCondition, NotificationType.OnEnable, new IAnyEdgeListener()
{
@Override
public void onAnyEdge(ConditionObserver conditionObserver, Date time, int missedEvents, boolean conditionValue)
{
if (conditionValue)
{
getLogger().info("force exceed");
if (bCollision) // Collision or resume is detected and try to freeze/resume the robot
{
getLogger().info("Collision");
getApplicationControl().setApplicationOverride(0.0d);
_Main_CommsIO.setOUT217_Collision_ON(true); // Notify PLC that Collsion is turned ON and Robot is freeze
ThreadUtil.milliSleep(wait1000ms); // Delay needed to disable multiple collsions overshoot
}
else
{
ThreadUtil.milliSleep(wait1000ms); // Delay needed to disable multiple collsions overshoot
getApplicationControl().setApplicationOverride(1.0d);
_Main_CommsIO.setOUT217_Collision_ON(false); // Notify PLC that Collsion is turned OFF and Robot has resumed
}
bCollision = !bCollision;
}
else
{
if (_Main_CommsIO.getIN217_Collision_ACK()) // PLC Notifys Robot to Resume. Operator Pressed HMI button
{
getLogger().info("resume by HMI");
getApplicationControl().setApplicationOverride(1.0d);
_Main_CommsIO.setOUT217_Collision_ON(false); // Notify PLC that Collsion is turned OFF and Robot has resumed
}
}
}
});
}
Display More
And I plan to enable/disable the collsionobserver on the main routine
public void TakePicture_CameraTool(){
_CameraTool.attachTo(_lbr14.getFlange());
this.setCollisionDetection(_VacuumTool);
_collisionObserver.enable(); // Enable Collision Detection
// Some Robot moves
_collisionObserver.disable(); // Disable Collision Detection
_CameraTool.detach();
}
Display More
As I mention, if I use:
ICondition collisionCondition = ForceCondition.createSpatialForceCondition(_CollisionTool.getDefaultMotionFrame(), collisionForce);
instead of:
ICondition collisionCondition = jt1.or(jt2, jt3, jt4, jt5, jt6, jt7);
works fine, but my intention is to replicate the behavior of the Collision Detection AMF (JointTorqueCondition). When I use the code attached, I get the the error displayed on the picture below
"Cannot be observed because it doesn't have a controller reference". I couldn't find any similar application of the JointTorqueCondition to link it to a controller.
Any suggestion about how to fix it?
Thanks