"""Everything the robot layer raises. The distinctions matter: they say whether the arm moved, whether anything can be done about it, and whether the answer needs a human first. Taken from the littlehand robot layer, where they were arrived at against this same controller. """ class MotionInterruptedError(Exception): """The motion was aborted in flight, by :meth:`ULite6.stop` or a controller fault.""" class RobotUnavailableError(Exception): """The command never ran because the arm was not usable. A pulled cable, a pressed emergency stop, a latched controller error: what a caller must do is the same, and it is never to carry on as if the arm moved. Recoverable by :meth:`ULite6.recover`. """ class UnreachablePoseError(Exception): """The pose was never commanded because the arm cannot hold it. Deliberately not a :class:`RobotUnavailableError`: the arm is fine and the target is not, so a retry would only ask the same impossible thing and latch a joint limit error on the controller. """ class ArmNeedsHomingError(RobotUnavailableError): """Only a motion of ours can clear this error, so the caller must warn first. A joint past its own limit stays past it however often the error is cleared. Narrow on purpose: an arm that is stopped rather than stuck — emergency stop held, collision to be dragged out of by hand — stays a plain :class:`RobotUnavailableError`, because homing it would move an arm somebody stopped deliberately. """ class EffectorUnsupportedError(Exception): """The configured effector is not one this arm can drive."""