LightLib
PROS library for VEX V5: EKF/MCL localization, RAMSETE path following, high-level chassis API
Loading...
Searching...
No Matches
odometry.hpp
Go to the documentation of this file.
1#pragma once
2#include <cmath>
3#include <vector>
4
6#include "light/distance.hpp"
7#include "light/gps.hpp"
8#include "light/imu.hpp"
10#include "light/rotation.hpp"
11
24struct Pose {
25 float x;
26 float y;
27 float theta;
28 Pose(float x = 0, float y = 0, float theta = 0) : x(x), y(y), theta(theta) {}
29 Pose operator*(float scalar) const { return {x * scalar, y * scalar, theta * scalar}; }
30 Pose operator+(const Pose& o) const { return {x + o.x, y + o.y, theta + o.theta}; }
31 Pose operator-(const Pose& o) const { return {x - o.x, y - o.y, theta - o.theta}; }
32};
33
39 public:
52 TrackingWheel(pros::Rotation* sensor, float wheelDiam, float offset, float tpr = 36000.0f)
53 : rotSensor(sensor), motorGroup(nullptr), wheelCircumference(wheelDiam * M_PI), offset(offset), tpr(tpr), powered(false) {}
54
67 TrackingWheel(pros::MotorGroup* motors, float wheelDiam, float offset, float tpr = 360.0f)
68 : rotSensor(nullptr), motorGroup(motors), wheelCircumference(wheelDiam * M_PI), offset(offset), tpr(tpr), powered(true) {}
69
71 float getDistanceTraveled() const {
72 if (rotSensor) return (rotSensor->get_position() / tpr) * wheelCircumference;
73 if (motorGroup) return (motorGroup->get_position() / tpr) * wheelCircumference;
74 return 0.0f;
75 }
76
78 float getOffset() const { return offset; }
79
81 bool isPowered() const { return powered; }
82
84 void reset() {
85 if (rotSensor) rotSensor->reset_position();
86 if (motorGroup) motorGroup->tare_position();
87 }
88
89 private:
90 pros::Rotation* rotSensor;
91 pros::MotorGroup* motorGroup;
92 float wheelCircumference;
93 float offset;
94 float tpr;
95 bool powered;
96};
97
109 pros::Distance* sensor;
110 float offsetX;
111 float offsetY;
112 float angleRad;
113};
114
121 pros::Imu* imu;
122 pros::Imu* imu2;
123
129 pros::Gps* gps;
132
138 std::vector<DistanceSensorSpec> distanceSensors;
139
143 pros::Imu* imu, pros::Imu* imu2 = nullptr)
144 : vertical1(v1), vertical2(v2), horizontal1(h1), horizontal2(h2), imu(imu), imu2(imu2), gps(nullptr), gpsOffsetX(0.0f), gpsOffsetY(0.0f) {}
145
149 pros::Imu* imu, pros::Imu* imu2,
150 pros::Gps* gps, float gpsOffsetX, float gpsOffsetY,
151 std::vector<DistanceSensorSpec> distanceSensors)
153};
154
161namespace light {
162
164void reset();
165
174void init(OdomSensors sensors, MCLConfig cfg = {});
175
177void stop();
178
193void moveToPoint(float targetX, float targetY, int timeout, float maxSpeed, bool reversed);
194
196Pose getPose(bool radians = false);
197
199void setPose(Pose pose, bool radians = false);
200
202Pose getSpeed(bool radians = false);
203
205Pose getLocalSpeed(bool radians = false);
206
211Pose estimatePose(float time, bool radians = false);
212
214void update();
215
224inline Pose getPoseRad() { return getPose(true); }
225} // namespace light
Single tracking wheel — works with either a Rotation sensor (preferred) or a powered MotorGroup.
Definition odometry.hpp:38
float getDistanceTraveled() const
Definition odometry.hpp:71
void reset()
Zero the encoder.
Definition odometry.hpp:84
float getOffset() const
Definition odometry.hpp:78
TrackingWheel(pros::Rotation *sensor, float wheelDiam, float offset, float tpr=36000.0f)
Construct from an unpowered Rotation sensor.
Definition odometry.hpp:52
TrackingWheel(pros::MotorGroup *motors, float wheelDiam, float offset, float tpr=360.0f)
Construct from a powered MotorGroup (blue-cart default).
Definition odometry.hpp:67
bool isPowered() const
Definition odometry.hpp:81
Runtime tuning for LightCast (particle filter) and the EKF.
Public LightLib odometry / pose-estimation API.
Definition pid.hpp:22
void update()
Force one update step (normally called by the background task).
Pose getSpeed(bool radians=false)
void init(OdomSensors sensors, MCLConfig cfg={})
Initialize the estimator.
Pose getPoseRad()
Radian-only pose accessor.
Definition odometry.hpp:224
void stop()
Stop the background odometry task.
Pose estimatePose(float time, bool radians=false)
Linearly extrapolate the pose time seconds into the future, assuming current velocity holds.
Pose getLocalSpeed(bool radians=false)
void reset()
Reset all internal pose state to (0, 0, 0).
Pose getPose(bool radians=false)
void moveToPoint(float targetX, float targetY, int timeout, float maxSpeed, bool reversed)
Drive the chassis to a field-relative point (legacy entry point).
void setPose(Pose pose, bool radians=false)
Overwrite the current pose.
STL namespace.
Per-sensor mount configuration for LightCast's ray-cast sensor model.
Definition odometry.hpp:108
float offsetX
Mount X in robot frame, inches.
Definition odometry.hpp:110
pros::Distance * sensor
Backing PROS distance sensor (not owned).
Definition odometry.hpp:109
float offsetY
Mount Y in robot frame, inches.
Definition odometry.hpp:111
float angleRad
Ray direction in robot frame, radians.
Definition odometry.hpp:112
Tuning knobs for the LightCast particle filter and the EKF.
Bundle of all sensors used by the LightLib pose estimator.
Definition odometry.hpp:116
TrackingWheel * horizontal1
Primary horizontal (lateral) tracking wheel.
Definition odometry.hpp:119
TrackingWheel * vertical1
Primary vertical (forward-axis) tracking wheel.
Definition odometry.hpp:117
OdomSensors(TrackingWheel *v1, TrackingWheel *v2, TrackingWheel *h1, TrackingWheel *h2, pros::Imu *imu, pros::Imu *imu2=nullptr)
Wheel + IMU only constructor.
Definition odometry.hpp:141
pros::Gps * gps
Optional absolute-position GPS.
Definition odometry.hpp:129
pros::Imu * imu2
Optional second IMU; nullptr if not used.
Definition odometry.hpp:122
TrackingWheel * horizontal2
Secondary horizontal tracking wheel (or nullptr).
Definition odometry.hpp:120
float gpsOffsetX
GPS mount X in robot frame, meters.
Definition odometry.hpp:130
std::vector< DistanceSensorSpec > distanceSensors
Optional distance sensors for LightCast.
Definition odometry.hpp:138
pros::Imu * imu
Primary IMU.
Definition odometry.hpp:121
TrackingWheel * vertical2
Secondary vertical tracking wheel (or nullptr).
Definition odometry.hpp:118
OdomSensors(TrackingWheel *v1, TrackingWheel *v2, TrackingWheel *h1, TrackingWheel *h2, pros::Imu *imu, pros::Imu *imu2, pros::Gps *gps, float gpsOffsetX, float gpsOffsetY, std::vector< DistanceSensorSpec > distanceSensors)
Full constructor with GPS and distance sensors.
Definition odometry.hpp:147
float gpsOffsetY
GPS mount Y in robot frame, meters.
Definition odometry.hpp:131
Field-frame 2D pose.
Definition odometry.hpp:24
float theta
Heading.
Definition odometry.hpp:27
float x
X position, inches.
Definition odometry.hpp:25
Pose(float x=0, float y=0, float theta=0)
Definition odometry.hpp:28
float y
Y position, inches.
Definition odometry.hpp:26
Pose operator*(float scalar) const
Definition odometry.hpp:29
Pose operator-(const Pose &o) const
Definition odometry.hpp:31
Pose operator+(const Pose &o) const
Definition odometry.hpp:30
2D pose: position (in) and heading (deg).
Definition util.hpp:116