Chassis v2.1.1
Chassisはロボコンでの足回り制御を行うためのC++ライブラリである。
Loading...
Searching...
No Matches
CoordinateUnit.h
Go to the documentation of this file.
1#ifndef COORDINATE_UNIT_H_
2#define COORDINATE_UNIT_H_
7#include <chrono>
8#include <cmath>
9
10#include "bits/float_cmp.h"
11
12namespace rct {
13
16
20
27template<int N>
29 float x_milli;
30 float y_milli;
31 float ang_rad;
32
35 static constexpr auto dimension() noexcept {
36 return N;
37 }
38
42 this->x_milli += obj.x_milli;
43 this->y_milli += obj.y_milli;
44 this->ang_rad += obj.ang_rad;
45 return *this;
46 }
48 this->x_milli -= obj.x_milli;
49 this->y_milli -= obj.y_milli;
50 this->ang_rad -= obj.ang_rad;
51 return *this;
52 }
53 CoordinateUnit& operator*=(const float obj) noexcept {
54 this->x_milli *= obj;
55 this->y_milli *= obj;
56 this->ang_rad *= obj;
57 return *this;
58 }
59 CoordinateUnit& operator/=(const float obj) noexcept {
60 this->x_milli /= obj;
61 this->y_milli /= obj;
62 this->ang_rad /= obj;
63 return *this;
64 }
66};
67
72
78template<int M, int N>
80 return *reinterpret_cast<const CoordinateUnit<M>*>(&obj);
81}
82
86constexpr float distance(const Coordinate& p1, const Coordinate& p2) {
87 return std::hypot(p1.x_milli - p2.x_milli, p1.y_milli - p2.y_milli);
88}
89
97template<class T>
98constexpr T lerp(const T& a, const T& b, float t) noexcept {
99 return a + t * (b - a);
100}
101
105template<int N>
106CoordinateUnit<N> operator+(const CoordinateUnit<N>& lhs, const CoordinateUnit<N>& rhs) {
107 CoordinateUnit<N> nrv{lhs};
108 nrv += rhs;
109 return nrv;
110};
111template<int N>
112CoordinateUnit<N> operator-(const CoordinateUnit<N>& lhs, const CoordinateUnit<N>& rhs) {
113 CoordinateUnit<N> nrv{lhs};
114 nrv -= rhs;
115 return nrv;
116};
117template<int N>
118CoordinateUnit<N> operator*(const CoordinateUnit<N>& lhs, const float rhs) {
119 auto nrv{lhs};
120 nrv *= rhs;
121 return nrv;
122};
123template<int N>
124CoordinateUnit<N> operator*(const float lhs, const CoordinateUnit<N>& rhs) {
125 return rhs * lhs;
126};
127template<int N>
128CoordinateUnit<N> operator/(const CoordinateUnit<N>& lhs, const float rhs) {
129 auto nrv{lhs};
130 nrv /= rhs;
131 return nrv;
132};
133template<int N>
134CoordinateUnit<N + 1> operator*(const CoordinateUnit<N>& obj, const std::chrono::microseconds& sec) {
135 return unit_cast<N + 1>(obj * sec.count() * 1e-6);
136}
137template<int N>
138CoordinateUnit<N + 1> operator*(const std::chrono::microseconds& sec, const CoordinateUnit<N>& obj) {
139 return obj * sec;
140}
141template<int N>
142CoordinateUnit<N - 1> operator/(const CoordinateUnit<N>& obj, const std::chrono::microseconds& sec) {
143 return unit_cast<N - 1>(obj / sec.count() * 1e6);
144}
145template<int N>
146bool operator==(const CoordinateUnit<N>& lhs, const CoordinateUnit<N>& rhs) {
147 return impl::float_cmp(lhs.x_milli, rhs.x_milli) == 0 && impl::float_cmp(lhs.y_milli, rhs.y_milli) == 0 &&
148 impl::float_cmp(lhs.ang_rad, rhs.ang_rad) == 0;
149}
150template<int N>
151bool operator!=(const CoordinateUnit<N>& lhs, const CoordinateUnit<N>& rhs) {
152 return !(lhs == rhs);
153}
155
157
159
160} // namespace rct
161
162#endif // COORDINATE_UNIT_H_
constexpr T lerp(const T &a, const T &b, float t) noexcept
二点aとbの間を、時間tで線形補間 (linear interpolate) する。
constexpr float distance(const Coordinate &p1, const Coordinate &p2)
2つの座標間の距離を計算する。
CoordinateUnit< M > unit_cast(const CoordinateUnit< N > &obj)
CoordinateUnitをCoordinateUnitにキャストする。
robot control library
Definition Chassis.h:16
座標、速度を示す構造体。 rct::Coordinate, rct::Velocity
float x_milli
x変位[mm]
CoordinateUnit & operator+=(const CoordinateUnit &obj) noexcept
各種演算子を定義する。
CoordinateUnit & operator/=(const float obj) noexcept
各種演算子を定義する。
float y_milli
y変位[mm]
float ang_rad
角変位[rad]
CoordinateUnit & operator*=(const float obj) noexcept
各種演算子を定義する。
CoordinateUnit & operator-=(const CoordinateUnit &obj) noexcept
各種演算子を定義する。
static constexpr auto dimension() noexcept
時間の次元を取得する。
N輪オムニの制御を行うクラス。
Definition Omni.h:25