Skip to content

Commit 77d5023

Browse files
committed
restructure please compile
1 parent 93184b5 commit 77d5023

1 file changed

Lines changed: 29 additions & 28 deletions

File tree

pybricks/experimental/odometry.c

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@ volatile int32_t last_left_angle = 0, last_right_angle = 0;
2424
float odom_deg_to_mm = 1.0f;
2525
float odom_inv_track = 1.0f;
2626

27-
// Pursuit State
27+
// Pursuit / Spline State
2828
volatile bool pursuit_running = false;
29-
volatile float p_target_x = 0.0f, p_target_y = 0.0f, p_target_speed = 0.0f;
30-
volatile float p_stop_threshold_sq = 400.0f;
29+
volatile float p_target_speed = 0.0f;
30+
volatile float p_lookahead = 120.0f;
31+
32+
// Spline Coefficients for y = ax^3 + bx^2 + cx + d
33+
volatile float sp_a = 0.0f, sp_b = 0.0f, sp_c = 0.0f, sp_d = 0.0f;
34+
volatile float sp_x_end = 0.0f;
3135

3236
// --- Background Updates ---
3337

@@ -64,34 +68,27 @@ void pb_background_odometry_update(void) {
6468
void pb_background_pursuit_update(void) {
6569
if (!pursuit_running || !left_servo_ptr || !right_servo_ptr) return;
6670

67-
float x_dif = p_target_x - global_x;
68-
float y_dif = p_target_y - global_y;
69-
float dist_sq = (x_dif * x_dif) + (y_dif * y_dif);
71+
// 1. PROJECT TARGET POINT
72+
// Use sp_a, sp_b, sp_c, sp_d and p_lookahead to find target_x and target_y
73+
float target_x = 0.0f;
74+
float target_y = 0.0f;
7075

71-
if (dist_sq < p_stop_threshold_sq) {
72-
pursuit_running = false;
73-
pbio_servo_stop(left_servo_ptr, PBIO_CONTROL_STOP_BRAKE);
74-
pbio_servo_stop(right_servo_ptr, PBIO_CONTROL_STOP_BRAKE);
75-
return;
76-
}
76+
// 2. CHECK EXIT CONDITION
77+
// Decide when to set pursuit_running = false (e.g. reaching sp_x_end)
7778

78-
float relative_y = (y_dif * pb_fast_cos(global_h)) - (x_dif * pb_fast_sin(global_h));
79-
float m_left = 1.0f, m_right = 1.0f;
80-
81-
if (relative_y > 0.001f || relative_y < -0.001f) {
82-
float radius = -(dist_sq / (2.0f * relative_y));
83-
float two_r = 2.0f * radius;
84-
float track = 1.0f / odom_inv_track;
85-
m_right = two_r / (two_r + track);
86-
m_left = two_r / (two_r - track);
87-
}
79+
// 3. PURE PURSUIT MATH
80+
// Calculate m_left and m_right based on target_x/y relative to global_x/y
81+
float m_left = 1.0f;
82+
float m_right = 1.0f;
8883

84+
// 4. DRIVE
8985
pbio_servo_run_velocity(left_servo_ptr, (int32_t)(p_target_speed * m_left));
9086
pbio_servo_run_velocity(right_servo_ptr, (int32_t)(p_target_speed * m_right));
9187
}
9288

9389
// --- MicroPython API ---
9490

91+
// start_odometry(left_m, right_m, mm_per_deg, track, x, y, h)
9592
mp_obj_t experimental_start_odometry(size_t n_args, const mp_obj_t *args) {
9693
left_servo_ptr = ((pb_type_Motor_obj_t *)MP_OBJ_TO_PTR(args[0]))->srv;
9794
right_servo_ptr = ((pb_type_Motor_obj_t *)MP_OBJ_TO_PTR(args[1]))->srv;
@@ -118,12 +115,16 @@ mp_obj_t experimental_stop_odometry(void) {
118115
return mp_const_none;
119116
}
120117

121-
mp_obj_t experimental_start_pursuit(size_t n_args, const mp_obj_t *args) {
122-
p_target_x = mp_obj_get_float(args[0]);
123-
p_target_y = mp_obj_get_float(args[1]);
124-
p_target_speed = mp_obj_get_float(args[2]);
125-
float thresh = mp_obj_get_float(args[3]);
126-
p_stop_threshold_sq = thresh * thresh;
118+
// NEW API: start_spline(a, b, c, d, x_end, speed, lookahead)
119+
mp_obj_t experimental_start_spline(size_t n_args, const mp_obj_t *args) {
120+
sp_a = mp_obj_get_float(args[0]);
121+
sp_b = mp_obj_get_float(args[1]);
122+
sp_c = mp_obj_get_float(args[2]);
123+
sp_d = mp_obj_get_float(args[3]);
124+
sp_x_end = mp_obj_get_float(args[4]);
125+
p_target_speed = mp_obj_get_float(args[5]);
126+
p_lookahead = mp_obj_get_float(args[6]);
127+
127128
pursuit_running = true;
128129
return mp_const_none;
129130
}

0 commit comments

Comments
 (0)