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.util;
006
007/** Utility class that converts between commonly used units in FRC. */
008public final class Units {
009  private static final double kInchesPerFoot = 12.0;
010  private static final double kMetersPerInch = 0.0254;
011  private static final double kMetersPerMile = 1609.344;
012  private static final double kSecondsPerMinute = 60;
013  private static final double kMinutesPerHour = 60;
014  private static final double kMillisecondsPerSecond = 1000;
015  private static final double kKilogramsPerLb = 0.453592;
016
017  /** Utility class, so constructor is private. */
018  private Units() {
019    throw new UnsupportedOperationException("This is a utility class!");
020  }
021
022  /**
023   * Converts given meters to feet.
024   *
025   * @param meters The meters to convert to feet.
026   * @return Feet converted from meters.
027   */
028  public static double metersToFeet(double meters) {
029    return metersToInches(meters) / kInchesPerFoot;
030  }
031
032  /**
033   * Converts given feet to meters.
034   *
035   * @param feet The feet to convert to meters.
036   * @return Meters converted from feet.
037   */
038  public static double feetToMeters(double feet) {
039    return inchesToMeters(feet * kInchesPerFoot);
040  }
041
042  /**
043   * Converts given meters to inches.
044   *
045   * @param meters The meters to convert to inches.
046   * @return Inches converted from meters.
047   */
048  public static double metersToInches(double meters) {
049    return meters / kMetersPerInch;
050  }
051
052  /**
053   * Converts given inches to meters.
054   *
055   * @param inches The inches to convert to meters.
056   * @return Meters converted from inches.
057   */
058  public static double inchesToMeters(double inches) {
059    return inches * kMetersPerInch;
060  }
061
062  /**
063   * Converts given degrees to radians.
064   *
065   * @param degrees The degrees to convert to radians.
066   * @return Radians converted from degrees.
067   */
068  public static double degreesToRadians(double degrees) {
069    return Math.toRadians(degrees);
070  }
071
072  /**
073   * Converts given radians to degrees.
074   *
075   * @param radians The radians to convert to degrees.
076   * @return Degrees converted from radians.
077   */
078  public static double radiansToDegrees(double radians) {
079    return Math.toDegrees(radians);
080  }
081
082  /**
083   * Converts given radians to rotations.
084   *
085   * @param radians The radians to convert.
086   * @return rotations Converted from radians.
087   */
088  public static double radiansToRotations(double radians) {
089    return radians / (Math.PI * 2);
090  }
091
092  /**
093   * Converts given degrees to rotations.
094   *
095   * @param degrees The degrees to convert.
096   * @return rotations Converted from degrees.
097   */
098  public static double degreesToRotations(double degrees) {
099    return degrees / 360;
100  }
101
102  /**
103   * Converts given rotations to degrees.
104   *
105   * @param rotations The rotations to convert.
106   * @return degrees Converted from rotations.
107   */
108  public static double rotationsToDegrees(double rotations) {
109    return rotations * 360;
110  }
111
112  /**
113   * Converts given rotations to radians.
114   *
115   * @param rotations The rotations to convert.
116   * @return radians Converted from rotations.
117   */
118  public static double rotationsToRadians(double rotations) {
119    return rotations * 2 * Math.PI;
120  }
121
122  /**
123   * Converts rotations per minute to radians per second.
124   *
125   * @param rpm The rotations per minute to convert to radians per second.
126   * @return Radians per second converted from rotations per minute.
127   */
128  public static double rotationsPerMinuteToRadiansPerSecond(double rpm) {
129    return rpm * Math.PI / (kSecondsPerMinute / 2);
130  }
131
132  /**
133   * Converts radians per second to rotations per minute.
134   *
135   * @param radiansPerSecond The radians per second to convert to from rotations per minute.
136   * @return Rotations per minute converted from radians per second.
137   */
138  public static double radiansPerSecondToRotationsPerMinute(double radiansPerSecond) {
139    return radiansPerSecond * (kSecondsPerMinute / 2) / Math.PI;
140  }
141
142  /**
143   * Converts miles per hour to meters per second.
144   *
145   * @param mph The miles per hour to convert to meters per second.
146   * @return Meters per second converted from miles per hour.
147   */
148  public static double milesPerHourToMetersPerSecond(double mph) {
149    return mph * kMetersPerMile / (kSecondsPerMinute * kMinutesPerHour);
150  }
151
152  /**
153   * Converts meters per second to miles per hour.
154   *
155   * @param metersPerSecond The meters per second to convert to from miles per hour.
156   * @return Miles per hour converted from meters per second.
157   */
158  public static double metersPerSecondToMilesPerHour(double metersPerSecond) {
159    return metersPerSecond / kMetersPerMile * (kSecondsPerMinute * kMinutesPerHour);
160  }
161
162  /**
163   * Converts given milliseconds to seconds.
164   *
165   * @param milliseconds The milliseconds to convert to seconds.
166   * @return Seconds converted from milliseconds.
167   */
168  public static double millisecondsToSeconds(double milliseconds) {
169    return milliseconds / kMillisecondsPerSecond;
170  }
171
172  /**
173   * Converts given seconds to milliseconds.
174   *
175   * @param seconds The seconds to convert to milliseconds.
176   * @return Milliseconds converted from seconds.
177   */
178  public static double secondsToMilliseconds(double seconds) {
179    return seconds * kMillisecondsPerSecond;
180  }
181
182  /**
183   * Converts kilograms into lbs (pound-mass).
184   *
185   * @param kilograms The kilograms to convert to lbs (pound-mass).
186   * @return Lbs (pound-mass) converted from kilograms.
187   */
188  public static double kilogramsToLbs(double kilograms) {
189    return kilograms / kKilogramsPerLb;
190  }
191
192  /**
193   * Converts lbs (pound-mass) into kilograms.
194   *
195   * @param lbs The lbs (pound-mass) to convert to kilograms.
196   * @return Kilograms converted from lbs (pound-mass).
197   */
198  public static double lbsToKilograms(double lbs) {
199    return lbs * kKilogramsPerLb;
200  }
201}