4#include <initializer_list>
7#include <frc/geometry/Translation2d.h>
8#include <units/angle.h>
9#include <units/angular_velocity.h>
10#include <units/base.h>
11#include <units/dimensionless.h>
12#include <units/length.h>
13#include <units/math.h>
14#include <units/time.h>
15#include <units/velocity.h>
17#include "frc/geometry/Pose2d.h"
18#include "frc/geometry/Pose3d.h"
19#include "frc/geometry/Rotation2d.h"
20#include "frc/geometry/Transform2d.h"
21#include "frc/geometry/Transform3d.h"
22#include "frc/geometry/Translation3d.h"
47 using NamedPhysicalVector::NamedPhysicalVector;
55 explicit Translation2d(frc::Translation2d frcTranslation) : Translation2d(frcTranslation.X(), frcTranslation.Y()) {};
61 explicit Translation2d(frc::Translation3d frcTranslation) : Translation2d(frcTranslation.X(), frcTranslation.Y()) {};
81 units::meter_t
Distance(
const Translation2d& other)
const {
return (*
this - other).Norm(); }
93 EigenUnit::VectorN<units::dimensionless::scalar, 2>>> {
95 EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::dimensionless::scalar, 2>, EigenUnit::VectorN<units::dimensionless::scalar, 2>>;
98 using NamedPhysicalMatrix::NamedPhysicalMatrix;
100 Rotation2d(
const BaseMatrix& b) : NamedPhysicalMatrix(b) {}
116 template <class AngleUnit, std::enable_if_t<units::traits::is_angle_unit<AngleUnit>::value,
int> = 0>
117 Rotation2d(units::unit_t<AngleUnit> theta) : Rotation2d(units::radian_t{theta}) {}
120 : NamedPhysicalMatrix(BaseMatrix::FromRows(
121 EigenUnit::VectorN<units::dimensionless::scalar, 2>{units::math::cos(theta), -units::math::sin(theta)},
122 EigenUnit::VectorN<units::dimensionless::scalar, 2>{units::math::sin(theta), units::math::cos(theta)})) {}
128 explicit Rotation2d(frc::Rotation2d frcRotation) : Rotation2d(frcRotation.Radians()) {};
135 explicit Rotation2d(frc::Rotation3d frcRotation) : Rotation2d(frcRotation.Z()) {};
144 units::radian_t
GetAngle()
const {
return units::math::atan2(Get<1, 0>(), Get<0, 0>()); }
153 static Rotation2d
Exp(units::radian_t theta) {
return Rotation2d(theta); }
168 using UnitVector::UnitVector;
183 using BaseMatrix = EigenUnit::PhysicalMatrix<HomogeneousVector2d, HomogeneousVector2d>;
186 using NamedPhysicalMatrix::NamedPhysicalMatrix;
188 Transform2d(
const BaseMatrix& b) : NamedPhysicalMatrix(b) {}
196 : NamedPhysicalMatrix{
197 BaseMatrix::FromBlocks(
199 EigenUnit::UnitMatrix<
std::tuple<units::meter, units::meter>,
std::tuple<units::dimensionless::scalar>>::FromCols(
201 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
std::tuple<units::meter, units::meter>>::Zero(),
202 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
std::tuple<units::dimensionless::scalar>>::
Identity()),
216 explicit Transform2d(frc::Transform2d frcTransform) : Transform2d(frcTransform.Translation(), frcTransform.Rotation()) {};
221 inline Translation2d Translation()
const {
return this->TopRight<2, 1>().Col<0>(); }
223 inline Rotation2d Rotation()
const {
return this->TopLeft<2, 2>(); }
229 auto invR = Rotation().
Inverse();
231 return Transform2d(invT, invR);
235 Transform2d
operator*(
double scalar)
const {
return Transform2d(Translation() * scalar,
Rotation2d(Rotation().GetAngle() * scalar)); }
246 using BaseMatrix = EigenUnit::PhysicalMatrix<HomogeneousVector2d, HomogeneousVector2d>;
249 using NamedPhysicalMatrix::NamedPhysicalMatrix;
251 Pose2d(
const BaseMatrix& b) : NamedPhysicalMatrix(b) {}
262 : NamedPhysicalMatrix{
263 BaseMatrix::FromBlocks(
265 EigenUnit::UnitMatrix<
std::tuple<units::meter, units::meter>,
std::tuple<units::dimensionless::scalar>>::FromCols(
267 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
std::tuple<units::meter, units::meter>>::Zero(),
268 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
std::tuple<units::dimensionless::scalar>>::Identity()),
282 explicit Pose2d(frc::Pose2d frcPose) : Pose2d(frcPose.Translation(), frcPose.Rotation()) {};
297 inline Translation2d Translation()
const {
return this->TopRight<2, 1>().Col<0>(); }
299 inline Rotation2d Rotation()
const {
return this->TopLeft<2, 2>(); }
301 inline units::meter_t X()
const {
return Translation().X(); }
303 inline units::meter_t Y()
const {
return Translation().Y(); }
317 inline Pose2d
RelativeTo(
const Pose2d& other)
const {
return Pose2d(other.Inverse() * (*
this)); }
334 return Pose2d(newTrans,
Rotation2d(rot * Rotation()));
342 Pose2d
Nearest(std::initializer_list<Pose2d> poses)
const {
343 Pose2d best = *poses.begin();
344 units::meter_t bestDist = Translation().Distance(best.Translation());
346 units::meter_t d = Translation().Distance(p.Translation());
361 return Transform2d(rel.Translation(), rel.Rotation());
365 Pose2d
operator*(
double scalar)
const {
return Pose2d(Translation() * scalar,
Rotation2d(Rotation().GetAngle() * scalar)); }
368 Pose2d
operator/(
double scalar)
const {
return (*
this) * (1.0 / scalar); }
373 static Pose2d
Exp(Twist2d twist) {
374 units::radian_t theta = twist.
Get<2>();
377 if (units::math::abs(theta) < 1e-9_rad) {
381 using VMatrix = EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::meter, 2>, EigenUnit::VectorN<units::meter, 2>>;
383 units::scalar_t s_over_t = units::math::sin(theta) * 1_rad / theta;
384 units::scalar_t c_over_t = (units::scalar_t{1.0} - units::math::cos(theta)) * 1_rad / theta;
386 VMatrix V = VMatrix::FromElems(s_over_t, -c_over_t, c_over_t, s_over_t);
393 units::radian_t theta = Rotation().GetAngle();
395 if (units::math::abs(theta) < 1e-9_rad) {
397 return {t.X(), t.Y(), 0_rad};
400 using VInvMatrix = EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::meter, 2>, EigenUnit::VectorN<units::meter, 2>>;
402 units::scalar_t a = (theta * units::math::sin(theta)) / (2.0_rad * (units::scalar_t{1.0} - units::math::cos(theta)));
403 units::scalar_t b = theta / 2.0_rad;
405 VInvMatrix V_inv = VInvMatrix::FromElems(a, b, -b, a);
407 auto trans = V_inv * Translation();
408 return {trans.X(), trans.Y(), theta};
422 using NamedPhysicalVector::NamedPhysicalVector;
444 explicit Translation3d(frc::Translation3d frcTrans) : Translation3d(frcTrans.
X(), frcTrans.
Y(), frcTrans.
Z()) {};
450 explicit Translation3d(frc::Translation2d frcTrans) : Translation3d(frcTrans.
X(), frcTrans.
Y(), 0_m) {};
470 units::meter_t
Distance(
const Translation3d& other)
const {
return (*
this - other).Norm(); }
492 EigenUnit::VectorN<units::dimensionless::scalar, 3>>> {
494 EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::dimensionless::scalar, 3>, EigenUnit::VectorN<units::dimensionless::scalar, 3>>;
497 using NamedPhysicalMatrix::NamedPhysicalMatrix;
499 Rotation3d(
const BaseMatrix& b) : NamedPhysicalMatrix(b) {}
501 Rotation3d(units::radian_t pitch, units::radian_t roll, units::radian_t yaw)
503 BaseMatrix::FromRows(
504 EigenUnit::VectorN<units::dimensionless::scalar, 3>{units::math::cos(pitch), 0, units::math::sin(pitch)},
505 EigenUnit::VectorN<units::dimensionless::scalar, 3>{0, 1, 0},
506 EigenUnit::VectorN<units::dimensionless::scalar, 3>{-units::math::sin(pitch), 0, units::math::cos(pitch)}),
507 BaseMatrix::FromRows(
508 EigenUnit::VectorN<units::dimensionless::scalar, 3>{1, 0, 0},
509 EigenUnit::VectorN<units::dimensionless::scalar, 3>{0, units::math::cos(roll), -units::math::sin(roll)},
510 EigenUnit::VectorN<units::dimensionless::scalar, 3>{0, units::math::sin(roll), units::math::cos(roll)}),
511 BaseMatrix::FromRows(EigenUnit::VectorN<units::dimensionless::scalar, 3>{units::math::cos(yaw), -units::math::sin(yaw), 0},
512 EigenUnit::VectorN<units::dimensionless::scalar, 3>{units::math::sin(yaw), units::math::cos(yaw), 0},
513 EigenUnit::VectorN<units::dimensionless::scalar, 3>{0, 0, 1}),
531 explicit Rotation3d(frc::Rotation3d frcRot) : Rotation3d(frcRot.Y(), frcRot.X(), frcRot.Z()) {};
538 explicit Rotation3d(frc::Rotation2d frcRot) : Rotation3d(0_rad, 0_rad, frcRot.Radians()) {};
544 static Rotation3d
Exp(EigenUnit::VectorN<units::radian, 3> w) {
545 units::radian_t theta = w.Norm();
546 if (theta < 1e-9_rad) {
549 EigenUnit::VectorN<units::dimensionless::scalar, 3> axis = w / theta;
550 BaseMatrix K = EigenUnit::VectorN<units::dimensionless::scalar, 3>::Skew(axis);
551 auto R = BaseMatrix::Identity() + units::math::sin(theta) * K + (1.0 - units::math::cos(theta)) * (K * K);
552 return Rotation3d(R);
556 EigenUnit::VectorN<units::radian, 3>
Log()
const {
557 units::dimensionless::scalar_t cos_theta = (this->Trace() - 1.0) / 2.0;
558 cos_theta = units::dimensionless::scalar_t{std::clamp(cos_theta.value(), -1.0, 1.0)};
559 units::radian_t theta = units::math::acos(cos_theta);
560 if (theta < 1e-9_rad) {
561 return EigenUnit::VectorN<units::radian, 3>::Zero();
563 BaseMatrix K = ((*this) - this->Transpose()) / (2.0 * units::math::sin(theta));
564 return EigenUnit::VectorN<units::radian, 3>{
565 K.Get<2, 1>() * theta,
566 K.Get<0, 2>() * theta,
567 K.Get<1, 0>() * theta,
573 return Rotation3d((*
this) *
Rotation3d::Exp(Rotation3d(other * this->Inverse()).
Log() * t));
576 units::radian_t Pitch()
const {
return units::math::asin(-Get<2, 0>()); }
578 units::radian_t Roll()
const {
return units::math::atan2(Get<2, 1>(), Get<2, 2>()); }
580 units::radian_t Yaw()
const {
return units::math::atan2(Get<1, 0>(), Get<0, 0>()); }
584 EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::dimensionless::scalar, 3>, EigenUnit::VectorN<units::dimensionless::scalar, 3>>
586 EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::dimensionless::scalar, 3>, EigenUnit::VectorN<units::dimensionless::scalar, 3>>
588 EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::dimensionless::scalar, 3>, EigenUnit::VectorN<units::dimensionless::scalar, 3>>
590 : NamedPhysicalMatrix{y * p * r}, pitchMatrix(p), rollMatrix(r), yawMatrix(y) {}
592 EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::dimensionless::scalar, 3>, EigenUnit::VectorN<units::dimensionless::scalar, 3>>
593 pitchMatrix, rollMatrix, yawMatrix;
597 return rot * (*this);
600inline Translation2d::Translation2d(
const Translation3d& t) : Translation2d(t.X(), t.Y()) {}
602inline Rotation2d::Rotation2d(
const Rotation3d& rot) : Rotation2d(rot.Yaw()) {}
609 using UnitVector::UnitVector;
623 using BaseMatrix = EigenUnit::PhysicalMatrix<HomogeneousVector3d, HomogeneousVector3d>;
626 using NamedPhysicalMatrix::NamedPhysicalMatrix;
628 Transform3d(
const BaseMatrix& b) : NamedPhysicalMatrix(b) {}
636 : NamedPhysicalMatrix{
639 EigenUnit::UnitMatrix<
std::tuple<units::meter, units::meter, units::meter>,
640 std::tuple<units::dimensionless::scalar>>::FromCols(trans),
641 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
642 std::tuple<units::meter, units::meter, units::meter>>::Zero(),
643 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
std::tuple<units::dimensionless::scalar>>::
Identity()),
663 explicit Transform3d(frc::Transform3d frcTransform) : Transform3d(frcTransform.Translation(), frcTransform.Rotation()) {};
676 inline Translation3d Translation()
const {
return this->TopRight<3, 1>().Col<0>(); }
678 inline Rotation3d Rotation()
const {
return this->TopLeft<3, 3>(); }
684 return Transform3d(invT, invR);
696 using BaseMatrix = EigenUnit::PhysicalMatrix<HomogeneousVector3d, HomogeneousVector3d>;
699 using NamedPhysicalMatrix::NamedPhysicalMatrix;
701 Pose3d(
const BaseMatrix& b) : NamedPhysicalMatrix(b) {}
713 : NamedPhysicalMatrix{
716 EigenUnit::UnitMatrix<
std::tuple<units::meter, units::meter, units::meter>,
717 std::tuple<units::dimensionless::scalar>>::FromCols(trans),
718 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
719 std::tuple<units::meter, units::meter, units::meter>>::Zero(),
720 EigenUnit::UnitMatrix<
std::tuple<units::dimensionless::scalar>,
std::tuple<units::dimensionless::scalar>>::Identity()),
740 explicit Pose3d(frc::Pose3d frcPose) : Pose3d(frcPose.Translation(), frcPose.Rotation()) {};
749 inline Translation3d Translation()
const {
return this->TopRight<3, 1>().Col<0>(); }
751 inline Rotation3d Rotation()
const {
return this->TopLeft<3, 3>(); }
753 inline units::meter_t X()
const {
return Translation().
X(); }
755 inline units::meter_t Y()
const {
return Translation().Y(); }
757 inline units::meter_t Z()
const {
return Translation().Z(); }
777 inline Pose3d
RelativeTo(
const Pose3d& other)
const {
return Pose3d{other.Inverse() * (*this)}; }
794 return Pose3d{newTrans,
Rotation3d{rot * Rotation()}};
802 Pose3d
Nearest(std::initializer_list<Pose3d> poses)
const {
803 Pose3d best = *poses.begin();
804 units::meter_t bestDist = Translation().Distance(best.Translation());
806 units::meter_t d = Translation().Distance(p.Translation());
821 return Transform3d{rel.Translation(), rel.Rotation()};
825 Pose3d
operator*(
double scalar)
const {
return Pose3d(Translation() * scalar, Rotation() * scalar); }
828 Pose3d
operator/(
double scalar)
const {
return (*
this) * (1.0 / scalar); }
833 static Pose3d
Exp(Twist3d twist) {
834 auto w = twist.
Tail<3>();
835 units::radian_t theta = w.Norm();
836 auto v = twist.
Head<3>();
838 if (theta < 1e-9_rad) {
842 double s = units::math::sin(theta).value();
843 double c = units::math::cos(theta).value();
844 double t = theta.value();
846 using VMatrix = EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::meter, 3>, EigenUnit::VectorN<units::meter, 3>>;
847 VMatrix K{EigenUnit::VectorN<units::dimensionless::scalar, 3>::Skew(w / theta).Raw()};
849 VMatrix V = VMatrix::Identity() + ((1.0 - c) / t) * K + ((t - s) / t) * (K * K);
856 valor::EigenUnit::VectorN<units::radian, 3> w = Rotation().Log();
857 units::radian_t theta = w.
Norm();
860 if (theta < 1e-9_rad) {
862 T.
X(), T.
Y(), T.
Z(), 0_rad, 0_rad, 0_rad,
866 double s = units::math::sin(theta).value();
867 double c = units::math::cos(theta).value();
868 double t = theta.value();
870 using VInvMatrix = EigenUnit::PhysicalMatrix<EigenUnit::VectorN<units::meter, 3>, EigenUnit::VectorN<units::meter, 3>>;
871 VInvMatrix K{EigenUnit::VectorN<units::dimensionless::scalar, 3>::Skew(w / theta).Raw()};
873 VInvMatrix V_inv = VInvMatrix::Identity() - (t / 2.0) * K + (1.0 - (t * s) / (2.0 * (1.0 - c))) * (K * K);
876 return {v.
X(), v.
Y(), v.
Z(), w.X(), w.Y(), w.Z()};
887 return Translation3d{rot * (*this)};
890inline Translation3d::Translation3d(units::meter_t distance,
const Rotation3d& direction)
892 distance * units::math::cos(direction.Pitch()) * units::math::cos(direction.Yaw()),
893 distance * units::math::cos(direction.Pitch()) * units::math::sin(direction.Yaw()),
894 distance * units::math::sin(direction.Pitch()),
Provides a unit-safe wrapper for Eigen matrices and vectors.
A vector wrapper that enforces units for each element.
Definition UnitVector.h:22
auto Norm() const
Computes the L2 norm (magnitude). Requires all elements to have the same unit tag.
Definition UnitVector.h:143
constexpr auto Get() const
Get the value of the N-th element with its unit.
Definition UnitVector.h:118
constexpr auto Head() const
Extract the first N elements as a new UnitVector.
Definition UnitVector.h:182
constexpr auto Tail() const
Extract the last N elements as a new UnitVector.
Definition UnitVector.h:193
constexpr auto Y() const
Definition UnitVector.h:438
constexpr const StorageType & Raw() const
Definition UnitVector.h:103
constexpr auto X() const
Definition UnitVector.h:424
constexpr auto Z() const
Definition UnitVector.h:452
Represents a 2D homogeneous transformation vector (x, y, 1).
Definition Pose.h:166
Represents a 3D homogeneous transformation vector (x, y, z, 1).
Definition Pose.h:607
Represents a 2D pose as a 3x3 homogeneous transformation matrix.
Definition Pose.h:245
Pose2d RelativeTo(const Pose2d &other) const
Express this pose relative to another pose.
Definition Pose.h:317
Pose2d(frc::Pose2d frcPose)
Construct a Pose2d from an frc::Pose2d.
Definition Pose.h:282
Pose2d operator*(double scalar) const
Scalar multiplication of both translation and rotation.
Definition Pose.h:365
Pose2d(frc::Translation2d frcTrans, frc::Rotation2d frcRot)
Construct a Pose2d from an frc::Translation2d and frc::Rotation2d.
Definition Pose.h:276
Pose2d RotateAround(const Translation2d &point, const Rotation2d &rot) const
Rotate this pose around an arbitrary point.
Definition Pose.h:332
static Pose2d Exp(Twist2d twist)
Exponential map: se(2) -> SE(2).
Definition Pose.h:373
Transform2d operator-(const Pose2d &other) const
operator- returns the Transform2d mapping other -> this.
Definition Pose.h:359
Pose2d operator/(double scalar) const
Scalar division.
Definition Pose.h:368
Pose2d RotateBy(const Rotation2d &rot) const
Rotate this pose around the global origin.
Definition Pose.h:324
Pose2d operator+(const Transform2d &transform) const
operator+ applies a Transform2d.
Definition Pose.h:356
Pose2d Nearest(std::initializer_list< Pose2d > poses) const
Find the nearest pose from a collection.
Definition Pose.h:342
Pose2d TransformBy(const Transform2d &transform) const
Apply a Transform2d in this pose's frame.
Definition Pose.h:310
Twist2d Log() const
Logarithm map: SE(2) -> se(2).
Definition Pose.h:392
Pose2d(Translation2d trans, Rotation2d rot)
Construct a Pose2d from a translation and rotation.
Definition Pose.h:261
Pose2d(frc::Pose3d frcPose)
Construct a Pose2d from an frc::Pose3d by projecting onto the X-Y plane. Z, pitch,...
Definition Pose.h:289
Represents a 3D pose as a 4x4 homogeneous transformation matrix.
Definition Pose.h:695
Pose3d(frc::Pose3d frcPose)
Construct a Pose3d from an frc::Pose3d.
Definition Pose.h:740
Pose3d RotateAround(const Translation3d &point, const Rotation3d &rot) const
Rotate this pose around an arbitrary point in 3D space.
Definition Pose.h:792
Pose3d operator*(double scalar) const
Scalar multiplication of both translation and rotation.
Definition Pose.h:825
Pose3d(frc::Pose2d frcPose)
Construct a Pose3d from an frc::Pose2d, lifting into 3D. Z is set to zero and pitch and roll are set ...
Definition Pose.h:747
Pose3d(frc::Translation3d frcTrans, frc::Rotation3d frcRot)
Construct a Pose3d from an frc::Translation3d and frc::Rotation3d.
Definition Pose.h:734
static Pose3d Exp(Twist3d twist)
Exponential map: se(3) -> SE(3).
Definition Pose.h:833
Pose3d operator+(const Transform3d &transform) const
operator+ applies a Transform3d.
Definition Pose.h:816
Pose3d(const Pose2d &pose)
Construct a Pose3d from a Pose2d in the X-Y plane.
Definition Pose.h:727
Pose3d TransformBy(const Transform3d &transform) const
Apply a Transform3d in this pose's frame.
Definition Pose.h:770
Pose3d RotateBy(const Rotation3d &rot) const
Rotate this pose around the global origin.
Definition Pose.h:784
Pose3d operator/(double scalar) const
Scalar division.
Definition Pose.h:828
Pose3d(Translation3d trans, Rotation3d rot)
Construct a Pose3d from a translation and rotation.
Definition Pose.h:712
Transform3d operator-(const Pose3d &other) const
operator- returns the Transform3d mapping other -> this.
Definition Pose.h:819
Pose2d ToPose2d() const
Project this pose onto the X-Y plane.
Definition Pose.h:763
Pose3d Nearest(std::initializer_list< Pose3d > poses) const
Find the nearest pose from a collection.
Definition Pose.h:802
Pose3d RelativeTo(const Pose3d &other) const
Express this pose relative to another pose.
Definition Pose.h:777
Twist3d Log() const
Logarithm map: SE(3) -> se(3).
Definition Pose.h:855
Represents a 2D rotation matrix (2x2).
Definition Pose.h:93
Rotation2d operator*(double scalar) const
Scalar multiplication of the angle.
Definition Pose.h:150
units::radian_t GetAngle() const
Get the rotation angle.
Definition Pose.h:144
Rotation2d(units::unit_t< AngleUnit > theta)
Construct a Rotation2d from any angle unit (degrees, radians, etc.).
Definition Pose.h:117
Rotation2d operator-() const
Unary negation — inverse rotation.
Definition Pose.h:147
static Rotation2d Exp(units::radian_t theta)
Exponential map: so(2) -> SO(2).
Definition Pose.h:153
Rotation2d(frc::Rotation2d frcRotation)
Construct a Rotation2d from an frc::Rotation2d.
Definition Pose.h:128
Rotation2d(frc::Rotation3d frcRotation)
Construct a Rotation2d from an frc::Rotation3d by extracting the yaw. Pitch and roll components are d...
Definition Pose.h:135
units::radian_t Log() const
Logarithm map: SO(2) -> so(2).
Definition Pose.h:156
Represents a 3D rotation matrix (3x3).
Definition Pose.h:492
Rotation3d operator*(double scalar) const
Scalar multiplication of the rotation axis-angle.
Definition Pose.h:541
Rotation3d(frc::Rotation2d frcRot)
Construct a Rotation3d from an frc::Rotation2d as a pure yaw rotation. Pitch and roll are set to zero...
Definition Pose.h:538
Rotation3d(const Rotation2d &rot)
Construct a Rotation3d from a Rotation2d (rotation about Z).
Definition Pose.h:520
Rotation3d Interpolate(const Rotation3d &other, double t) const
Spherical Linear Interpolation (SLERP).
Definition Pose.h:572
static Rotation3d Exp(EigenUnit::VectorN< units::radian, 3 > w)
Exponential map: so(3) -> SO(3) using Rodrigues' formula.
Definition Pose.h:544
EigenUnit::VectorN< units::radian, 3 > Log() const
Logarithm map: SO(3) -> so(3).
Definition Pose.h:556
Rotation3d(frc::Rotation3d frcRot)
Construct a Rotation3d from an frc::Rotation3d.
Definition Pose.h:531
Represents a 2D translation vector (x, y).
Definition Pose.h:45
Translation2d(frc::Translation3d frcTranslation)
Construct a 2D translation from an frc::Translation3d by dropping Z.
Definition Pose.h:61
units::meter_t Distance(const Translation2d &other) const
Distance from this translation to another.
Definition Pose.h:81
Translation2d RotateBy(const Rotation2d &rot) const
Rotate this translation by a Rotation2d.
Definition Pose.h:596
Translation2d(frc::Translation2d frcTranslation)
Construct a 2D translation from an frc::Translation2d.
Definition Pose.h:55
Represents a 3D translation vector (x, y, z).
Definition Pose.h:420
Translation3d(const Translation2d &t)
Construct a 3D translation from a 2D translation (z = 0).
Definition Pose.h:430
Translation2d ToTranslation2d() const
Project this translation onto the X-Y plane.
Definition Pose.h:456
Translation3d RotateBy(const Rotation3d &rot) const
Rotate this translation by a Rotation3d.
Definition Pose.h:886
Translation3d operator/(double scalar) const
Scalar division.
Definition Pose.h:478
Translation3d(frc::Translation3d frcTrans)
Construct a 3D translation from an frc::Translation3d.
Definition Pose.h:444
units::meter_t Distance(const Translation3d &other) const
Distance from this translation to another.
Definition Pose.h:470
Translation3d(frc::Translation2d frcTrans)
Construct a 3D translation from an frc::Translation2d, setting Z to zero.
Definition Pose.h:450
Translation3d operator*(double scalar) const
Scalar multiplication.
Definition Pose.h:473
Template specializations for std::tuple_size and std::tuple_element to support UnitVector.
Definition Formatters.h:8
Definition UnitMatrix.h:600
Definition UnitVector.h:675