Odyssey uses aDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/saquer916/odyssey/llms.txt
Use this file to discover all available pages before exploring further.
Localizer interface as its only connection to the robot’s position estimate. Any odometry source — two-wheel dead reckoning, three-wheel pods, VSLAM, or a vision pipeline — can feed the Follower as long as it implements this interface. The included PinpointLocalizer wraps the GoBILDA Pinpoint odometry computer and is the recommended starting point for most FTC teams.
The Localizer interface
getPose() must return the robot’s current position in mm and heading in radians as a Pose2d. update() is called once per loop by the user to poll the hardware — Odyssey never calls update() internally, so the timing is entirely under your control.
Setting up PinpointLocalizer
The Pinpoint is declared in the hardware map under the name"localizer". Call resetPosAndIMU() during init() to zero the odometry at the robot’s starting position before the match begins.
PinpointLocalizer.getPose() reads three values from the Pinpoint driver and packages them into a Pose2d:
Pose2d normalises the heading to the range (−π, π] via MathUtils.normalizeAngle() on construction, so you never need to clamp the heading yourself.
Verifying with the Push Test OpMode
Before running any autonomous path, verify that the localizer tracks correctly using thePush Test Odometry TeleOp (PushTest.java):
Deploy and start
Build the TeamCode module and start the
Push Test Odometry TeleOp. The Driver Station telemetry will show X, Y, and HEADING.Push forward
Push the robot straight forward (toward the +Y wall). Confirm that
Y increases and X stays near zero. If X changes instead of Y, the Pinpoint pods are swapped.Push sideways
Push the robot to the right. Confirm that
X increases. If the sign is wrong, the X pod direction is reversed in the Pinpoint configuration.Implementing a custom Localizer
If you are using a different odometry source — for example, three dead-wheel pods through Road Runner’s kinematics, or AprilTag vision — implementLocalizer directly:
Follower constructor in place of PinpointLocalizer. No other changes are required.
Coordinate units
Pose2d stores position in whatever units you provide, but the Follower compares pose positions directly against path control points. Use millimetres consistently throughout — all Vector2d control points in your BezierCurve definitions and all positions returned by getPose() must be in the same unit.
Odyssey expects the same coordinate units as your path control points. If your path uses mm (the FTC field is 3657.5 mm × 3657.5 mm), your
Localizer must return mm. Mixing units will cause the follower to report wildly wrong distances and the PID controllers will saturate.