# Motor Test Joystick (Issue #513) Terminal-based interactive joystick for bench testing SaltyBot motors via Termux. ## Quick Start ```bash python3 motor_test_joystick.py # ROS2 mode python3 motor_test_joystick.py --backend websocket --host # WebSocket mode ``` ## Controls | Key | Action | |-----|--------| | **W** / **↑** | Forward (linear +X) | | **S** / **↓** | Reverse (linear -X) | | **A** / **←** | Turn left (angular +Z) | | **D** / **→** | Turn right (angular -Z) | | **SPACE** | E-stop toggle | | **R** | Reset velocities | | **Q** | Quit | ## Features - Real-time velocity feedback with bar graphs - Spacebar e-stop (instantly zeros velocity) - 500ms timeout safety (sends zero if idle) - Conservative defaults: 0.1 m/s linear, 0.3 rad/s angular - Dual backend: ROS2 (/cmd_vel) or WebSocket - Graceful fallback if ROS2 unavailable ## Usage Examples ```bash # Standard ROS2 mode python3 motor_test_joystick.py # WebSocket mode (fallback) python3 motor_test_joystick.py --backend websocket --host 192.168.1.100 # Custom velocity limits python3 motor_test_joystick.py --linear-max 0.5 --angular-max 1.0 ``` ## Architecture - **MotorTestController**: State machine, velocity limiting, timeout enforcement - **MotorTestNode** (ROS2): Twist publisher to /cmd_vel - **WebSocketController** (fallback): JSON messages to Jetson - **Curses UI**: Non-blocking input, real-time feedback, status display ## Safety - Conservative defaults (0.1/0.3 m/s) - E-stop button (spacebar) - 500ms timeout (auto-zero velocity) - Input clamping & exponential decay ## Related Issues - #420 — Termux bootstrap & Android phone node - #512 — Autonomous arming (uses /cmd_vel)