Nota

¡Hola! Bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. ¡Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto con otros entusiastas!

¿Por qué unirte?

  • 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.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [here] y únete hoy.

11. Coche con Video

¡Este programa te proporcionará una Vista en Primera Persona desde el PiCar-X! Usa las teclas WSAD del teclado para controlar la dirección del movimiento, y las teclas O y P para ajustar la velocidad.

Ejecutar el Código

cd ~/picar-x/example
sudo python3 11.video_car.py

Una vez que el código esté en ejecución, podrás ver lo que PiCar-X está grabando y controlarlo presionando las siguientes teclas.

  • O: aumentar velocidad

  • P: disminuir velocidad

  • W: avanzar

  • S: retroceder

  • A: girar a la izquierda

  • D: girar a la derecha

  • F: detenerse

  • T: tomar foto

  • Ctrl+C: salir

Ver la Imagen

Después de ejecutar el código, el terminal mostrará el siguiente mensaje:

¡No hay escritorio!
* Sirviendo la aplicación Flask "vilib.vilib" (carga perezosa)
* Entorno: producción
ADVERTENCIA: No utilices el servidor de desarrollo en un entorno de producción.
Usa un servidor WSGI de producción.
* Modo de depuración: desactivado
* Ejecutando en http://0.0.0.0:9000/ (Presiona CTRL+C para salir)

Luego puedes ingresar http://<tu IP>:9000/mjpg en el navegador para ver la pantalla de video, por ejemplo: https://192.168.18.113:9000/mjpg

../_images/display.png

Código

#!/usr/bin/env python3

from robot_hat.utils import reset_mcu
from picarx import Picarx
from vilib import Vilib
from time import sleep, time, strftime, localtime
import readchar

import os
user = os.getlogin()
user_home = os.path.expanduser(f'~{user}')

reset_mcu()
sleep(0.2)

manual = '''
Press key to call the function(non-case sensitive):

    O: speed up
    P: speed down
    W: forward
    S: backward
    A: turn left
    D: turn right
    F: stop
    T: take photo

    Ctrl+C: quit
'''


px = Picarx()

def take_photo():
    _time = strftime('%Y-%m-%d-%H-%M-%S',localtime(time()))
    name = 'photo_%s'%_time
    path = f"{user_home}/Pictures/picar-x/"
    Vilib.take_photo(name, path)
    print('\nphoto save as %s%s.jpg'%(path,name))


def move(operate:str, speed):

    if operate == 'stop':
        px.stop()
    else:
        if operate == 'forward':
            px.set_dir_servo_angle(0)
            px.forward(speed)
        elif operate == 'backward':
            px.set_dir_servo_angle(0)
            px.backward(speed)
        elif operate == 'turn left':
            px.set_dir_servo_angle(-30)
            px.forward(speed)
        elif operate == 'turn right':
            px.set_dir_servo_angle(30)
            px.forward(speed)



def main():
    speed = 0
    status = 'stop'

    Vilib.camera_start(vflip=False,hflip=False)
    Vilib.display(local=True,web=True)
    sleep(2)  # espera a que arranque
    print(manual)

    while True:
         print("\rstatus: %s , speed: %s    "%(status, speed), end='', flush=True)
        # leer tecla
        key = readchar.readkey().lower()
        # operación
        if key in ('wsadfop'):
            # aceleración
            if key == 'o':
                if speed <=90:
                    speed += 10
            elif key == 'p':
                if speed >=10:
                    speed -= 10
                if speed == 0:
                    status = 'stop'
            # dirección
            elif key in ('wsad'):
                if speed == 0:
                    speed = 10
                if key == 'w':
                    # Límite de velocidad al retroceder, evitar corrientes instantáneas demasiado altas
                    if status != 'forward' and speed > 60:
                        speed = 60
                    status = 'forward'
                elif key == 'a':
                    status = 'turn left'
                elif key == 's':
                    if status != 'backward' and speed > 60: # Límite de velocidad al retroceder
                        speed = 60
                    status = 'backward'
                elif key == 'd':
                    status = 'turn right'
            # detener
            elif key == 'f':
                status = 'stop'
            # mover
            move(status, speed)
        # tomar foto
        elif key == 't':
            take_photo()
        # salir
        elif key == readchar.key.CTRL_C:
            print('\nquit ...')
            px.stop()
            Vilib.camera_close()
            break

        sleep(0.1)


if __name__ == "__main__":
    try:
        main()
    except Exception as e:
        print("error:%s"%e)
    finally:
        px.stop()
        Vilib.camera_close()