Skip to content

Motion

Planned motion: the client sends a target, the controller plans the trajectory in its planner subprocess, checks it for collisions and limits, queues it, and plays it. Every planned command returns a command index and runs in queue order.

The five moves

Call Path Target
move_j(angles) Straight in joint space: every joint moves proportionally, all finish together. The tool's path curves Six joint angles, or pose= a Cartesian pose solved once at the target
move_l(pose) A straight line of the tool, orientation interpolated A pose in the WRF, or in the TRF with frame="TRF"
move_c(via, end) A circular arc from the current pose through via to end Two poses
move_s(waypoints) A cubic spline through the waypoints A list of poses
move_p(waypoints) A process path: the waypoints joined by lines, run at constant tool speed with automatic blending at the corners A list of poses

rel=True on move_j and move_l makes the target relative to the current angles or pose; with frame="TRF" a relative move_l moves along the tool's own axes.

rbt.move_j([90, -90, 180, 0, 0, 180], speed=0.5)                 # joint move
rbt.move_j(pose=[100, 340, 334, 90, 0, 90], speed=0.5)           # IK at the target, then a joint move
rbt.move_l([-50, 340, 334, 90, 0, 90], speed=0.3)                # straight line
rbt.move_l([0, 0, -20, 0, 0, 0], frame="TRF", rel=True, speed=0.2)   # 20 mm out of the tool: the API's -Z
rbt.move_c(via=[0, 250, 250, 90, 0, 90], end=[0, 263, 242, 90, 0, 90], speed=0.5)
rbt.move_s([[0, 263, 242, 90, 0, 90], [50, 250, 200, 90, 0, 90]], speed=0.5)
rbt.move_p(waypoints, speed=0.8)

Speed, acceleration, duration

speed and accel are fractions of the robot model's maxima in (0, 1], default 0.5 each. For a joint move they scale the leading joint; for a Cartesian move they scale the tool's linear and angular limits, with the joint limits as hard bounds. A duration in seconds times the move instead and speed is ignored; duration and speed are not combined. The move's actual speed is also capped by what the profile and the limits allow: a short move never reaches the asked speed.

rbt.move_l(target, speed=0.25, accel=1.0)      # a quarter of the Cartesian speed limit, full acceleration
rbt.move_l(target, duration=2.0)               # two seconds, whatever that takes

Blending

r, in millimetres, on move_j, move_l and move_c: the move does not stop at its target but blends into the next queued move within that radius (Blending). move_p blends on its own.

Profiles

select_profile("TOPPRA") and the others set how the speed curve is shaped for all planned moves (Motion profiles); profile() reads it. The profiles of this version: TOPPRA, RUCKIG, QUINTIC, TRAPEZOID, LINEAR.

Waiting

wait=True, the default, blocks until the move completes and raises MotionError if it was cancelled or failed; TimeoutError if the timeout runs out first, in which case the move is still queued and stop() cancels it. wait=False returns the index for a later wait_command(); wait_motion() waits for the whole queue and for the arm to come to rest (Status and waiting).

Execution speed and pause

set_execution_speed(0.5) runs the queued trajectory at half its planned speed from now on, 10 to 100 %; pause() decelerates the queue to a hold and resume() continues it. Both keep the queue. A paused robot's execution_speed().paused is true once it has actually stopped.

Refusals

A target outside the joint limits, a pose the IK cannot solve, a path that collides, an unhomed robot, a latched protective stop: the command is refused before anything moves, with a MotionError whose code says why (Errors). A refused command cancels nothing already queued; a command that fails while running cancels everything queued behind it.

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