Ya no se vuelve loco al hacer giros. Los hace mas lentos y suaves

This commit is contained in:
2026-05-22 10:25:44 -05:00
parent 872b9e48d3
commit c609a4148e
+27 -5
View File
@@ -9,9 +9,9 @@ from modulo_slam import EvasorObstaculos
from modulo_imu import IMU from modulo_imu import IMU
# ── Constantes de velocidad ──────────────────────────────────────────────────── # ── Constantes de velocidad ────────────────────────────────────────────────────
VEL_NORMAL = 0.50 # m/s en camino libre VEL_NORMAL = 0.65 # m/s en camino libre
VEL_LENTA = 0.25 # m/s en precaución VEL_LENTA = 0.40 # m/s en precaución
VEL_GIRO = 1.50 # rad/s al girar VEL_GIRO = 2 # rad/s al girar
# ── Mapa 2D local ────────────────────────────────────────────────────────────── # ── Mapa 2D local ──────────────────────────────────────────────────────────────
MAPA_W, MAPA_H = 700, 700 MAPA_W, MAPA_H = 700, 700
@@ -282,9 +282,15 @@ def main():
estado_auto = AUTO_LIBRE # estado actual de la máquina estado_auto = AUTO_LIBRE # estado actual de la máquina
theta_inicio = 0.0 # theta del IMU al iniciar el paso de giro theta_inicio = 0.0 # theta del IMU al iniciar el paso de giro
w_giro_actual = 0.0 # dirección del giro en curso (+/-) w_giro_actual = 0.0 # dirección del giro en curso (+/-)
incremento_w = 0.0 # compensación dinámica de giro por fricción
ultimo_tiempo_auto = time.perf_counter()
try: try:
while True: while True:
ahora = time.perf_counter()
dt = ahora - ultimo_tiempo_auto
ultimo_tiempo_auto = ahora
# Cámara: solo se usa para el evasor de obstáculos, sin mostrar video # Cámara: solo se usa para el evasor de obstáculos, sin mostrar video
escaner, _ = camara.obtener_datos() escaner, _ = camara.obtener_datos()
@@ -321,11 +327,25 @@ def main():
# Completó ~30° → detener y evaluar # Completó ~30° → detener y evaluar
robot.enviar_velocidad(0.0, 0.0) robot.enviar_velocidad(0.0, 0.0)
estado_auto = AUTO_CHECK estado_auto = AUTO_CHECK
incremento_w = 0.0
print(f"\n✓ Giro completado ({math.degrees(girado):.0f}°). Evaluando camino...") print(f"\n✓ Giro completado ({math.degrees(girado):.0f}°). Evaluando camino...")
else: else:
# ── Compensación de fricción ──
# Si el robot está atascado (IMU marca casi cero giro), aumentamos el PWM
w_real = abs(imu.omega_x_rads)
if w_real < 0.2:
incremento_w += 1.5 * dt # Rampa de subida (1.5 rad/s por segundo)
else:
incremento_w -= 3.0 * dt # Rampa de bajada más rápida si ya gira
# Limitar entre 0 y 2.5 rad/s extra para que no se vuelva loco
incremento_w = max(0.0, min(incremento_w, 2.5))
w_compensado = w_giro_actual + math.copysign(incremento_w, w_giro_actual)
# Continuar girando # Continuar girando
robot.enviar_velocidad(0.0, w_giro_actual) robot.enviar_velocidad(0.0, w_compensado)
print(f"\r🔄 Girando... {math.degrees(girado):.0f}° / 30°", end="") print(f"\r🔄 Girando... {math.degrees(girado):.0f}° / 30° (Boost: {incremento_w:.1f})", end="")
elif estado_auto == AUTO_CHECK: elif estado_auto == AUTO_CHECK:
# ── Verificar si el camino quedó libre ──────────────────── # ── Verificar si el camino quedó libre ────────────────────
@@ -369,12 +389,14 @@ def main():
estado_auto = AUTO_LIBRE estado_auto = AUTO_LIBRE
theta_inicio = robot.theta theta_inicio = robot.theta
w_giro_actual = 0.0 w_giro_actual = 0.0
incremento_w = 0.0
modo_autonomo = True modo_autonomo = True
elif tecla == ord('m'): elif tecla == ord('m'):
print("\n🛑 MODO MANUAL") print("\n🛑 MODO MANUAL")
modo_autonomo = False modo_autonomo = False
estado_auto = AUTO_LIBRE estado_auto = AUTO_LIBRE
incremento_w = 0.0
robot.enviar_velocidad(0.0, 0.0) robot.enviar_velocidad(0.0, 0.0)
elif tecla == ord('c'): elif tecla == ord('c'):