# Revision history [back]

Quoting myself in #q285090:

The ur_modern_driver exposes a FollowJointTrajectory action server. As the name implies, that server accepts goals containing a JointTrajectory.

Interacting with an action server is done by writing an action client. This interaction can be both synchronous (ie: blocking) and asynchronous (ie: non-blocking). The former only returns when a trajectory has completed, the latter returns immediately.

I'd suggest you review the wiki/actionlib documentation and do some of the tutorials. That should provide you with some insight.

Quoting myself in #q285090:

The ur_modern_driver exposes a FollowJointTrajectory action server. As the name implies, that server accepts goals containing a JointTrajectory.

Interacting with an action server is done by writing an action client. This interaction can be both synchronous (ie: blocking) and asynchronous (ie: non-blocking). The former only returns when a trajectory has completed, the latter returns immediately.

I'd suggest you review the wiki/actionlib documentation and do some of the tutorials. That should provide you with some insight.

Edit: note that ur_modern_driver does not directly use URScript when executing a trajectory. The limitations mentioned by Thomas only apply when sending script snippets to the controller over the /urscript topic.

Edit2: see also the test_move.py Python script that implements a very rudimentary action client to control the robot through the driver.