YAMS
Yet Another Mechanism System
Loading...
Searching...
No Matches
MechanismPositionConfig.hpp
Go to the documentation of this file.
1// Copyright (c) 2026 Yet Another Software Suite
2// SPDX-License-Identifier: LGPL-3.0-or-later
3
4#pragma once
5
6#include <cmath>
7#include <functional>
8#include <optional>
9#include <utility>
10
11#include <wpi/math/geometry/Pose3d.hpp>
12#include <wpi/math/geometry/Rotation3d.hpp>
13#include <wpi/math/geometry/Transform3d.hpp>
14#include <wpi/math/geometry/Translation3d.hpp>
15#include <wpi/units/angle.hpp>
16#include <wpi/units/length.hpp>
17
19
32 public:
34 enum class Plane {
36 XZ,
38 YZ,
40 XY
41 };
42
44
51 MechanismPositionConfig& WithRelativePosition(const wpi::math::Translation3d& robotToMechanism) {
52 m_robotToMechanism = robotToMechanism;
53 return *this;
54 }
55
64 MechanismPositionConfig& WithRelativePosition(const wpi::math::Transform3d& robotToMechanism) {
65 m_robotToMechanism = robotToMechanism.Translation();
66 m_mountRotation = robotToMechanism.Rotation();
67 return *this;
68 }
69
77 m_plane = plane;
78 return *this;
79 }
80
88 MechanismPositionConfig& WithParent(std::function<wpi::math::Pose3d()> parentPose) {
89 m_parent = std::move(parentPose);
90 return *this;
91 }
92
94 std::optional<wpi::math::Translation3d> GetRelativePosition() const { return m_robotToMechanism; }
95
97 Plane GetMovementPlane() const { return m_plane; }
98
103 wpi::math::Pose3d GetMountPose() const {
104 wpi::math::Pose3d base = m_parent ? m_parent() : wpi::math::Pose3d{};
105 return base.TransformBy(wpi::math::Transform3d{m_robotToMechanism.value_or(wpi::math::Translation3d{}),
106 m_mountRotation});
107 }
108
117 wpi::math::Pose3d GetRotatedPose(wpi::units::radian_t angle) const {
118 return GetMountPose().TransformBy(
119 wpi::math::Transform3d{wpi::math::Translation3d{}, RotationInPlane(angle)});
120 }
121
130 wpi::math::Pose3d GetTranslatedPose(wpi::units::meter_t distance, wpi::units::radian_t angle) const {
131 const wpi::units::meter_t along = distance * std::cos(angle.value());
132 const wpi::units::meter_t across = distance * std::sin(angle.value());
133 wpi::math::Translation3d slide;
134 switch (m_plane) {
135 case Plane::XZ:
136 slide = wpi::math::Translation3d{along, wpi::units::meter_t{0}, across};
137 break;
138 case Plane::YZ:
139 slide = wpi::math::Translation3d{wpi::units::meter_t{0}, along, across};
140 break;
141 case Plane::XY:
142 slide = wpi::math::Translation3d{along, across, wpi::units::meter_t{0}};
143 break;
144 }
145 return GetMountPose().TransformBy(wpi::math::Transform3d{slide, wpi::math::Rotation3d{}});
146 }
147
154 wpi::math::Rotation3d RotationInPlane(wpi::units::radian_t angle) const {
155 switch (m_plane) {
156 case Plane::YZ:
157 // +Y turns toward +Z: a positive roll about +X.
158 return wpi::math::Rotation3d{angle, wpi::units::radian_t{0}, wpi::units::radian_t{0}};
159 case Plane::XY:
160 // +X turns toward +Y: a positive yaw about +Z.
161 return wpi::math::Rotation3d{wpi::units::radian_t{0}, wpi::units::radian_t{0}, angle};
162 case Plane::XZ:
163 default:
164 // +X turns toward +Z: a negative pitch about +Y.
165 return wpi::math::Rotation3d{wpi::units::radian_t{0}, -angle, wpi::units::radian_t{0}};
166 }
167 }
168
169 private:
170 std::optional<wpi::math::Translation3d> m_robotToMechanism;
171 wpi::math::Rotation3d m_mountRotation;
172 Plane m_plane{Plane::XZ};
173 std::function<wpi::math::Pose3d()> m_parent;
174};
175
176} // namespace yams::mechanisms::config
Definition MechanismPositionConfig.hpp:31
std::optional< wpi::math::Translation3d > GetRelativePosition() const
Definition MechanismPositionConfig.hpp:94
wpi::math::Pose3d GetMountPose() const
Definition MechanismPositionConfig.hpp:103
wpi::math::Pose3d GetTranslatedPose(wpi::units::meter_t distance, wpi::units::radian_t angle) const
Definition MechanismPositionConfig.hpp:130
MechanismPositionConfig & WithRelativePosition(const wpi::math::Translation3d &robotToMechanism)
Definition MechanismPositionConfig.hpp:51
MechanismPositionConfig & WithMovementPlane(Plane plane)
Definition MechanismPositionConfig.hpp:76
wpi::math::Rotation3d RotationInPlane(wpi::units::radian_t angle) const
Definition MechanismPositionConfig.hpp:154
Plane
Definition MechanismPositionConfig.hpp:34
MechanismPositionConfig & WithRelativePosition(const wpi::math::Transform3d &robotToMechanism)
Definition MechanismPositionConfig.hpp:64
wpi::math::Pose3d GetRotatedPose(wpi::units::radian_t angle) const
Definition MechanismPositionConfig.hpp:117
MechanismPositionConfig & WithParent(std::function< wpi::math::Pose3d()> parentPose)
Definition MechanismPositionConfig.hpp:88
Plane GetMovementPlane() const
Definition MechanismPositionConfig.hpp:97
Definition ArmConfig.hpp:17