Brick
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
12/**
13 * @brief Trajectory constraint that limits velocity and acceleration based on tank drive kinematics
14 * and maximum wheel constraints.
15 */
16class TankKinematicsConstraint : public TrajectoryConstraint {
17 public:
18 /**
19 * @brief Constructs a TankKinematicsConstraint.
20 * @param track_width Robot track width (distance between left and right wheels).
21 * @param max_speed Maximum allowed speed of a single wheel.
22 * @param max_acceleration Maximum allowed acceleration of a single wheel.
23 */
25 units::Length track_width, units::Velocity max_speed,
26 units::Acceleration max_acceleration = 10000_inps2
27 )
28 : kinematics_(track_width), max_speed_(max_speed), max_acceleration_(max_acceleration) {}
29
30 /**
31 * @brief Constructs a TankKinematicsConstraint from TankKinematics.
32 * @param kinematics Differential drive kinematics model.
33 * @param max_speed Maximum allowed speed of a single wheel.
34 * @param max_acceleration Maximum allowed acceleration of a single wheel.
35 */
37 const TankKinematics& kinematics, units::Velocity max_speed,
38 units::Acceleration max_acceleration = 10000_inps2
39 )
40 : kinematics_(kinematics), max_speed_(max_speed), max_acceleration_(max_acceleration) {}
41
42 /**
43 * @brief Computes maximum allowed chassis velocity to keep wheel speeds within limits during
44 * turns.
45 * @param pose 2D position and orientation.
46 * @param curvature Path curvature in rad/meter.
47 * @param velocity Candidate linear velocity.
48 * @return Constrained units::Velocity limit.
49 */
50 units::Velocity max_velocity(
51 const Pose2d& pose, units::Curvature curvature, units::Velocity velocity
52 ) const override {
53 units::AngularVelocity omega = velocity * curvature;
54 ChassisVelocities chassis_speeds{velocity, 0_inps, omega};
55
56 TankWheelVelocities wheel_speeds = kinematics_.to_wheel_velocities(chassis_speeds);
57
58 units::Velocity real_max_speed =
59 units::max(units::abs(wheel_speeds.left), units::abs(wheel_speeds.right));
60
61 if (real_max_speed > max_speed_) {
62 return velocity * (max_speed_ / real_max_speed);
63 }
64
65 return velocity;
66 }
67
68 /**
69 * @brief Computes minimum and maximum allowed linear accelerations.
70 * @param pose 2D position and orientation.
71 * @param curvature Path curvature in rad/meter.
72 * @param speed Current scalar speed.
73 * @return MinMax acceleration bounds struct.
74 */
76 const Pose2d& pose, units::Curvature curvature, units::Velocity speed
77 ) const override {
78 // Linear acceleration a mapping to wheel accelerations:
79 // alpha_kinematic = a * curvature
80 // wheel_accels = kinematics_.to_wheel_accelerations({a, 0, alpha_kinematic})
81 // Since it's a linear mapping: a_left = a * left_factor, a_right = a * right_factor
82
83 double left_factor =
84 1.0 - (curvature.to(units::radpm) * kinematics_.track_width.to(units::m)) / 2.0;
85 double right_factor =
86 1.0 + (curvature.to(units::radpm) * kinematics_.track_width.to(units::m)) / 2.0;
87
88 units::Acceleration max_a = max_acceleration_;
89 units::Acceleration min_a = -max_acceleration_;
90
91 double factors[2] = {left_factor, right_factor};
92 for (int i = 0; i < 2; ++i) {
93 double factor = factors[i];
94 if (std::abs(factor) > 1e-6) {
95 units::Acceleration limit = max_acceleration_ / std::abs(factor);
96 max_a = units::min(max_a, limit);
97 min_a = units::max(min_a, -limit);
98 }
99 }
100
101 return {min_a, max_a};
102 }
103
104 /**
105 * @brief Creates an independent copy of this constraint.
106 * @return Unique pointer to cloned TankKinematicsConstraint instance.
107 */
108 std::unique_ptr<TrajectoryConstraint> clone() const override {
109 return std::unique_ptr<TrajectoryConstraint>(new TankKinematicsConstraint(*this));
110 }
111
112 private:
113 TankKinematics kinematics_; ///< Kinematics for tank drive
114 units::Velocity max_speed_; ///< Maximum allowed speed of a single wheel
115 units::Acceleration max_acceleration_; ///< Maximum allowed acceleration of a single wheel
116};
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:75
std::unique_ptr< TrajectoryConstraint > clone() const override
Creates an independent copy of this constraint.
Definition tank_kinematics_constraint.h:108
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:50
TankKinematicsConstraint(const TankKinematics &kinematics, units::Velocity max_speed, units::Acceleration max_acceleration=10000_inps2)
Constructs a TankKinematicsConstraint from TankKinematics.
Definition tank_kinematics_constraint.h:36
Helper class that converts a chassis velocity (vx and omega) to left and right wheel velocities for a...
Definition tank_kinematics.h:19
Definition units.h:691
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