Hi Seulki,
That was issue, is working now. I just tested it on friday (Didnt get the chance to get into the robot since), and it worked.
Below my new Collision program
Code
public void setCollisionDetection(){ // *********************************************** Collision Detection Program *********************
bCollision = true;
//Use _CameraTool as the default tool for collisionCondition. All tools have the same payload. Using just one tool is quicker for Activation
JointTorqueCondition jt1 = new JointTorqueCondition(_lbr14,JointEnum.J1, -collisionForce, collisionForce);
JointTorqueCondition jt2 = new JointTorqueCondition(_lbr14,JointEnum.J2, -collisionForce, collisionForce);
JointTorqueCondition jt3 = new JointTorqueCondition(_lbr14,JointEnum.J3, -collisionForce, collisionForce);
JointTorqueCondition jt4 = new JointTorqueCondition(_lbr14,JointEnum.J4, -collisionForce, collisionForce);
JointTorqueCondition jt5 = new JointTorqueCondition(_lbr14,JointEnum.J5, -collisionForce, collisionForce);
JointTorqueCondition jt6 = new JointTorqueCondition(_lbr14,JointEnum.J6, -collisionForce, collisionForce);
JointTorqueCondition jt7 = new JointTorqueCondition(_lbr14,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
I had to create a BooleanIOCondition to reset it from the PLC
Code
public void AckCollisionDetection(){ // ************************************* Acknowledge from PLC Collision Detection Program **************
AbstractIO _Collision_ACK= _Main_CommsIO.getInput("IN217_Collision_ACK");
BooleanIOCondition _Collision_ACK_True = new BooleanIOCondition(_Collision_ACK, true);
_ResetcollisionObserver = getObserverManager().createConditionObserver(_Collision_ACK_True, NotificationType.OnEnable, new IRisingEdgeListener(){
@Override
public void onRisingEdge(ConditionObserver conditionObserver,Date time, int missedEvents) {
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 on the main code, all I have to do is:
Code
this.setCollisionDetection();
this.AckCollisionDetection();
_ResetcollisionObserver.enable(); //
_collisionObserver.enable(); //
//Some Robot moves
_ResetcollisionObserver.disable(); //
_collisionObserver.disable(); //
Display More
Thanks so much