Passthrough trajectory controller no response for short goals or current position goal

Scenario:

Passthrough trajectory controller says
“Trajectory should be finished by now. You may want to cancel this goal, if it is not.” If short goals say 600 microns or giving current position as a goal says the above and it gets to a deadlock where client is waiting for controller response and controller is waiting for client to cancel the goal.

Request:

What to do for giving short goals or avoid deadlock when current position is given as a goal ?

Use case:

Passthrough is the only option when used along with force mode. Small motions in microns are needed when doing visual servoing applications

I cannot reproduce any deadlock as you are describing. Sending the current joint position as a target

$ ros2 action send_goal /passthrough_trajectory_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory "{
    trajectory: {                                                                                                                                                                                                                           
      joint_names: [shoulder_pan_joint, shoulder_lift_joint, elbow_joint, wrist_1_joint, wrist_2_joint, wrist_3_joint],                                                                                                                     
      points: [                                                                                                                                                                                                                             
        {                                                                                                                                                                                                                                   
          positions: [-1.6007, -1.7271, -2.2030, -0.8080, 1.5951, -0.0310],                                                                                                                                                                 
          velocities: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],                                                                                                                                                                                       
          accelerations: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0],                                                                                                                                                                                    
          time_from_start: {sec: 2, nanosec: 0}                                                                                                                                                                                             
        }                                                                                                                                                                                                                                   
      ]                                                                                                                                                                                                                                     
    },                                                                                                                                                                                                                                      
    goal_time_tolerance: {sec: 1, nanosec: 0},                                                                                                                                                                                              
    goal_tolerance: [                                                                                                                                                                                                                       
      {name: shoulder_pan_joint, position: 0.01, velocity: 0.0, acceleration: 0.0},                                                                                                                                                         
      {name: shoulder_lift_joint, position: 0.01, velocity: 0.0, acceleration: 0.0},                                                                                                                                                        
      {name: elbow_joint, position: 0.01, velocity: 0.0, acceleration: 0.0},                                                                                                                                                                
      {name: wrist_1_joint, position: 0.01, velocity: 0.0, acceleration: 0.0},                                                                                                                                                              
      {name: wrist_2_joint, position: 0.01, velocity: 0.0, acceleration: 0.0},                                                                                                                                                              
      {name: wrist_3_joint, position: 0.01, velocity: 0.0, acceleration: 0.0}                                                                                                                                                               
    ]                                                                                                                                                                                                                                       
  }"

yields to the following driver output for me:

[ros2_control_node-1] [INFO 2026-08-18 08:21:51.651] [passthrough_trajectory_controller]: Received new trajectory.                                                                                                                          
[ros2_control_node-1] [INFO 2026-08-18 08:21:51.652] [passthrough_trajectory_controller]: Accepted new trajectory with 1 points.                                                                                                            
[ros2_control_node-1] [INFO 2026-08-18 08:21:51.652] [passthrough_trajectory_controller]: Using goal tolerances                                                                                                                             
[ros2_control_node-1] shoulder_pan_joint -- position: 0.01, velocity: 0, acceleration: 0                                                                                                                                                    
[ros2_control_node-1] shoulder_lift_joint -- position: 0.01, velocity: 0, acceleration: 0                                                                                                                                                   
[ros2_control_node-1] elbow_joint -- position: 0.01, velocity: 0, acceleration: 0                                                                                                                                                           
[ros2_control_node-1] wrist_1_joint -- position: 0.01, velocity: 0, acceleration: 0                                                                                                                                                         
[ros2_control_node-1] wrist_2_joint -- position: 0.01, velocity: 0, acceleration: 0                                                                                                                                                         
[ros2_control_node-1] wrist_3_joint -- position: 0.01, velocity: 0, acceleration: 0                                                                                                                                                         
[ros2_control_node-1]                                                                                                                                                                                                                       
[ros2_control_node-1] [INFO 2026-08-18 08:21:51.652] [passthrough_trajectory_controller]: Goal time tolerance: 1 sec                                                                                                                        
[ros2_control_node-1] [INFO 2026-08-18 08:21:51.662] [controller_manager.hardware_component.system.ur5e]: Got a new trajectory with 1 points.
[ros2_control_node-1] [INFO 2026-08-18 08:21:53.688] [controller_manager.hardware_component.system.ur5e]: Trajectory done callback called with result: 0
[ros2_control_node-1] [INFO 2026-08-18 08:21:53.689] [passthrough_trajectory_controller]: Trajectory executed successfully in 2.024882 (scaled) seconds! The real time needed for execution could be longer.

The action client reports the action as being executed successfully, as well.

Goal accepted with ID: 682b14a50d3449cab4d4654df804c68c    

Result:                                                    
    error_code: 0                                          
error_string: Trajectory executed successfully in 2.024882 (scaled) seconds! The real time needed for execution could be longer.

Goal finished with status: SUCCEEDED

When using a very tight goal tolerance that is below the encoder’s noise level, the trajectory fails.

It can happen that the ROS control loop runs a bit faster than the robot’s one in which case you see the output you mentioned in the OP. But also in that case the trajectory finishes correctly:

[ros2_control_node-1] [INFO 2026-08-18 08:32:46.497] [passthrough_trajectory_controller]: Received new trajectory.
[ros2_control_node-1] [INFO 2026-08-18 08:32:46.498] [passthrough_trajectory_controller]: Accepted new trajectory with 1 points.
[ros2_control_node-1] [INFO 2026-08-18 08:32:46.498] [passthrough_trajectory_controller]: Goal time tolerance: 0 sec
[ros2_control_node-1] [INFO 2026-08-18 08:32:46.499] [controller_manager.hardware_component.system.ur5e]: Got a new trajectory with 1 points.
[ros2_control_node-1] [WARN 2026-08-18 08:32:48.503] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ros2_control_node-1] [INFO 2026-08-18 08:32:48.525] [controller_manager.hardware_component.system.ur5e]: Trajectory done callback called with result: 0
[ros2_control_node-1] [INFO 2026-08-18 08:32:48.527] [passthrough_trajectory_controller]: Trajectory executed successfully in 2.021978 (scaled) seconds! The real time needed for execution could be longer.

