You can paramaterize your handguiding motion so it only locks the joint that reached its respective limit instead of all joints.
Posts by NullReference
-
-
I see no need to control the stacklight from the safety configuration. You could check your programs state from your application and control the light from there. Keep in mind that when an application is stopped only robot motions are stopped, Java code will continue running untill a call to move the robot is made in the API, when that happens the calling thread will be blocked.
If you really want to know that your application is running then you could use the status controller option.
-
Does entering KRF mode activate the motion enable?
-
I just found this method LBR.getAlphaInverseKinematicFromReference(frame, correspondingJoints, alphaAngle).
By the short description in the java doc it appears to accomplish what you are looking for. Not sure what the alpha angle is though.
-
Now I understand your problem.
Yes, when moving to frames with no redundancy data the calculated IK will just copy the exact same redundancy angle of the current position. Really stupid that it doesn't solve for the closest reachable redundancy.
I believe you can set the redundancy of a given frame with the method Frame.SetRedundancyInformation(robot, IRedundancyColelction).
I have not yet had the need to use calculated frames in my programs yet. When the need arises I think im going to create helper class for calculating frames with redundancy. Perhaps something that performs a simple transformation and returns a new frame with the same redundancy angle of the current robot position (or the redundancy angle of another frame) if the robot can assume that particular configuration, otherwise the closest redundancy angle is calculated.
-
Im not sure I understand your question. By IK do you mean the method robot.getInverseKinematicFromFrame(frame)? If you want to include the redundancy then you have to set it yourself or use a taught frame as taught frame always contain redundancy angle.
If you want to get the IK from a frame with a non-null redundancy angle then use the method robot.getInverseKinematicFromFrameAndRedundancy(frame).
If you want to know more about the kinematic redundancy of the iiwa robots then check the systems integrator manual, it covers this concept fairly well.
-
-
-
This is not true.
Actually you have to set it to false to use Hand Guiding in an application. This should also be mentioned in the manual.And as you (Confused_user) already did correctly is that you use ESMs to make it safe.
I am not that deep into it that I can see if you configured it correctly. But did you set the Hand Guiding Enabling Switch to true in your safety configuration?If you want to handguide the robot using the handguiding motion in the java code then you have to set it to false. If you want to always be able to enter handguding mode even if no java application is running then you set it true. For commissioning it is very helpful to have it set to true.
By the way, ESM states do not guarantee that your application is safe, ESM states are set from normal java code. If you robot becomes unsafe because the wrong ESM state has been set in the wrong place or time then you should re-evaluate your safety configuration.
-
You need to set "enable hand guiding in automatic mode" to true in the station setup.
-
I encounter this fairly often in 1.14. Didn't know restarting multiple times is a solution. I just re-install the station.
-
I'm not really sure if I understood what you mean either. I was thinking about the opposite situation. 'If I want to modify a frame relative to other frames than its parent'
What I was suggesting is that it might be better to use transformation() method instead of setX/Y/Z/A/B/C() methods.
using set...() has only capability to transform itself with referring to it's own(parent's) orientation.
while transformation() has capability to take other frame as its orientation reference.
-> You can't 'simply; yes it's still possible with setParent()' modify your frame to be placed 50mm upward from its ground(World +z) when its parent is not having an aligned orientation to the world.Code// to transform 'corner1' 50mm regarding canvas Z+ corner1.transform( canvas, Transformation.ofTranslation( 0, 0, 50 ) ); // or AbstractFrame formerParent = corner1.getParent(); corner1.setParent( canvas, true ); corner1.setZ( corner1.getZ() + 50 ); corner1.setParent( formerParent, true );
Of course we can simply use set...() methods when a reference frame is not needed. But in that case as well, I'd personally prefer use transformation().
With respect, enlighten me if I'm trapped in my way.I had a frame defined within a base. Getting the frame from getApplicationData() and then increasing z by 10mm transformed the frame not in the positive z-direction of the parent frame but in the z-direction of the frame itself. I had to fetch the parent frame (base) and set the base as a parent to the frame I wanted to transform. After setting the parent my transformation started behaving as it should. I used the debugger to check if the frame had a parent prior to setting its parent programatically and sure enough it already had a reference to the parent frame.
Going by your comment this is not how a simple transformation should behave in this API so I must have done something wrong while transforming.
I agree that transform() is more capable however most of the time I just want to transform relative to the closest parent and just transform 1 coordinate axis.
-
3. Using setX/setY/setZ... will change your frame's value only relatively to the frame itself(which is relative to its parent's transformation/orientation) which means every frames must be set as a child of a frame which you want to use as a base; in your case I think it's Canvas.
When it comes that you need to transform your frame relatively to other frame or to World frame, refer to the code below instead,I just encountered this yesterday. If I understood correctly, modifying the translation of the frame directly is like modifying the frame relative to a parent that has the exact same transformation of the frame you are modifying. If that's right then that's so stupid. If you want to modify a frame relative to the closest parent (which most of the time is what is preferred) then you have to get or create the parent also so you can transform from the parents coordinate system.
-
Use an IRisingEdgeListener to monitor a JointTorqueCondition.
-
Well, that's a very unhelpful exception. Try copying the base with copyWithRedundancy();
Also move the robot with tool.move(). robot.move() plans the motions with the flange.
Debug again and post a picture of the motion that throws this exception. Hover your mouse over the motion and expand all fields. Something is null and it shouldn't be.
-
Debug your program with the eclipse debugger. Put a breakpoint one line before the code that generates the NPE. When the breakpoint is hit check all objects that might be null by hovering over them with the mouse.
-
When it comes to the calibration of both the canvas and the tool, is there any way we gan do this once and then save it in the program? So much hassle to do it every time we upload the code to the robot.Download the latest program to the controller. Do your calibrations, upload the program to your PC. All processdata, frames and bases are saved in the applicationdata xml file. When you download to the controller you overwrite this xml file and thus all data in the controller is lost.
Ahh! That explains why it wouldn’t work! I’ll move it back into initialize as you suggested! When it comes to the handguiding it worked before we started our project, we could push the white button and than guide the arm around.. but recently it haven’t worked.. this may be because we have done some work in the safety configuration ect.. do we need to implement a package or something with the handguiding software? Any help here would be usefull.
Sounds like you should back trace whatever changes you made to the safety configuration and figure it out yourselves.
-
This method "getApplicationData().getFrame("/canvas").copy();" exists in the superclass "RoboticsAPIApplication". Line 22 gets executed when the class is being constructed and before this child class inherits anything from the superclass. That means when you call the method getFrame() which exists in the context of the super class it won't exist in your class context (yet). You can fix this by calling this method in your initialize method instead.
If you want handguiding in manual mode you need the white enabling switch on the flange.
-
You must do a 3 point calibration or atleast teach the canvas base. A newly created frame will always generate a nullpointer exception because it contains no teach data.
-
Did you do a 3 point calibration on the canvas base?
Post your modified code.