With a UR5 (CB3 controller), is there a way to servo the joints (using MoveJ, or similar) from the python API through a large number of joint positions, without the robot stopping at each point?
I teach a class in robotics and would like the students to implement a form of resolved motion rate control using the inverse Jacobian. I would expect them to develop code for the Jacobian (either in python or Matlab, offline), to calculate a series of required joint angles to effect a trajectory for the end-effector. They would determine an k x 6 matrix to move through k points in joint space (where k might consist of approximately 100 points/move). If I do this using a MoveJ in a loop, the robot briefly stops at each point, making the motion fairly jerky. Is there any way to get it to smoothly move through these (or approximately these) points?
Any help or suggestions would be appreciated.
This project looks interesting!
You should include a rounding/blending parameter to your motion. The rounding/blending parameter will prevent the robot from stopping at every point.
You can find the rounding instruction in the main menu -> Program -> Set rounding Instruction.
One more thing, make sure to implement a "minimum distance between each point" validation in your algorithm.
You don't want to feed points that have a relative distance of less than the minimum increment of the robot (smallest movement the robot can do).
The rounding can also affect the minimum distance. (Most likely towards a bigger value.)
Let me know if it works.
As I am using the python API, the main menu -> Program -> Set rounding Instruction doesn't quite work for me. However, that did lead me to find the robolink.setRounding() function that does do what I want.
I just reread your post and I missed that API part... Oups!
Glade you found the solution on your own.
I am facing a very similar problem as above, I believe.
I am controlling a Staubli TX2-90 arm through the Python APIs. As I am implementing a human-robot interface, I need to stream live data to the robot which is controlled in velocity.
I am testing the "Move robot using a keyboard" example, but after each MoveJ the robot stops for almost a second.
I tried to change the smoothing parameter with robot.setZoneData, but it does not change much.
Unfortunately, it's impossible to achieve continuous motion using drivers.
For continuous motions to occur, the robot controller needs to read "ahead" of the current motion command. This way it can manage the transition.
RoboDK's driver streams the command to the robot one by one, waiting for a confirmation from the controller before sending the next command.
To achieve continuous motions, you need to generate a robot program using the Staubli VAL3 post-processor.
thank you for your quick reply.
You mean that it is not possible to stream live data and obtain a smooth trajectory?
What would you recommend for my problem (i.e. I want to obtain a smooth trajectory from live data stream)?
Should I generate a robot program that listens to my inputs and send them through UDP? Can you help me with this?
Sorry, it seems like I never pressed send on my answer.
As far as I know, I don't think it's possible to have a smooth trajectory using streamed data. If you ever find a way, please let us know.
I see, maybe my question was not super clear :)
So far I only used Python online programming.
How do I stream data to an offline-programmed robot? the motion looks much smoother in that case.
I'd need to:
- compute the next robot pose on some external process (OK)
- stream the pose to the robot through UDP (MISSING)
- move the robot to the new location (OK)
but I don't know how to implement UDP communication in RoboDK.