@@ -123,20 +123,25 @@ def get_joint_positions(self) -> dict[str, float]:
123123 return self ._rpc .get_joint_positions () or {}
124124
125125 def get_trajectory_status (self , task_name : str ) -> dict [str , Any ]:
126- """Get status of a trajectory task."""
127- return self ._rpc .get_trajectory_status (task_name ) or {}
126+ """Get status of a trajectory task via task_invoke."""
127+ result = self ._rpc .task_invoke (task_name , "get_state" , {})
128+ if result is not None :
129+ return {"state" : int (result ), "task" : task_name }
130+ return {}
128131
129132 # =========================================================================
130- # Trajectory execution (RPC calls )
133+ # Trajectory execution (via task_invoke )
131134 # =========================================================================
132135
133136 def execute_trajectory (self , task_name : str , trajectory : JointTrajectory ) -> bool :
134- """Execute a trajectory on a task."""
135- return self ._rpc .execute_trajectory (task_name , trajectory ) or False
137+ """Execute a trajectory on a task via task_invoke."""
138+ result = self ._rpc .task_invoke (task_name , "execute" , {"trajectory" : trajectory })
139+ return bool (result )
136140
137141 def cancel_trajectory (self , task_name : str ) -> bool :
138- """Cancel an active trajectory."""
139- return self ._rpc .cancel_trajectory (task_name ) or False
142+ """Cancel an active trajectory via task_invoke."""
143+ result = self ._rpc .task_invoke (task_name , "cancel" , {})
144+ return bool (result )
140145
141146 # =========================================================================
142147 # Task selection and setup
@@ -320,26 +325,32 @@ def preview_trajectory(trajectory: JointTrajectory, joint_names: list[str]) -> N
320325
321326
322327def wait_for_completion (client : CoordinatorClient , task_name : str , timeout : float = 60.0 ) -> bool :
323- """Wait for trajectory to complete with progress display."""
328+ """Wait for trajectory to complete by polling task state.
329+
330+ TrajectoryState is an IntEnum: IDLE=0, EXECUTING=1, COMPLETED=2, ABORTED=3, FAULT=4.
331+ """
324332 start = time .time ()
325- last_progress = - 1.0
333+ _STATE_NAMES = { 0 : "IDLE" , 1 : "EXECUTING" , 2 : "COMPLETED" , 3 : "ABORTED" , 4 : "FAULT" }
326334
327335 while time .time () - start < timeout :
328336 status = client .get_trajectory_status (task_name )
329- if not status .get ("active" , False ):
330- state : str = status .get ("state" , "UNKNOWN" )
331- print (f"\n Trajectory finished: { state } " )
332- return state == "COMPLETED"
337+ if not status :
338+ print ("\n Could not get trajectory status" )
339+ return False
333340
334- progress = status .get ("progress" , 0.0 )
335- if progress != last_progress :
336- bar_len = 30
337- filled = int (bar_len * progress )
338- bar = "=" * filled + "-" * (bar_len - filled )
339- print (f"\r [{ bar } ] { progress * 100 :.1f} %" , end = "" , flush = True )
340- last_progress = progress
341+ state_val = status .get ("state" )
342+ state_name = _STATE_NAMES .get (state_val , f"UNKNOWN({ state_val } )" ) # type: ignore[arg-type]
341343
342- time .sleep (0.05 )
344+ if state_val in (0 , 2 ): # IDLE or COMPLETED
345+ print (f"\n Trajectory finished: { state_name } " )
346+ return True
347+ if state_val in (3 , 4 ): # ABORTED or FAULT
348+ print (f"\n Trajectory failed: { state_name } " )
349+ return False
350+ # state_val == 1 means EXECUTING, keep polling
351+ elapsed = time .time () - start
352+ print (f"\r Executing... ({ elapsed :.1f} s)" , end = "" , flush = True )
353+ time .sleep (0.1 )
343354
344355 print ("\n Timeout waiting for trajectory" )
345356 return False
@@ -471,12 +482,12 @@ def run(self) -> None:
471482
472483 def status (self ) -> None :
473484 """Show task status."""
485+ _STATE_NAMES = {0 : "IDLE" , 1 : "EXECUTING" , 2 : "COMPLETED" , 3 : "ABORTED" , 4 : "FAULT" }
474486 status = self ._client .get_trajectory_status (self ._current_task )
487+ state_val = status .get ("state" )
488+ state_name = _STATE_NAMES .get (state_val , f"UNKNOWN({ state_val } )" ) # type: ignore[arg-type]
475489 print (f"\n Task: { self ._current_task } " )
476- print (f" Active: { status .get ('active' , False )} " )
477- print (f" State: { status .get ('state' , 'UNKNOWN' )} " )
478- if "progress" in status :
479- print (f" Progress: { status ['progress' ] * 100 :.1f} %" )
490+ print (f" State: { state_name } ({ state_val } )" )
480491
481492 def cancel (self ) -> None :
482493 """Cancel active trajectory."""
0 commit comments