TrajoptLib
Library for generating time-optimal trajectories for FRC robots.
Loading...
Searching...
No Matches
pose2.hpp
1// Copyright (c) TrajoptLib contributors
2
3#pragma once
4
5#include <type_traits>
6#include <utility>
7
8#include <sleipnir/autodiff/variable.hpp>
9#include <sleipnir/util/concepts.hpp>
10
11#include "trajopt/geometry/rotation2.hpp"
12#include "trajopt/geometry/translation2.hpp"
13
14namespace trajopt {
15
17template <typename T>
18class Pose2 {
19 public:
21 constexpr Pose2() = default;
22
28 : m_translation{std::move(translation)},
29 m_rotation{std::move(rotation)} {}
30
37 constexpr Pose2(T x, T y, Rotation2<T> rotation)
38 : m_translation{Translation2<T>{std::move(x), std::move(y)}},
39 m_rotation{std::move(rotation)} {}
40
44 template <typename U>
45 constexpr explicit Pose2(const Pose2<U>& other)
46 : m_translation{other.translation()}, m_rotation{other.rotation()} {}
47
51 constexpr const Translation2<T>& translation() const { return m_translation; }
52
56 constexpr const T& x() const { return m_translation.x(); }
57
61 constexpr const T& y() const { return m_translation.y(); }
62
66 constexpr const Rotation2<T>& rotation() const { return m_rotation; }
67
72 constexpr Pose2<T> rotate_by(const Rotation2<T>& rotation) const {
73 return {m_translation.rotate_by(rotation), m_rotation.rotate_by(rotation)};
74 }
75
76 private:
77 Translation2<T> m_translation;
78 Rotation2<T> m_rotation;
79};
80
81using Pose2d = Pose2<double>;
82
83template <typename Scalar>
84using Pose2v = Pose2<slp::Variable<Scalar>>;
85
86template <typename LHS, typename RHS>
87 requires slp::SleipnirType<LHS> && (!slp::SleipnirType<RHS>)
88auto operator==(const Pose2<LHS>& lhs, const Pose2<RHS>& rhs) {
89 using Scalar = typename std::decay_t<LHS>::Scalar;
90
91 return slp::EqualityConstraints<Scalar>{
92 {lhs.translation() == rhs.translation(),
93 lhs.rotation() == rhs.rotation()}};
94}
95
96template <typename LHS, typename RHS>
97 requires(!slp::SleipnirType<LHS>) && slp::SleipnirType<RHS>
98auto operator==(const Pose2<LHS>& lhs, const Pose2<RHS>& rhs) {
99 using Scalar = typename std::decay_t<RHS>::Scalar;
100
101 return slp::EqualityConstraints<Scalar>{
102 {lhs.translation() == rhs.translation(),
103 lhs.rotation() == rhs.rotation()}};
104}
105
106template <typename LHS, typename RHS>
107 requires slp::SleipnirType<LHS> && slp::SleipnirType<RHS>
108auto operator==(const Pose2<LHS>& lhs, const Pose2<RHS>& rhs) {
109 using Scalar = typename std::decay_t<LHS>::Scalar;
110
111 return slp::EqualityConstraints<Scalar>{
112 {lhs.translation() == rhs.translation(),
113 lhs.rotation() == rhs.rotation()}};
114}
115
116} // namespace trajopt
constexpr const Rotation2< double > & rotation() const
Definition pose2.hpp:66
constexpr const double & x() const
Definition pose2.hpp:56
constexpr Pose2< T > rotate_by(const Rotation2< T > &rotation) const
Definition pose2.hpp:72
constexpr Pose2(T x, T y, Rotation2< T > rotation)
Definition pose2.hpp:37
constexpr const double & y() const
Definition pose2.hpp:61
constexpr const Translation2< double > & translation() const
Definition pose2.hpp:51
constexpr Pose2(Translation2< T > translation, Rotation2< T > rotation)
Definition pose2.hpp:27
constexpr Pose2()=default
Constructs a pose at the origin facing toward the positive x-axis.
constexpr Pose2(const Pose2< U > &other)
Definition pose2.hpp:45
Definition rotation2.hpp:20
Represents a translation in 2D space.
Definition translation2.hpp:21