|
|
@@ -1,4 +1,4 @@
|
|
|
-from typing import Tuple, Optional
|
|
|
+from typing import Optional
|
|
|
import time
|
|
|
import asyncio
|
|
|
from api.grbl_handler import GRBLHandler
|
|
|
@@ -10,10 +10,10 @@ logger = LoggerSingleton.get_logger()
|
|
|
class RobotMovement:
|
|
|
def __init__(self, grbl: GRBLHandler):
|
|
|
self.grbl = grbl
|
|
|
- self.current_position: Tuple[float, float, float] = (0.0, 0.0, 0.0)
|
|
|
+ self.current_position: tuple[float, float, float] = (0.0, 0.0, 0.0)
|
|
|
self.speed: float = 100.0 # TODO [SG]: Set at beginning?
|
|
|
self.is_moving: bool = False
|
|
|
- self.home_position: Tuple[float, float, float] = (0.0, 0.0, 0.0)
|
|
|
+ self.home_position: tuple[float, float, float] = (0.0, 0.0, 0.0)
|
|
|
self.endeffector_active = False
|
|
|
self.pump_speed = 1000 # Default pump speed/power
|
|
|
|
|
|
@@ -30,7 +30,7 @@ class RobotMovement:
|
|
|
# Set GRBL feed rate
|
|
|
await self.grbl.send_gcode([f'F{speed_mms * 60}']) # Convert mm/s to mm/min
|
|
|
|
|
|
- async def move_to_position(self, x: float, y: float, z: float) -> bool:
|
|
|
+ async def move_to_position(self, x: float, y: float, z: float) -> tuple[float, float, float]:
|
|
|
try:
|
|
|
self.is_moving = True
|
|
|
logger.debug(f"Moving to position X:{x:.3f} Y:{y:.3f} Z:{z:.3f}")
|
|
|
@@ -39,15 +39,17 @@ class RobotMovement:
|
|
|
[f'G1 X{x:.3f} Y{y:.3f} Z{z:.3f} F{self.speed * 60}'],
|
|
|
position=self.current_position
|
|
|
)
|
|
|
+ if self.grbl.debug:
|
|
|
+ self.current_position = (x, y, z)
|
|
|
if self.current_position != (x, y, z):
|
|
|
- raise RuntimeError(f"Movement failed: Not arrived at the target position {x}, {y}, {z}!")
|
|
|
- return True
|
|
|
+ logger.warning(f"Movement failed: Not arrived at the target position ({x}, {y}, {z}). Actual position: {self.current_position}!")
|
|
|
+ return self.current_position
|
|
|
except TimeoutError as e:
|
|
|
raise RuntimeError(f"Movement failed: {str(e)}")
|
|
|
finally:
|
|
|
self.is_moving = False
|
|
|
|
|
|
- async def move_relative(self, dx: float, dy: float, dz: float) -> bool:
|
|
|
+ async def move_relative(self, dx: float, dy: float, dz: float) -> tuple[float, float, float]:
|
|
|
logger.debug(f"Moving relative by dX:{dx:.3f} dY:{dy:.3f} dZ:{dz:.3f}")
|
|
|
await self.grbl.send_gcode(['G91']) # Relative positioning
|
|
|
result = await self.move_to_position(dx, dy, dz)
|
|
|
@@ -65,7 +67,7 @@ class RobotMovement:
|
|
|
self.is_moving = False
|
|
|
raise RuntimeError(f"Homing failed: {str(e)}")
|
|
|
|
|
|
- def get_position(self) -> Tuple[float, float, float]:
|
|
|
+ def get_position(self) -> tuple[float, float, float]:
|
|
|
return self.current_position
|
|
|
|
|
|
async def activate_endeffector(self, speed: Optional[int] = None) -> bool:
|