Menlo
Python SDKGuides

Control Joints Directly

goto and trajectory: per-joint targets, with the walking policy off.

When a gait won't do — a pose, a gesture, your own controller — drive the joints yourself. Two verbs: goto moves to a pose for you, trajectory sends one setpoint and expects you to clock the next.

A trajectory turns the balance policy off

Every joint goes under position control and nothing keeps the robot upright. On a standing biped, use these only with the robot supported — a crane, a stand, a hand — or with gains you know hold the legs. A fall latches a fault-DAMP that lasts until the firmware restarts.

Move to a Pose

goto interpolates from where the robot is to where you asked, minimum-jerk, clocking setpoints from a background thread at hz:

robot.goto(pose, duration=2.0)               # blocks until every joint is within tolerance
robot.goto(pose, duration=2.0, wait=False)   # returns immediately

pose is one radian value per motor in firmware order — robot.info.dof of them, named in robot.info.joint_names. It holds the pose after arriving, by re-sending it, until another verb takes over. goto refuses to plan from a reported pose older than half a second.

A goto is fenced: any verb from any thread — damp(), stand(), a velocity — stops the goto thread before its next setpoint leaves.

Stream Your Own Setpoints

trajectory is the raw form. You clock it:

import time

for target in my_controller:            # 50 Hz
    robot.trajectory(target)
    time.sleep(0.02)

Two things will bite you:

  • Keep sending. The edge DAMPs a trajectory about two seconds after the last setpoint. A stalled loop is a limp robot, not a frozen one.
  • kp=0 is not "no gain". The firmware substitutes its own damping constants, which is limp. Leave kp/kd as None to use the robot's own per-joint gains.

Whoever Streams, Owns

A loop you clock yourself is not fenced the way goto is. While it streams, your loop is the controller: a mode verb sent from another thread is overwritten by your next setpoint, and nothing raises. Stop streaming, then send the verb. In an emergency, kill the process: the edge DAMPs by itself about two seconds after the last setpoint. See Safety.

Next

How is this guide?

On this page