Could you send the commit id which can work well with ROS humble ? We are using the commit id GitHub - UniversalRobots/Universal_Robots_ROS2_Driver at 050377245442ecedafa86abe5a10579e6ecc3ffc · GitHub Does this issue got solved after this commit id

I was originally doing my test on Rolling master, as a) you didn’t specify any version and b) I don’t remember touching that in quite a while.

I ran the same test on Humble using a combination based in your driver’s version

I also tested the current Humble development head.

All versions I tested worked fine. Since you seem to be using a rather old version, I would recommend updating everything to the latest Humble-Release. If the issue still persists, please give us some more information on how to reproduce this. Exact commands and full output are most helpful there.

I used the same commit of all mentioned in this

When the robot is in below mentioned position, I used RVIZ motion planning tab with checkbox of use cartesian path, the same issue hits. But I have printed out the goal request from the passthrough trajectory controller side to reproduce the issue

On top of that I added following print statement

RCLCPP_INFO_STREAM(get_node()->get_logger(), "Printout the goal request "

                                                   << control_msgs::action::to_yaml(*goal_handle->get_goal())<< std::endl);

on the file passthrough_trajectory_controller.cpp below this line (Universal_Robots_ROS2_Driver/ur_controllers/src/passthrough_trajectory_controller.cpp at 050377245442ecedafa86abe5a10579e6ecc3ffc · UniversalRobots/Universal_Robots_ROS2_Driver · GitHub)

Following is the output of ros driver after doing these changes. Still, I am facing the same issue

[ur_ros2_control_node-1] [INFO] [1787211946.752866132] [passthrough_trajectory_controller]: Printout the goal request trajectory:
[ur_ros2_control_node-1]   header:
[ur_ros2_control_node-1]     stamp:
[ur_ros2_control_node-1]       sec: 0
[ur_ros2_control_node-1]       nanosec: 0
[ur_ros2_control_node-1]     frame_id: "world"
[ur_ros2_control_node-1]   joint_names:
[ur_ros2_control_node-1]   - "elbow_joint"
[ur_ros2_control_node-1]   - "shoulder_lift_joint"
[ur_ros2_control_node-1]   - "shoulder_pan_joint"
[ur_ros2_control_node-1]   - "wrist_1_joint"
[ur_ros2_control_node-1]   - "wrist_2_joint"
[ur_ros2_control_node-1]   - "wrist_3_joint"
[ur_ros2_control_node-1]   points:
[ur_ros2_control_node-1]   -
[ur_ros2_control_node-1]     positions:
[ur_ros2_control_node-1]     - -1.95095
[ur_ros2_control_node-1]     - -1.51139
[ur_ros2_control_node-1]     - -1.60931
[ur_ros2_control_node-1]     - -1.26492
[ur_ros2_control_node-1]     - 1.59463
[ur_ros2_control_node-1]     - -0.0391460
[ur_ros2_control_node-1]     velocities:
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     accelerations:
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     - 0.00000
[ur_ros2_control_node-1]     effort: []
[ur_ros2_control_node-1]     time_from_start:
[ur_ros2_control_node-1]       sec: 0
[ur_ros2_control_node-1]       nanosec: 0
[ur_ros2_control_node-1] multi_dof_trajectory:
[ur_ros2_control_node-1]   header:
[ur_ros2_control_node-1]     stamp:
[ur_ros2_control_node-1]       sec: 0
[ur_ros2_control_node-1]       nanosec: 0
[ur_ros2_control_node-1]     frame_id: ""
[ur_ros2_control_node-1]   joint_names: []
[ur_ros2_control_node-1]   points: []
[ur_ros2_control_node-1] path_tolerance: []
[ur_ros2_control_node-1] component_path_tolerance: []
[ur_ros2_control_node-1] goal_tolerance: []
[ur_ros2_control_node-1] component_goal_tolerance: []
[ur_ros2_control_node-1] goal_time_tolerance:
[ur_ros2_control_node-1]   sec: 0
[ur_ros2_control_node-1]   nanosec: 0
[ur_ros2_control_node-1] 
[ur_ros2_control_node-1] 
[ur_ros2_control_node-1] [INFO] [1787211946.752938539] [passthrough_trajectory_controller]: Goal time tolerance: 0 sec
[ur_ros2_control_node-1] [INFO] [1787211946.755067962] [URPositionHardwareInterface]: Got a new trajectory with 1 points.
[ur_ros2_control_node-1] [WARN] [1787211946.761485654] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ur_ros2_control_node-1] [WARN] [1787211947.761607025] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ur_ros2_control_node-1] [WARN] [1787211948.763730557] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ur_ros2_control_node-1] [WARN] [1787211949.765706477] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ur_ros2_control_node-1] [WARN] [1787211950.767405613] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ur_ros2_control_node-1] [WARN] [1787211951.769581466] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ur_ros2_control_node-1] [WARN] [1787211952.769661112] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.
[ur_ros2_control_node-1] [WARN] [1787211953.769856912] [passthrough_trajectory_controller]: Trajectory should be finished by now. You may want to cancel this goal, if it is not.

I see. The timing seems to be the issue, not the distance. I’ll check and come back to this.

Fix/passthrough controller very short trajectories by urfeex · Pull Request #1940 · UniversalRobots/Universal_Robots_ROS2_Driver · GitHub should fix this.