Nota
¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. ¡Profundiza en el mundo de Raspberry Pi, Arduino y ESP32 con otros entusiastas!
¿Por qué unirse?
Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Preestrenos exclusivos: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.
Promociones festivas y sorteos: Participa en sorteos y promociones especiales en días festivos.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [here] y únete hoy.
5. Seguimiento de Línea
Este proyecto usará el módulo de escala de grises para hacer que el PiCar-X avance siguiendo una línea. Usa cinta de color oscuro para hacer una línea lo más recta posible y con pocas curvas. Puede que necesites experimentar un poco si el PiCar-X se sale de la línea.
Ejecutar el Código
cd ~/picar-x/example
sudo python3 5.minecart_plus.py
Después de ejecutar el código, el PiCar-X se moverá hacia adelante siguiendo una línea.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes de eso, debes ir a la ruta del código fuente como picar-x/example
. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
from picarx import Picarx
from time import sleep
px = Picarx()
# px = Picarx(grayscale_pins=['A0', 'A1', 'A2'])
# Por favor, ejecuta ./calibration/grayscale_calibration.py para calibrar automáticamente los valores de escala de grises
# o modifica manualmente los valores de referencia con el siguiente código
# px.set_line_reference([1400, 1400, 1400])
current_state = None
px_power = 10
offset = 20
last_state = "stop"
def outHandle():
global last_state, current_state
if last_state == 'left':
px.set_dir_servo_angle(-30)
px.backward(10)
elif last_state == 'right':
px.set_dir_servo_angle(30)
px.backward(10)
while True:
gm_val_list = px.get_grayscale_data()
gm_state = get_status(gm_val_list)
print("outHandle gm_val_list: %s, %s"%(gm_val_list, gm_state))
currentSta = gm_state
if currentSta != last_state:
break
sleep(0.001)
def get_status(val_list):
_state = px.get_line_status(val_list) # [bool, bool, bool], 0 significa línea, 1 significa fondo
if _state == [0, 0, 0]:
return 'stop'
elif _state[1] == 1:
return 'forward'
elif _state[0] == 1:
return 'right'
elif _state[2] == 1:
return 'left'
if __name__=='__main__':
try:
while True:
gm_val_list = px.get_grayscale_data()
gm_state = get_status(gm_val_list)
print("gm_val_list: %s, %s"%(gm_val_list, gm_state))
if gm_state != "stop":
last_state = gm_state
if gm_state == 'forward':
px.set_dir_servo_angle(0)
px.forward(px_power)
elif gm_state == 'left':
px.set_dir_servo_angle(offset)
px.forward(px_power)
elif gm_state == 'right':
px.set_dir_servo_angle(-offset)
px.forward(px_power)
else:
outHandle()
finally:
px.stop()
print("stop and exit")
sleep(0.1)
¿Cómo funciona?
Este script de Python controla un coche robótico PiCarX utilizando sensores de escala de grises para la navegación. Aquí tienes un desglose de sus componentes principales:
Importación e inicialización:
El script importa la clase Picarx para controlar el coche robótico y la función sleep del módulo time para añadir retrasos.
Se crea una instancia de Picarx, y hay una línea comentada que muestra una inicialización alternativa con pines específicos de sensores de escala de grises.
from picarx import Picarx from time import sleep px = Picarx()
Configuración y variables globales:
current_state
,px_power
,offset
ylast_state
son variables globales utilizadas para rastrear y controlar el movimiento del coche.px_power
establece la potencia del motor, yoffset
se usa para ajustar el ángulo de dirección.current_state = None px_power = 10 offset = 20 last_state = "stop"
Función
outHandle
:Esta función se llama cuando el coche necesita manejar un escenario «fuera de la línea».
Ajusta la dirección del coche según
last_state
y verifica los valores del sensor de escala de grises para determinar el nuevo estado.def outHandle(): global last_state, current_state if last_state == 'left': px.set_dir_servo_angle(-30) px.backward(10) elif last_state == 'right': px.set_dir_servo_angle(30) px.backward(10) while True: gm_val_list = px.get_grayscale_data() gm_state = get_status(gm_val_list) print("outHandle gm_val_list: %s, %s"%(gm_val_list, gm_state)) currentSta = gm_state if currentSta != last_state: break sleep(0.001)
Función
get_status
:Interpreta los datos del sensor de escala de grises (
val_list
) para determinar el estado de navegación del coche.El estado del coche puede ser “forward”, “left”, “right” o “stop”, dependiendo de qué sensor detecte la línea.
def get_status(val_list): _state = px.get_line_status(val_list) # [bool, bool, bool], 0 significa línea, 1 significa fondo if _state == [0, 0, 0]: return 'stop' elif _state[1] == 1: return 'forward' elif _state[0] == 1: return 'right' elif _state[2] == 1: return 'left'
Bucle principal:
El bucle
while True
verifica continuamente los datos de escala de grises y ajusta el movimiento del coche en consecuencia.Dependiendo del
gm_state
, ajusta el ángulo de dirección y la dirección de movimiento.if __name__=='__main__': try: while True: gm_val_list = px.get_grayscale_data() gm_state = get_status(gm_val_list) print("gm_val_list: %s, %s"%(gm_val_list, gm_state)) if gm_state != "stop": last_state = gm_state if gm_state == 'forward': px.set_dir_servo_angle(0) px.forward(px_power) elif gm_state == 'left': px.set_dir_servo_angle(offset) px.forward(px_power) elif gm_state == 'right': px.set_dir_servo_angle(-offset) px.forward(px_power) else: outHandle()
Seguridad y limpieza:
El bloque
try...finally
asegura que el coche se detenga cuando el script sea interrumpido o finalizado.finally: px.stop() print("stop and exit") sleep(0.1)
En resumen, el script utiliza sensores de escala de grises para navegar el coche robótico PiCarX. Lee continuamente los datos del sensor para determinar la dirección y ajusta el movimiento y la dirección del coche en consecuencia. La función outHandle proporciona lógica adicional para situaciones en las que el coche necesita ajustar significativamente su ruta.