@@ -24,10 +24,14 @@ volatile int32_t last_left_angle = 0, last_right_angle = 0;
2424float odom_deg_to_mm = 1.0f ;
2525float odom_inv_track = 1.0f ;
2626
27- // Pursuit State
27+ // Pursuit / Spline State
2828volatile 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) {
6468void 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)
9592mp_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