Skip to content

Valpatel/mr-cal-guide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

300 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MR-Cal Guide

Multiple Robot Calibration Guide β€” interactive reference.

A free, public, plain-English reference for camera, LiDAR, and IMU calibration β€” what the techniques are, when each one wins, what research it comes from, and which permissively-licensed software implements it. Designed to demystify a topic that's currently spread across hundreds of papers and dozens of single-purpose repos.

πŸ”— Quick links

πŸ“š Browse all 16 topics papers Β· open-source software (license-badged) Β· real hardware part numbers
πŸ§ͺ 19 technique deep-dives Zhang's method Β· ICP Β· AX = XB Β· Kalibr Β· bundle adjustment Β· Allan variance Β· …
πŸ–Ό Animation gallery (137 beats) every interactive scene, every beat, with captions
πŸ“– Glossary 68 plain-English term definitions
πŸ— Architecture how the site itself is built (no build step, no framework)
✍️ Contributing adding a paper / a software / a topic / an animation
☁️ Deploy Cloudflare Pages step-by-step
πŸš€ Onboarding first-week path for a new contributor
πŸ“’ Project glossary codebase-internal terms (anim-host, beat, slug, lazy-mount, …) β€” not the calibration jargon
πŸ—Ί System map bird's-eye diagrams: surface area Β· data flow Β· asset relationships Β· test pipeline
πŸ“‹ Requirements inviolable contracts (R-01 … R-NN) β€” read before merging
πŸ“ Changelog curated rollup by ship-date

Gallery

Six picks from the 21 interactive animations. Click any tile for the topic doc (papers, software, hardware); see the full screenshot index β†’ for every beat of every animation.

Levinson per-beam LiDAR refinement
Levinson LiDAR refinement
per-beam offsets converging on flat ground
ICP between two LiDAR scans
Multi-LiDAR ICP
two scans converging into a single cloud
Hand-eye AX=XB on a moving robot
Hand-eye AX = XB
two LiDARs on a moving robot
LiDAR-IMU time-offset estimation
LiDAR-IMU time offset
aligning gyro rate vs LiDAR pose rate
Fisheye projection models compared
Fisheye projection models
pinhole vs Kannala-Brandt vs double-sphere
Asymmetric stepped block with pose ghosts
Asymmetric stepped block
why symmetric targets fail (4 pose ghosts)

