Hello!
I have an UR5 that I want to control realtime, setting the TCP to coordinates generated realtime too by an external computer. I have been using Python + urx to send programs, but there’s a ≈0.5 seconds stop between each program sent.
How can I control it like in this video, where it seems that the robot is just waiting for a continuous stream of coordinates? https://video.universal-robots.com/1to1-telerobotics-extender-by
Is it using RTDE? I see how to read positions (outputs) but not how to set them.
Thanks!
Marc
You will want to check the servoj
command. Essentially you bypass the controller’s path planning and stream directly a list of joint targets that the robot tries to track as fast as possible (with some parameters on how “aggressive” you want to track the target pose).
The naive way we tried at first is to stream servoj
commands over the realtime interface, which “kind of works” but the control loop requires strict timing so if you drop commands because of OS lag or network congestion your bot will jitter like crazy.
We moved to having a local program sending constantly the servoj
with the joint targets stored in the RTDE buffer, and we update remotely the RTDE buffer. This is how ROS implements realtime remote control and I think is the recommended way to do it since you guarantee sending servoj
at precise interval since you’re generating that locally on the robot controller, and you only manipulate the target remotely via RTDE messages so it’s not as time-critical if you miss the 125Hz update mark.
I would be also interested in this topic. Does one of you know some example code or a project where this is implemented, preferably in Python for easy and fast testing?
We modeled our current realtime setup by studying the sources there GitHub - Mandelbr0t/UniversalRobot-Realtime-Control: A Fork of https://bitbucket.org/RopeRobotics/ur-interface/src. I reduced the code to the absolute minimum needed for executing commands and added an option for real-time Control of a UR Robot.
Essentially a light program is sent to the controller, doing a simple lookup of RTDE float buffer values as a 6 joints pose, and formats it as a servoj
command and sync
, then you remotely update the RTDE float buffer values. This makes sure that if you drop frames over network the servoj
command is still sent at the proper 125Hz update rate and the robot wont jitter. By using the servoj
command you will always be slightly lagging behind your actual target, even if using aggressive gain and lookahead values. From our research the “ultimate” way to realtime control the bot is to use the speedj
command with a control loop so you can be closer to the target than with a simple proportional control loop as servoj
is doing, but the current setup is good enough for us.
hello
Have you implemented the functions in the video?How do you do that it.I also interested in this topic.
Looking forward to your reply!
Thank you very much.
hi,
Im doing these things recently. Have you achieved your idea yet?
Is URscript(servoj) useful for this problem? Im glad you will show some example codes or give me some advise.
thanks!
Hi, we have since moved to using ROS for realtime control and trajectory execution so I cannot help any further. From reading sources I think the servoj/speedj are internally used by the URCap for ROS control so yes it’s just the same idea, but nicely wrapped with nice interfaces.