RIT VEXU Core API
Loading...
Searching...
No Matches
twist2d.h
1#pragma once
2
3#include "cevalm.hpp"
4#include "core/math/eigen_interface.h"
5#include "core/math/units.h"
6
20class Twist2d {
21 private:
22 units::Length dx_;
23 units::Length dy_;
24 units::Angle dtheta_;
25
26 public:
28 constexpr Twist2d() : dx_(0), dy_(0), dtheta_(0) {}
29
37 constexpr Twist2d(units::Length dx, units::Length dy, units::Angle dtheta)
38 : dx_{dx}, dy_{dy}, dtheta_{dtheta} {}
39
47 constexpr Twist2d(
48 const Eigen::Vector3d& twist_vector, units::Length length_unit,
49 units::Angle angle_unit = units::radians
50 )
51 : dx_{twist_vector[0], length_unit},
52 dy_{twist_vector[1], length_unit},
53 dtheta_{twist_vector[2], angle_unit} {}
54
56 constexpr units::Length dx() const { return dx_; }
57
59 constexpr double dx(units::Length unit) const { return dx_.to(unit); }
60
62 constexpr void set_dx(units::Length val) { dx_ = val; }
63
65 constexpr units::Length dy() const { return dy_; }
66
68 constexpr double dy(units::Length unit) const { return dy_.to(unit); }
69
71 constexpr void set_dy(units::Length val) { dy_ = val; }
72
74 constexpr units::Angle dtheta() const { return dtheta_; }
75
77 constexpr double dtheta(units::Angle unit) const { return dtheta_.to(unit); }
78
80 constexpr void set_dtheta(units::Angle val) { dtheta_ = val; }
81
89 EVec<3> as_vector(units::Length length_unit, units::Angle angle_unit = units::radians) const {
90 return EVec<3>{dx_.to(length_unit), dy_.to(length_unit), dtheta_.to(angle_unit)};
91 }
92
94 constexpr Twist2d operator*(double scalar) const {
95 return Twist2d{dx_ * scalar, dy_ * scalar, dtheta_ * scalar};
96 }
97
99 friend constexpr Twist2d operator*(double scalar, const Twist2d& twist) {
100 return twist * scalar;
101 }
102
104 constexpr Twist2d& operator*=(double scalar) { return *this = *this * scalar; }
105
107 constexpr Twist2d operator/(double scalar) const { return *this * (1.0 / scalar); }
108
110 constexpr Twist2d& operator/=(double scalar) { return *this = *this / scalar; }
111
113 constexpr bool operator==(const Twist2d& other) const {
114 return dx_ == other.dx_ && dy_ == other.dy_ && dtheta_ == other.dtheta_;
115 }
116
121 constexpr bool is_near(
122 const Twist2d& other, units::Length distance_tolerance = units::Length(1e-6),
123 units::Angle angle_tolerance = units::Angle(1e-6)
124 ) const {
125 return units::hypot(dx_ - other.dx_, dy_ - other.dy_) <= distance_tolerance &&
126 units::abs(dtheta_ - other.dtheta_) <= angle_tolerance;
127 }
128};
constexpr Twist2d & operator*=(double scalar)
Multiplies this twist by a scalar.
Definition twist2d.h:104
constexpr Twist2d & operator/=(double scalar)
Divides this twist by a scalar.
Definition twist2d.h:110
constexpr void set_dtheta(units::Angle val)
Sets the angle displacement.
Definition twist2d.h:80
constexpr units::Length dx() const
Gets the x displacement.
Definition twist2d.h:56
constexpr double dtheta(units::Angle unit) const
Gets the angle displacement in the supplied unit.
Definition twist2d.h:77
constexpr double dx(units::Length unit) const
Gets the x displacement in the supplied unit.
Definition twist2d.h:59
constexpr Twist2d(const Eigen::Vector3d &twist_vector, units::Length length_unit, units::Angle angle_unit=units::radians)
Definition twist2d.h:47
constexpr units::Length dy() const
Gets the y displacement.
Definition twist2d.h:65
constexpr Twist2d()
Default Constructor for Twist2d.
Definition twist2d.h:28
constexpr Twist2d(units::Length dx, units::Length dy, units::Angle dtheta)
Definition twist2d.h:37
friend constexpr Twist2d operator*(double scalar, const Twist2d &twist)
Multiplies a scalar by this twist.
Definition twist2d.h:99
constexpr bool operator==(const Twist2d &other) const
Checks exact equality between this and another twist.
Definition twist2d.h:113
EVec< 3 > as_vector(units::Length length_unit, units::Angle angle_unit=units::radians) const
Definition twist2d.h:89
constexpr void set_dy(units::Length val)
Sets the y displacement.
Definition twist2d.h:71
constexpr Twist2d operator*(double scalar) const
Multiplies this twist by a scalar.
Definition twist2d.h:94
constexpr double dy(units::Length unit) const
Gets the y displacement in the supplied unit.
Definition twist2d.h:68
constexpr void set_dx(units::Length val)
Sets the x displacement.
Definition twist2d.h:62
constexpr units::Angle dtheta() const
Gets the Angle displacement.
Definition twist2d.h:74
constexpr Twist2d operator/(double scalar) const
Divides this twist by a scalar.
Definition twist2d.h:107
constexpr bool is_near(const Twist2d &other, units::Length distance_tolerance=units::Length(1e-6), units::Angle angle_tolerance=units::Angle(1e-6)) const
Definition twist2d.h:121