RIT VEXU Core API
Loading...
Searching...
No Matches
tank_kinematics_constraint.h
1#pragma once
2
3#include <cmath>
4#include <memory>
5
6#include "core/math/kinematics/tank_kinematics.h"
7#include "core/math/trajectory/constraints/trajectory_constraint.h"
8#include "core/math/units.h"
9
10using namespace units::literals;
11
16class TankKinematicsConstraint : public TrajectoryConstraint {
17 public:
24 TankKinematicsConstraint(units::Length track_width, units::Velocity max_speed,
25 units::Acceleration max_acceleration = 10000_inps2)
26 : kinematics_(track_width), max_speed_(max_speed), max_acceleration_(max_acceleration) {}
27
34 TankKinematicsConstraint(const TankKinematics& kinematics, units::Velocity max_speed,
35 units::Acceleration max_acceleration = 10000_inps2)
36 : kinematics_(kinematics), max_speed_(max_speed), max_acceleration_(max_acceleration) {}
37
46 units::Velocity max_velocity(const Pose2d& pose, units::Curvature curvature,
47 units::Velocity velocity) const override {
48 units::AngularVelocity omega = velocity * curvature;
49 ChassisVelocities chassis_speeds{velocity, 0_inps, omega};
50
51 TankWheelVelocities wheel_speeds = kinematics_.to_wheel_velocities(chassis_speeds);
52
53 units::Velocity real_max_speed =
54 units::max(units::abs(wheel_speeds.left), units::abs(wheel_speeds.right));
55
56 if (real_max_speed > max_speed_) {
57 return velocity * (max_speed_ / real_max_speed);
58 }
59
60 return velocity;
61 }
62
70 MinMax min_max_acceleration(const Pose2d& pose, units::Curvature curvature,
71 units::Velocity speed) const override {
72 // Linear acceleration a mapping to wheel accelerations:
73 // alpha_kinematic = a * curvature
74 // wheel_accels = kinematics_.to_wheel_accelerations({a, 0, alpha_kinematic})
75 // Since it's a linear mapping: a_left = a * left_factor, a_right = a * right_factor
76
77 double left_factor =
78 1.0 - (curvature.to(units::radpm) * kinematics_.track_width.to(units::m)) / 2.0;
79 double right_factor =
80 1.0 + (curvature.to(units::radpm) * kinematics_.track_width.to(units::m)) / 2.0;
81
82 units::Acceleration max_a = max_acceleration_;
83 units::Acceleration min_a = -max_acceleration_;
84
85 double factors[2] = {left_factor, right_factor};
86 for (int i = 0; i < 2; ++i) {
87 double factor = factors[i];
88 if (std::abs(factor) > 1e-6) {
89 units::Acceleration limit = max_acceleration_ / std::abs(factor);
90 max_a = units::min(max_a, limit);
91 min_a = units::max(min_a, -limit);
92 }
93 }
94
95 return {min_a, max_a};
96 }
97
102 std::unique_ptr<TrajectoryConstraint> clone() const override {
103 return std::unique_ptr<TrajectoryConstraint>(new TankKinematicsConstraint(*this));
104 }
105
106 private:
107 TankKinematics kinematics_;
108 units::Velocity max_speed_;
109 units::Acceleration max_acceleration_;
110};
Definition pose2d.h:21
MinMax min_max_acceleration(const Pose2d &pose, units::Curvature curvature, units::Velocity speed) const override
Computes minimum and maximum allowed linear accelerations.
Definition tank_kinematics_constraint.h:70
std::unique_ptr< TrajectoryConstraint > clone() const override
Creates an independent copy of this constraint.
Definition tank_kinematics_constraint.h:102
TankKinematicsConstraint(units::Length track_width, units::Velocity max_speed, units::Acceleration max_acceleration=10000_inps2)
Constructs a TankKinematicsConstraint.
Definition tank_kinematics_constraint.h:24
units::Velocity max_velocity(const Pose2d &pose, units::Curvature curvature, units::Velocity velocity) const override
Computes maximum allowed chassis velocity to keep wheel speeds within limits during turns.
Definition tank_kinematics_constraint.h:46
TankKinematicsConstraint(const TankKinematics &kinematics, units::Velocity max_speed, units::Acceleration max_acceleration=10000_inps2)
Constructs a TankKinematicsConstraint from TankKinematics.
Definition tank_kinematics_constraint.h:34
Helper class that converts a chassis velocity (vx and omega) to left and right wheel velocities for a...
Definition tank_kinematics.h:19
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