fix zero-velocity jog reporting a running motion as idle
start_jog restored READY for any zero velocity, without checking whether a motion owned the arm. A teleop source streaming zero-velocity ticks during a move published moving -> ready mid-motion, and the closing guard in _run_motion then saw READY rather than MOVING and never republished, so a caller watching robot_state concluded the motion had finished early. Route every "the arm has stopped" transition through _idle_unless_busy, which reports READY only when no motion is running, no jog is driving the arm, and the state has not already left MOVING for unavailable or recovering. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -130,6 +130,29 @@ def test_a_zero_velocity_jog_puts_the_arm_back_to_ready(monkeypatch):
|
||||
control.shutdown()
|
||||
|
||||
|
||||
def test_a_zero_velocity_jog_does_not_make_a_running_motion_look_idle(monkeypatch):
|
||||
# A teleop source streaming zero velocity says nothing about a motion that
|
||||
# owns the arm, and must not answer for it: an arm that is travelling must
|
||||
# never look idle, and a `ready` here would also stop the motion's own end
|
||||
# from ever being published.
|
||||
control = build(monkeypatch)
|
||||
control.arms[0].block = threading.Event()
|
||||
try:
|
||||
wait_for(lambda: READY in control.take_state_changes())
|
||||
control.submit(ServiceCall(request_id="m1", row={"service": "home"}))
|
||||
wait_for(lambda: MOVING in control.take_state_changes())
|
||||
|
||||
for _ in range(5):
|
||||
control.start_jog([0.0] * 6)
|
||||
|
||||
assert control.take_state_changes() == []
|
||||
|
||||
control.arms[0].block.set()
|
||||
wait_for(lambda: READY in control.take_state_changes())
|
||||
finally:
|
||||
control.shutdown()
|
||||
|
||||
|
||||
def test_a_sender_that_goes_quiet_stops_being_called_jogging(monkeypatch):
|
||||
# The controller expires the command on its own; nothing tells us, so the
|
||||
# clock has to.
|
||||
|
||||
Reference in New Issue
Block a user