interactive_movement.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. # GPIO pin assignments
  14. pump_pin = 17
  15. valve_pin = 27
  16. servo_pin = 13
  17. grbl_config = GRBLConfig(port="/dev/ttyUSB0", baudrate=115200)
  18. test_config = MovementConfig(
  19. speed_mmmin=15000,
  20. safe_height=10
  21. )
  22. grbl_handler = GRBLHandler(
  23. grbl_config.port,
  24. grbl_config.baudrate
  25. )
  26. movement = RobotMovement(test_config, grbl_handler)
  27. gpio = PiGPIO([pump_pin, valve_pin, servo_pin], [])
  28. pump_state = 0
  29. valve_state = 0
  30. async def main():
  31. await grbl_handler.connect()
  32. print("Robot ready. Enter X Y Z [speed_mmmin], 'p' to toggle pump, 'v' to toggle valve, 's <angle> <speed>' for smooth servo (or 'exit' to quit):")
  33. global pump_state, valve_state
  34. while True:
  35. user_input = input("Target position (X Y Z [speed] | p | v | s <angle> <speed>): ").strip().lower()
  36. if user_input in ("exit", "quit"):
  37. print("Exiting...")
  38. break
  39. elif user_input == "p":
  40. pump_state ^= 1
  41. gpio.set_pin(pump_pin, pump_state)
  42. print(f"Pump {'ON' if pump_state else 'OFF'}")
  43. continue
  44. elif user_input == "v":
  45. valve_state ^= 1
  46. gpio.set_pin(valve_pin, valve_state)
  47. print(f"Valve {'ON' if valve_state else 'OFF'}")
  48. continue
  49. elif user_input.startswith("s "):
  50. try:
  51. _, angle_str, duration_str = user_input.split()
  52. angle = float(angle_str)
  53. duration = float(duration_str)
  54. print(f"Moving servo on pin {servo_pin} to {angle}° for {duration}ms...")
  55. gpio.set_servo_angle_smooth(servo_pin, angle, duration)
  56. print("Servo move complete.")
  57. except Exception:
  58. print("Invalid servo command. Use: s <angle> <time_in_ms>")
  59. continue
  60. try:
  61. parts = user_input.split()
  62. if len(parts) not in (3, 4):
  63. raise ValueError
  64. x, y, z = map(float, parts[:3])
  65. if len(parts) == 4:
  66. speed = int(parts[3])
  67. else:
  68. speed = test_config.speed_mmmin
  69. except Exception:
  70. print("Invalid input. Please enter three or four numbers separated by spaces, 'p', 'v', 's <angle> <speed>', or 'exit'.")
  71. continue
  72. print(f"Moving to ({x}, {y}, {z}) at {speed} mm/min...")
  73. await movement.move_to_position(x, y, z, speed_mmmin=speed)
  74. print("Move complete. Enter next position, 'p', 'v', 's <angle> <speed>', or 'exit'.")
  75. if __name__ == "__main__":
  76. try:
  77. asyncio.run(main())
  78. except KeyboardInterrupt:
  79. print("\nExiting...")