libstp
Robotics library for Botball
Loading...
Searching...
No Matches
Pose2D.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cmath>
4#include <numbers>
5
6namespace libstp::sim
7{
8 struct Vec2
9 {
10 float x{0.0f};
11 float y{0.0f};
12 };
13
17 struct Pose2D
18 {
19 float x{0.0f};
20 float y{0.0f};
21 float theta{0.0f};
22 };
23
24 inline float normalizeAngle(float angle) noexcept
25 {
26 constexpr float kPi = std::numbers::pi_v<float>;
27 constexpr float kTwoPi = 2.0f * kPi;
28 while (angle > kPi) angle -= kTwoPi;
29 while (angle < -kPi) angle += kTwoPi;
30 return angle;
31 }
32
34 inline Pose2D applyLocalDelta(const Pose2D& pose, float dxLocal, float dyLocal, float dTheta) noexcept
35 {
36 const float c = std::cos(pose.theta);
37 const float s = std::sin(pose.theta);
38 return {
39 pose.x + dxLocal * c - dyLocal * s,
40 pose.y + dxLocal * s + dyLocal * c,
41 normalizeAngle(pose.theta + dTheta),
42 };
43 }
44
45 inline Pose2D forwardMove(const Pose2D& pose, float distanceCm) noexcept
46 {
47 return {
48 pose.x + distanceCm * std::cos(pose.theta),
49 pose.y + distanceCm * std::sin(pose.theta),
50 pose.theta,
51 };
52 }
53
54 inline Pose2D strafeMove(const Pose2D& pose, float distanceCm) noexcept
55 {
56 constexpr float kHalfPi = std::numbers::pi_v<float> / 2.0f;
57 const float perp = pose.theta + kHalfPi;
58 return {
59 pose.x + distanceCm * std::cos(perp),
60 pose.y + distanceCm * std::sin(perp),
61 pose.theta,
62 };
63 }
64
65 inline Pose2D rotate(const Pose2D& pose, float angleRad) noexcept
66 {
67 return {pose.x, pose.y, normalizeAngle(pose.theta + angleRad)};
68 }
69}
Pose2D rotate(const Pose2D &pose, float angleRad) noexcept
Definition Pose2D.hpp:65
Pose2D strafeMove(const Pose2D &pose, float distanceCm) noexcept
Definition Pose2D.hpp:54
Pose2D forwardMove(const Pose2D &pose, float distanceCm) noexcept
Definition Pose2D.hpp:45
Pose2D applyLocalDelta(const Pose2D &pose, float dxLocal, float dyLocal, float dTheta) noexcept
Apply a delta expressed in the robot's local frame (forward, left, yaw).
Definition Pose2D.hpp:34
float normalizeAngle(float angle) noexcept
Definition Pose2D.hpp:24