@@ -40,17 +40,17 @@ volatile float sp_a = 0.0f, sp_b = 0.0f, sp_c = 0.0f, sp_d = 0.0f, sp_x_end = 0.
4040void pb_background_odometry_update (void ) {
4141 if (!odom_running || !left_servo_ptr || !right_servo_ptr ) return ;
4242
43- uint32_t now = mp_hal_ticks_ms ();
44- if (now - last_odom_time_ms < 5 ) return ;
45- last_odom_time_ms = now ;
46-
4743 int32_t cur_l , cur_r , unused_rate ;
4844 pbio_servo_get_state_user (left_servo_ptr , & cur_l , & unused_rate );
4945 pbio_servo_get_state_user (right_servo_ptr , & cur_r , & unused_rate );
5046
5147 int32_t delta_l = cur_l - last_left_angle ;
5248 int32_t delta_r = cur_r - last_right_angle ;
5349
50+ // Update state immediately to prevent dropped ticks
51+ last_left_angle = cur_l ;
52+ last_right_angle = cur_r ;
53+
5454 if (delta_l != 0 || delta_r != 0 ) {
5555 float dL = (float )delta_l * odom_deg_to_mm ;
5656 float dR = (float )delta_r * odom_deg_to_mm ;
@@ -62,11 +62,9 @@ void pb_background_odometry_update(void) {
6262 global_y += dD * pb_fast_sin (avg_h );
6363 global_h += dH ;
6464
65+ // Keep heading within [-PI, PI]
6566 while (global_h > 3.14159f ) global_h -= 6.28318f ;
6667 while (global_h < -3.14159f ) global_h += 6.28318f ;
67-
68- last_left_angle = cur_l ;
69- last_right_angle = cur_r ;
7068 }
7169}
7270
@@ -108,15 +106,19 @@ void pb_background_pursuit_update(void) {
108106mp_obj_t experimental_start_odometry (size_t n_args , const mp_obj_t * args ) {
109107 left_servo_ptr = ((pb_type_pupdevices_Motor_obj_t * )MP_OBJ_TO_PTR (args [0 ]))-> srv ;
110108 right_servo_ptr = ((pb_type_pupdevices_Motor_obj_t * )MP_OBJ_TO_PTR (args [1 ]))-> srv ;
111- odom_deg_to_mm = mp_obj_get_float (args [2 ]) / 360.0f ;
109+
110+ // Using mm_per_deg directly as passed from Python
111+ odom_deg_to_mm = mp_obj_get_float (args [2 ]);
112112 odom_inv_track = 1.0f / mp_obj_get_float (args [3 ]);
113+
113114 global_x = mp_obj_get_float (args [4 ]);
114115 global_y = mp_obj_get_float (args [5 ]);
115116 global_h = mp_obj_get_float (args [6 ]);
116117
117- int32_t unused_rate ;
118- pbio_servo_get_state_user (left_servo_ptr , (int32_t * )& last_left_angle , & unused_rate );
119- pbio_servo_get_state_user (right_servo_ptr , (int32_t * )& last_right_angle , & unused_rate );
118+ int32_t unused ;
119+ pbio_servo_get_state_user (left_servo_ptr , (int32_t * )& last_left_angle , & unused );
120+ pbio_servo_get_state_user (right_servo_ptr , (int32_t * )& last_right_angle , & unused );
121+
120122 odom_running = true;
121123 return mp_const_none ;
122124}
0 commit comments