diff --git a/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java b/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java index 8db6a3540f..ff1e6f2fc0 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java +++ b/wpimath/src/main/java/edu/wpi/first/math/estimator/DifferentialDrivePoseEstimator.java @@ -33,14 +33,6 @@ import java.util.Objects; * *

{@link DifferentialDrivePoseEstimator#addVisionMeasurement} can be called as infrequently as * you want; if you never call it then this class will behave exactly like regular encoder odometry. - * - *

The state-space system used internally has the following states (x), and outputs (y): - * - *

x = [x, y, theta]ᵀ in the field coordinate system containing x position, y - * position, and heading. - * - *

y = [x, y, theta]ᵀ from vision containing x position, y position, and - * heading. */ public class DifferentialDrivePoseEstimator { private final DifferentialDriveKinematics m_kinematics; @@ -85,16 +77,16 @@ public class DifferentialDrivePoseEstimator { * Constructs a DifferentialDrivePoseEstimator. * * @param kinematics A correctly-configured kinematics object for your drivetrain. - * @param gyroAngle The current gyro angle. + * @param gyroAngle The gyro angle of the robot. * @param leftDistanceMeters The distance traveled by the left encoder. * @param rightDistanceMeters The distance traveled by the right encoder. - * @param initialPoseMeters The starting pose estimate. - * @param stateStdDevs Standard deviations of model states. Increase these numbers to trust your - * model's state estimates less. This matrix is in the form [x, y, theta]ᵀ, with units in - * meters and radians. - * @param visionMeasurementStdDevs Standard deviations of the vision measurements. Increase these - * numbers to trust global measurements from vision less. This matrix is in the form [x, y, - * theta]ᵀ, with units in meters and radians. + * @param initialPoseMeters The estimated initial pose. + * @param stateStdDevs Standard deviations of the pose estimate (x position in meters, y position + * in meters, and heading in radians). Increase these numbers to trust your state estimate + * less. + * @param visionMeasurementStdDevs Standard deviations of the vision pose measurement (x position + * in meters, y position in meters, and heading in radians). Increase these numbers to trust + * the vision pose measurement less. */ public DifferentialDrivePoseEstimator( DifferentialDriveKinematics kinematics, @@ -188,10 +180,11 @@ public class DifferentialDrivePoseEstimator { * @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param timestampSeconds The timestamp of the vision measurement in seconds. Note that if you * don't use your own time source by calling {@link - * DifferentialDrivePoseEstimator#updateWithTime} then you must use a timestamp with an epoch - * since FPGA startup (i.e. the epoch of this timestamp is the same epoch as - * Timer.getFPGATimestamp.) This means that you should use Timer.getFPGATimestamp as your time - * source or sync the epochs. + * DifferentialDrivePoseEstimator#updateWithTime(double,Rotation2d,double,double)} then you + * must use a timestamp with an epoch since FPGA startup (i.e., the epoch of this timestamp is + * the same epoch as {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()}.) This means that + * you should use {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()} as your time source + * or sync the epochs. */ public void addVisionMeasurement(Pose2d visionRobotPoseMeters, double timestampSeconds) { // Step 1: Get the pose odometry measured at the moment the vision measurement was made. @@ -249,13 +242,14 @@ public class DifferentialDrivePoseEstimator { * @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param timestampSeconds The timestamp of the vision measurement in seconds. Note that if you * don't use your own time source by calling {@link - * DifferentialDrivePoseEstimator#updateWithTime} then you must use a timestamp with an epoch - * since FPGA startup (i.e. the epoch of this timestamp is the same epoch as - * Timer.getFPGATimestamp.) This means that you should use Timer.getFPGATimestamp as your time - * source in this case. - * @param visionMeasurementStdDevs Standard deviations of the vision measurements. Increase these - * numbers to trust global measurements from vision less. This matrix is in the form [x, y, - * theta]ᵀ, with units in meters and radians. + * DifferentialDrivePoseEstimator#updateWithTime(double,Rotation2d,double,double)}, then you + * must use a timestamp with an epoch since FPGA startup (i.e., the epoch of this timestamp is + * the same epoch as {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()}. This means that + * you should use {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()} as your time source + * in this case. + * @param visionMeasurementStdDevs Standard deviations of the vision pose measurement (x position + * in meters, y position in meters, and heading in radians). Increase these numbers to trust + * the vision pose measurement less. */ public void addVisionMeasurement( Pose2d visionRobotPoseMeters, @@ -266,8 +260,8 @@ public class DifferentialDrivePoseEstimator { } /** - * Updates the the Kalman Filter using only wheel encoder information. Note that this should be - * called every loop. + * Updates the pose estimator with wheel encoder and gyro information. This should be called every + * loop. * * @param gyroAngle The current gyro angle. * @param distanceLeftMeters The total distance travelled by the left wheel in meters. @@ -281,8 +275,8 @@ public class DifferentialDrivePoseEstimator { } /** - * Updates the the Kalman Filter using only wheel encoder information. Note that this should be - * called every loop. + * Updates the pose estimator with wheel encoder and gyro information. This should be called every + * loop. * * @param currentTimeSeconds Time at which this method was called, in seconds. * @param gyroAngle The current gyro angle. diff --git a/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java b/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java index 46b55aa2c5..4624746ed5 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java +++ b/wpimath/src/main/java/edu/wpi/first/math/estimator/MecanumDrivePoseEstimator.java @@ -32,14 +32,6 @@ import java.util.Objects; * *

{@link MecanumDrivePoseEstimator#addVisionMeasurement} can be called as infrequently as you * want; if you never call it, then this class will behave mostly like regular encoder odometry. - * - *

The state-space system used internally has the following states (x) and outputs (y): - * - *

x = [x, y, theta]ᵀ in the field coordinate system containing x position, y - * position, and heading. - * - *

y = [x, y, theta]ᵀ from vision containing x position, y position, and - * heading. */ public class MecanumDrivePoseEstimator { private final MecanumDriveKinematics m_kinematics; @@ -82,14 +74,14 @@ public class MecanumDrivePoseEstimator { * * @param kinematics A correctly-configured kinematics object for your drivetrain. * @param gyroAngle The current gyro angle. - * @param wheelPositions The distances driven by each wheel. + * @param wheelPositions The distance measured by each wheel. * @param initialPoseMeters The starting pose estimate. - * @param stateStdDevs Standard deviations of model states. Increase these numbers to trust your - * model's state estimates less. This matrix is in the form [x, y, theta]ᵀ, with units in - * meters and radians. - * @param visionMeasurementStdDevs Standard deviations of the vision measurements. Increase these - * numbers to trust global measurements from vision less. This matrix is in the form [x, y, - * theta]ᵀ, with units in meters and radians. + * @param stateStdDevs Standard deviations of the pose estimate (x position in meters, y position + * in meters, and heading in radians). Increase these numbers to trust your state estimate + * less. + * @param visionMeasurementStdDevs Standard deviations of the vision pose measurement (x position + * in meters, y position in meters, and heading in radians). Increase these numbers to trust + * the vision pose measurement less. */ public MecanumDrivePoseEstimator( MecanumDriveKinematics kinematics, @@ -175,10 +167,12 @@ public class MecanumDrivePoseEstimator { * * @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param timestampSeconds The timestamp of the vision measurement in seconds. Note that if you - * don't use your own time source by calling {@link MecanumDrivePoseEstimator#updateWithTime} - * then you must use a timestamp with an epoch since FPGA startup (i.e. the epoch of this - * timestamp is the same epoch as Timer.getFPGATimestamp.) This means that you should use - * Timer.getFPGATimestamp as your time source or sync the epochs. + * don't use your own time source by calling {@link + * MecanumDrivePoseEstimator#updateWithTime(double,Rotation2d,MecanumDriveWheelPositions)} + * then you must use a timestamp with an epoch since FPGA startup (i.e., the epoch of this + * timestamp is the same epoch as {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()}.) + * This means that you should use {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()} as + * your time source or sync the epochs. */ public void addVisionMeasurement(Pose2d visionRobotPoseMeters, double timestampSeconds) { // Step 1: Get the pose odometry measured at the moment the vision measurement was made. @@ -230,13 +224,15 @@ public class MecanumDrivePoseEstimator { * * @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param timestampSeconds The timestamp of the vision measurement in seconds. Note that if you - * don't use your own time source by calling {@link MecanumDrivePoseEstimator#updateWithTime} - * then you must use a timestamp with an epoch since FPGA startup (i.e. the epoch of this - * timestamp is the same epoch as Timer.getFPGATimestamp.) This means that you should use - * Timer.getFPGATimestamp as your time source in this case. - * @param visionMeasurementStdDevs Standard deviations of the vision measurements. Increase these - * numbers to trust global measurements from vision less. This matrix is in the form [x, y, - * theta]ᵀ, with units in meters and radians. + * don't use your own time source by calling {@link + * MecanumDrivePoseEstimator#updateWithTime(double,Rotation2d,MecanumDriveWheelPositions)}, + * then you must use a timestamp with an epoch since FPGA startup (i.e., the epoch of this + * timestamp is the same epoch as {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()}. This + * means that you should use {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()} as your + * time source in this case. + * @param visionMeasurementStdDevs Standard deviations of the vision pose measurement (x position + * in meters, y position in meters, and heading in radians). Increase these numbers to trust + * the vision pose measurement less. */ public void addVisionMeasurement( Pose2d visionRobotPoseMeters, @@ -247,7 +243,7 @@ public class MecanumDrivePoseEstimator { } /** - * Updates the Kalman Filter using only wheel encoder information. This should be called every + * Updates the pose estimator with wheel encoder and gyro information. This should be called every * loop. * * @param gyroAngle The current gyro angle. @@ -259,7 +255,7 @@ public class MecanumDrivePoseEstimator { } /** - * Updates the Kalman Filter using only wheel encoder information. This should be called every + * Updates the pose estimator with wheel encoder and gyro information. This should be called every * loop. * * @param currentTimeSeconds Time at which this method was called, in seconds. diff --git a/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java b/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java index bc01f28b4a..474b524db6 100644 --- a/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java +++ b/wpimath/src/main/java/edu/wpi/first/math/estimator/SwerveDrivePoseEstimator.java @@ -31,14 +31,6 @@ import java.util.Objects; * *

{@link SwerveDrivePoseEstimator#addVisionMeasurement} can be called as infrequently as you * want; if you never call it, then this class will behave as regular encoder odometry. - * - *

The state-space system used internally has the following states (x) and outputs (y): - * - *

x = [x, y, theta]ᵀ in the field coordinate system containing x position, y - * position, and heading. - * - *

y = [x, y, theta]ᵀ from vision containing x position, y position, and - * heading. */ public class SwerveDrivePoseEstimator { private final SwerveDriveKinematics m_kinematics; @@ -82,14 +74,14 @@ public class SwerveDrivePoseEstimator { * * @param kinematics A correctly-configured kinematics object for your drivetrain. * @param gyroAngle The current gyro angle. - * @param modulePositions The current distance measurements and rotations of the swerve modules. + * @param modulePositions The current distance and rotation measurements of the swerve modules. * @param initialPoseMeters The starting pose estimate. - * @param stateStdDevs Standard deviations of model states. Increase these numbers to trust your - * model's state estimates less. This matrix is in the form [x, y, theta]ᵀ, with units in - * meters and radians. - * @param visionMeasurementStdDevs Standard deviations of the vision measurements. Increase these - * numbers to trust global measurements from vision less. This matrix is in the form [x, y, - * theta]ᵀ, with units in meters and radians. + * @param stateStdDevs Standard deviations of the pose estimate (x position in meters, y position + * in meters, and heading in radians). Increase these numbers to trust your state estimate + * less. + * @param visionMeasurementStdDevs Standard deviations of the vision pose measurement (x position + * in meters, y position in meters, and heading in radians). Increase these numbers to trust + * the vision pose measurement less. */ public SwerveDrivePoseEstimator( SwerveDriveKinematics kinematics, @@ -176,10 +168,12 @@ public class SwerveDrivePoseEstimator { * * @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param timestampSeconds The timestamp of the vision measurement in seconds. Note that if you - * don't use your own time source by calling {@link SwerveDrivePoseEstimator#updateWithTime} - * then you must use a timestamp with an epoch since FPGA startup (i.e. the epoch of this - * timestamp is the same epoch as Timer.getFPGATimestamp.) This means that you should use - * Timer.getFPGATimestamp as your time source or sync the epochs. + * don't use your own time source by calling {@link + * SwerveDrivePoseEstimator#updateWithTime(double,Rotation2d,SwerveModulePosition[])} then you + * must use a timestamp with an epoch since FPGA startup (i.e., the epoch of this timestamp is + * the same epoch as {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()}.) This means that + * you should use {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()} as your time source + * or sync the epochs. */ public void addVisionMeasurement(Pose2d visionRobotPoseMeters, double timestampSeconds) { // Step 1: Get the pose odometry measured at the moment the vision measurement was made. @@ -231,13 +225,15 @@ public class SwerveDrivePoseEstimator { * * @param visionRobotPoseMeters The pose of the robot as measured by the vision camera. * @param timestampSeconds The timestamp of the vision measurement in seconds. Note that if you - * don't use your own time source by calling {@link SwerveDrivePoseEstimator#updateWithTime} - * then you must use a timestamp with an epoch since FPGA startup (i.e. the epoch of this - * timestamp is the same epoch as Timer.getFPGATimestamp.) This means that you should use - * Timer.getFPGATimestamp as your time source in this case. - * @param visionMeasurementStdDevs Standard deviations of the vision measurements. Increase these - * numbers to trust global measurements from vision less. This matrix is in the form [x, y, - * theta]ᵀ, with units in meters and radians. + * don't use your own time source by calling {@link + * SwerveDrivePoseEstimator#updateWithTime(double,Rotation2d,SwerveModulePosition[])}, then + * you must use a timestamp with an epoch since FPGA startup (i.e., the epoch of this + * timestamp is the same epoch as {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()}. This + * means that you should use {@link edu.wpi.first.wpilibj.Timer#getFPGATimestamp()} as your + * time source in this case. + * @param visionMeasurementStdDevs Standard deviations of the vision pose measurement (x position + * in meters, y position in meters, and heading in radians). Increase these numbers to trust + * the vision pose measurement less. */ public void addVisionMeasurement( Pose2d visionRobotPoseMeters, @@ -248,7 +244,7 @@ public class SwerveDrivePoseEstimator { } /** - * Updates the Kalman Filter using only wheel encoder information. This should be called every + * Updates the pose estimator with wheel encoder and gyro information. This should be called every * loop. * * @param gyroAngle The current gyro angle. @@ -260,7 +256,7 @@ public class SwerveDrivePoseEstimator { } /** - * Updates the Kalman Filter using only wheel encoder information. This should be called every + * Updates the pose estimator with wheel encoder and gyro information. This should be called every * loop. * * @param currentTimeSeconds Time at which this method was called, in seconds. diff --git a/wpimath/src/main/native/include/frc/estimator/DifferentialDrivePoseEstimator.h b/wpimath/src/main/native/include/frc/estimator/DifferentialDrivePoseEstimator.h index 31ba550855..339ccc98d3 100644 --- a/wpimath/src/main/native/include/frc/estimator/DifferentialDrivePoseEstimator.h +++ b/wpimath/src/main/native/include/frc/estimator/DifferentialDrivePoseEstimator.h @@ -8,7 +8,6 @@ #include #include "frc/EigenCore.h" -#include "frc/estimator/UnscentedKalmanFilter.h" #include "frc/geometry/Pose2d.h" #include "frc/geometry/Rotation2d.h" #include "frc/interpolation/TimeInterpolatableBuffer.h" @@ -32,15 +31,6 @@ namespace frc { * * AddVisionMeasurement() can be called as infrequently as you want; if you * never call it, then this class will behave like regular encoder odometry. - * - * The state-space system used internally has the following states (x) and - * outputs (y): - * - * x = [x, y, theta]ᵀ in the field coordinate - * system containing x position, y position, and heading. - * - * y = [x, y, theta]ᵀ from vision containing x position, y - * position, and heading. */ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { public: @@ -53,12 +43,12 @@ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { * The default standard deviations of the vision measurements are * 0.1 meters for x, 0.1 meters for y, and 0.1 radians for heading. * - * @param kinematics A correctly-configured kinematics object - * for your drivetrain. - * @param gyroAngle The gyro angle of the robot. + * @param kinematics A correctly-configured kinematics object for your + * drivetrain. + * @param gyroAngle The gyro angle of the robot. * @param leftDistance The distance traveled by the left encoder. * @param rightDistance The distance traveled by the right encoder. - * @param initialPose The estimated initial pose. + * @param initialPose The estimated initial pose. */ DifferentialDrivePoseEstimator(DifferentialDriveKinematics& kinematics, const Rotation2d& gyroAngle, @@ -69,24 +59,19 @@ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { /** * Constructs a DifferentialDrivePoseEstimator. * - * @param kinematics A correctly-configured kinematics object - * for your drivetrain. - * @param gyroAngle The gyro angle of the robot. + * @param kinematics A correctly-configured kinematics object for your + * drivetrain. + * @param gyroAngle The gyro angle of the robot. * @param leftDistance The distance traveled by the left encoder. * @param rightDistance The distance traveled by the right encoder. - * @param initialPose The estimated initial pose. - * @param stateStdDevs Standard deviations of model states. - * Increase these numbers to trust your - * model's state estimates less. This matrix - * is in the form - * [x, y, theta]ᵀ, - * with units in meters and radians. - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from - * vision less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param initialPose The estimated initial pose. + * @param stateStdDevs Standard deviations of the pose estimate (x position in + * meters, y position in meters, and heading in radians). Increase these + * numbers to trust your state estimate less. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ DifferentialDrivePoseEstimator( DifferentialDriveKinematics& kinematics, const Rotation2d& gyroAngle, @@ -95,16 +80,14 @@ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { const wpi::array& visionMeasurementStdDevs); /** - * Sets the pose estimator's trust of global measurements. This might be used + * Sets the pose estimator's trust in vision measurements. This might be used * to change trust in vision measurements after the autonomous period, or to * change trust as distance to a vision target increases. * - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ void SetVisionMeasurementStdDevs( const wpi::array& visionMeasurementStdDevs); @@ -139,15 +122,13 @@ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { * one meter or so of the current pose estimate. * * @param visionRobotPose The pose of the robot as measured by the vision - * camera. - * @param timestamp The timestamp of the vision measurement in seconds. - * Note that if you don't use your own time source by - * calling UpdateWithTime(), then you must use a - * timestamp with an epoch since FPGA startup (i.e. the - * epoch of this timestamp is the same epoch as - * frc::Timer::GetFPGATimestamp(). This means that - * you should use frc::Timer::GetFPGATimestamp() as - * your time source in this case. + * camera. + * @param timestamp The timestamp of the vision measurement in seconds. Note + * that if you don't use your own time source by calling UpdateWithTime(), + * then you must use a timestamp with an epoch since FPGA startup (i.e., + * the epoch of this timestamp is the same epoch as + * frc::Timer::GetFPGATimestamp(). This means that you should use + * frc::Timer::GetFPGATimestamp() as your time source in this case. */ void AddVisionMeasurement(const Pose2d& visionRobotPose, units::second_t timestamp); @@ -167,25 +148,18 @@ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { * method will continue to apply to future measurements until a subsequent * call to SetVisionMeasurementStdDevs() or this method. * - * @param visionRobotPose The pose of the robot as measured by the - * vision camera. - * @param timestamp The timestamp of the vision measurement in - * seconds. Note that if you don't use your - * own time source by calling - * UpdateWithTime(), then you must use a - * timestamp with an epoch since FPGA startup - * (i.e. the epoch of this timestamp is the - * same epoch as - * frc::Timer::GetFPGATimestamp(). This means - * that you should use - * frc::Timer::GetFPGATimestamp() as your - * time source in this case. - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param visionRobotPose The pose of the robot as measured by the vision + * camera. + * @param timestamp The timestamp of the vision measurement in seconds. Note + * that if you don't use your own time source by calling UpdateWithTime(), + * then you must use a timestamp with an epoch since FPGA startup (i.e., + * the epoch of this timestamp is the same epoch as + * frc::Timer::GetFPGATimestamp(). This means that you should use + * frc::Timer::GetFPGATimestamp() as your time source in this case. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ void AddVisionMeasurement( const Pose2d& visionRobotPose, units::second_t timestamp, @@ -195,8 +169,8 @@ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { } /** - * Updates the Unscented Kalman Filter using only wheel encoder information. - * Note that this should be called every loop iteration. + * Updates the pose estimator with wheel encoder and gyro information. This + * should be called every loop. * * @param gyroAngle The current gyro angle. * @param leftDistance The distance traveled by the left encoder. @@ -208,8 +182,8 @@ class WPILIB_DLLEXPORT DifferentialDrivePoseEstimator { units::meter_t rightDistance); /** - * Updates the Unscented Kalman Filter using only wheel encoder information. - * Note that this should be called every loop iteration. + * Updates the pose estimator with wheel encoder and gyro information. This + * should be called every loop. * * @param currentTime The time at which this method was called. * @param gyroAngle The current gyro angle. diff --git a/wpimath/src/main/native/include/frc/estimator/MecanumDrivePoseEstimator.h b/wpimath/src/main/native/include/frc/estimator/MecanumDrivePoseEstimator.h index d07d77095b..d1967e9db9 100644 --- a/wpimath/src/main/native/include/frc/estimator/MecanumDrivePoseEstimator.h +++ b/wpimath/src/main/native/include/frc/estimator/MecanumDrivePoseEstimator.h @@ -10,7 +10,6 @@ #include #include "frc/EigenCore.h" -#include "frc/estimator/UnscentedKalmanFilter.h" #include "frc/geometry/Pose2d.h" #include "frc/geometry/Rotation2d.h" #include "frc/interpolation/TimeInterpolatableBuffer.h" @@ -32,15 +31,6 @@ namespace frc { * AddVisionMeasurement() can be called as infrequently as you want; if you * never call it, then this class will behave mostly like regular encoder * odometry. - * - * The state-space system used internally has the following states (x) and - * outputs (y): - * - * x = [x, y, theta]ᵀ in the field - * coordinate system containing x position, y position, and heading. - * - * y = [x, y, theta]ᵀ from vision containing x position, y - * position, and heading. */ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { public: @@ -53,11 +43,11 @@ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { * The default standard deviations of the vision measurements are * 0.45 meters for x, 0.45 meters for y, and 0.45 radians for heading. * - * @param kinematics A correctly-configured kinematics object - * for your drivetrain. - * @param gyroAngle The current gyro angle. - * @param wheelPositions The distance measured by each wheel. - * @param initialPose The starting pose estimate. + * @param kinematics A correctly-configured kinematics object for your + * drivetrain. + * @param gyroAngle The current gyro angle. + * @param wheelPositions The distance measured by each wheel. + * @param initialPose The starting pose estimate. */ MecanumDrivePoseEstimator(MecanumDriveKinematics& kinematics, const Rotation2d& gyroAngle, @@ -67,23 +57,18 @@ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { /** * Constructs a MecanumDrivePoseEstimator. * - * @param kinematics A correctly-configured kinematics object - * for your drivetrain. - * @param gyroAngle The current gyro angle. - * @param wheelPositions The distance measured by each wheel. - * @param initialPose The starting pose estimate. - - * @param stateStdDevs Standard deviations of model states. - * Increase these numbers to trust your - * model's state estimates less. This matrix - * is in the form [x, y, theta]ᵀ, with units - * in meters and radians. - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param kinematics A correctly-configured kinematics object for your + * drivetrain. + * @param gyroAngle The current gyro angle. + * @param wheelPositions The distance measured by each wheel. + * @param initialPose The starting pose estimate. + * @param stateStdDevs Standard deviations of the pose estimate (x position in + * meters, y position in meters, and heading in radians). Increase these + * numbers to trust your state estimate less. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ MecanumDrivePoseEstimator( MecanumDriveKinematics& kinematics, const Rotation2d& gyroAngle, @@ -92,16 +77,14 @@ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { const wpi::array& visionMeasurementStdDevs); /** - * Sets the pose estimator's trust of global measurements. This might be used + * Sets the pose estimator's trust in vision measurements. This might be used * to change trust in vision measurements after the autonomous period, or to * change trust as distance to a vision target increases. * - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ void SetVisionMeasurementStdDevs( const wpi::array& visionMeasurementStdDevs); @@ -139,15 +122,13 @@ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { * one meter or so of the current pose estimate. * * @param visionRobotPose The pose of the robot as measured by the vision - * camera. - * @param timestamp The timestamp of the vision measurement in seconds. - * Note that if you don't use your own time source by - * calling UpdateWithTime() then you must use a - * timestamp with an epoch since FPGA startup - * (i.e. the epoch of this timestamp is the same - * epoch as Timer#GetFPGATimestamp.) This means - * that you should use Timer#GetFPGATimestamp as your - * time source or sync the epochs. + * camera. + * @param timestamp The timestamp of the vision measurement in seconds. Note + * that if you don't use your own time source by calling UpdateWithTime() + * then you must use a timestamp with an epoch since FPGA startup (i.e., + * the epoch of this timestamp is the same epoch as + * frc::Timer::GetFPGATimestamp().) This means that you should use + * frc::Timer::GetFPGATimestamp() as your time source or sync the epochs. */ void AddVisionMeasurement(const Pose2d& visionRobotPose, units::second_t timestamp); @@ -167,25 +148,18 @@ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { * method will continue to apply to future measurements until a subsequent * call to SetVisionMeasurementStdDevs() or this method. * - * @param visionRobotPose The pose of the robot as measured by the - * vision camera. - * @param timestamp The timestamp of the vision measurement in - * seconds. Note that if you don't use your - * own time source by calling - * UpdateWithTime(), then you must use a - * timestamp with an epoch since FPGA startup - * (i.e. the epoch of this timestamp is the - * same epoch as - * frc::Timer::GetFPGATimestamp(). This means - * that you should use - * frc::Timer::GetFPGATimestamp() as your - * time source in this case. - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param visionRobotPose The pose of the robot as measured by the vision + * camera. + * @param timestamp The timestamp of the vision measurement in seconds. Note + * that if you don't use your own time source by calling UpdateWithTime(), + * then you must use a timestamp with an epoch since FPGA startup (i.e., + * the epoch of this timestamp is the same epoch as + * frc::Timer::GetFPGATimestamp(). This means that you should use + * frc::Timer::GetFPGATimestamp() as your time source in this case. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ void AddVisionMeasurement( const Pose2d& visionRobotPose, units::second_t timestamp, @@ -195,8 +169,8 @@ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { } /** - * Updates the the Kalman Filter using only wheel encoder - * information. This should be called every loop. + * Updates the pose estimator with wheel encoder and gyro information. This + * should be called every loop. * * @param gyroAngle The current gyro angle. * @param wheelPositions The distances measured at each wheel. @@ -206,8 +180,8 @@ class WPILIB_DLLEXPORT MecanumDrivePoseEstimator { const MecanumDriveWheelPositions& wheelPositions); /** - * Updates the the Kalman Filter using only wheel encoder - * information. This should be called every loop. + * Updates the pose estimator with wheel encoder and gyro information. This + * should be called every loop. * * @param currentTime Time at which this method was called, in seconds. * @param gyroAngle The current gyroscope angle. diff --git a/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h b/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h index f8d3461780..d07bafe5ed 100644 --- a/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h +++ b/wpimath/src/main/native/include/frc/estimator/SwerveDrivePoseEstimator.h @@ -31,15 +31,6 @@ namespace frc { * AddVisionMeasurement() can be called as infrequently as you want; if you * never call it, then this class will behave as regular encoder * odometry. - * - * The state-space system used internally has the following states (x) and - * outputs (y): - * - * x = [x, y, theta]ᵀ in the field coordinate - * system containing x position, y position, and heading. - * - * y = [x, y, theta]ᵀ from vision containing x position, y - * position, and heading. */ template class SwerveDrivePoseEstimator { @@ -53,12 +44,12 @@ class SwerveDrivePoseEstimator { * The default standard deviations of the vision measurements are * 0.9 meters for x, 0.9 meters for y, and 0.9 radians for heading. * - * @param kinematics A correctly-configured kinematics object - * for your drivetrain. - * @param gyroAngle The current gyro angle. - * @param modulePositions The current distance and rotation - * measurements of the swerve modules. - * @param initialPose The starting pose estimate. + * @param kinematics A correctly-configured kinematics object for your + * drivetrain. + * @param gyroAngle The current gyro angle. + * @param modulePositions The current distance and rotation measurements of + * the swerve modules. + * @param initialPose The starting pose estimate. */ SwerveDrivePoseEstimator( SwerveDriveKinematics& kinematics, @@ -72,23 +63,19 @@ class SwerveDrivePoseEstimator { /** * Constructs a SwerveDrivePoseEstimator. * - * @param kinematics A correctly-configured kinematics object - * for your drivetrain. - * @param gyroAngle The current gyro angle. - * @param modulePositions The current distance and rotation - * measurements of the swerve modules. - * @param initialPose The starting pose estimate. - * @param stateStdDevs Standard deviations of model states. - * Increase these numbers to trust your - * model's state estimates less. This matrix - * is in the form [x, y, theta]ᵀ, with units - * in meters and radians. - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param kinematics A correctly-configured kinematics object for your + * drivetrain. + * @param gyroAngle The current gyro angle. + * @param modulePositions The current distance and rotation measurements of + * the swerve modules. + * @param initialPose The starting pose estimate. + * @param stateStdDevs Standard deviations of the pose estimate (x position in + * meters, y position in meters, and heading in radians). Increase these + * numbers to trust your state estimate less. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ SwerveDrivePoseEstimator( SwerveDriveKinematics& kinematics, @@ -133,16 +120,14 @@ class SwerveDrivePoseEstimator { Pose2d GetEstimatedPosition() const { return m_odometry.GetPose(); } /** - * Sets the pose estimator's trust of global measurements. This might be used + * Sets the pose estimator's trust in vision measurements. This might be used * to change trust in vision measurements after the autonomous period, or to * change trust as distance to a vision target increases. * - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ void SetVisionMeasurementStdDevs( const wpi::array& visionMeasurementStdDevs) { @@ -175,15 +160,13 @@ class SwerveDrivePoseEstimator { * one meter or so of the current pose estimate. * * @param visionRobotPose The pose of the robot as measured by the vision - * camera. - * @param timestamp The timestamp of the vision measurement in seconds. - * Note that if you don't use your own time source by - * calling UpdateWithTime() then you must use a - * timestamp with an epoch since FPGA startup - * (i.e. the epoch of this timestamp is the same - * epoch as Timer#GetFPGATimestamp.) This means - * that you should use Timer#GetFPGATimestamp as your - * time source or sync the epochs. + * camera. + * @param timestamp The timestamp of the vision measurement in seconds. Note + * that if you don't use your own time source by calling UpdateWithTime() + * then you must use a timestamp with an epoch since FPGA startup (i.e., + * the epoch of this timestamp is the same epoch as + * frc::Timer::GetFPGATimestamp().) This means that you should use + * frc::Timer::GetFPGATimestamp() as your time source or sync the epochs. */ void AddVisionMeasurement(const Pose2d& visionRobotPose, units::second_t timestamp) { @@ -243,25 +226,18 @@ class SwerveDrivePoseEstimator { * method will continue to apply to future measurements until a subsequent * call to SetVisionMeasurementStdDevs() or this method. * - * @param visionRobotPose The pose of the robot as measured by the - * vision camera. - * @param timestamp The timestamp of the vision measurement in - * seconds. Note that if you don't use your - * own time source by calling - * UpdateWithTime(), then you must use a - * timestamp with an epoch since FPGA startup - * (i.e. the epoch of this timestamp is the - * same epoch as - * frc::Timer::GetFPGATimestamp(). This means - * that you should use - * frc::Timer::GetFPGATimestamp() as your - * time source in this case. - * @param visionMeasurementStdDevs Standard deviations of the vision - * measurements. Increase these numbers to - * trust global measurements from vision - * less. This matrix is in the form - * [x, y, theta]ᵀ, with units in meters and - * radians. + * @param visionRobotPose The pose of the robot as measured by the vision + * camera. + * @param timestamp The timestamp of the vision measurement in seconds. Note + * that if you don't use your own time source by calling UpdateWithTime(), + * then you must use a timestamp with an epoch since FPGA startup (i.e., + * the epoch of this timestamp is the same epoch as + * frc::Timer::GetFPGATimestamp(). This means that you should use + * frc::Timer::GetFPGATimestamp() as your time source in this case. + * @param visionMeasurementStdDevs Standard deviations of the vision pose + * measurement (x position in meters, y position in meters, and heading in + * radians). Increase these numbers to trust the vision pose measurement + * less. */ void AddVisionMeasurement( const Pose2d& visionRobotPose, units::second_t timestamp, @@ -271,8 +247,8 @@ class SwerveDrivePoseEstimator { } /** - * Updates the Kalman Filter using only wheel encoder information. This should - * be called every loop. + * Updates the pose estimator with wheel encoder and gyro information. This + * should be called every loop. * * @param gyroAngle The current gyro angle. * @param modulePositions The current distance and rotation measurements of @@ -287,8 +263,8 @@ class SwerveDrivePoseEstimator { } /** - * Updates the Kalman Filter using only wheel encoder information. This should - * be called every loop. + * Updates the pose estimator with wheel encoder and gyro information. This + * should be called every loop. * * @param currentTime Time at which this method was called, in seconds. * @param gyroAngle The current gyro angle.