001// Copyright (c) FIRST and other WPILib contributors. 002// Open Source Software; you can modify and/or share it under the terms of 003// the WPILib BSD license file in the root directory of this project. 004 005package edu.wpi.first.math.trajectory.constraint; 006 007import edu.wpi.first.math.geometry.Pose2d; 008import edu.wpi.first.math.kinematics.ChassisSpeeds; 009import edu.wpi.first.math.kinematics.DifferentialDriveKinematics; 010 011/** 012 * A class that enforces constraints on the differential drive kinematics. This can be used to 013 * ensure that the trajectory is constructed so that the commanded velocities for both sides of the 014 * drivetrain stay below a certain limit. 015 */ 016public class DifferentialDriveKinematicsConstraint implements TrajectoryConstraint { 017 private final double m_maxSpeedMetersPerSecond; 018 private final DifferentialDriveKinematics m_kinematics; 019 020 /** 021 * Constructs a differential drive dynamics constraint. 022 * 023 * @param kinematics A kinematics component describing the drive geometry. 024 * @param maxSpeedMetersPerSecond The max speed that a side of the robot can travel at. 025 */ 026 public DifferentialDriveKinematicsConstraint( 027 final DifferentialDriveKinematics kinematics, double maxSpeedMetersPerSecond) { 028 m_maxSpeedMetersPerSecond = maxSpeedMetersPerSecond; 029 m_kinematics = kinematics; 030 } 031 032 /** 033 * Returns the max velocity given the current pose and curvature. 034 * 035 * @param poseMeters The pose at the current point in the trajectory. 036 * @param curvatureRadPerMeter The curvature at the current point in the trajectory. 037 * @param velocityMetersPerSecond The velocity at the current point in the trajectory before 038 * constraints are applied. 039 * @return The absolute maximum velocity. 040 */ 041 @Override 042 public double getMaxVelocityMetersPerSecond( 043 Pose2d poseMeters, double curvatureRadPerMeter, double velocityMetersPerSecond) { 044 // Create an object to represent the current chassis speeds. 045 var chassisSpeeds = 046 new ChassisSpeeds( 047 velocityMetersPerSecond, 0, velocityMetersPerSecond * curvatureRadPerMeter); 048 049 // Get the wheel speeds and normalize them to within the max velocity. 050 var wheelSpeeds = m_kinematics.toWheelSpeeds(chassisSpeeds); 051 wheelSpeeds.desaturate(m_maxSpeedMetersPerSecond); 052 053 // Return the new linear chassis speed. 054 return m_kinematics.toChassisSpeeds(wheelSpeeds).vxMetersPerSecond; 055 } 056 057 /** 058 * Returns the minimum and maximum allowable acceleration for the trajectory given pose, 059 * curvature, and speed. 060 * 061 * @param poseMeters The pose at the current point in the trajectory. 062 * @param curvatureRadPerMeter The curvature at the current point in the trajectory. 063 * @param velocityMetersPerSecond The speed at the current point in the trajectory. 064 * @return The min and max acceleration bounds. 065 */ 066 @Override 067 public MinMax getMinMaxAccelerationMetersPerSecondSq( 068 Pose2d poseMeters, double curvatureRadPerMeter, double velocityMetersPerSecond) { 069 return new MinMax(); 070 } 071}