Skip to content

Commit 0ef7e4a

Browse files
committed
compile maybe?
1 parent ee77a6a commit 0ef7e4a

2 files changed

Lines changed: 20 additions & 12 deletions

File tree

bricks/_common/mpconfigport.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,19 @@ typedef long mp_off_t;
155155
#define PYBRICKS_VM_HOOK_LOOP_EXTRA
156156
#endif
157157

158+
void pb_background_odometry_update(void);
159+
void pb_background_pursuit_update(void);
160+
158161
#define MICROPY_VM_HOOK_LOOP \
159162
do { \
160163
PYBRICKS_VM_HOOK_LOOP_EXTRA \
161164
extern bool pbio_os_run_processes_once(void); \
162165
pbio_os_run_processes_once(); \
166+
/* Call our experimental hooks every VM cycle */ \
167+
pb_background_odometry_update(); \
168+
pb_background_pursuit_update(); \
163169
} while (0);
164-
170+
165171
#define MICROPY_GC_HOOK_LOOP(i) do { \
166172
if (((i) & 0xf) == 0) { \
167173
MICROPY_VM_HOOK_LOOP \

pybricks/experimental/odometry.c

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
4040
void 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) {
108106
mp_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

Comments
 (0)