etrobocon2018 feat.KatLab  770af34cce41ae9c30c41303275e1add2daae0c3 (with uncommitted changes)
 全て クラス 名前空間 ファイル 関数 変数 列挙型 列挙値 フレンド マクロ定義 ページ
WheelOdometryTest.cpp
[詳解]
1 
5 #include "WheelOdometry.h"
6 #include <gtest/gtest.h>
7 
8 namespace etrobocon2018_test {
9  TEST(CoordinateTest, updateTest)
10  {
11  Coordinate coordinate;
12  coordinate.update(10.0f, 5.0f);
13  ASSERT_FLOAT_EQ(5.0f / 2.0f, coordinate.arg);
14  ASSERT_FLOAT_EQ(10.0f, coordinate.radius);
15  ASSERT_FLOAT_EQ(10.0f * std::cos(5.0f / 2.0f), coordinate.x);
16  ASSERT_FLOAT_EQ(10.0f * std::sin(5.0f / 2.0f), coordinate.y);
17  }
18 
19  TEST(CoordinateTest, updateTest2)
20  {
21  Coordinate coordinate;
22  coordinate.update(10.0f, 5.0f);
23  float radius = 10.0f + 5.0f;
24  float arg = 5.0f / 2.0f + 10.0f / 2.0f;
25  float x = 10.0f * std::cos(5.0f / 2.0f);
26  float y = 10.0f * std::sin(5.0f / 2.0f);
27  ASSERT_FLOAT_EQ(x, coordinate.x);
28  ASSERT_FLOAT_EQ(y, coordinate.y);
29 
30  coordinate.update(5.0f, 10.0f);
31  ASSERT_FLOAT_EQ(arg, coordinate.arg);
32  ASSERT_FLOAT_EQ(radius, coordinate.radius);
33  ASSERT_FLOAT_EQ(5.0f * std::cos(arg) + x, coordinate.x);
34  ASSERT_FLOAT_EQ(5.0f * std::sin(arg) + y, coordinate.y);
35  }
36 
37  TEST(CoordinateTest, resetTest)
38  {
39  Coordinate coordinate;
40  coordinate.update(10.0, 5.0);
41  coordinate.reset();
42  ASSERT_FLOAT_EQ(0.0, coordinate.arg);
43  ASSERT_FLOAT_EQ(0.0, coordinate.radius);
44  ASSERT_FLOAT_EQ(0.0, coordinate.x);
45  ASSERT_FLOAT_EQ(0.0, coordinate.y);
46  }
47 
48  TEST(WheelOdometryTest, velocityTest)
49  {
50  MotorAngle motor_angle;
51  float transform = 3.14f * 99.0f / 2.0f / 180.0f / 0.04f;
52  float angle = motor_angle.relativeAngleMean(5, 5);
53 
54  WheelOdometry odometry;
55  ASSERT_FLOAT_EQ(transform * angle, odometry.velocity(5, 5));
56  }
57 
58  TEST(WheelOdometryTest, velocityTestHuge)
59  {
60  MotorAngle motor_angle;
61  float transform = 3.14f * 99.0f / 2.0f / 180.0f / 0.04f;
62  float angle = motor_angle.relativeAngleMean(140, 140);
63 
64  WheelOdometry odometry;
65  ASSERT_FLOAT_EQ(transform * angle, odometry.velocity(140, 140));
66  }
67 
68 
69  TEST(WheelOdometryTest, angularVelocityTest)
70  {
71  MotorAngle motor_angle;
72  float transform = 99.0f / 2.0f / 147.5f / 0.04f;
73  float angle = motor_angle.angularDifference(2, 5);
74 
75  WheelOdometry odometry;
76  ASSERT_FLOAT_EQ(transform * angle, odometry.angularVelocity(2, 5));
77  }
78 
79  TEST(WheelOdometryTest, resetTest)
80  {
81  WheelOdometry odometry;
82  odometry.update(10.0f, 5.0f);
83  const Coordinate& coordinate = odometry.reset();
84  ASSERT_FLOAT_EQ(0.0f, coordinate.radius);
85  ASSERT_FLOAT_EQ(0.0f, coordinate.arg);
86  ASSERT_FLOAT_EQ(0.0f, coordinate.x);
87  ASSERT_FLOAT_EQ(0.0f, coordinate.y);
88  }
89 
90  TEST(WheelOdometryTest, updateTest)
91  {
92  MotorAngle motor_angle;
93  float transform = 3.14f * 99.0f / 2.0f / 180.0f;
94  float angle = motor_angle.relativeAngleMean(2, 5);
95  float expected_distance = transform * angle;
96 
97  transform = 99.0f / 2.0f / 147.5f;
98  angle = motor_angle.angularDifference(2, 5);
99  float expected_angle = transform * angle;
100 
101  WheelOdometry odometry;
102  const Coordinate& coordinate = odometry.update(2, 5);
103  ASSERT_FLOAT_EQ(expected_distance, coordinate.radius);
104  ASSERT_FLOAT_EQ(expected_angle / 2.0f, coordinate.arg);
105  ASSERT_FLOAT_EQ(expected_distance * std::cos(expected_angle / 2.0f), coordinate.x);
106  ASSERT_FLOAT_EQ(expected_distance * std::sin(expected_angle / 2.0f), coordinate.y);
107  }
108 
109  TEST(WheelOdometryTest, updateCoordinateTest)
110  {
111  WheelOdometry odometry;
112  MotorAngle motor_angle;
113  ASSERT_FLOAT_EQ(0.0, odometry.getCoordinate().radius);
114  ASSERT_FLOAT_EQ(0.0, odometry.getCoordinate().arg);
115 
116  float transform = 3.14f * 99.0f / 2.0f / 180.0f;
117  float angle = motor_angle.relativeAngleMean(2, 5);
118  float expected_distance = transform * angle;
119  odometry.update(2, 5);
120 
121  ASSERT_FLOAT_EQ(expected_distance, odometry.getCoordinate().radius);
122  odometry.update(4, 10);
123  ASSERT_FLOAT_EQ(2 * expected_distance, odometry.getCoordinate().radius);
124  odometry.update(6, 15);
125  ASSERT_FLOAT_EQ(3 * expected_distance, odometry.getCoordinate().radius);
126  }
127 
128  TEST(WheelOdometryTest, getRotationAngleTest)
129  {
130  WheelOdometry odometry;
131  float transform = 99.0f / 147.5f;
132  float angle = (5.0f + 5.0f) / 2.0f;
133 
134  ASSERT_FLOAT_EQ(transform * angle, odometry.getRotationAngle(-5, 5));
135 
136  float angle2 = (2.0f + 2.0f) / 2.0f;
137 
138  ASSERT_FLOAT_EQ(transform * angle2, odometry.getRotationAngle(-2, 2));
139  }
140 
141  TEST(WheelOdometryTest, getCoordinateTest)
142  {
143  WheelOdometry odometry;
144  const Coordinate& coordinate = odometry.getCoordinate();
145 
146  ASSERT_FLOAT_EQ(0.0f, coordinate.radius);
147  ASSERT_FLOAT_EQ(0.0f, coordinate.arg);
148  ASSERT_FLOAT_EQ(0.0f, coordinate.x);
149  ASSERT_FLOAT_EQ(0.0f, coordinate.y);
150  }
151 
152  TEST(WheelOdometryTest, getPointXTest)
153  {
154  WheelOdometry odometry;
155  const Coordinate& coordinate = odometry.update(2, 5);
156 
157  ASSERT_FLOAT_EQ(coordinate.x, odometry.getPointX());
158  }
159 
160  TEST(WheelOdometryTest, getPointYTest)
161  {
162  WheelOdometry odometry;
163  const Coordinate& coordinate = odometry.update(2, 5);
164 
165  ASSERT_FLOAT_EQ(coordinate.y, odometry.getPointY());
166  }
167 }
float relativeAngleMean(std::int32_t current_left_motor, std::int32_t current_right_motor)
左右モータの相対角度の平均値を計算する
Definition: MotorAngle.cpp:51
float getPointX()
走行体の位置x座標を返す
float angularVelocity(std::int32_t left_motor, std::int32_t right_motor)
走行体の旋回角速度を求める
const Coordinate & getCoordinate()
走行体の位置情報を返す
float getRotationAngle(std::int32_t left_motor, std::int32_t right_motor)
走行体の回転角度を返す
float angularDifference(std::int32_t left_motor, std::int32_t right_motor)
左右モータ角度の差を計算する(右手系/反時計回りが正)
Definition: MotorAngle.cpp:72
float radius
Definition: WheelOdometry.h:17
TEST(AIAnswerArrayTest, construct)
void reset()
走行体の位置情報を初期化する
const Coordinate & update(std::int32_t left_motor, std::int32_t right_motor)
走行体の位置情報を更新する
float velocity(std::int32_t left_motor, std::int32_t right_motor)
走行体の旋回速度を求める
const Coordinate & reset()
走行体の位置情報を初期化する
void update(float distance, float angle)
走行体の位置情報を更新する
float getPointY()
走行体の位置y座標を返す
オドメトリ(Wheel odometry)手法を用いた速度/角度/自己位置推定
走行体の位置情報をまとめた構造体
Definition: WheelOdometry.h:16