Brick
Loading...
Searching...
No Matches
tank_voltage_constraint.h
1#pragma once
2
3#include "core/math/kinematics/tank_kinematics.h"
4#include "core/math/trajectory/constraints/trajectory_constraint.h"
5#include "core/math/units.h"
6
7using namespace units::literals;
8
9/**
10 * @brief Trajectory constraint that limits acceleration based on available battery voltage and
11 * motor capabilities.
12 */
13class TankVoltageConstraint : public TrajectoryConstraint {
14 public:
15 /**
16 * @brief Constructs a TankVoltageConstraint from track width.
17 * @param Kv Linear velocity feedforward constant.
18 * @param Ka Linear acceleration feedforward constant.
19 * @param max_voltage Maximum available voltage.
20 * @param track_width Robot track width (distance between left and right wheels).
21 */
23 units::LinearVelocityFeedforward Kv, units::LinearAccelerationFeedforward Ka,
24 units::Voltage max_voltage, units::Length track_width
25 )
26 : Kv_(Kv), Ka_(Ka), max_voltage_(max_voltage), kinematics_(track_width) {}
27
28 /**
29 * @brief Constructs a TankVoltageConstraint from TankKinematics.
30 * @param Kv Linear velocity feedforward constant.
31 * @param Ka Linear acceleration feedforward constant.
32 * @param max_voltage Maximum available voltage.
33 * @param kinematics Kinematics model for tank drive.
34 */
36 units::LinearVelocityFeedforward Kv, units::LinearAccelerationFeedforward Ka,
37 units::Voltage max_voltage, const TankKinematics& kinematics
38 )
39 : Kv_(Kv), Ka_(Ka), max_voltage_(max_voltage), kinematics_(kinematics) {}
40
41 /**
42 * @brief Computes maximum allowed velocity.
43 * @param pose 2D position and orientation.
44 * @param curvature Path curvature in rad/meter.
45 * @param velocity Candidate linear velocity.
46 * @return Constrained units::Velocity limit.
47 */
48 units::Velocity max_velocity(
49 const Pose2d& pose, units::Curvature curvature, units::Velocity velocity
50 ) const override {
51 return units::Velocity(std::numeric_limits<double>::max());
52 }
53
54 /**
55 * @brief Computes minimum and maximum allowed linear accelerations based on voltage limits.
56 * @param pose 2D position and orientation.
57 * @param curvature Path curvature in rad/meter.
58 * @param speed Current scalar speed.
59 * @return MinMax acceleration bounds struct.
60 */
62 const Pose2d& pose, units::Curvature curvature, units::Velocity speed
63 ) const override {
64 units::AngularVelocity omega = speed * curvature;
65 ChassisVelocities chassis_speeds(speed, 0_inps, omega);
66 TankWheelVelocities wheel_speeds = kinematics_.to_wheel_velocities(chassis_speeds);
67
68 units::Velocity max_wheel_speed = units::max(wheel_speeds.left, wheel_speeds.right);
69 units::Velocity min_wheel_speed = units::min(wheel_speeds.left, wheel_speeds.right);
70
71 units::Acceleration max_wheel_acceleration = (max_voltage_ - (Kv_ * max_wheel_speed)) / Ka_;
72 units::Acceleration min_wheel_acceleration = (-max_voltage_ - Kv_ * min_wheel_speed) / Ka_;
73
74 units::Acceleration max_chassis_acceleration;
75 units::Acceleration min_chassis_acceleration;
76
77 const units::Number curvature_term = (kinematics_.track_width * units::abs(curvature)) / 1_rad;
78
79 if (units::abs(speed) <= 1e-9_mps) {
80 const units::Number denom = 1.0 + (curvature_term / 2.0);
81 max_chassis_acceleration =
82 max_wheel_acceleration / (units::abs(denom) < 1e-6 ? units::Number(1e-6) : denom);
83 min_chassis_acceleration =
84 min_wheel_acceleration / (units::abs(denom) < 1e-6 ? units::Number(1e-6) : denom);
85 } else {
86 const units::Number speed_sgn = units::sgn(speed);
87 const units::Number max_denom = 1.0 + (curvature_term * speed_sgn / 2.0);
88 const units::Number min_denom = 1.0 - (curvature_term * speed_sgn / 2.0);
89
90 max_chassis_acceleration =
91 max_wheel_acceleration / (units::abs(max_denom) < 1e-6 ? units::Number(1e-6) : max_denom);
92 min_chassis_acceleration =
93 min_wheel_acceleration / (units::abs(min_denom) < 1e-6 ? units::Number(1e-6) : min_denom);
94 }
95
96 if (units::abs(curvature) > 1E-9_radpm &&
97 (kinematics_.track_width / 2.0) > 1_rad / units::abs(curvature)) {
98 if (speed > 0_mps && min_chassis_acceleration > 0_inps2) {
99 min_chassis_acceleration = -min_chassis_acceleration;
100 } else if (speed < 0_mps && max_chassis_acceleration < 0_inps2) {
101 max_chassis_acceleration = -max_chassis_acceleration;
102 }
103 }
104
105 return {min_chassis_acceleration, max_chassis_acceleration};
106 }
107
108 /**
109 * @brief Creates an independent copy of this constraint.
110 * @return Unique pointer to cloned TankVoltageConstraint instance.
111 */
112 std::unique_ptr<TrajectoryConstraint> clone() const override {
113 return std::unique_ptr<TrajectoryConstraint>(new TankVoltageConstraint(*this));
114 }
115
116 private:
117 units::LinearVelocityFeedforward Kv_; ///< Linear velocity feedforward constant
118 units::LinearAccelerationFeedforward Ka_; ///< Linear acceleration feedforward constant
119 units::Voltage max_voltage_; ///< Maximum available voltage
120 TankKinematics kinematics_; ///< Tank drive kinematics model
121};
Definition pose2d.h:21
Helper class that converts a chassis velocity (vx and omega) to left and right wheel velocities for a...
Definition tank_kinematics.h:19
TankVoltageConstraint(units::LinearVelocityFeedforward Kv, units::LinearAccelerationFeedforward Ka, units::Voltage max_voltage, units::Length track_width)
Constructs a TankVoltageConstraint from track width.
Definition tank_voltage_constraint.h:22
MinMax min_max_acceleration(const Pose2d &pose, units::Curvature curvature, units::Velocity speed) const override
Computes minimum and maximum allowed linear accelerations based on voltage limits.
Definition tank_voltage_constraint.h:61
TankVoltageConstraint(units::LinearVelocityFeedforward Kv, units::LinearAccelerationFeedforward Ka, units::Voltage max_voltage, const TankKinematics &kinematics)
Constructs a TankVoltageConstraint from TankKinematics.
Definition tank_voltage_constraint.h:35
std::unique_ptr< TrajectoryConstraint > clone() const override
Creates an independent copy of this constraint.
Definition tank_voltage_constraint.h:112
units::Velocity max_velocity(const Pose2d &pose, units::Curvature curvature, units::Velocity velocity) const override
Computes maximum allowed velocity.
Definition tank_voltage_constraint.h:48
Definition units.h:691
Quantity<> Number
Number is just dimensionless.
Definition units.h:162
Represents robot chassis velocities.
Definition chassis_velocities.h:14
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
Struct representing minimum and maximum allowed linear accelerations.
Definition trajectory_constraint.h:29