Skip to content

Commit fd921ee

Browse files
sunghyuneunwilliamckha
authored andcommitted
Improved Euclidean to Wheel Readability / Logic? + Fixed Tests
1 parent d4b2a76 commit fd921ee

3 files changed

Lines changed: 98 additions & 65 deletions

File tree

src/software/physics/euclidean_to_wheel.cpp

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,39 +8,40 @@
88
#include "software/geom/angular_velocity.h"
99
#include "software/geom/vector.h"
1010

11-
#ifdef DEBUG_WHEEL
11+
// get rid of this stupid ifdef, and then look at the issue
12+
13+
// Turn this to
14+
#if CHECK_VERSION(2026)
1215
EuclideanToWheel::EuclideanToWheel(const robot_constants::RobotConstants& robot_constants)
1316
: robot_constants_(robot_constants)
1417
{
1518
// Angles [rads]
1619
auto p = robot_constants_.front_wheel_angle_deg * M_PI / 180.;
1720
auto t = robot_constants_.back_wheel_angle_deg * M_PI / 180.;
1821

19-
auto cos_p = std::cos(p);
20-
auto sin_p = std::sin(p);
21-
auto cos_t = std::cos(t);
22-
auto sin_t = std::sin(t);
22+
// Beta is angle of wheel rolling direction relative to X-axis
23+
// LOOK AT (software)/src/shared/robot_constants.h to see X-axis
24+
double b_fr = -(M_PI - p);
25+
double b_fl = -p;
26+
double b_bl = t;
27+
double b_br = (M_PI - t);
2328

24-
// 1. Physical wheel coordinates in meters
25-
// Mapped to the robot frame: +X = Right, +Y = Forward
26-
double fr_x = 0.06632, fr_y = 0.03485;
27-
double br_x = 0.05592, br_y = -0.04985;
29+
// Mapped to the robot frame: +X = Forward, +Y = Left
30+
double fr_x = 0.03485, fr_y = -0.06632;
31+
double fl_x = 0.03485, fl_y = 0.06632;
32+
double bl_x = -0.04985, bl_y = 0.05592;
33+
double br_x = -0.04985, br_y = -0.05592;
2834

29-
// 2. Unit drive vectors (extracted directly from the matrix's linear columns)
30-
double fr_dx = -sin_p, fr_dy = cos_p;
31-
double br_dx = sin_t, br_dy = cos_t;
3235

33-
// 3. Dynamically calculate the rotational lever arms using the 2D cross product
34-
// Lever Arm = | X * Dy - Y * Dx |
35-
double rot_f = std::abs((fr_x * fr_dy) - (fr_y * fr_dx));
36-
double rot_b = std::abs((br_x * br_dy) - (br_y * br_dx));
36+
// Assuming that CCW when looking end of shaft into motor is the positive direction.
37+
// Formula is u_1 = v_x * cos(B_1) + v_y * sin(B_1) + W * (x_1 * sin(B_1) - y_1 * cos(B_1))
3738

3839
// clang-format off
3940
euclidean_to_wheel_velocity_D_ <<
40-
-sin_p, cos_p, rot_f,
41-
-sin_p, -cos_p, rot_f,
42-
sin_t, -cos_t, rot_b,
43-
sin_t, cos_t, rot_b;
41+
std::cos(b_fr), std::sin(b_fr), (fr_x * std::sin(b_fr) - fr_y * std::cos(b_fr)),
42+
std::cos(b_fl), std::sin(b_fl), (fl_x * std::sin(b_fl) - fl_y * std::cos(b_fl)),
43+
std::cos(b_bl), std::sin(b_bl), (bl_x * std::sin(b_bl) - bl_y * std::cos(b_bl)),
44+
std::cos(b_br), std::sin(b_br), (br_x * std::sin(b_br) - br_y * std::cos(b_br));
4445
// clang-format on
4546

4647
// Calculate Pseudo-inverse dynamically
@@ -102,7 +103,8 @@ EuclideanToWheel::EuclideanToWheel(const robot_constants::RobotConstants& robot_
102103

103104
#endif
104105

105-
#ifdef DEBUG_WHEEL
106+
// Why was this DEBUG_WHEEL
107+
#if CHECK_VERSION(2026)
106108
WheelSpace_t EuclideanToWheel::getWheelVelocity(EuclideanSpace_t euclidean_velocity) const
107109
{
108110
// The generalized D matrix natively handles the w -> tangential velocity

src/software/physics/euclidean_to_wheel.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
#include "software/geom/angular_velocity.h"
88
#include "software/geom/vector.h"
99

10-
#define DEBUG_WHEEL
11-
1210
/**
1311
* Vector representation of 2D Euclidean space.
1412
*

src/software/physics/euclidean_to_wheel_test.cpp

Lines changed: 75 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -40,74 +40,104 @@ TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_zero)
4040
// velocity, and vise-versa.
4141
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_x)
4242
{
43-
// Test +x/right
43+
// Test +x/forward
4444
target_euclidean_velocity = {1, 0, 0};
4545
calculated_wheel_speeds =
4646
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
4747

48-
// Front wheels must be - velocity, back wheels must be + velocity.
48+
// Right wheels must be - velocity, left wheels must be + velocity.
4949
EXPECT_LT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
50-
EXPECT_LT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
50+
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
5151
EXPECT_GT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
52-
EXPECT_GT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
52+
EXPECT_LT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
53+
54+
55+
// Right wheels must have same velocity magnitude as left wheels, but opposite sign.
56+
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
57+
-calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]);
58+
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX],
59+
-calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]);
5360
}
5461

5562
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_x)
5663
{
57-
// Test -x/left
64+
// Test -x/backward
5865
target_euclidean_velocity = {-1, 0, 0};
5966
calculated_wheel_speeds =
6067
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
6168

62-
// Front wheels must be + velocity, back wheels must be - velocity.
69+
// Right wheels must be + velocity, left wheels must be - velocity.
6370
EXPECT_GT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
64-
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
71+
EXPECT_LT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
6572
EXPECT_LT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
66-
EXPECT_LT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
73+
EXPECT_GT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
74+
75+
// Right wheels must have same velocity magnitude as left wheels, but opposite sign.
76+
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
77+
-calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]);
78+
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX],
79+
-calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]);
6780
}
6881

6982
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_y)
7083
{
71-
// Test +y/forwards
84+
// Test +y/left
7285
target_euclidean_velocity = {0, 1, 0};
7386
calculated_wheel_speeds =
7487
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
7588

76-
// Right wheels must be + velocity, Left wheels must be - velocity.
77-
EXPECT_GT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
89+
// Back wheels must be + velocity, front wheels must be - velocity.
90+
EXPECT_LT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
7891
EXPECT_LT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
79-
EXPECT_LT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
92+
EXPECT_GT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
8093
EXPECT_GT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
81-
82-
// Right wheels must have same velocity magnitude as left wheels, but opposite sign.
83-
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
84-
-calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]);
85-
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX],
86-
-calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]);
8794
}
8895

8996
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_y)
9097
{
91-
// Test -y/backwards
98+
// Test -y/right
9299
target_euclidean_velocity = {0, -1, 0};
93100
calculated_wheel_speeds =
94101
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
95102

103+
// Back wheels must be - velocity, front wheels must be + velocity.
104+
EXPECT_GT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
105+
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
106+
EXPECT_LT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
107+
EXPECT_LT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
108+
}
109+
110+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w_sign)
111+
{
112+
// Test w / counter-clockwise
113+
target_euclidean_velocity = {0, 0, 1};
114+
calculated_wheel_speeds =
115+
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
116+
96117
// Right wheels must be + velocity, Left wheels must be - velocity.
97118
EXPECT_LT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
98-
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
99-
EXPECT_GT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
119+
EXPECT_LT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
120+
EXPECT_LT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
100121
EXPECT_LT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
122+
}
101123

102-
// Right wheels must have same velocity magnitude as left wheels, but opposite sign.
103-
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
104-
-calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]);
105-
EXPECT_DOUBLE_EQ(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX],
106-
-calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]);
124+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w_sign)
125+
{
126+
// Test w / clockwise
127+
target_euclidean_velocity = {0, 0, -1};
128+
calculated_wheel_speeds =
129+
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
130+
131+
// Right wheels must be + velocity, Left wheels must be - velocity.
132+
EXPECT_GT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
133+
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
134+
EXPECT_GT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
135+
EXPECT_GT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
107136
}
108137

109-
#ifdef DEBUG_WHEEL
110-
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w)
138+
// #ifdef DEBUG_WHEEL
139+
#if CHECK_VERSION(2026)
140+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w_magnitude)
111141
{
112142
// Test +w/counter-clockwise
113143
target_euclidean_velocity = {0, 0, 1};
@@ -116,20 +146,23 @@ TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w)
116146

117147
// Because the wheels are offset, their speed at 1 rad/s equals their
118148
// exact physical lever arm (in meters), NOT the nominal robot_radius.
119-
// Based on the physical offsets, the lever arm evaluates to 0.0746 meters.
120-
double expected_lever_arm = 0.0746;
121149

122-
EXPECT_NEAR(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
150+
// i have no idea what it's yapping about above but i ignored it lol
151+
152+
// Based on the physical offsets, the lever arm evaluates to 0.0749 meters.
153+
double expected_lever_arm = 0.0749;
154+
155+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX]),
123156
expected_lever_arm, 0.001);
124-
EXPECT_NEAR(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
157+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
125158
0.001);
126-
EXPECT_NEAR(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
159+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
127160
0.001);
128-
EXPECT_NEAR(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], expected_lever_arm,
161+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]), expected_lever_arm,
129162
0.001);
130163
}
131164

132-
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w)
165+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w_magnitude)
133166
{
134167
// Test -w/clockwise
135168
target_euclidean_velocity = {0, 0, -1};
@@ -138,20 +171,20 @@ TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w)
138171

139172
// Because the wheels are offset, their speed at -1 rad/s equals their
140173
// exact physical lever arm (in meters) multiplied by the negative velocity.
141-
double expected_lever_arm = -0.0746;
174+
double expected_lever_arm = 0.0749;
142175

143-
EXPECT_NEAR(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
176+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX]),
144177
expected_lever_arm, 0.001);
145-
EXPECT_NEAR(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
178+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
146179
0.001);
147-
EXPECT_NEAR(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
180+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
148181
0.001);
149-
EXPECT_NEAR(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], expected_lever_arm,
182+
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]), expected_lever_arm,
150183
0.001);
151184
}
152185
#else
153186

154-
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w)
187+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w_magnitude)
155188
{
156189
// Test +w/counter-clockwise
157190
target_euclidean_velocity = {0, 0, 1};
@@ -169,7 +202,7 @@ TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w)
169202
}
170203

171204

172-
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w)
205+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w_magnitude)
173206
{
174207
// Test -w/clockwise
175208
target_euclidean_velocity = {0, 0, -1};

0 commit comments

Comments
 (0)