Status and waiting¶
Queries¶
Every query is a request to the controller with a reply, returning None on a timeout:
rbt.ping() # PingResult: hardware_connected
rbt.angles() # [J1..J6] in degrees
rbt.pose() # [x, y, z, rx, ry, rz], mm and degrees; pose("TRF") in the tool frame
rbt.joint_speeds() # deg/s
rbt.tcp_speed() # mm/s
rbt.io() # [in1, in2, out1, out2, estop]
rbt.status() # StatusSnapshot: pose, angles, speeds, io, tool_status
rbt.activity() # what the robot does now: state, command, parameters, error
rbt.queue() # the queued commands
rbt.error() # the current RobotError, or None
rbt.reachable() # remaining travel per joint and axis
rbt.tools(); rbt.profile(); rbt.tcp_offset(); rbt.tcp_transform(); rbt.shapes()
rbt.loop_stats(); rbt.status_rate(); rbt.execution_speed(); rbt.is_simulator()
The status stream¶
The controller broadcasts its state at 50 Hz (set_status_rate() changes it) as multicast; the async client
yields it as a stream:
async for s in rbt.stream_status():
s.angles, s.speeds, s.pose, s.io, s.tool_status
s.action_state, s.action_current, s.executing_index, s.completed_index, s.accepted_index
s.error, s.homed, s.enabled, s.simulator_active, s.collision_active
s.session_id, s.seq, s.mono_time_ns # for recording: a session, a sequence, a timestamp
The fields are listed on Status fields. seq gaps mean missed broadcasts;
session_id changes when the controller restarts; mono_time_ns is the time of the controller's snapshot, not
of the sensor reading. The sync client's wait_status(predicate) waits for a status that satisfies a function.
Waiting for a command¶
index = rbt.move_l(target, wait=False)
ok = rbt.wait_command(index, timeout=10) # True when completed; raises MotionError if it failed
wait_command asks the controller for that command's exact result. Queued commands run in index order, so a
wait on one covers everything queued before it; a jog or a tool.stop() can finish earlier than something queued
before it, which is why a wait never infers success from the highest completed index. A command discarded by
stop(), an E-stop, reset_state(), a teleport or a failure ahead of it raises MotionError with
MOTN_CANCELLED at once; an unknown or expired result stays unconfirmed and the wait returns False at its
timeout. The controller keeps its last 1024 completions and 1024 failures.
wait_motion() waits for the whole queue to run out and the arm to hold still for a settle window; wait_ready()
polls ping() until the controller answers; is_robot_stopped() looks at the joint speeds only.
What "done" means¶
A blocking move returns when the controller reports the command complete: the trajectory played to its end and
the arm at the commanded position, in counted steps. For a tool action, when the gripper's estimated travel
time or its reported state says so. Neither is a measurement of the world: a program that needs to know the
part is in the gripper checks where the jaws stopped (tool.status().positions) or reads a sensor. For the electric
grippers, the tool status's part_detected does not follow the gripper's object-detection bits at this version
(Tool status).
Comments
Found a mistake on this page? Edit it on GitHub · Report it · Get help · This page as Markdown · llms.txt · The whole manual as PDF