WPILibC++ 2027.0.0-alpha-4
Loading...
Searching...
No Matches
DifferentialDriveKinematics.hpp
Go to the documentation of this file.
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#pragma once
6
7#include <type_traits>
8
17#include "wpi/units/angle.hpp"
18#include "wpi/units/length.hpp"
20
21namespace wpi::math {
22/**
23 * Helper class that converts a chassis velocity (dx and dtheta components) to
24 * left and right wheel velocities for a differential drive.
25 *
26 * Inverse kinematics converts a desired chassis velocity into left and right
27 * velocity components whereas forward kinematics converts left and right
28 * component velocities into a linear and angular chassis velocity.
29 */
31 : public Kinematics<DifferentialDriveWheelPositions,
32 DifferentialDriveWheelVelocities,
33 DifferentialDriveWheelAccelerations> {
34 public:
35 /**
36 * Constructs a differential drive kinematics object.
37 *
38 * @param trackwidth The trackwidth of the drivetrain. Theoretically, this is
39 * the distance between the left wheels and right wheels. However, the
40 * empirical value may be larger than the physical measured value due to
41 * scrubbing effects.
42 */
43 constexpr explicit DifferentialDriveKinematics(wpi::units::meter_t trackwidth)
45 if (!std::is_constant_evaluated()) {
46 wpi::math::MathSharedStore::ReportUsage("DifferentialDriveKinematics",
47 "");
48 }
49 }
50
51 /**
52 * Returns a chassis velocity from left and right component velocities using
53 * forward kinematics.
54 *
55 * @param wheelVelocities The left and right velocities.
56 * @return The chassis velocity.
57 */
59 const DifferentialDriveWheelVelocities& wheelVelocities) const override {
60 return {
61 (wheelVelocities.left + wheelVelocities.right) / 2.0, 0_mps,
62 (wheelVelocities.right - wheelVelocities.left) / trackwidth * 1_rad};
63 }
64
65 /**
66 * Returns left and right component velocities from a chassis velocity using
67 * inverse kinematics.
68 *
69 * @param chassisVelocities The linear and angular (dx and dtheta) components
70 * that represent the chassis' velocity.
71 * @return The left and right velocities.
72 */
74 const ChassisVelocities& chassisVelocities) const override {
75 return {
76 chassisVelocities.vx - trackwidth / 2 * chassisVelocities.omega / 1_rad,
77 chassisVelocities.vx +
78 trackwidth / 2 * chassisVelocities.omega / 1_rad};
79 }
80
81 /**
82 * Returns a twist from left and right distance deltas using
83 * forward kinematics.
84 *
85 * @param leftDistance The distance measured by the left encoder.
86 * @param rightDistance The distance measured by the right encoder.
87 * @return The resulting Twist2d.
88 */
89 constexpr Twist2d ToTwist2d(const wpi::units::meter_t leftDistance,
90 const wpi::units::meter_t rightDistance) const {
91 return {(leftDistance + rightDistance) / 2, 0_m,
92 (rightDistance - leftDistance) / trackwidth * 1_rad};
93 }
94
95 constexpr Twist2d ToTwist2d(
97 const DifferentialDriveWheelPositions& end) const override {
98 return ToTwist2d(end.left - start.left, end.right - start.right);
99 }
100
103 const DifferentialDriveWheelPositions& end, double t) const override {
104 return start.Interpolate(end, t);
105 }
106
108 const DifferentialDriveWheelAccelerations& wheelAccelerations)
109 const override {
110 return {(wheelAccelerations.left + wheelAccelerations.right) / 2.0,
111 0_mps_sq,
112 (wheelAccelerations.right - wheelAccelerations.left) / trackwidth *
113 1_rad};
114 }
115
117 const ChassisAccelerations& chassisAccelerations) const override {
118 return {chassisAccelerations.ax -
119 trackwidth / 2 * chassisAccelerations.alpha / 1_rad,
120 chassisAccelerations.ax +
121 trackwidth / 2 * chassisAccelerations.alpha / 1_rad};
122 }
123
124 /// Differential drive trackwidth.
125 wpi::units::meter_t trackwidth;
126};
127} // namespace wpi::math
128
#define WPILIB_DLLEXPORT
Definition SymbolExports.hpp:36
constexpr DifferentialDriveWheelAccelerations ToWheelAccelerations(const ChassisAccelerations &chassisAccelerations) const override
Performs inverse kinematics to return the wheel accelerations from a desired chassis acceleration.
Definition DifferentialDriveKinematics.hpp:116
constexpr DifferentialDriveWheelPositions Interpolate(const DifferentialDriveWheelPositions &start, const DifferentialDriveWheelPositions &end, double t) const override
Performs interpolation between two values.
Definition DifferentialDriveKinematics.hpp:101
constexpr ChassisAccelerations ToChassisAccelerations(const DifferentialDriveWheelAccelerations &wheelAccelerations) const override
Performs forward kinematics to return the resulting chassis accelerations from the wheel acceleration...
Definition DifferentialDriveKinematics.hpp:107
constexpr Twist2d ToTwist2d(const wpi::units::meter_t leftDistance, const wpi::units::meter_t rightDistance) const
Returns a twist from left and right distance deltas using forward kinematics.
Definition DifferentialDriveKinematics.hpp:89
wpi::units::meter_t trackwidth
Differential drive trackwidth.
Definition DifferentialDriveKinematics.hpp:125
constexpr Twist2d ToTwist2d(const DifferentialDriveWheelPositions &start, const DifferentialDriveWheelPositions &end) const override
Performs forward kinematics to return the resulting Twist2d from the given change in wheel positions.
Definition DifferentialDriveKinematics.hpp:95
constexpr DifferentialDriveKinematics(wpi::units::meter_t trackwidth)
Constructs a differential drive kinematics object.
Definition DifferentialDriveKinematics.hpp:43
constexpr DifferentialDriveWheelVelocities ToWheelVelocities(const ChassisVelocities &chassisVelocities) const override
Returns left and right component velocities from a chassis velocity using inverse kinematics.
Definition DifferentialDriveKinematics.hpp:73
constexpr ChassisVelocities ToChassisVelocities(const DifferentialDriveWheelVelocities &wheelVelocities) const override
Returns a chassis velocity from left and right component velocities using forward kinematics.
Definition DifferentialDriveKinematics.hpp:58
Helper class that converts a chassis velocity (dx, dy, and dtheta components) into individual wheel v...
Definition Kinematics.hpp:26
static void ReportUsage(std::string_view resource, std::string_view data)
Definition MathShared.hpp:61
Definition LinearSystem.hpp:20
Represents robot chassis accelerations.
Definition ChassisAccelerations.hpp:21
units::meters_per_second_squared_t ax
Acceleration along the x-axis.
Definition ChassisAccelerations.hpp:25
units::radians_per_second_squared_t alpha
Angular acceleration of the robot frame.
Definition ChassisAccelerations.hpp:35
Represents robot chassis velocities.
Definition ChassisVelocities.hpp:26
wpi::units::meters_per_second_t vx
Velocity along the x-axis.
Definition ChassisVelocities.hpp:30
wpi::units::radians_per_second_t omega
Represents the angular velocity of the robot frame.
Definition ChassisVelocities.hpp:40
Represents the wheel accelerations for a differential drive drivetrain.
Definition DifferentialDriveWheelAccelerations.hpp:14
units::meters_per_second_squared_t left
Acceleration of the left side of the robot.
Definition DifferentialDriveWheelAccelerations.hpp:18
units::meters_per_second_squared_t right
Acceleration of the right side of the robot.
Definition DifferentialDriveWheelAccelerations.hpp:23
Represents the wheel positions for a differential drive drivetrain.
Definition DifferentialDriveWheelPositions.hpp:15
wpi::units::meter_t left
Distance driven by the left side.
Definition DifferentialDriveWheelPositions.hpp:19
wpi::units::meter_t right
Distance driven by the right side.
Definition DifferentialDriveWheelPositions.hpp:24
Represents the wheel velocities for a differential drive drivetrain.
Definition DifferentialDriveWheelVelocities.hpp:15
wpi::units::meters_per_second_t right
Velocity of the right side of the robot.
Definition DifferentialDriveWheelVelocities.hpp:24
wpi::units::meters_per_second_t left
Velocity of the left side of the robot.
Definition DifferentialDriveWheelVelocities.hpp:19
A change in distance along a 2D arc since the last pose update.
Definition Twist2d.hpp:23