feat: 记录夹爪逻辑执行状态

This commit is contained in:
2026-08-10 17:57:07 +08:00
parent 7b2caf3012
commit 043d3d0533
5 changed files with 183 additions and 5 deletions
+64
View File
@@ -1,4 +1,5 @@
import math
import threading
import time
from types import SimpleNamespace
@@ -42,6 +43,69 @@ class FakePublisher:
self.messages.append(message)
def _tool_state_teleop(*, command_error=None):
started = threading.Event()
release = threading.Event()
class Adapter:
def set_tool_enabled(self, open_tool):
del open_tool
started.set()
assert release.wait(timeout=1.0)
if command_error is not None:
raise command_error
teleop = object.__new__(SingleArmVelocityTeleop)
teleop._arm_name = "right_rm75"
teleop._adapter = Adapter()
teleop._tool_command_queue = None
teleop._tool_worker_stop = threading.Event()
teleop._tool_worker_thread = None
teleop._tool_state_lock = threading.Lock()
teleop._tool_target_open = True
teleop._tool_state_open = True
teleop._tool_command_pending = False
teleop._tool_command_failed = False
teleop.get_logger = lambda: FakeLogger()
teleop._start_tool_worker()
return teleop, started, release
def test_tool_state_changes_only_after_command_succeeds() -> None:
teleop, started, release = _tool_state_teleop()
try:
teleop._enqueue_tool_command(False, "test")
assert started.wait(timeout=1.0)
assert teleop._tool_state_snapshot() == (False, True, True, False)
release.set()
assert teleop._tool_command_queue is not None
teleop._tool_command_queue.join()
assert teleop._tool_state_snapshot() == (False, False, False, False)
finally:
release.set()
teleop._shutdown_tool_worker()
def test_tool_failure_keeps_previous_state_and_is_reported() -> None:
teleop, started, release = _tool_state_teleop(
command_error=RuntimeError("modbus failed")
)
try:
teleop._enqueue_tool_command(False, "test")
assert started.wait(timeout=1.0)
release.set()
assert teleop._tool_command_queue is not None
teleop._tool_command_queue.join()
assert teleop._tool_state_snapshot() == (False, True, False, True)
finally:
release.set()
teleop._shutdown_tool_worker()
def _joint_publishing_teleop() -> SingleArmVelocityTeleop:
names = [f"omnipic_joint_{index}" for index in range(1, 8)]
teleop = object.__new__(SingleArmVelocityTeleop)