"""Isolated DDS-domain integration fixture. All hardware transports are fake.""" import threading import time from pathlib import Path # The caller assigns a private ROS_DOMAIN_ID before importing rclpy. import rclpy from rclpy.executors import MultiThreadedExecutor from rclpy.node import Node from arm_msgs.srv import GripperExecute from arm_application.dh_pgea import GripperState import arm_application.dh_pgea_node as driver class FakeGripper: writes=[] def __init__(self,**kwargs): self.state=GripperState(init_state=1,grip_state=1,position=300,target_position=300,target_force=33) def open(self): pass def close(self): pass def probe(self): return 1 def get_run_states(self,**kwargs): return self.state def initialize(self): self.writes.append('INIT') def move(self,pos,force,speed): self.writes.append((pos,force,speed));self.state.position=pos;self.state.target_position=pos;return True def main(): driver.DhPgeaGripper=FakeGripper rclpy.init(args=['--ros-args','-r','__ns:=/station/grippers/arm_89','-p','auto_init:=false']) device=driver.DhPgeaNode() assert device.get_namespace()=='/station/grippers/arm_89',device.get_namespace() client_node=Node('station_test_client') executor=MultiThreadedExecutor(num_threads=2);executor.add_node(device);executor.add_node(client_node) thread=threading.Thread(target=executor.spin,daemon=True);thread.start() try: client=client_node.create_client(GripperExecute,'/station/grippers/arm_89/execute') assert client.wait_for_service(timeout_sec=3) def command(name,position=0,force=33,speed=25): req=GripperExecute.Request();req.command.command=name;req.command.position=float(position) req.command.force=float(force);req.command.speed=float(speed) future=client.call_async(req);deadline=time.monotonic()+3 while not future.done() and time.monotonic()packet['epochs']['left'] assert site_catalog._TACTILE['left']['force_n'] is None gateway.watch_tactile(True) gateway._tactile_image('left_thermal',message) assert 'left_thermal' in gateway.tactile_frames() gateway.watch_tactile(False) assert not gateway.tactile_frames() and not gateway._tactile_images.items print('ROS tactile driver reuse, unchanged force values and preview lifetime PASS',flush=True) print('ROS persistent gateway, arm identity and trajectory cancellation PASS',flush=True) finally: action.destroy();gateway.executor.remove_node(fake);fake.destroy_node();gateway.close() if __name__=='__main__': main()