interactive_movement.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import asyncio
  2. from robot_control.src.robot.movement import RobotMovement
  3. from robot_control.src.api.grbl_handler import GRBLHandler
  4. from robot_control.src.utils.config import GRBLConfig, MovementConfig
  5. from robot_control.src.api.gpio import PiGPIO
  6. """
  7. Interactive movement script for the robot.
  8. - Homes only once at startup.
  9. - Lets you enter X, Y, Z positions in a loop.
  10. - No restart or re-homing between moves.
  11. - Type 'exit' to quit.
  12. """
  13. grbl_config = GRBLConfig(port="/dev/ttyUSB0", baudrate=115200)
  14. test_config = MovementConfig(
  15. speed_mmmin=15000,
  16. safe_height=10
  17. )
  18. grbl_handler = GRBLHandler(
  19. grbl_config.port,
  20. grbl_config.baudrate
  21. )
  22. movement = RobotMovement(test_config, grbl_handler)
  23. pump_pin = 17
  24. valve_pin = 27
  25. gpio = PiGPIO([pump_pin, valve_pin], [])
  26. pump_state = 0
  27. valve_state = 0
  28. async def main():
  29. await grbl_handler.connect()
  30. print("Robot ready. Enter X Y Z [speed_mmmin], 'p' to toggle pump, 'v' to toggle valve (or 'exit' to quit):")
  31. global pump_state, valve_state
  32. while True:
  33. user_input = input("Target position (X Y Z [speed] | p | v): ").strip().lower()
  34. if user_input in ("exit", "quit"):
  35. print("Exiting...")
  36. break
  37. elif user_input == "p":
  38. pump_state ^= 1
  39. gpio.set_pin(pump_pin, pump_state)
  40. print(f"Pump {'ON' if pump_state else 'OFF'}")
  41. continue
  42. elif user_input == "v":
  43. valve_state ^= 1
  44. gpio.set_pin(valve_pin, valve_state)
  45. print(f"Valve {'ON' if valve_state else 'OFF'}")
  46. continue
  47. try:
  48. parts = user_input.split()
  49. if len(parts) not in (3, 4):
  50. raise ValueError
  51. x, y, z = map(float, parts[:3])
  52. if len(parts) == 4:
  53. speed = int(parts[3])
  54. else:
  55. speed = test_config.speed_mmmin
  56. except Exception:
  57. print("Invalid input. Please enter three or four numbers separated by spaces, 'p', 'v', or 'exit'.")
  58. continue
  59. print(f"Moving to ({x}, {y}, {z}) at {speed} mm/min...")
  60. await movement.move_to_position(x, y, z, speed_mmmin=speed)
  61. print("Move complete. Enter next position, 'p', 'v', or 'exit'.")
  62. if __name__ == "__main__":
  63. try:
  64. asyncio.run(main())
  65. except KeyboardInterrupt:
  66. print("\nExiting...")