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.
| 📚 Browse all 14 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 |
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 LiDAR refinement per-beam offsets converging on flat ground |
![]() Multi-LiDAR ICP two scans converging into a single cloud |
![]() Hand-eye AX = XB two LiDARs on a moving robot |
![]() LiDAR-IMU time offset aligning gyro rate vs LiDAR pose rate |
![]() Fisheye projection models pinhole vs Kannala-Brandt vs double-sphere |
![]() Asymmetric stepped block why symmetric targets fail (4 pose ghosts) |
- 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.
- Tradeoffs, glossary, and a beginner-friendly tone throughout.
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 (14 topics)
├── techniques/ ← per-technique deep dives (1 so far)
├── 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 ← Three.js scaffold + onNarrationBeat() bridge
│ └── animations/ ← one ES module per animation (21 files)
├── data/
│ ├── topics.json ← list of topics + slugs + categories
│ ├── schema.md ← citation JSON schema
│ ├── by-topic/ ← per-topic citations (papers / software / parts) — 14 files
│ └── narration/ ← per-animation narration scripts (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 suite (64 tests)
│ ├── conftest.py
│ ├── test_pages_load.py
│ ├── test_animations.py
│ ├── test_screenshots.py
│ └── README.md ← how to run + CI sketch
├── scripts/ ← smoke tests + tooling
├── _headers ← Cloudflare Pages security headers
├── _redirects ← Cloudflare clean-URL rewrites
└── DEPLOY.md ← Cloudflare Pages step-by-step
# Any static server. The guide ships zero build step.
npx serve . # http://localhost:3000
# or
python3 -m http.server 8080 # http://localhost:8080See DEPLOY.md for Cloudflare Pages instructions
(literally: connect the repo, set build = none, output = /).
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:
- Copy
topics/_template.html→topics/<your-slug>.html. - Fill in the placeholders (search for
{{ }}markers). - Add citations to
data/by-topic/<your-slug>.json. - Append your slug to
data/topics.json. - Optionally: add a Three.js animation in
js/animations/<your-slug>.js.
MIT — see LICENSE. © 2026 Valpatel Software ·
Created by Matthew Valancy. Use it however you like.
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.





