Tabla de contenido:

Tutorial de detección de objetos del robot cuadrúpedo Jetson Nano: 4 pasos
Tutorial de detección de objetos del robot cuadrúpedo Jetson Nano: 4 pasos

Video: Tutorial de detección de objetos del robot cuadrúpedo Jetson Nano: 4 pasos

Video: Tutorial de detección de objetos del robot cuadrúpedo Jetson Nano: 4 pasos
Video: Perro robot con IA supera las habilidades de los humanos en el fútbol | Avance de la IA de Google 2024, Junio
Anonim
Image
Image

Nvidia Jetson Nano es un kit de desarrollador, que consta de un SoM (System on Module) y una placa portadora de referencia. Está dirigido principalmente a la creación de sistemas integrados que requieren una alta potencia de procesamiento para aplicaciones de procesamiento de video, visión artificial y aprendizaje automático. Puede ver una revisión detallada en mi canal de YouTube.

Nvidia ha estado tratando de hacer que Jetson Nano sea lo más fácil de usar y fácil de desarrollar proyectos posible. Incluso lanzaron un pequeño curso sobre cómo construir su robot con Jetson Nano, días después del lanzamiento de la placa. Puede encontrar los detalles sobre ese proyecto aquí.

Sin embargo, yo mismo tuve algunos problemas con el Jetbot como proyecto:

1) No fue lo suficientemente EPIC para mí. Jetson Nano es una placa muy interesante con grandes capacidades de procesamiento y hacer un simple robot con ruedas parecía algo muy … decepcionante.

2) La elección del hardware. Jetbot requiere algún hardware que es costoso / puede reemplazarse con otras alternativas, por ejemplo, usan un joystick para la teleoperación. Suena divertido, pero ¿realmente necesito un joystick para controlar un robot?

Entonces, inmediatamente después de tener en mis manos Jetson Nano, comencé a trabajar en mi propio proyecto, un Jetspider. La idea era replicar las demostraciones básicas que tenía Jetbot, pero con hardware más común y aplicable a una variedad más amplia de proyectos.

Paso 1: Prepare su hardware

Prepare su hardware
Prepare su hardware

Para este proyecto utilicé un primer prototipo de robot cuadrúpedo Zuri, fabricado por Zoobotics. Estuvo en el laboratorio de nuestra empresa durante mucho tiempo. Lo equipé con un soporte de madera cortado con láser para Jetson Nano y un soporte para cámara. Su diseño es propietario, por lo que si para su robot Jetson Nano desea crear algo similar, puede echar un vistazo al proyecto Meped, que es un cuadrúpedo similar con un diseño de código abierto. De hecho, como nadie tenía el código fuente del microcontrolador de Zuri (Arduino Mega) en nuestro laboratorio, utilicé el código de Meped con algunos ajustes menores en la compensación de piernas / pies.

Usé una cámara web USB normal compatible con Raspberry Pi y un dongle USB Wifi.

El punto principal es que, dado que vamos a utilizar Pyserial para la comunicación en serie entre el microcontrolador y Jetson Nano, su sistema esencialmente puede usar cualquier tipo de microcontrolador, siempre que pueda conectarse con Jetson Nano con un cable serie USB. Si su robot utiliza motores de CC y un controlador de motor (por ejemplo, basado en L298P), es posible interactuar directamente con el controlador de motor Jetson Nano GPIO. Pero, desafortunadamente, para controlar los servos solo puede usar otro microcontrolador o un servocontrolador I2C dedicado, ya que Jetson Nano no tiene hardware GPIO PWM.

Para resumir, puede usar el tipo de robot con cualquier microcontrolador que se pueda conectar con Jetson Nano mediante un cable de datos USB. Subí el código para Arduino Mega al repositorio de github para este tutorial y la parte relevante para la interfaz Jetson Nano con Arduino está aquí:

