"""Run new device nodes on a private ROS domain, with every device mocked.""" import threading import time from unittest.mock import patch import cv2 import numpy as np import rclpy from rclpy.node import Node from rclpy.executors import MultiThreadedExecutor from rclpy.qos import qos_profile_sensor_data from sensor_msgs.msg import CompressedImage from geometry_msgs.msg import WrenchStamped from arm_msgs.msg import TactileStatus from arm_msgs.srv import GripperExecute from std_srvs.srv import Trigger from arm_application.dh_pgea import GripperState import arm_application.gripper_node as gripper from arm_application.tactile_flow_node import TactileFlowNode class FakeGripper: writes=[];fail_force=False def __init__(self,**kwargs):self.state=GripperState(init_state=1,grip_state=1,position=300) def open(self):pass def close(self):pass def get_run_states(self,**kwargs):return self.state def set_target_force(self,v):self.writes.append(('force',v));return not self.fail_force def set_target_speed(self,v):self.writes.append(('speed',v));return True def set_target_position(self,v):self.writes.append(('position',v));self.state.position=v;return True rclpy.init(args=['--ros-args','-r','__ns:=/isolated_devices']) gripper.DhPgeaGripper=FakeGripper jaw=gripper.GripperNode() with patch.object(TactileFlowNode,'_capture',return_value=None):sensor=TactileFlowNode() client_node=Node('device_test_client');statuses=[];frames=[];forces=[] client_node.create_subscription(TactileStatus,'/tactile/left/status',statuses.append,10) client_node.create_subscription(WrenchStamped,'/tactile/left/wrench',forces.append,qos_profile_sensor_data) client_node.create_subscription(CompressedImage,'/tactile/left/flow/compressed',frames.append,qos_profile_sensor_data) client=client_node.create_client(GripperExecute,'/isolated_devices/execute') executor=MultiThreadedExecutor(num_threads=2) for node in (jaw,sensor,client_node):executor.add_node(node) thread=threading.Thread(target=executor.spin,daemon=True);thread.start() try: assert client.wait_for_service(timeout_sec=3) def request(command,pos=0.,force=33.,speed=25.): req=GripperExecute.Request();req.command.command=command;req.command.position=pos;req.command.force=force;req.command.speed=speed future=client.call_async(req);end=time.monotonic()+3 while not future.done() and time.monotonic()