What's in here

  • Topic pages for every common calibration relationship β€” mono camera, wide-FoV / fisheye, stereo, multi-camera, LiDAR intrinsics, multi-LiDAR extrinsics, IMU, camera-LiDAR, camera-IMU, LiDAR-IMU, calibration targets, hand-eye / robot-sensor.
  • Real research citations β€” papers with arXiv / IEEE / venue links, year, authors.
  • Permissive software index β€” every tool we cite is verified MIT / BSD / Apache-2.0 / MPL-2.0. GPL/LGPL/AGPL projects are flagged so readers can avoid accidental contamination.
  • Real hardware part numbers β€” Ouster OS-series, Hesai Pandar, Velodyne VLP/HDL, Livox, AprilTag boards, etc., with datasheet links.
  • 21 interactive Three.js animations β€” pinhole projection, ICP convergence, Allan variance, hand-eye AX=XB, fisheye ray-bending, Zhang's method walkthrough, six-position IMU cal, Levinson-Thrun refinement, asymmetric stepped block, the works. Every animation has its own dedicated title bar, canvas, and narration panel with captions + opt-in TTS narration that follows the scene beat-by-beat.
  • Portrait + landscape variants for every animation, with a state-preserving orientation remount controller (rotate your phone mid-narration; you don't lose the beat).
  • Narration-driven cinematography β€” each animation ships a per-beat camera script that re-frames the scene to focus on whatever the narration is currently discussing.
  • Tradeoffs, glossary, and a beginner-friendly tone throughout.

Why this exists

Robotics calibration is critical, copyleft-heavy, and woefully under-explained for newcomers. MR-Cal Guide is a deliberate counter-program: free, plain-English, permissively-licensed references, and interactive explanations of the math.

The guide stands on its own β€” read it, fork it, share it, mirror it. It's published by Valpatel Software.

Run locally

# Any static server. The guide ships zero build step.
npx serve .                      # http://localhost:3000
# or
python3 -m http.server 8080      # http://localhost:8080

Stack

Vanilla HTML + ES modules + Three.js (loaded via importmap from unpkg). No build step. Drops onto any static host. Ships fast, stays maintainable, no framework treadmill.

mr-cal-guide/
β”œβ”€β”€ index.html        ← landing page
β”œβ”€β”€ glossary.html
β”œβ”€β”€ about.html
β”œβ”€β”€ topics/           ← one HTML page per topic (16 topics)
β”œβ”€β”€ styles/
β”‚   β”œβ”€β”€ theme.css     ← shared dark cyberpunk theme
β”‚   └── guide.css     ← guide-specific layout (titles, panels, citations)
β”œβ”€β”€ js/
β”‚   β”œβ”€β”€ nav.js        ← injects header + side rail + section collapsing
β”‚   β”œβ”€β”€ citations.js  ← renders paper / software / part chips
β”‚   β”œβ”€β”€ narration.js  ← captions + word-sync; plays pre-rendered Piper audio
β”‚   β”œβ”€β”€ viewer.js     ← mountAnim + orientation remount controller
β”‚   β”œβ”€β”€ common/       ← shared library (sensors, targets, minimap, hud-controls,
β”‚   β”‚                   hud-panel, narration-sync, orientation, state-bus,
β”‚   β”‚                   reduced-motion, trail, camera-script) β€” see
β”‚   β”‚                   docs/architecture/stack.md "Framework vs project boundary"
β”‚   └── animations/   ← one folder per animation:
β”‚                       <slug>/{index,landscape,portrait,shared}.js
β”œβ”€β”€ data/
β”‚   β”œβ”€β”€ topics.json         ← list of topics + slugs + categories
β”‚   β”œβ”€β”€ schema.md           ← citation JSON schema
β”‚   β”œβ”€β”€ by-topic/           ← per-topic citations β€” 14 files (ros + isaac-sim
β”‚   β”‚                         are orientation pages without citations)
β”‚   β”œβ”€β”€ narration/          ← per-animation narration scripts β€” 21 JSON files
β”‚   └── camera-scripts/     ← per-animation camera plans β€” 21 JSON files
β”œβ”€β”€ audio/narration/  ← pre-rendered Piper voice clips, one folder per slug
β”œβ”€β”€ scripts/render-narration.py  ← regenerate the audio above
β”œβ”€β”€ images/targets/   ← 9 printable SVG calibration targets
β”œβ”€β”€ tests/            ← pytest + Playwright + (opt-in) VLM suite
β”‚   β”œβ”€β”€ conftest.py
β”‚   β”œβ”€β”€ test_pages_load.py / test_animations.py / test_narration.py / …
β”‚   β”œβ”€β”€ test_chaos_fuzz.py / test_external_links.py
β”‚   β”œβ”€β”€ visual/        ← OpenCV + VLM + OCR + caption-stability + wheel-zoom
β”‚   └── README.md      ← how to run + what each file does
β”œβ”€β”€ scripts/
β”‚   β”œβ”€β”€ render-narration.py      ← regenerate audio
β”‚   β”œβ”€β”€ build-docs.py            ← regenerate docs/topics + docs/gallery
β”‚   β”œβ”€β”€ build-test-reports.py    ← aggregate probe reports β†’ data/testing/summary.json
β”‚   β”œβ”€β”€ refresh-dashboard.sh     ← run every probe + rebuild the dashboard
β”‚   β”œβ”€β”€ scan-*.py                ← individual probes (web-vitals, heap-growth, …)
β”‚   β”œβ”€β”€ naive-user-review.py     ← overnight VLM "first-time visitor" loop
β”‚   β”œβ”€β”€ review-test-reports.py   ← LLM reviewer that annotates each suite card
β”‚   β”œβ”€β”€ llm-server-setup.sh      ← manage remote Ollama / llama-server CUDA backend
β”‚   β”œβ”€β”€ setup-visual-tests.sh    ← one-time pip install for OpenCV layer
β”‚   └── setup-vlm.sh             ← one-time remote Ollama install for VLM layer
β”œβ”€β”€ .env.example      ← visual-test config template (copy to .env)
β”œβ”€β”€ _headers          ← Cloudflare Pages security headers
└── DEPLOY.md         ← Cloudflare Pages step-by-step

Testing infrastructure

A 21-suite dashboard at /about/test-reports.html aggregates every probe on the repo into one live status page. The explainer page at /about/testing.html walks through every suite in plain English (philosophy, what it catches, where the report lives) β€” that's the place to read if you want the full picture.

To run the whole thing locally:

# Prereq: http.server on :8000 (the probes drive a headless Chromium
# against localhost:8000 β€” they never hit the production site).
python3 -m http.server 8000 &

# Full refresh (~45 min):
scripts/refresh-dashboard.sh            # incremental
scripts/refresh-dashboard.sh --clean    # wipe previous artefacts first
scripts/refresh-dashboard.sh --quick    # skip chaos-fuzz (saves ~20 min)
scripts/refresh-dashboard.sh --only vitals   # run a single stage

Opt-in pytest gates (each gated on a MRCAL_GATE_* env var so they stay out of CI by default):

Var Gate
MRCAL_GATE_FRAMING=1 per-(anim Γ— viewport) beat-0 framing check
MRCAL_GATE_FRAMING_PER_BEAT=1 every camera-script beat Γ— viewport
MRCAL_GATE_WHEEL_ZOOM=1 wheel-zoom doesn't fall through / blank / break clamp
MRCAL_VLM_ENABLED=1 semantic scene check against a local VLM
MRCAL_LINK_CHECK_EXTERNAL=1 every external URL reachable

Full probe-by-probe + pytest tables, env vars, and an LLM reviewer loop are documented in tests/README.md and on /about/testing.html.

Deploy

See DEPLOY.md for Cloudflare Pages instructions (literally: connect the repo, set build = none, output = /).

Contributing

Each topic is one HTML page in topics/<slug>.html plus one JSON file in data/by-topic/<slug>.json. The HTML follows topics/_template.html. Citations follow data/schema.md.

To add a topic:

  1. Copy topics/_template.html β†’ topics/<your-slug>.html.
  2. Fill in the placeholders (search for {{ }} markers).
  3. Add citations to data/by-topic/<your-slug>.json.
  4. Append your slug to data/topics.json.
  5. Optionally: add a Three.js animation in js/animations/<your-slug>.js.

Next steps for contributors

License

MIT β€” see LICENSE. Β© 2026 Valpatel Software Β· Created by Matthew Valancy. Use it however you like.

About

An interactive guide to robot calibration terms, techniques, and tools.

Resources

License

Contributing

Stars

1 star

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors