mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-24 01:31:46 +00:00
[wpimath] Refactor kinematics, odometry, and pose estimator (#5355)
This commit is contained in:
@@ -11,32 +11,9 @@ using namespace frc;
|
||||
DifferentialDriveOdometry::DifferentialDriveOdometry(
|
||||
const Rotation2d& gyroAngle, units::meter_t leftDistance,
|
||||
units::meter_t rightDistance, const Pose2d& initialPose)
|
||||
: m_pose(initialPose),
|
||||
m_prevLeftDistance(leftDistance),
|
||||
m_prevRightDistance(rightDistance) {
|
||||
m_previousAngle = m_pose.Rotation();
|
||||
m_gyroOffset = m_pose.Rotation() - gyroAngle;
|
||||
: Odometry<DifferentialDriveWheelSpeeds, DifferentialDriveWheelPositions>(
|
||||
m_kinematicsImpl, gyroAngle, {leftDistance, rightDistance},
|
||||
initialPose) {
|
||||
wpi::math::MathSharedStore::ReportUsage(
|
||||
wpi::math::MathUsageId::kOdometry_DifferentialDrive, 1);
|
||||
}
|
||||
|
||||
const Pose2d& DifferentialDriveOdometry::Update(const Rotation2d& gyroAngle,
|
||||
units::meter_t leftDistance,
|
||||
units::meter_t rightDistance) {
|
||||
auto deltaLeftDistance = leftDistance - m_prevLeftDistance;
|
||||
auto deltaRightDistance = rightDistance - m_prevRightDistance;
|
||||
|
||||
m_prevLeftDistance = leftDistance;
|
||||
m_prevRightDistance = rightDistance;
|
||||
|
||||
auto averageDeltaDistance = (deltaLeftDistance + deltaRightDistance) / 2.0;
|
||||
auto angle = gyroAngle + m_gyroOffset;
|
||||
|
||||
auto newPose = m_pose.Exp(
|
||||
{averageDeltaDistance, 0_m, (angle - m_previousAngle).Radians()});
|
||||
|
||||
m_previousAngle = angle;
|
||||
m_pose = {newPose.Translation(), angle};
|
||||
|
||||
return m_pose;
|
||||
}
|
||||
|
||||
@@ -11,35 +11,9 @@ using namespace frc;
|
||||
MecanumDriveOdometry::MecanumDriveOdometry(
|
||||
MecanumDriveKinematics kinematics, const Rotation2d& gyroAngle,
|
||||
const MecanumDriveWheelPositions& wheelPositions, const Pose2d& initialPose)
|
||||
: m_kinematics(kinematics),
|
||||
m_pose(initialPose),
|
||||
m_previousWheelPositions(wheelPositions) {
|
||||
m_previousAngle = m_pose.Rotation();
|
||||
m_gyroOffset = m_pose.Rotation() - gyroAngle;
|
||||
: Odometry<MecanumDriveWheelSpeeds, MecanumDriveWheelPositions>(
|
||||
m_kinematicsImpl, gyroAngle, wheelPositions, initialPose),
|
||||
m_kinematicsImpl(kinematics) {
|
||||
wpi::math::MathSharedStore::ReportUsage(
|
||||
wpi::math::MathUsageId::kOdometry_MecanumDrive, 1);
|
||||
}
|
||||
|
||||
const Pose2d& MecanumDriveOdometry::Update(
|
||||
const Rotation2d& gyroAngle,
|
||||
const MecanumDriveWheelPositions& wheelPositions) {
|
||||
auto angle = gyroAngle + m_gyroOffset;
|
||||
|
||||
MecanumDriveWheelPositions wheelDeltas{
|
||||
wheelPositions.frontLeft - m_previousWheelPositions.frontLeft,
|
||||
wheelPositions.frontRight - m_previousWheelPositions.frontRight,
|
||||
wheelPositions.rearLeft - m_previousWheelPositions.rearLeft,
|
||||
wheelPositions.rearRight - m_previousWheelPositions.rearRight,
|
||||
};
|
||||
|
||||
auto twist = m_kinematics.ToTwist2d(wheelDeltas);
|
||||
twist.dtheta = (angle - m_previousAngle).Radians();
|
||||
|
||||
auto newPose = m_pose.Exp(twist);
|
||||
|
||||
m_previousAngle = angle;
|
||||
m_previousWheelPositions = wheelPositions;
|
||||
m_pose = {newPose.Translation(), angle};
|
||||
|
||||
return m_pose;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user