Want to give more dynamic, hands-free presentations? Too comfortable on the couch to reach your laptop? Just wave.
GesturePilot lets you control your laptop with nothing but your body. Detected in real time by a Jetson Nano running PoseNet, your gestures are sent over WiFi to your laptop — skip slides, pause your show, adjust volume, and never touch a thing. Walk around the room and own the stage during presentations, or kick back on the couch and control your video without reaching for a remote.
https://www.youtube.com/watch?v=T-TqokT0JZE
Timestamps:
Project Demonstration - 0:00
GitHub Overview - 3:14
Dashboard.py Demo - 3:26
jetson_gestures.py Explanation - 8:18
dashboard.py Explanation - 22:29
laptop_listener.py - 23:51
[Camera] → [Jetson Nano] → (UDP over WiFi) → [Laptop]
detects gestures executes keypresses
jetson_gestures.pyruns on the Jetson Nano — reads the camera, detects body keypoints with PoseNet, and sends commands over UDPdashboard.pyruns alongside it — serves a live browser dashboard athttp://<jetson-ip>:8080showing the camera feed and gesture loglaptop_listener.pyruns on the laptop — receives UDP commands and executes the corresponding key/media action
| Gesture | Action |
|---|---|
| Right hand swipe right | → Next slide / Right arrow |
| Left hand swipe left | ← Previous slide / Left arrow |
| Both hands raised (hold) | Space / Pause |
| Right hand raised above shoulder (hold) | Volume Up |
| Left hand raised above shoulder (hold) | Volume Down |
- NVIDIA Jetson Nano
- Jetson inference package: https://github.com/dusty-nv/jetson-inference
- JetPack SDK (includes
jetson.inferenceandjetson.utils) - USB or CSI camera connected to the Nano
- Python 3 with the following packages:
pip3 install opencv-python numpy
- Python 3
pyautogui(used on Windows):pip3 install pyautogui
- Both the Jetson and laptop must be on the same WiFi network
git clone https://github.com/sehgality/GesturePilot.git
cd GesturePilot- Connect to your Jetson:
ssh username@<jetson-ip> - Copy
jetson_gestures.pyanddashboard.pyto the Jetson (e.g. your home directory~/)
scp jetson_gestures.py dashboard.py <user>@<jetson-ip>:~/Mac:
ipconfig getifaddr en0Windows:
ipconfigLook for the IPv4 address under your WiFi adapter.
python3 ~/jetson_gestures.py --ip <your-laptop-ip> --key <your-secret-key>Example:
python3 ~/jetson_gestures.py --ip 10.0.0.56 --key mypasswordOnce running, open the live dashboard in your browser:
http://<jetson-ip>:8080
python3 laptop_listener.py --key <your-secret-key>Example:
python3 laptop_listener.py --key mypasswordThe --key must match exactly on both sides or commands will be rejected. The script automatically detects whether you're on Mac or Windows and uses the appropriate method for each command.
GesturePilot uses a shared secret key to authenticate UDP packets. Any packet received without the correct key is rejected, preventing other devices on the same network from sending commands to your laptop.
Both the Jetson and laptop must be started with the same --key value. Choose any string you like — just keep it consistent.
On macOS, Terminal needs Accessibility access to send keypresses (arrow keys, spacebar) to other applications.
- Go to System Settings → Privacy & Security → Accessibility
- Click + and add Terminal
- Make sure the toggle is on
- Restart
laptop_listener.py
Volume up/down work without this permission since they use
osascriptdirectly.
In jetson_gestures.py, DEBUG_MODE = True prints detected gestures to the terminal without sending any UDP commands. Set it to False to send real commands to the laptop:
DEBUG_MODE = FalseGesturePilot/
├── jetson_gestures.py # Runs on Jetson — gesture detection + UDP sender
├── dashboard.py # Runs on Jetson — live browser dashboard (imported by jetson_gestures.py)
└── laptop_listener.py # Runs on laptop — receives UDP and executes keypresses