From 0682de64276eb7f49cdc821d256531fdd203a1f8 Mon Sep 17 00:00:00 2001 From: Bill Finger Date: Fri, 23 May 2025 20:27:35 +0300 Subject: [PATCH] use thread instead async --- node.py | 53 ++++++++++++++++++++--------------------------------- 1 file changed, 20 insertions(+), 33 deletions(-) diff --git a/node.py b/node.py index f60528a..db9db19 100644 --- a/node.py +++ b/node.py @@ -7,7 +7,7 @@ from sensor_msgs.msg import JointState from utils import RobotClient import time from main import config, HOST, PORT -import asyncio +import threading class RobotControllerNode(Node): @@ -24,26 +24,21 @@ class RobotControllerNode(Node): self.robot_client = RobotClient(HOST, PORT) self.get_logger().info("Robot client connected") - self.loop = asyncio.get_event_loop() self.waiting_for_gripper = False - # Настройка скорости и ускорения self.robot_client.set_end_max_line_velc(0.6) self.robot_client.set_end_max_line_acc(0.8) self.gripper_joint_name = "left_outer_knuckle_joint" self.sequence_step = 0 - # Запуск основного сценария через таймер - self.timer = self.create_timer( - 1.0, self.run_sequence - ) # Задержка 1 сек для инициализации + self.timer = self.create_timer(1.0, self.run_sequence) def js_callback(self, msg: JointState): self.last_js = msg - async def send_gripper_command_async( + def send_gripper_command( self, target_pose: float, tolerance: float = 0.01, timeout: float = 3.0 - ): + ) -> bool: msg = Float64MultiArray() msg.data = [target_pose] self.pub.publish(msg) @@ -68,37 +63,29 @@ class RobotControllerNode(Node): ) return True else: - self.get_logger().warn( - "Gripper joint index out of bounds in position list" - ) + self.get_logger().warn("Gripper joint index out of bounds") else: - self.get_logger().warn( - f"Gripper joint '{self.gripper_joint_name}' not found in joint_states" - ) + self.get_logger().warn(f"Joint '{self.gripper_joint_name}' not found") return False if time.time() - start_time > timeout: - self.get_logger().warn("Timeout waiting for gripper to reach position") + self.get_logger().warn("Timeout waiting for gripper") return False - async def handle_gripper_step( + def handle_gripper_step( self, target_pose: float, timeout: float = 3.0, tolerance: float = 0.01 ): try: - success = await self.send_gripper_command_async( - target_pose, tolerance, timeout - ) + success = self.send_gripper_command(target_pose, tolerance, timeout) if success: self.sequence_step += 1 self.get_logger().info( - f"Gripper action succeeded, moving to step {self.sequence_step}" + f"Gripper moved successfully. Next step: {self.sequence_step}" ) else: - self.get_logger().warn( - f"Gripper action failed or timed out at pose {target_pose}" - ) + self.get_logger().warn("Gripper movement failed or timed out.") except Exception as e: - self.get_logger().error(f"Exception in handle_gripper_step: {str(e)}") + self.get_logger().error(f"Exception in gripper thread: {str(e)}") finally: self.waiting_for_gripper = False @@ -117,11 +104,11 @@ class RobotControllerNode(Node): elif self.sequence_step == 2: if not self.waiting_for_gripper: self.waiting_for_gripper = True - self.loop.create_task( - self.handle_gripper_step( - target_pose=0.582, timeout=10.0, tolerance=0.1 - ) - ) + threading.Thread( + target=self.handle_gripper_step, + args=(0.582, 10.0, 0.1), + daemon=True, + ).start() elif self.sequence_step == 3: self.get_logger().info("Moving to post-grasp") @@ -146,9 +133,9 @@ class RobotControllerNode(Node): elif self.sequence_step == 7: if not self.waiting_for_gripper: self.waiting_for_gripper = True - self.loop.create_task( - self.handle_gripper_step(target_pose=0.54, timeout=10.0) - ) + threading.Thread( + target=self.handle_gripper_step, args=(0.54, 10.0), daemon=True + ).start() elif self.sequence_step >= 8: self.get_logger().info("Sequence complete")