Command, the follower writes an AppliedAction, and a LimitEvent records
any joint it had to hold back on the way.
on_applied hands you the AppliedAction, and on_limited hands you one
LimitEvent per joint that was held back. What comes back the other way is an
Observation.
Command
One tick of the leader’s pose, on its way to the follower. The SDK packs it from yourread_joints() and sends it.
int
Identifies this command for the whole session. Safe to use as a key when
matching a dataset row back to its command.
int
The newest observation the leader had when it asked, so you can tell what it
was looking at.
dict
The values asked for, in the order the descriptor declares them.
AppliedAction
What the follower actually wrote to the motors, and how far that was from what was asked.dict[str, float]
The values written, after limits and the speed cap.
dict[str, float]
The values asked for, before either. Kept so the difference stays visible.
bool
True when anything was held back on this tick.tuple[LimitEvent, ...]
One entry per joint that was held back. Empty when nothing was.
int
Which command this came from.
int
Which observation that command was acting on.
float
Milliseconds from that observation to this write. Both ends are timed on the
follower, so it is exact.
bool
False means your write_joints() raised, and the follower stopped the arm.Keeping both is what lets you tell smooth driving from a limit doing the work.
Train on
action, since that is what the arm really did.LimitEvent
One joint that was held back on one tick.str
Which joint.
float
What was asked for.
float
What was written instead.
float
The difference between the two.
LimitRule
POSITION if it hit a joint limit, SLEW if it was moving too fast.Related
Observation
What the leader was looking at when it asked.
SafetyConfig
The limits that turn a command into an applied action.