Spaces:
Running
Running
|
Download README.md from blambert/movement-tracker: direct link, hf CLI and curl.
- Browser
- Download file 3.81 kB
-
https://huggingface.co/spaces/blambert/movement-tracker/resolve/main/README.md
- Command line
-
hf download hf://spaces/blambert/movement-tracker/README.md
-
curl -L -o README.md https://huggingface.co/spaces/blambert/movement-tracker/resolve/main/README.md
3.81 kB
| title: Movement Tracker | |
| emoji: ๐ | |
| colorFrom: red | |
| colorTo: blue | |
| sdk: static | |
| pinned: false | |
| short_description: Looks at whatever is moving | |
| tags: | |
| - reachy_mini | |
| - reachy_mini_python_app | |
| # Movement Tracker | |
| A Reachy Mini app that looks at whatever is moving. It uses OpenCV's MOG2 | |
| background subtractor to find pixels that differ from the learned background, | |
| groups them into blobs, and turns its head toward the largest one. After each | |
| move the background is relearned, since the robot's own motion changes the | |
| whole view. | |
| If nothing moves for a while, it scans: the head sweeps smoothly left and right | |
| while watching for motion. MOG2 needs a still camera, so scanning uses a second | |
| detector that cancels out the head's own motion: it tracks background features | |
| between frames, fits the homography that explains how they moved (a turning | |
| head is close to a pure rotation, which a homography models exactly), warps the | |
| older frame to line up with the newer one, and looks for what still differs. | |
| When it sees motion, the robot turns toward it and goes back to tracking. | |
| ## Motion Map | |
| The settings page at `http://<robot>:8042` shows a live motion map for checking | |
| detection: the camera view with the largest blob boxed (green if the robot will | |
| turn toward it, red if it is below the minimum blob size), the raw detector | |
| output (the background-subtraction mask while still, the aligned frame | |
| difference while scanning), and the cleaned mask used to pick the blob. Above | |
| it is what the robot is doing (learning the background, watching, tracking, or | |
| scanning). | |
| ## Tuning | |
| The settings page has sliders for the change thresholds (still and scanning) | |
| and the minimum blob size, so detection can be tuned live while watching the | |
| motion map. Changes last until the app restarts; the defaults are the constants | |
| at the top of `movement_tracker/motion.py`: | |
| | Constant | Meaning | | |
| |-------------------|-------------------------------------------------------------------| | |
| | `VAR_THRESHOLD` | MOG2 change threshold; raise it to ignore noise and flicker. | | |
| | `MIN_BLOB_FRAC` | Smallest blob, as a fraction of the image, that triggers a turn. | | |
| | `WARMUP` | Frames used to learn the background before reacting. | | |
| | `DIFF_THRESHOLD` | Change, after cancelling head motion, that counts while scanning. | | |
| | `FRAME_GAP` | Frames apart when comparing while scanning; higher sees slower. | | |
| Behavior constants live at the top of `movement_tracker/main.py`: | |
| | Constant | Meaning | | |
| |----------------|-----------------------------------------------------------| | |
| | `DEADBAND` | How far from the image center motion must be to turn. | | |
| | `IDLE_TIMEOUT` | Seconds without motion before scanning starts. | | |
| | `SCAN_RANGE` | How far the head sweeps each way, relative to body. | | |
| | `SCAN_SPEED` | Sweep speed; faster blurs frames and breaks alignment. | | |
| | `SCAN_CONFIRM` | Consecutive detections needed to stop a sweep. | | |
| ## Deployment | |
| The app is published as the private Hugging Face Space | |
| `blambert/movement-tracker`. To install it, log in to Hugging Face from the | |
| robot's dashboard and add the app from there. | |
| The Space is a git remote. Set it up once (this requires an SSH key added to | |
| your Hugging Face account): | |
| git remote add space git@hf.co:spaces/blambert/movement-tracker | |
| Then publish `main` to the Space: | |
| git push space main | |
| ## Development | |
| Run the tests (they cover only the detector, so the full `reachy-mini` install isn't needed): | |
| uv run --no-project --with pytest --with numpy --with opencv-python-headless pytest | |
| Check formatting: | |
| uvx black --check . | |
| uvx isort --check . | |