Brick
Loading...
Searching...
No Matches
tank_kinematics.h
1#pragma once
2
3#include "core/math/kinematics/chassis_accelerations.h"
4#include "core/math/kinematics/chassis_velocities.h"
5#include "core/math/kinematics/tank_wheel_accelerations.h"
6#include "core/math/kinematics/tank_wheel_velocities.h"
7#include "core/math/units.h"
8
9using namespace units::literals;
10
11/**
12 * @brief Helper class that converts a chassis velocity (vx and omega) to
13 * left and right wheel velocities for a tank drive.
14 *
15 * Inverse kinematics converts a desired chassis velocity into left and right
16 * velocity components whereas forward kinematics converts left and right
17 * component velocities into a linear and angular chassis velocity.
18 */
20 public:
21 /** @brief Distance between the left and right wheels (often tuned empirically). */
22 units::Length track_width;
23
24 /**
25 * @brief Constructs a tank drive kinematics object.
26 * @param track_width The physical (or effective) distance between left and right wheels.
27 */
28 explicit TankKinematics(units::Length track_width) : track_width(track_width) {}
29
30 /**
31 * @brief Returns a chassis velocity from left and right component velocities using forward
32 * kinematics.
33 * @param wheel_velocities The left and right velocities.
34 * @return The chassis velocity.
35 */
37 units::Velocity vx = (wheel_velocities.left + wheel_velocities.right) / 2.0;
38
39 // omega = (right - left) / track_width
40 units::AngularVelocity omega =
41 ((wheel_velocities.right.to(units::inps) - wheel_velocities.left.to(units::inps)) /
42 track_width.to(units::in)) *
43 units::radps;
44
45 return ChassisVelocities(vx, 0_inps, omega);
46 }
47
48 /**
49 * @brief Returns left and right component velocities from a chassis velocity using inverse
50 * kinematics.
51 * @param chassis_velocities The linear and angular components that represent the chassis'
52 * velocity.
53 * @return The left and right velocities.
54 */
56 // v_L = vx - (track_width / 2) * omega
57 // v_R = vx + (track_width / 2) * omega
58 units::Velocity omega_linear =
59 (chassis_velocities.omega.to(units::radps) * (track_width.to(units::in) / 2.0)) *
60 units::inps;
61
63 chassis_velocities.vx - omega_linear, chassis_velocities.vx + omega_linear
64 );
65 }
66
67 /**
68 * @brief Returns a chassis acceleration from left and right component accelerations using forward
69 * kinematics.
70 * @param wheel_accels The left and right accelerations.
71 * @return The chassis acceleration.
72 */
74 units::Acceleration ax = (wheel_accels.left + wheel_accels.right) / 2.0;
75
76 // alpha = (right - left) / track_width
77 units::AngularAcceleration alpha =
78 ((wheel_accels.right.to(units::inps2) - wheel_accels.left.to(units::inps2)) /
79 track_width.to(units::in)) *
80 units::radps2;
81
82 return ChassisAccelerations(ax, 0_inps2, alpha);
83 }
84
85 /**
86 * @brief Returns left and right component accelerations from a chassis acceleration using inverse
87 * kinematics.
88 * @param chassis_accels The linear and angular components that represent the chassis'
89 * acceleration.
90 * @return The left and right accelerations.
91 */
93 // a_L = ax - (track_width / 2) * alpha
94 // a_R = ax + (track_width / 2) * alpha
95 units::Acceleration alpha_linear =
96 (chassis_accels.alpha.to(units::radps2) * (track_width.to(units::in) / 2.0)) * units::inps2;
97
99 chassis_accels.ax - alpha_linear, chassis_accels.ax + alpha_linear
100 );
101 }
102};
TankKinematics(units::Length track_width)
Constructs a tank drive kinematics object.
Definition tank_kinematics.h:28
TankWheelAccelerations to_wheel_accelerations(const ChassisAccelerations &chassis_accels) const
Returns left and right component accelerations from a chassis acceleration using inverse kinematics.
Definition tank_kinematics.h:92
ChassisVelocities to_chassis_velocities(const TankWheelVelocities &wheel_velocities) const
Returns a chassis velocity from left and right component velocities using forward kinematics.
Definition tank_kinematics.h:36
TankWheelVelocities to_wheel_velocities(const ChassisVelocities &chassis_velocities) const
Returns left and right component velocities from a chassis velocity using inverse kinematics.
Definition tank_kinematics.h:55
units::Length track_width
Distance between the left and right wheels (often tuned empirically).
Definition tank_kinematics.h:22
ChassisAccelerations to_chassis_accelerations(const TankWheelAccelerations &wheel_accels) const
Returns a chassis acceleration from left and right component accelerations using forward kinematics.
Definition tank_kinematics.h:73
Definition units.h:691
Represents robot chassis accelerations.
Definition chassis_accelerations.h:12
units::Acceleration ax
Acceleration along the x-axis. (Forward is positive).
Definition chassis_accelerations.h:14
units::AngularAcceleration alpha
Angular acceleration of the robot frame. (Counter-Clockwise is positive).
Definition chassis_accelerations.h:20
Represents robot chassis velocities.
Definition chassis_velocities.h:14
units::AngularVelocity omega
Angular velocity of the robot frame. (Counter-Clockwise is positive).
Definition chassis_velocities.h:22
units::Velocity vx
Velocity along the x-axis. (Forward is positive).
Definition chassis_velocities.h:16
Represents the left and right accelerations of a tank drive.
Definition tank_wheel_accelerations.h:9
units::Acceleration left
Left wheel acceleration.
Definition tank_wheel_accelerations.h:11
units::Acceleration right
Right wheel acceleration.
Definition tank_wheel_accelerations.h:13
Represents the left and right velocities of a tank drive.
Definition tank_wheel_velocities.h:9
units::Velocity right
Right wheel velocity.
Definition tank_wheel_velocities.h:13
units::Velocity left
Left wheel velocity.
Definition tank_wheel_velocities.h:11