Skip to content

Commit f86b25d

Browse files
sunghyuneunwilliamckha
authored andcommitted
Revert "Improved Euclidean to Wheel Readability / Logic? + Fixed Tests"
Moved changes to PR #3731 This reverts commit 6aec7b3.
1 parent fd921ee commit f86b25d

3 files changed

Lines changed: 65 additions & 98 deletions

File tree

src/software/physics/euclidean_to_wheel.cpp

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

11-
// get rid of this stupid ifdef, and then look at the issue
12-
13-
// Turn this to
14-
#if CHECK_VERSION(2026)
11+
#ifdef DEBUG_WHEEL
1512
EuclideanToWheel::EuclideanToWheel(const robot_constants::RobotConstants& robot_constants)
1613
: robot_constants_(robot_constants)
1714
{
1815
// Angles [rads]
1916
auto p = robot_constants_.front_wheel_angle_deg * M_PI / 180.;
2017
auto t = robot_constants_.back_wheel_angle_deg * M_PI / 180.;
2118

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);
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);
2823

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;
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;
3428

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;
3532

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))
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));
3837

3938
// clang-format off
4039
euclidean_to_wheel_velocity_D_ <<
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));
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;
4544
// clang-format on
4645

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

104103
#endif
105104

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

src/software/physics/euclidean_to_wheel.h

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

10+
#define DEBUG_WHEEL
11+
1012
/**
1113
* Vector representation of 2D Euclidean space.
1214
*

src/software/physics/euclidean_to_wheel_test.cpp

Lines changed: 42 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -40,104 +40,74 @@ 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/forward
43+
// Test +x/right
4444
target_euclidean_velocity = {1, 0, 0};
4545
calculated_wheel_speeds =
4646
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
4747

48-
// Right wheels must be - velocity, left wheels must be + velocity.
48+
// Front wheels must be - velocity, back wheels must be + velocity.
4949
EXPECT_LT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
50-
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
50+
EXPECT_LT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
5151
EXPECT_GT(calculated_wheel_speeds[BACK_LEFT_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]);
52+
EXPECT_GT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
6053
}
6154

6255
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_x)
6356
{
64-
// Test -x/backward
57+
// Test -x/left
6558
target_euclidean_velocity = {-1, 0, 0};
6659
calculated_wheel_speeds =
6760
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
6861

69-
// Right wheels must be + velocity, left wheels must be - velocity.
62+
// Front wheels must be + velocity, back wheels must be - velocity.
7063
EXPECT_GT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
71-
EXPECT_LT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
64+
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
7265
EXPECT_LT(calculated_wheel_speeds[BACK_LEFT_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]);
66+
EXPECT_LT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
8067
}
8168

8269
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_y)
8370
{
84-
// Test +y/left
71+
// Test +y/forwards
8572
target_euclidean_velocity = {0, 1, 0};
8673
calculated_wheel_speeds =
8774
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
8875

89-
// Back wheels must be + velocity, front wheels must be - velocity.
90-
EXPECT_LT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
76+
// Right wheels must be + velocity, Left wheels must be - velocity.
77+
EXPECT_GT(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX], 0);
9178
EXPECT_LT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
92-
EXPECT_GT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
79+
EXPECT_LT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
9380
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]);
9487
}
9588

9689
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_y)
9790
{
98-
// Test -y/right
91+
// Test -y/backwards
9992
target_euclidean_velocity = {0, -1, 0};
10093
calculated_wheel_speeds =
10194
euclidean_to_four_wheel.getWheelVelocity(target_euclidean_velocity);
10295

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-
11796
// Right wheels must be + velocity, Left wheels must be - velocity.
11897
EXPECT_LT(calculated_wheel_speeds[FRONT_RIGHT_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);
121-
EXPECT_LT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
122-
}
123-
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);
13398
EXPECT_GT(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], 0);
13499
EXPECT_GT(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], 0);
135-
EXPECT_GT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
100+
EXPECT_LT(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], 0);
101+
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]);
136107
}
137108

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

147117
// Because the wheels are offset, their speed at 1 rad/s equals their
148118
// 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;
149121

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]),
122+
EXPECT_NEAR(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
156123
expected_lever_arm, 0.001);
157-
EXPECT_NEAR(std::abs(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
124+
EXPECT_NEAR(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
158125
0.001);
159-
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
126+
EXPECT_NEAR(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
160127
0.001);
161-
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]), expected_lever_arm,
128+
EXPECT_NEAR(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], expected_lever_arm,
162129
0.001);
163130
}
164131

165-
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w_magnitude)
132+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w)
166133
{
167134
// Test -w/clockwise
168135
target_euclidean_velocity = {0, 0, -1};
@@ -171,20 +138,20 @@ TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w_magnitude)
171138

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

176-
EXPECT_NEAR(std::abs(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX]),
143+
EXPECT_NEAR(calculated_wheel_speeds[FRONT_RIGHT_WHEEL_SPACE_INDEX],
177144
expected_lever_arm, 0.001);
178-
EXPECT_NEAR(std::abs(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
145+
EXPECT_NEAR(calculated_wheel_speeds[FRONT_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
179146
0.001);
180-
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX]), expected_lever_arm,
147+
EXPECT_NEAR(calculated_wheel_speeds[BACK_LEFT_WHEEL_SPACE_INDEX], expected_lever_arm,
181148
0.001);
182-
EXPECT_NEAR(std::abs(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX]), expected_lever_arm,
149+
EXPECT_NEAR(calculated_wheel_speeds[BACK_RIGHT_WHEEL_SPACE_INDEX], expected_lever_arm,
183150
0.001);
184151
}
185152
#else
186153

187-
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w_magnitude)
154+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w)
188155
{
189156
// Test +w/counter-clockwise
190157
target_euclidean_velocity = {0, 0, 1};
@@ -202,7 +169,7 @@ TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_positive_w_magnitude)
202169
}
203170

204171

205-
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w_magnitude)
172+
TEST_F(EuclideanToWheelTest, test_target_wheel_speeds_negative_w)
206173
{
207174
// Test -w/clockwise
208175
target_euclidean_velocity = {0, 0, -1};

0 commit comments

Comments
 (0)