TrajoptLib
Library for generating time-optimal trajectories for FRC robots.
Loading...
Searching...
No Matches
linear_velocity_direction_constraint.hpp
1// Copyright (c) TrajoptLib contributors
2
3#pragma once
4
5#include <sleipnir/autodiff/variable.hpp>
6#include <sleipnir/optimization/problem.hpp>
7
8#include "trajopt/geometry/pose2.hpp"
9#include "trajopt/geometry/translation2.hpp"
10#include "trajopt/util/symbol_exports.hpp"
11
12namespace trajopt {
13
15class TRAJOPT_DLLEXPORT LinearVelocityDirectionConstraint {
16 public:
20 explicit LinearVelocityDirectionConstraint(double angle) : m_angle{angle} {}
21
30 void apply(
31 [[maybe_unused]] slp::Problem<double>& problem,
32 [[maybe_unused]] const Pose2v<double>& pose,
33 const Translation2v<double>& linear_velocity,
34 [[maybe_unused]] const slp::Variable<double>& angular_velocity,
35 [[maybe_unused]] const Translation2v<double>& linear_acceleration,
36 [[maybe_unused]] const slp::Variable<double>& angular_acceleration) {
37 // <v_x, v_y> and <u_x, u_y> must be parallel
38 //
39 // (v ⋅ u)/‖v‖ = 1
40 // v ⋅ u = ‖v‖
41 // (v ⋅ u)² = ‖v‖²
42 auto dot = linear_velocity.dot(Translation2d{m_angle.cos(), m_angle.sin()});
43 problem.subject_to(dot * dot == linear_velocity.squared_norm());
44 }
45
46 private:
47 trajopt::Rotation2d m_angle;
48};
49
50} // namespace trajopt
LinearVelocityDirectionConstraint(double angle)
Definition linear_velocity_direction_constraint.hpp:20
void apply(slp::Problem< double > &problem, const Pose2v< double > &pose, const Translation2v< double > &linear_velocity, const slp::Variable< double > &angular_velocity, const Translation2v< double > &linear_acceleration, const slp::Variable< double > &angular_acceleration)
Definition linear_velocity_direction_constraint.hpp:30
constexpr auto dot(const Translation2< U > &other) const
Definition translation2.hpp:133
constexpr auto squared_norm() const
Definition translation2.hpp:158