1+ #include "py/mpconfig.h"
2+ #include "py/mphal.h"
3+ #include "py/runtime.h"
4+ #include "pybricks/experimental/platform_math.h"
5+ #include "pybricks/experimental/odometry.h"
6+
7+ // Global visibility for the linker
8+ mp_obj_t calculate_odometry (int num_iters , float wheel_circ , float axle_track , mp_obj_t right_angle_func , mp_obj_t left_angle_func ) {
9+
10+ // Constants (mm/deg and 1/track)
11+ float deg_to_mm = wheel_circ * 0.0027777778f ;
12+ float inv_axle_track = 1.0f / axle_track ;
13+
14+ // Position State
15+ float rx = 0.0f ;
16+ float ry = 0.0f ;
17+ float rh = 0.0f ;
18+
19+ // Initial Grabs
20+ int32_t last_r = mp_obj_get_int (mp_call_function_0 (right_angle_func ));
21+ int32_t last_l = mp_obj_get_int (mp_call_function_0 (left_angle_func ));
22+
23+ uint32_t start_time = mp_hal_ticks_ms ();
24+
25+ for (int i = 0 ; i < num_iters ; i ++ ) {
26+ // Fetch raw encoders
27+ int32_t cur_r = mp_obj_get_int (mp_call_function_0 (right_angle_func ));
28+ int32_t cur_l = mp_obj_get_int (mp_call_function_0 (left_angle_func ));
29+
30+ // Differential logic
31+ float dR = (float )(cur_r - last_r ) * deg_to_mm ;
32+ float dL = (float )(cur_l - last_l ) * deg_to_mm ;
33+ float dD = (dR + dL ) * 0.5f ;
34+ float dH = (dR - dL ) * inv_axle_track ;
35+
36+ // Update with Midpoint Heading (RK2)
37+ if (dD != 0.0f || dH != 0.0f ) {
38+ float avg_h = rh + (dH * 0.5f );
39+ rx += dD * pb_fast_cos (avg_h );
40+ ry += dD * pb_fast_sin (avg_h );
41+ rh += dH ;
42+ }
43+
44+ last_r = cur_r ;
45+ last_l = cur_l ;
46+
47+ // Yield to MicroPython (Every 1024 iters)
48+ if ((i & 0x3FF ) == 0 ) {
49+ mp_handle_pending (true);
50+ }
51+ }
52+
53+ uint32_t dur = mp_hal_ticks_ms () - start_time ;
54+
55+ mp_obj_t tuple [5 ] = {
56+ mp_obj_new_float_from_f ((float )dur * 0.001f ),
57+ mp_obj_new_int (num_iters ),
58+ mp_obj_new_float_from_f ((float )num_iters / ((float )dur * 0.001f )),
59+ mp_obj_new_float_from_f (rx ),
60+ mp_obj_new_float_from_f (ry )
61+ };
62+ return mp_obj_new_tuple (5 , tuple );
63+ }
0 commit comments