A step-by-step guide to building a swing-arm odometry pod using standard VEX parts and a laser-cut Delrin or milled polycarbonate bracket. No 3D printing required.
A swing-arm odometry pod is the current standard design used by top VRC teams. It uses a small omni wheel that drags freely along the floor — not connected to any motor — and a rotation sensor that counts every degree the wheel turns. A pivot joint and rubber band keep the wheel pressed against the floor at all times, even when the robot chassis flexes.
The swing-arm design solves the single biggest challenge with tracking wheels: keeping consistent floor contact. When your robot drives over a game element or the floor is slightly uneven, a rigid mount lifts the wheel off the ground and your position data goes bad instantly.
The swing arm pivots freely, and the rubber band always pulls the wheel downward — so it stays on the floor no matter what the chassis does above it.
| Part | Notes | Qty | |
|---|---|---|---|
| 🔵 | V5 Rotation Sensor | SKU 276-6050 — Smart Port, high resolution. Do NOT substitute with potentiometer. | ×1 |
| 🟢 | 2" Omni-Directional Wheel | SKU 276-7254 — Smaller than 2.75", gives better accuracy. Fits rotation sensor shaft directly. | ×1 |
| ⚪ | 2-Wide C-Channel, 5-hole (2×1×1×5) | The swing arm that holds the sensor and wheel. Cut from longer stock if needed. | ×1 |
| ⚪ | 2-Wide C-Channel, 3-hole (2×1×1×3) | The fixed mount that attaches to the chassis. Cut from stock. | ×1 |
| 🟡 | High Strength Shaft Insert (round) | From the HS Shaft Insert Kit — adapts the 2" omni wheel to fit the rotation sensor's 0.375" hub. | ×1 |
| 🟡 | High Strength Spacers (0.375") | Used to center the wheel on the screw joint and set correct spacing. | ×2 |
| ⚫ | #8-32 × 1.5" Screw (Star Drive) | This is the screw joint axle — the wheel and sensor rotate around it. | ×1 |
| ⚫ | #8-32 × 0.5" Screws (Star Drive) | For mounting rotation sensor to bracket and bracket to C-channel. | ×4 |
| ⚫ | Nylock Nuts (#8-32) | Used on all joints. Nylock prevents loosening from vibration. Never use keps nuts on the pivot. | ×6 |
| ⚫ | Bearing Flat | One bearing on each side of the pivot hole in the fixed mount. Reduces friction and slop. | ×2 |
| 🔴 | Rubber Band #32 | Creates spring tension to press wheel against the floor. Cross over the arm and hook both ends. | ×1–2 |
| 🔵 | V5 Smart Cable (8") | Connects rotation sensor to Brain. Route away from moving parts. | ×1 |
| Part | Notes | Size | |
|---|---|---|---|
| 🩷 | Rotation Sensor Bracket — Delrin preferred | Nests the rotation sensor body. Holds it rigidly against the swing arm C-channel. Laser-cut or milled. Template provided in next section. | 1.5" × 3" |
| Hole | Diameter | Purpose | |
|---|---|---|---|
| ● | Top pair (×2) | 0.170" (#8-32 clearance) | Bolts bracket to inside of swing arm C-channel. 0.5" spacing. |
| ● | Sensor pair (×2) | 0.170" (#8-32 clearance) | Matches rotation sensor mounting holes exactly. Use sensor as template to mark these. |
| ● | Screw joint (×1) | 0.190" (slightly loose) | The screw passes through here — needs to rotate freely, not thread into plastic. |
Place the rotation sensor flat against the bracket with its shaft hole aligned to the screw joint hole in the bracket. The sensor's cable port should face upward (toward the robot chassis) when installed.
The swing arm is a 5-hole 2-wide C-channel. The bracket bolts to the inside (web) face of the C-channel at the bottom end. The rotation sensor will hang below the C-channel, pointing down toward the floor.
The screw joint is the axle the 2" omni wheel spins on. The rotation sensor measures this rotation. Assembly order matters here — do it in this sequence:
The fixed mount is a 3-hole 2-wide C-channel that bolts to your robot chassis. The swing arm pivots off this mount using a screw joint with bearing flats.
The rubber band presses the wheel against the floor. It hooks from a screw on the robot chassis to a screw on the swing arm, crossing over the pivot point.
The rotation sensor's cable must flex with the swing arm without binding or being pulled tight.
This pod measures Y-axis movement — how far your robot has driven forward or backward.
offset value you enter in EZ Template. Write it down in inches.This pod measures X-axis movement — lateral drift. The wheel faces sideways (90° rotated from the parallel pod).
With the robot on the floor, spin the omni wheel by hand. It should spin with almost zero resistance for at least 2–3 full rotations after you let go. If it stops immediately, the outer nylock nut is too tight — back it off 1/4 turn at a time.
Lift the robot 2–3 inches and set it back down. The tracking wheel should always be the first thing touching the floor. Push one corner of the robot down (simulating going over a game element) — the wheel should stay in contact on the other side. If it lifts, add a second rubber band.
Manually push the swing arm upward to its maximum compressed position (like the robot is driving over something). The smart cable should still have visible slack — it should never pull tight. If it does, reroute or use a longer cable.
Turn on the V5 Brain. Go to Devices → Rotation Sensor. It should show the sensor and its current position value. Push the robot forward by hand — the position value should change continuously. If it shows 0 and doesn't change, check the cable connection at both ends.
Push the robot forward. Watch the sensor position value on the Brain screen. It should increase when pushing forward. If it decreases when pushing forward, the sensor is mounted backwards — add true as the last parameter when declaring the sensor in code (don't flip the physical hardware).
Using the code from the odometry guide (printf position every 100ms), reset the sensor position to 0. Push the robot forward exactly one VRC tile (24 inches — measure with tape). The Y reading should be close to 24.0 inches. If it reads significantly more or less, your wheel diameter or gear ratio value in code is wrong. A 2" wheel should give very accurate readings with the default EZ Template settings.