if (Serial.available ()) {switch (Serial.read ()) {

{

caso 1':

hacia adelante();

rotura;

caso '2':

espalda();

rotura;

caso '3':

Gire a la derecha();

rotura;

caso '4':

Gire a la izquierda();

rotura;

Verificamos si hay datos disponibles y, si los hay, los pasamos a la estructura de control de la caja del interruptor. Preste atención, que los datos de la serie vienen como caracteres, observe las comillas simples alrededor de los números 1, 2, 3, 4.

Paso 2: instale los paquetes necesarios

Afortunadamente para nosotros, la imagen predeterminada del sistema Jetson Nano viene con muchas cosas preinstaladas (como OpenCV, TensorRT, etc.), por lo que solo necesitamos instalar un par de otros paquetes para que el código funcione y habilite SSH.

Comencemos habilitando SSH en caso de que desee hacer todo el resto del trabajo de forma remota.

actualización de sudo apt

sudo apt instalar openssh-server

El servidor SSH se iniciará automáticamente.

Para conectarse a su máquina Ubuntu a través de LAN, solo necesita ingresar el siguiente comando:

ssh username @ ip_address

Si tiene una máquina con Windows, deberá instalar el cliente SSH, por ejemplo, Putty.

Comencemos instalando Python Package Manager (pip) y Pillow para la manipulación de imágenes.

sudo apt instalar python3-pip python3-pil

Luego instalaremos el repositorio de Jetbot, ya que confiamos en algunas partes de su marco para realizar la detección de objetos.

sudo apt install python3-smbus python-pyserial

clon de git

cd jetbot

sudo apt-get install cmake

sudo python3 setup.py instalar

Finalmente, clone mi repositorio de Github para este proyecto en su carpeta de inicio e instale Flask y algunos otros paquetes para el control remoto del robot mediante el servidor web.

clon de git

CD

sudo pip3 install -r requirements-opencv

Descargue el modelo SSD (Single Shot Detector) previamente entrenado desde este enlace y colóquelo en la carpeta jetspider_demos.

¡Ahora estamos listos para ir!

Paso 3: Ejecute el código

Ejecuta el código
Ejecuta el código

Hice dos demostraciones para Jetspider, la primera es una teleoperación simple, muy similar a la que hice anteriormente para el rover Banana Pi y la segunda usa TensorRT para la detección de objetos y envía los comandos de movimiento a través de la conexión en serie al microcontrolador..

Dado que la mayor parte del código de teleoperación se describe en mi otro tutorial (solo hice algunos ajustes menores, volviendo a calificar la transmisión de video) aquí me centraré en la parte de Detección de objetos.

El script principal para el seguimiento de objetos es object_following.py en jetspider_object_following, para la teleoperación es spider_teleop.py en jetspider_teleoperation.

El siguiente script del objeto comienza con la importación de los módulos necesarios y la declaración de variables e instancias de clase. Luego iniciamos el servidor web Flask con esta línea

app.run (host = '0.0.0.0', subproceso = Verdadero)

Tan pronto como abramos la dirección 0.0.0.0 (localhost) en nuestro navegador web o la dirección Jetson Nano en la red (puede verificar con el comando ifconfig), esta función se ejecutará

def index ():

Muestra la plantilla de la página web que tenemos en la carpeta de plantillas. La plantilla tiene una fuente de video incrustada, por lo que una vez que termine de cargarse, se ejecutará def video_feed (): que devuelve un objeto Response que se inicializa con la función generadora.

El secreto para implementar actualizaciones en el lugar (actualizar la imagen en la página web para nuestra transmisión de video) es usar una respuesta de varias partes. Las respuestas de varias partes consisten en un encabezado que incluye uno de los tipos de contenido de varias partes, seguido de las partes, separadas por un marcador de límite y cada una tiene su propio tipo de contenido específico de parte.

En def gen (): función implementamos la función del generador en un bucle infinito que captura la imagen, la envía a def execute (img): function, produciendo una imagen para ser enviada a la página web después de eso.

def execute (img): la función es donde ocurre toda la magia, toma una imagen, la redimensiona con OpenCV y la pasa a la instancia de clase Jetbot ObjectDetector "modelo". Devuelve devuelve la lista de detecciones y usamos OpenCV para dibujar rectángulos azules alrededor de ellos y escribir anotaciones con la clase de objeto detectado. Después de eso, verificamos si hay un objeto de nuestro interés detectadomatching_detections = [d for d in detections [0] if d ['label'] == 53]

Puede cambiar ese número (53) a otro número del conjunto de datos CoCo si desea que su robot siga otros objetos, 53 es una manzana. La lista completa está en el archivo categorías.py.

Finalmente, si no se detecta ningún objeto durante 5 segundos, transmitimos el carácter "5" para que el robot se detenga sobre la serie. Si se encuentra un objeto, calculamos qué tan lejos está del centro de la imagen y actuamos en consecuencia (si está cerca del centro, siga recto (carácter "1" en la serie), si está a la izquierda, vaya a la izquierda, etc.). ¡Puede jugar con esos valores para determinar el mejor para su configuración particular!

Paso 4: Pensamientos finales

Pensamientos finales
Pensamientos finales

Esta es la esencia de la demostración de ObjectFollowing, si desea saber más sobre la transmisión de video del servidor web Flask, puede echar un vistazo a este gran tutorial de Miguel Grinberg.

También puede echar un vistazo al portátil Nvidia Jetbot Object Detection aquí.

Espero que mis implementaciones de demostraciones de Jetbot ayuden a construir su robot utilizando el marco de Jetbot. No implementé la demostración para evitar obstáculos, ya que creo que la elección del modelo no producirá buenos resultados para evitar obstáculos.

Agrégame en LinkedId si tienes alguna pregunta y suscríbete a mi canal de YouTube para recibir notificaciones sobre proyectos más interesantes relacionados con el aprendizaje automático y la robótica.

Recomendado: