Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
UNIVERSIDAD TECNOLÓGICA NACIONAL FACULTAD REGIONAL SAN NICOLÁS INGENIERÍA ELECTRÓNICA Problema de Ingeniería: TÉCNICAS DIGITALES III APLICACIÓN DE VISIÓN ARTIFICIAL EN PLATAFORMAS VOLCADORAS Integrantes: Cardozo, Blas E. Cuccioletta, Federico G. Isidro, Marco J. Manavella, Nicolás J., Docentes: - Profesor: Poblete Felipe - Auxiliar: González Mariano AÑO 2021 ÍNDICE Objetivo 2 Materias Integradoras 2 Problema 3 Propuesta y Alcance 3 Estrategia de Desarrollo 4 Fundamentos Teóricos 5 Visión artificial 5 Proceso de descarga en plataformas volcadoras 6 Librerías de Python 7 OpenCV 7 Python-Snap7 7 Entornos Virtuales 8 SQLServer 8 Funcionamiento 8 Servicios, herramientas y ediciones de SQL Server 9 RGB y HSV 10 Protocolos que intervienen en el proyecto 12 ProfiBus 12 TCP/IP 13 Modelo OSI 16 RTSP 19 Desarrollo 20 Introducción 20 Conexión con el proceso 20 Iluminación de la zona de análisis 21 Introducción al desarrollo del código 22 Pruebas anteriores a la implementación final 23 Detección de Color 23 Detección de Movimiento 24 Visión general del código y diagramas en bloques 25 Hilo de comunicación con la cámara 26 Hilo de comunicación con el PLC 28 Hilo principal 30 Detalles del Multiprocesamiento 32 Problema de Ingeniería- Técnicas Digitales III 1 Estimación categórica del caudal 32 Comunicación con la base de datos 36 Conclusiones 38 Posibles mejoras y extensiones 38 Seguridad 39 Seguridad en el proceso 39 Seguridad en el código 39 Anexos 40 Código detección de color 40 Código detección de movimiento 41 Código Completo 42 Hoja de datos del inclinómetro 48 Bibliografía 49 Problema de Ingeniería- Técnicas Digitales III 2 Objetivo El objetivo del trabajo es la resolución de un problema real de ingeniería. Para ello, también es necesario utilizar los conocimientos adquiridos tanto en la materia de Técnicas Digitales III como en el resto de las materias de Ingeniería Electrónica. En nuestro caso se optó por resolver un problema que tenía una empresa en su sistema de descarga de camiones. Luego de analizar el problema, se determinó el alcance del proyecto de ingeniería. Para resolverlo fue necesario utilizar, investigar y estudiar conceptos de programación, visión artificial, redes de comunicación, protocolos de comunicación, seguridad, iluminación y electricidad. El objetivo principal es resolver el problema que tiene la empresa: la detección de la descarga de granos en los camiones cuando están siendo inclinados por las plataformas volcadoras. ● Resolver el problema de ingeniería. ● Adquirir los conocimientos técnicos necesarios para la resolución del proyecto. ● Aprender a resolver un problema en conjunto con los compañeros. Materias Integradoras Dicho proyecto, además de los fundamentos matemáticos, físicos y de programación adquiridos en los primeros años de la carrera, se integran principalmente los conocimientos de la materia electiva “Inteligencia Artificial Aplicada a la Ingeniería” y la materia en la que se desarrollara el proyecto “Técnicas Digitales III”. En cuanto a la materia de Técnicas digitales se hace uso de los conceptos desarrollados en la unidad 5 del apunte de cátedra, es decir, la arquitectura de las computadoras personales, más específicamente los temas relacionados con el video y las tarjetas gráficas. Por otro lado, de la materia de Inteligencia Artificial Aplicada a la Ingeniería, se van a obtener todos los conceptos básicos relacionados con la inteligencia artificial, ya sea para el posible uso de redes neuronales como de otros métodos utilizados en la industria actualmente. Por otro lado, se utilizaron los conocimientos sobre PLC desarrollados en la materia de “Tecnologías Electrónicas” y los principios de programación dados en las materias “Informática I y II”, además de los conocimientos adquiridos en el ámbito laboral. Problema de Ingeniería- Técnicas Digitales III 3 Problema Para el presente trabajo se optó por resolver una problemática presentada por la empresa Bunge Argentina en su complejo industrial de Ramallo. Bunge LTD es una de las principales compañías de agronegocios en el país. La problemática presentada por la empresa consiste en la necesidad de un sistema de detección para la descarga de granos (soja, maíz, girasol o sorgo) en los camiones ubicados sobre las plataformas volcadoras. En caso de que el camión esté posicionado en la plataforma, la misma comience a inclinarse y la puerta trasera del acoplado permanezca cerrada como consecuencia de una fallà mecánica o un error del operador, se corre el riesgo de que se rompan las trabas de seguridad y colapse el acoplado debido al peso generado por la carga, produciendo grandes pérdidas económicas y generando la posibilidad de que ocurra un accidente grave con los operadores y camioneros. Para evitar y aumentar las medidas de seguridad en las operaciones con las plataformas volcadoras, se desarrollará un sistema de detección que le pueda avisar al operario de la plataforma, si el proceso está en condiciones de accionarse. Propuesta y Alcance Debido a que Bunge, mediante un servicio tercerizado, probó varias alternativas para la detección de granos desde los camiones y resultaron no tener resultados satisfactorios, se optó por el desarrollo de un sistema de visión artificial, buscando mejorar los resultados previos y resolver la problemática. Luego de ponernos en contacto con Bunge, identificamos nuevas problemáticas dentro del mismo proceso, que de resolverse se conseguiría un aumento de productividad y eliminación de posibles gastos futuros. En base a estas problemáticas, el sistema de visión artificial integrará las siguientes funcionalidades: ● Detección de la caída de granos, siendo este el punto central del proyecto y la problemática inicial. ● Estimación categórica del caudal de grano que se está depositando. ● Medición del tiempo de descarga de los camiones. Cabe aclarar, que nuestra solución va a ser funcional solamente para camiones con acoplados, ya que aquellos que no cuenten con uno van a posicionarse más lejos de la cámara siendo necesaria la utilización de una red neuronal que identifique la puerta trasera de los camiones. Ya que un camión sin acoplado no ejerce la misma fuerza en posición suspendida y no se cuenta con el material necesario para entrenar la red neuronal, se optó por limitar la funcionalidad del software de visión artificial implementado. Problema de Ingeniería- Técnicas Digitales III 4 Estrategia de Desarrollo Para la realización del trabajo se debe realizar las siguientes tareas que se pueden dividir en los temas de investigación, desarrollo y pruebas. En tareas de investigación se pueden destacar el aprendizaje de los conceptos básicos de python orientados a la visión artificial, más específicamente de la librería OpenCV, así como la composición de imágenes y propiedades de los videos. Además, se investigará en temas de iluminación, ya que la misma juega un papel fundamental en la visión artificial. Una vez terminada la investigación previa necesaria para el desarrollo del trabajo, se abordará el problema de forma segmentada con el objetivo de lograr un flujo de trabajo equilibrado entre los integrantes del proyecto. En un principio se harán pruebas en los conceptos básicos de detección, como lo pueden ser el color o el movimiento; posteriormente se optara por la mejor combinación de los mismos teniendo en cuenta la problemática con la que se trata. Además, se destinará un tiempo al mejoramiento de la experiencia de usuario del sistema desarrollado. Finalmente, se implementarán pruebas en el sistema desarrollado para determinar el grado de exactitud con el que opera, y de ser insuficiente parala aplicación, se volverá a la etapa de desarrollo hasta lograr resultados satisfactorios. Cabe destacar que en una etapa anterior al desarrollo del proyecto, y a lo largo del proyecto se llevarán a cabo reuniones virtuales con el encargado del sector en Bunge Argentina, con el objetivo de tener material de trabajo (videos del proceso principalmente) y resolver posibles conflictos que se puedan presentar. Problema de Ingeniería- Técnicas Digitales III 5 Fundamentos Teóricos En esta sección vamos a desarrollar los conceptos básicos de los fundamentos teóricos utilizados para la resolución del problema de ingeniería en la descarga de plataformas volcadoras. Visión artificial Es una pequeña parte de la inteligencia artificial. La visión artificial se centra básicamente en técnicas que permiten a los dispositivos poder ver, identificar y procesar imágenes similar o igual a como lo hace la visión humana, esto puede ser tanto de manera automática como asistida por una persona. Estas técnicas por medio de software y hardware, pueden ser tales como la iluminación, la captación y digitalización de la imagen, el pre-procesamiento, el procesamiento y la comunicación de los resultados. En pocas palabras, la tecnología de visión artificial proporciona a los equipos industriales la capacidad de "ver" lo que están haciendo y tomar decisiones rápidas en función de lo que ven. Los usos más comunes de la visión artificial son la inspección visual y la detección de defectos, la colocación y medición de piezas, además de identificar, clasificar y rastrear productos. La visión artificial es una de las tecnologías fundacionales de la automatización industrial. Ha ayudado a mejorar la calidad de los productos, a acelerar la producción y a optimizar la fabricación y la logística durante décadas. Y ahora, esta tecnología contrastada, se fusiona con la inteligencia artificial para liderar la transición hacia la industria 4.0. Los principales componentes de un sistema de visión artificial incluyen la iluminación, los lentes, el sensor de imagen, el procesador de visión y las comunicaciones. La iluminación ilumina la pieza a inspeccionar o el proceso sobre el cual se quiere trabajar, y permite que sus características sobresalgan para que la cámara las pueda ver claramente. El lente captura la imagen y se la presenta al sensor en forma de luz. El sensor en una cámara de visión artificial convierte esta luz en una imagen digital que, luego, se envía al procesador para ser analizada. El procesador de visión consta de algoritmos que controlan la imagen y extraen la información necesaria, ejecutan la inspección correspondiente y toman una decisión. Finalmente, la información generada es enviada a un dispositivo que registra y/o utiliza la misma. Figura 1: Componentes principales de un sistema de visión artificial Problema de Ingeniería- Técnicas Digitales III 6 Proceso de descarga en plataformas volcadoras El área de logística en la planta de Bunge cuenta con un sector techado donde se encuentran cuatro plataformas volcadoras en paralelo. El proceso comienza formando una fila de camiones a la espera de su turno. Una vez que un camión debe ingresar a descargar sus granos, un operador se encarga de darle aviso para que se posicione sobre una plataforma volcadora. El operador y sus asistentes se aseguran que el camión esté colocado en la posición adecuada dependiendo del tamaño del mismo. Luego, el conductor se retira del vehículo y los operadores ponen en posición los tacos de traba de las ruedas del camión. Otro operador se encarga de abrir todas las compuertas laterales y traseras de los acoplados para que, una vez inclinado, todo el producto caiga por estas aperturas. Todo este proceso es monitoreado por otro operador ubicado en una cabina. Esta cabina cuenta con un gabinete tipo consola donde se ubica la botonera para operar la plataforma, también posee una pantalla HMI Siemens donde visualiza el scada con los valores de los sensores pertinentes a la plataforma (Inclinómetro de la plataforma, desplazamiento de los pistones, corriente de los motores y otros) y, además, otra pantalla donde observa una imagen de vídeo panorámica de toda la plataforma volcadora. Cuando todo está en posición, los operadores se retiran y se da la orden de elevar la plataforma volcadora. La misma se inclina hasta unos 50º aproximadamente, permitiendo que todo el grano descienda de los acoplados. El grano cae en dirección a unas rejillas donde es redireccionado a una cinta transportadora que se encuentra en el subsuelo de las plataformas. Luego, según el tipo de grano, se hace una combinación de cintas para que el material se dirija a la celda o silo que corresponda. El proceso exige la participación de un grupo de 6 o 7 operadores que son los encargados de hacer el paso a paso de este. No hay ninguna automatización. Problema de Ingeniería- Técnicas Digitales III 7 Librerías de Python OpenCV OpenCV (Open Source Computer Vision Library) es una biblioteca de software de visión artificial y aprendizaje automático de código abierto. OpenCV se creó para proporcionar una infraestructura común para aplicaciones de visión por computadora y para acelerar el uso de la percepción de la máquina en los productos comerciales. Al ser un producto con licencia BSD, OpenCV facilita que las empresas utilicen y modifiquen el código. Tiene interfaces C ++, Python, Java y MATLAB y es compatible con Windows, Linux, Android y Mac OS. Python-Snap7 Snap7 es un software multi plataforma para comunicarse de igual manera que lo harían de forma nativa PLCs del fabricante SIEMENS empleando tecnología Ethernet y protocolo S7. Con Snap 7 podremos imitar ciertas comunicaciones y comportamientos de igual modo que lo hicimos con Modbus en la entrada “Simulador de Protocolo MODBUS”. Entre sus características principales destacan: ● Arquitectura diseñada para 32 y 64 bits. ● Software Open Source. ● Soporte para varios sistemas operativos, Windows, Linux, MacOSX, etc. ● Soporte para varios tipos de CPU. ● No son necesarios librerías de terceros. ● No es necesaria su instalación. ● Modelos de transmisión de información síncrona como asíncrona. ● Se incluyen algunas demos para su uso directo. Problema de Ingeniería- Técnicas Digitales III 8 Entornos Virtuales Las aplicaciones en Python usualmente hacen uso de paquetes y módulos que no forman parte de la librería estándar. Las aplicaciones a veces necesitan una versión específica de una librería, debido a que dicha aplicación requiere que un bug particular haya sido solucionado o bien la aplicación ha sido escrita usando una versión obsoleta de la interfaz de la librería. Esto significa que tal vez no sea posible para una instalación de Python cumplir los requerimientos de todas las aplicaciones. Si la aplicación A necesita la versión 1.0 de un módulo particular y la aplicación B necesita la versión 2.0, entonces los requerimientos entran en conflicto e instalar la versión 1.0 o 2.0 dejará una de las aplicaciones sin funcionar. La solución a este problema es crear un entorno virtual, un directorio que contiene una instalación de Python de una versión en particular, además de unos cuantos paquetes adicionales. Diferentes aplicaciones pueden entonces usar entornos virtuales diferentes. Para resolver el ejemplo de requerimientos en conflicto citado anteriormente, la aplicación A puede tener su propio entorno virtual con la versión 1.0 instalada mientras que la aplicación B tiene otro entorno virtual con la versión 2.0. Si la aplicación B requiere actualizar la librería a la versión 3.0, ésto no afectará el entorno virtual de la aplicación A. El script usado para crear y manejar entornos virtuales en python es pyvenv. Pyvenv normalmente instalará la versiónmas reciente de Python que tengas disponible; el script también es instalado con un número de versión, con lo que si tienes múltiples versiones de Python en tu sistema puedes seleccionar una versión de Python específica ejecutando python3 o la versión que desees. SQLServer Microsoft SQL Server es un sistema de gestión de bases de datos relacionales (RDBMS), desarrollado por la empresa Microsoft. El mismo, se basa en SQL, un lenguaje de programación estandarizado que los administradores de bases de datos (DBA) y otros profesionales de TI utilizan para gestionar las bases de datos y consultar los datos que contienen. Funcionamiento SQL Server se construye principalmente en torno a una estructura de tablas basada en filas que conecta los elementos de datos relacionados en diferentes tablas entre sí, evitando la necesidad de almacenar datos de forma redundante en varios lugares dentro de una base de datos. El modelo relacional también proporciona integridad referencial y otras restricciones de integridad para mantener la exactitud de los datos. Estas comprobaciones forman parte de una adhesión más amplia a los principios de atomicidad, consistencia, aislamiento y durabilidad, conocidos colectivamente como propiedades ACID, y están diseñadas para garantizar que las transacciones de la base de datos se Problema de Ingeniería- Técnicas Digitales III 9 procesen de forma fiable. El componente principal de Microsoft SQL Server es el motor de base de datos de SQL Server, que controla el almacenamiento, el procesamiento y la seguridad de los datos. Incluye un motor relacional que procesa los comandos y las consultas y un motor de almacenamiento que gestiona los archivos de la base de datos, las tablas, las páginas, los índices, los búferes de datos y las transacciones. El motor de base de datos también crea y ejecuta procedimientos almacenados, desencadenantes, vistas y otros objetos de la base de datos. Debajo del motor de base de datos se encuentra el sistema operativo de SQL Server, o SQLOS. SQLOS se encarga de las funciones de nivel inferior, como la gestión de la memoria y la E/S, la programación de trabajos y el bloqueo de datos para evitar actualizaciones conflictivas. Por encima del motor de base de datos se encuentra una capa de interfaz de red que utiliza el protocolo Tabular Data Stream de Microsoft para facilitar las interacciones de solicitud y respuesta con los servidores de base de datos. Y a nivel de usuario, los administradores de bases de datos y desarrolladores de SQL Server escriben sentencias T-SQL para construir y modificar estructuras de bases de datos, manipular datos, implementar protecciones de seguridad y realizar copias de seguridad de las bases de datos, entre otras tareas. Servicios, herramientas y ediciones de SQL Server Microsoft también incluye una variedad de herramientas de gestión de datos, inteligencia empresarial (BI) y análisis con SQL Server. Además de la tecnología R Services y ahora Machine Learning Services, que apareció por primera vez en SQL Server 2016, las ofertas de análisis de datos incluyen SQL Server Analysis Services, un motor analítico que procesa los datos para su uso en aplicaciones de BI y visualización de datos, y SQL Server Reporting Services, que admite la creación y entrega de informes de BI. En cuanto a la gestión de datos, Microsoft SQL Server incluye SQL Server Integration Services, SQL Server Data Quality Services y SQL Server Master Data Services. El SGBD también incluye dos conjuntos de herramientas para administradores de bases de datos y desarrolladores: SQL Server Data Tools, para el desarrollo de bases de datos, y SQL Server Management Studio, para el despliegue, la supervisión y la gestión de bases de datos. Problema de Ingeniería- Técnicas Digitales III 10 RGB y HSV RGB (sigla en inglés de red, green, blue, en español «rojo, verde y azul») es la composición del color en términos de la intensidad de los colores primarios de la luz. Figura 2: Distribución de color RGB Este sistema se basa principalmente en el modo en que los colores aditivos se representan en las pantallas que emiten luz (no se relaciona con la pigmentación, como impresoras, que utilizan la codificación de colores sustractivos CMYK), ya que estas se componen de píxeles, que son pequeñas fracciones de la pantalla que emiten luz roja, verde y azul en diferentes intensidades. La intensidad de cada una de las componentes se mide según una escala que va del 0 al 255 (ya que por estándar se utilizan 8 bits), y cada color es definido por un conjunto de valores escritos entre paréntesis (correspondientes a valores "R", "G" y "B") entre comillas y separados por comas. De este modo, el rojo se obtiene con (255,0,0), el verde con (0,255,0) y el azul con (0,0,255), obteniendo, en cada caso un color resultante monocromático. La ausencia de color, es decir el color negro, se obtiene cuando las tres componentes son 0: (0,0,0). La combinación de dos colores a su máximo valor de 255 con un tercero con valor 0 da lugar a tres colores intermedios. De esta forma, aparecen los colores amarillo (255,255,0), cian (0,255,255) y magenta (255,0,255). El color blanco se forma con los tres colores primarios a su máximo valor (255,255,255). Por otro lado, el modelo HSV (del inglés Hue, Saturation, Value – Matiz, Saturación, Valor), también llamado HSB (Hue, Saturation, Brightness – Matiz, Saturación, Brillo), define un modelo de color en términos de sus componentes. Figura 3: Distribución de color HSV Problema de Ingeniería- Técnicas Digitales III 11 MATIZ: Se representa como un grado de ángulo cuyos valores posibles van de 0 a 360° (aunque para algunas aplicaciones se normalizan del 0 al 100%). Cada valor corresponde a un color. Disponemos de 360 grados dónde se dividen los 3 colores RGB, eso da un total de 120º por color, sabiendo esto podemos recordar que el 0 es rojo RGB(1, 0, 0), 120 es verde RGB(0, 1, 0) y 240 es azul RGB(0, 0, 1). Para colores mixtos se utilizan los grados intermedios, el amarillo, RGB(1, 1, 0) está entre rojo y verde, por lo tanto 60º. ● 0º = RGB(1, 0, 0) ● 60º = RGB(1, 1, 0) ● 120º = RGB(0, 1, 0) ● 180º = RGB(0, 1, 1) ● 240º = RGB(0, 0, 1) ● 300º = RGB(1, 0, 1) ● 360º = 0º SATURACIÓN: Se representa como la distancia al eje de brillo negro-blanco. Los valores posibles van del 0 al 100%. A este parámetro también se le suele llamar "pureza" por la analogía con la pureza de excitación y la pureza colorimétrica de la colorimetría. Cuanto menor sea la saturación de un color, mayor tonalidad grisácea habrá y más decolorado estará. VALOR: Representa la altura en el eje blanco-negro. Los valores posibles van del 0 al 100%. 0 (cero) siempre es negro. Dependiendo de la saturación, 100 podría ser blanco o un color más o menos saturado. Problema de Ingeniería- Técnicas Digitales III 12 Protocolos que intervienen en el proyecto ProfiBus PROFIBUS (Process Field Bus) es un estándar de red digital de campo abierto (bus de campo) que se encarga de la comunicación entre los sensores de campo y el sistema de control o los controladores. La primera idea durante su desarrollo fue la de implementar soluciones PROFIBUS en industrias de automatización de fábricas, luego en industrias de procesos, fabricación, etc. Esta red de comunicación es adecuada tanto para aplicaciones rápidas y sensibles como para tareas de comunicación complejas. En cuanto al desarrollo, la tecnología Process Field Bus es estable y está en constante evolución de desarrollo. La tecnología de la información desempeñó un papel decisivo en el desarrollo de la automatización industrial y cambió las jerarquías y estructuras de las empresas. En la actualidad, ha llegado al entorno industrial y a sus diversos sectores, desde las industriasde proceso y fabricación hasta los edificios y sistemas logísticos. La posibilidad de comunicación entre los dispositivos y el uso de mecanismos estandarizados, abiertos y flexibles son componentes esenciales del concepto de automatización actual. La comunicación se expande rápidamente en la dirección horizontal a nivel de campo, así como en la dirección vertical integrando todos los niveles jerárquicos de un sistema de automatización. De acuerdo con las características de la aplicación y el coste máximo a alcanzar, una combinación gradual de diferentes sistemas de redes de comunicación industrial como Ethernet Industrial, PROFIBUS y AS-Interface son las condiciones de red abierta ideales para los procesos industriales. En cuanto a los actuadores/sensores, el AS-Interface es el sistema de comunicación de datos perfecto, ya que las señales de datos binarias se transmiten a través de un bus de datos extremadamente sencillo y de bajo coste, junto con la fuente de alimentación de 24Vdc necesaria para alimentar dichos sensores y actuadores. Otra característica importante es que los datos se transmiten en ciclos, de forma muy eficiente y rápida. A nivel de campo, los periféricos distribuidos, como módulos de E/S, transductores, accionamientos, válvulas y paneles de operación funcionan en los sistemas de automatización, a través de un eficiente sistema de comunicación en tiempo real, el PROFIBUS DP o PA. La transmisión de datos de proceso se realiza en ciclos, mientras que las alarmas, los parámetros y los diagnósticos se transmiten sólo cuando es necesario, de forma no cíclica. En lo que respecta a las células, los controladores programables como los PLC y los ordenadores de ingeniería necesitan comunicarse entre sí, por lo tanto requieren que se transfiera un gran paquete de datos en varias y potentes funciones de comunicación. Además, la integración eficiente en los sistemas de comunicación corporativos existentes, como Intranet, Internet y Ethernet es absolutamente obligatoria. Esta necesidad se satisface mediante el protocolo PROFINET. La revolución de la comunicación industrial en la tecnología juega un papel fundamental en la optimización de los sistemas de proceso y ha hecho una valiosa contribución para mejorar el uso de los recursos. Problema de Ingeniería- Técnicas Digitales III 13 TCP/IP Los protocolos son conjuntos de normas para formatos de mensaje y procedimientos que permiten a las máquinas y los programas de aplicación intercambiar información. Cada máquina implicada en la comunicación debe seguir estas normas para que el sistema principal de recepción pueda interpretar el mensaje. El conjunto de protocolos TCP/IP puede interpretarse en términos de capas (o niveles). El modelo TCP/IP describe la funcionalidad de los protocolos que forman la suite de protocolos TCP/IP. Estos protocolos, que se implementan en los hosts emisores y receptores, interactúan para brindar una entrega extremo a extremo de las aplicaciones a través de la red. Figura 4: Capas del protocolo TCP/IP Problema de Ingeniería- Técnicas Digitales III 14 Capa de aplicación: Representa datos para el usuario más el control de la codificación y de dialogo. Ofrece a las aplicaciones la capacidad de acceder a los servicios de las otras capas y define los protocolos que utilizan las aplicaciones para intercambiar datos. Los protocolos de la capa de aplicación más conocidos son HTTP, FTP, SMTP, Telnet, DNS, SNMP y el Protocolo de información de enrutamiento (RIP). Capa de transporte: Admite la comunicación entre distintos dispositivos de distintas redes. Se encarga de proporcionar comunicación de sesión y datagrama a la capa de aplicación de servicios . Los protocolos principales de esta capa son TCP y UDP. TCP proporciona un servicio de comunicaciones individual, fiable y orientado a la conexión. Es responsable de la secuenciación y detección de los paquetes enviados y de la recuperación de los paquetes perdidos en la transmisión. UDP proporciona un servicio de comunicaciones individual o grupal, sin conexión y poco fiable. Este se utiliza normalmente cuando la cantidad de datos a transferir es pequeña, como por ejemplo cuando estos caben en un solo paquete. Capa de internet: Determina la mejor ruta a través de la red, es responsable de las funciones de direccionamiento, empaquetado y enrutamiento del host. Los protocolos centrales de la capa de Internet son IP, Protocolo de resolución de direcciones (ARP), Protocolo de mensajes de control de Internet (ICMP) y Protocolo de administración de grupos de Internet (IGMP). En esta capa, el IP agrega la cabecera a los paquetes, lo que se conoce como dirección IP. En la actualidad existen tanto dirección IPv4 (32 bits) como dirección IP IPv6 (128 bits). Capa de acceso a la red: La capa de acceso a la red (o capa de enlace) es responsable de colocar los paquetes TCP/IP en el portador de datos de la red y recibir los paquetes TCP/IP situados fuera del mismo. El protocolo TCP/IP está diseñado para ser independiente del método de acceso a la red, el formato de la trama de red y el potador. En otras palabras, este protocolo es independiente de cualquier tecnología de red específica, lo que hace que este se pueda utilizar para conectar diferentes tipos de red, como Ethernet, Token Ring y Modo de transferencia asíncrono (ATM). TCP/IP define cuidadosamente cómo se mueve la información desde el remitente hasta el destinatario. En primer lugar, los programas de aplicación envían mensajes o corrientes de datos a uno de los protocolos de la capa de transporte de Internet, UDP (User Datagram Protocol) o TCP (Transmission Control Protocolo). Estos protocolos reciben los datos de la aplicación, los dividen en partes más pequeñas llamadas paquetes, añaden una dirección de destino y, a continuación, pasan los paquetes a la siguiente capa de protocolo, la capa de red de Internet. La capa de red de Internet pone el paquete en un datagrama de IP (Internet Protocol), pone la cabecera y la cola de datagrama, decide dónde enviar el datagrama (directamente a un destino o a una pasarela) y pasa el datagrama a la capa de interfaz de red. La capa de interfaz de red acepta los datagramas IP y los transmite como tramas a través de un hardware de red específico, por ejemplo redes Ethernet o de Red en anillo. Problema de Ingeniería- Técnicas Digitales III 15 Protocolos principales de TCP/IP Problema de Ingeniería- Técnicas Digitales III 16 Modelo OSI El modelo OSI fue desarrollado en 1984 por la organización ISO (International Organization for Standarization). Este estándar perseguía el ambicioso objetivo de conseguir interconectar sistema de procedencia distinta para que esto pudieran intercambiar información sin ningún tipo de impedimentos debido a los protocolos con los que estos operaban de forma propia según su fabricante. El modelo OSI está conformado por 7 capas o niveles de abstracción. Cada uno de estos niveles tendrá sus propias funciones para que en conjunto sean capaces de poder alcanzar su objetivo final. Precisamente esta separación en niveles hace posible la intercomunicación de protocolos distintos al concentrar funciones específicas en cada nivel de operación. Otra cosa que debemos tener muy presente es que el modelo OSI no es la definición de una topología ni un modelo de red en sí mismo. Tampoco especifica ni define los protocolos que se utilizan en la comunicación, ya que estos están implementados de forma independiente a este modelo. Lo que realmente hace OSI es definir la funcionalidad de ellos para conseguir un estándar. Niveles que componen el modelo OSI Problema de Ingeniería- Técnicas Digitales III 17 La capa de aplicación: proporciona los servicios utilizados por las aplicaciones para quelos usuarios se comuniquen a través de la red. Es el nivel más cercano al usuario. La capa de presentación: define el formato de los datos que se van a intercambiar entre las aplicaciones, ofreciendo un conjunto de servicios para la transformación de datos. La capa de sesión: proporciona los mecanismos para controlar el diálogo entre las aplicaciones de los sistemas finales: abre, mantiene y cierra la sesión entre dos sistemas. La capa de transporte: permite intercambiar datos entre sistemas finales, dividiendo el mensaje en varios fragmentos. El servicio de transporte puede ser orientado o no orientado a conexión, tomando en cuenta la unidad de transferencia máxima (MTU). La capa de red: se encarga de definir el camino que seguirán los datos desde el origen hasta su destino a través de una o más redes conectadas mediante dispositivos de enrutamiento (router). La capa de enlace: se ocupa del direccionamiento físico dentro de cualquier topología de red, esta capa nos permite activar, mantener y deshabilitar la conexión, así como la notificación de errores. La capa física: controla las señales por donde viajaran los datos (cable de par trenzado, fibra óptica, radio frecuencia). Nombres y funciones básicas de cada una de las capas Problema de Ingeniería- Técnicas Digitales III 18 Capas con el modelos TCP/IP y OSI Ambos modelos son de gran importancia al momento de estudiar las comunicaciones en redes, ya que definen la comunicación por medio de una arquitectura basada en capas. Sin embargo, existen algunas características entre uno y otro que los hacen diferentes, aunque el propósito para el que fueron creados sea el mismo. En lo que se refiere al modelo OSI, se trata de un conjunto de siete capas, siendo la capa de aplicación la más cercana al usuario y la capa física la más alejada a él. En cada una de sus capas se ofrece un servicio que contribuye con una parte de la comunicación, dicho servicio es implementado a través de un protocolo y la manera de comunicarse con sus capas adyacentes es llevada a cabo mediante el establecimiento de una interfaz, es decir, la capa n solo puede comunicarse con las capas n-1 y n+1, siendo la capa física la que realmente conecta a ambas máquinas, ya que es a través de esta donde fluyen los mensajes en forma de bits. Durante el envío de un mensaje desde una máquina A hacia otra máquina B, el mensaje debe iniciar su viaje desde la capa de aplicación de la maquina A, hacer un descenso en cada una de sus capas hasta llegar a la capa física (encapsulamiento). Una vez que esto sucede, el mensaje debe viajar por el medio (en forma de señales eléctricas o electromagnéticas) hasta llegar a la maquina B, donde será recibido por la capa física y transferido a sus capas superiores para llevar a cabo el proceso inverso (desencapsulamiento), la transmisión concluye cuando el mensaje llega a la capa de aplicación en B. Sin embargo, aunque OSI es un excelente modelo, solo ha servido como referente teórico por lo general y detallado que es; mientras que en términos prácticos se opta por TCP/IP debido a que los protocolos para este último son más adecuados a la realidad. Problema de Ingeniería- Técnicas Digitales III 19 Comparación de los modelos: La semejanza mas importante las encontramos en los paralelos de las capas de red y las capas de transporte. La principal ventaja de los modelos en capas es su modularidad. RTSP Real Time Streaming Protocol (RTSP) es un protocolo de nivel de aplicación para la transferencia de datos de medios en tiempo real. Utilizado para establecer y controlar sesiones de medios entre puntos finales, RTSP es un protocolo de canal de control entre el cliente de medios y el servidor de medios. La comunicación típica es entre un cliente y un servidor multimedia de streaming. La transmisión de medios desde una red privada a una red pública requiere traducir direcciones IP y números de puerto a través de la red. La funcionalidad Citrix ADC incluye una puerta de enlace de capa de aplicación (ALG) para RTSP, que se puede utilizar con NAT de gran escala (LSN) para analizar la secuencia de medios y realizar los cambios necesarios para garantizar que el protocolo continúe funcionando a través de la red. La forma en que se realiza la traducción de direcciones IP depende del tipo y la dirección del mensaje y del tipo de medios admitidos por la implementación cliente- servidor. Los mensajes se traducen de la siguiente manera: ● Solicitud saliente: Dirección IP privada a la dirección IP pública propiedad de Citrix ADC denominada dirección IP de grupo LSN. ● Respuesta entrante: Dirección IP de grupo LSN a dirección IP privada. ● Solicitud entrante: Sin traducción. ● Respuesta saliente: Dirección IP privada a la dirección IP del grupo LSN. Problema de Ingeniería- Técnicas Digitales III 20 Desarrollo Introducción En esta sección se llevará a cabo el desarrollo del proyecto teniendo en cuenta las conexiones con el proceso, el código utilizado y detallado, las diferentes detecciones que se implementan, las comunicaciones con los dispositivos, entre otras cosas, todo representado por diagramas en bloques. Conexión con el proceso La cámara IP estará conectada a un servidor donde correrá el programa desarrollado en este proyecto. El servidor está conectado a través de una red ethernet al PLC que controla el proceso de descarga de camiones en la plataforma volcadora. El PLC tiene una conexión a un panel HMI que utiliza el operador para controlar la plataforma y a una ET200 en campo donde se conectan las señales que se utilizan en el proceso. En el módulo de entradas analógicas de la ET200 está conectado un sensor de inclinación que enviará una señal de 4-20 mA escalado a un ángulo de 0-90°. A modo de seguridad, en el módulo de salidas digitales, se agrega una alarma y en el módulo de entradas digitales una parada de emergencia en campo para que actúen en caso de que el programa detecte una falla. En caso de requerirse, la empresa puede automatizar la plataforma de inclinación para que la misma minimice su ángulo de inclinación en caso de que se detecte que no está cayendo granos de los camiones. Figura 5: Diagrama de conexión con el proceso Problema de Ingeniería- Técnicas Digitales III 21 Iluminación de la zona de análisis Debido a que se realiza una preselección de pixeles por color en el código implementado y que la configuración RGB de los mismos varía considerablemente según la iluminación con la que cuenta, se optó por la utilización de HSV pero como se seguia notanto una dependencia con la iluminación del medio se concluyo que la mejor solución era el uso de iluminación artificial. Se dimensionó el reflector necesario para independizar el sistema de los cambios de iluminación por el clima, hora del día u otros factores. Para esto se estandarizó una distancia de seis metros entre el reflector y la plataforma volcadora. Se tuvo en cuenta que el reflector debe estar al costado de la calle por la cual circulan los camiones. Luego se tuvo en cuenta un promedio de una superficie de 3m de ancho por 3 metros de alto correspondiente a la parte trasera del acoplado a la cual estará apuntando la cámara. Figura 6: Diagrama de colocación de ilumunación Por tabla, se sabe que para un área de trabajos especializados se necesitan 2000 lux. Tabla 1: Lux en función de la actividad Como tenemos un área de (3m x 3m) = 9 metros cuadrados para iluminar: para obtener el número de lúmenes que necesitamos que tenga nuestro reflector, multiplicamos los lux necesarios por el área a iluminar. 2000x9=18000 lm Por lo tanto, viendo el catálogo (Flow | Lumenac Iluminación Led) de Lumenac flow, concluimos en que se debe colocar el modelo FLOW 180 (iluminaciónled - 180w) Tabla 2: Sección del catálogo de Lumenac flow https://lumenac.com.ar/product/flow/ Problema de Ingeniería- Técnicas Digitales III 22 Introducción al desarrollo del código Para el desarrollo del código se usó principalmente el IDE PyCharm, el cual es una herramienta que facilita la programación debido a sus herramientas de desarrollo incorporadas y a las sugerencias de optimización de código. Dicho IDE cuenta con una versión gratuita, cuyas prestaciones fueron más que suficientes para el desarrollo del proyecto. A continuación se puede observar la interfaz del mismo y algunas de sus formas de ayuda. Figura 7: IDE PyCharm Una vez que teníamos instalada dicha herramienta, se inició un proyecto en la misma, y debido a que dicha aplicación crea entornos virtuales para cada proyecto, se debieron instalar las librerías que se utilizaron. Si bien ya se hicieron mención de las librerías principales en el marco teórico, nos gustaría mencionar brevemente para que se utilizan cada una de las librerías importadas, en las siguientes líneas de código. import queue import threading import cv2 import numpy as np import math import time import snap7 import pyodbc A continuación se describe el uso que se les día a las mismas en el desarrollo: ● queue: se utilizó para la creación de una pila tipo FIFO con posibilidad de comunicación entre distintos hilos de ejecución. ● threading: se utilizó para la creación de los diferentes hilos que se inicializan en Problema de Ingeniería- Técnicas Digitales III 23 el código. ● cv2: es la librería de OpenCV descrita anteriormente. ● numpy: se utilizó para la creación de matrices ● math: es una librería con funciones matemáticas. ● time: es una librería que nos permite saber el tiempo actual, entre muchas otras funciones. ● snap7: es la librería python-snap7 descrita anteriormente. ● pyodbc: es una librería para la comunicación con la base de datos SQLServer. Nos gustaría aclarar que la comunicación con el PLC, si bien está presente el código en el práctico, no se pudo probar debido a que no contamos con un PLC Siemens (Como el que tiene la planta donde se implementará en un futuro) y se debieron crear simulaciones del mismo para poder testear las demás partes de la IA desarrollada. Pruebas anteriores a la implementación final Como se comentó anteriormente, antes de empezar el desarrollo final se empezó con la realización de diversas pruebas las cuales sirvieron de base y agilizaron la programación del proyecto. Las principales pruebas que se desarrollaron fueron en base a la detección del caudal, empezando con pruebas de detección de color y siguiendo con pruebas de detección de movimiento. Posteriormente se realizaron pruebas de comunicación con las cámaras, bases de datos y el PLC pero para una mejor explicación de dichos procesos se van a desarrollar durante la explicación final. Detección de Color Como se puede observar en el código presente en los anexos, para la realización de la detección de color se crea una máscara con todos los pixeles cuya configuración HSV este dentro de los limites preestablecidos. Para llevar a cabo dichas pruebas, estos límites fueron tomados en tiempo real a partir de barras deslizantes como se puede observar en la siguiente figura. Figura 8: Detección de color con python Problema de Ingeniería- Técnicas Digitales III 24 Se llegó a la conclusión de que esta técnica se puede implementar sin mayores problemas, sin embargo hay que considerar los temas de iluminación detallados anteriormente ya que debido a la misma la configuración de HSV puede variar. Otro de los problemas, es que con esta técnica se detecta todo el grano, pero para la detección de caudal se necesita detectar solamente lo que está cayendo del camión y no aquello que ya está en la superficie de la plataforma volcadora. Detección de Movimiento Para la detección de movimiento, como se puede observar en el código presente en la sección de anexos, se utiliza una técnica que realiza una diferencia entre dos frame consecutivos obteniendo solamente los píxeles que son diferentes entre ambas imágenes. Figura 9: Detección de movimiento con python El problema que se encontró con esta técnica fue que detecta todo el movimiento en la imagen, por lo que nos encontramos con la necesidad de crear alguna máscara que preseleccione un único sector de interés. Figura 10: Detección de operario no buscada Problema de Ingeniería- Técnicas Digitales III 25 Visión general del código y diagramas en bloques Para el desarrollo del programa de visión artificial, se optó por un proceso en múltiples hilos de procesamiento, esto se logra mediante la librería “threading” que divide la ejecución del código en diferentes núcleos del procesador. Cabe destacar que dicha decisión se tomó por los temas de seguridad detallados en la sección correspondiente. Figura 11: Comunicación entre los hilos del programa. Como se puede observar en la figura anterior se optó por dividirlo en 3 hilos que se comunican entre sí mediante determinadas variables y/o procesos. A continuación se van a detallar la funcionalidad de cada hilo en particular mediante diagramas de flujo, para poder comprender en profundidad el funcionamiento de la visión artificial. Se van a describir el código final de implementación, sin embargo en el código que se encuentra en anexos se puede encontrar una simulación del proceso mediante un video del proceso que nos facilitó la empresa de Bunge para realizar las pruebas. Problema de Ingeniería- Técnicas Digitales III 26 Hilo de comunicación con la cámara En el presente hilo de comunicación con la cámara, se sigue la lógica de la siguiente figura. En la misma se puede observar que como medida de seguridad se le podría agregar que en caso de que la cámara no funcione se le mande una señal de alarma al PLC, aunque para el alcance de este trabajo nos limitamos a mostrar un mensaje por pantalla. A continuación pasamos a explicar las líneas principales de este hilo de procesamiento. Como se puede observar en las siguientes líneas, este hilo está representado en la función “Receive”. def Receive(): global finalizar print('Inicializando la cámara...') #muestra en pantalla cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") ret, frame = cap.read() q.put(frame) while True: if ret: ret, frame = cap.read() if not q.full(): q.put(frame) if finalizar: cap.release() #libera la cámara break else: print('Error. Reconectando...') #mandar señal de alarma al PLC cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") En un primer momento, se especifica que la variable “finalizar” es de tipo global, esto se hace para que si en el hilo principal se da la orden de terminar el proceso, se pueda simultáneamente terminar adecuadamente este hilo, en otras palabras liberar la cámara para evitar posibles errores futuros de conexión. cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") ret, frame = cap.read() q.put(frame) En la librería de OpenCv hay definida una función llamada VideoCapture que nos facilita la conexión a una cámara mediante ip, solamente pasándole como parámetro el enlace para la conexión por el protocolo rtsp. En dicha línea de código se le deben modificar el usuario, contraseña e ip según corresponda a la cámara en el lugar a implementar. y Posteriormente con el método read() se toma un frame de la cámara, devolviendo además en la variable ret, si se capturó de manera adecuada.; y con q.put() se guarda el frame en la pila tipo FIFO cuya creación se va a detallar en la explicacióndel hilo principal. Luego, de realizado esta inicialización, la lógica entra en un bucle infinito dentro del cual se van a ir guardando nuevos frame en la pila a medida que el hilo principal los va retirando, siempre y cuando la cámara siga en funcionamiento y que no se especifique la orden de terminar con el proceso. Problema de Ingeniería- Técnicas Digitales III 27 Para un mayor entendimiento se muestra un diagrama en bloques de este proceso en particular. Figura 12: Flujo de funcionamiento del hilo de comunicación con la cámara Problema de Ingeniería- Técnicas Digitales III 28 Hilo de comunicación con el PLC El hilo de la comunicación con el PLC es la parte más importante del programa, ya que es el medio por el cual le comunicamos a los usuarios la detección del problema para evitar lo antes posible los daños potenciales. Por tal motivo, vimos en la necesidad de agregar en el caso de que falle su conexión una forma de avisarle al usuario de dicho estado, si bien no está implementada esta parte se nos ocurrió que podría realizarse mediante el envió de un SMS y/o correo a los usuarios finales del programa. Como se puede observar en las siguientes líneas, la implementación de dicha comunicación se realiza dentro de la función angulo y al igual que en el hilo de comunicación con la cámara se utilizan las variables globales “angulo_estatus”, “finalizar” y “alarma” para la comunicación con el hilo principal. def angulo(): global angulo_estatus, finalizar, alarma #desabilitar el acceso optimizado al bloque en el PLC IP = '192.168.1.10' RACK = SLOT = DB_NUMBER_lec = DB_NUMBER_esc = START_ADDRESS_lec = #colocar direccion en bytes donde esta el dato bool START_ADDRESS_esc = #colocar direccion en bytes donde guardar el dato bool SIZE = 1 plc = snap7.client.Client(lib_location="snap7.dll") plc.connect(IP, RACK, SLOT) while plc.get_connected(): db = plc.db_read(DB_NUMBER_lec, START_ADDRESS_lec, SIZE) angulo_estatus = bool(db[START_ADDRESS]) if alarma: db1 = plc.db_read(DB_NUMBER_esc, START_ADDRESS_esc, SIZE) snap7.util.set_bool(db1,0,0,True) plc.db_write(DB_NUMBER_esc, START_ADDRESS_esc,db1) alarma = False if finalizar: break print('Error de conexcion con el plc') #en este punto se podría mandar un correo al usuario para informarle que no funciona la #comunicación con el PLC Antes de entrar en el while, se deben completar los datos de las variables según se tenga configurado el PLC Siemens utilizado en el proceso. Dichos datos consisten en una IP, para comunicarse mediante ethernet, en el RACK y el SLOT para ubicarlo físicamente, así como variables para ubicar en el software del PLC los datos guardar o leer. plc = snap7.client.Client(lib_location="snap7.dll") plc.connect(IP, RACK, SLOT) while plc.get_connected(): Una vez configurada la conexión, se pasa a realizar la conexión para lo cual se necesita un archivo “snap7.dll” el cual es condición de la librería y se puede obtener desde su página oficial. Finalmente entramos en un bucle, siempre y cuando el PLC siga conectado. Dentro de dicho while, leeremos constantemente el db con el dato sobre el Problema de Ingeniería- Técnicas Digitales III 29 ángulo de la plataforma volcadora y en caso de que se deba mandar una alarma, la misma se guarda en el PLC y se coloca la variable global alarma en 0 para informar el hilo principal que ya se notificó. Cabe destacar que el PLC no informa el grado de inclinación que tiene la plataforma, sino un dato booleano con un 1 o 0 dependiendo de si la misma está por encima o no, respectivamente, del ángulo crítico. Para un mayor entendimiento en la siguiente figura se puede observar el diagrama en bloques de la lógica detallada. Figura 12: Flujo de funcionamiento del hilo de comunicación con el PLC Problema de Ingeniería- Técnicas Digitales III 30 Hilo principal En el hilo principal ocurre la lógica principal del programa, además de la comunicación con la base de datos, la estimación categórica del caudal y la inicialización y finalización de los hilos de comunicación con PLC y la cámara. Por tal motivo, se va a dar una presentación general y posteriormente se detallarán ciertos bloques más específicos. A continuación se muestra de forma resumida el código del hilo, obviando las partes de código que se detallarán más adelante. finalizar = 0 #variable para comunicar los hilos de procesamiento angulo_estatus = False a=0 font = cv2.FONT_HERSHEY_SIMPLEX alarma = False caudal = False bandera = 0 bandera1 = 0 bandera2 = 0 tiempo_descarga = 0 tiempo_inicial_riesgo = 0 tiempo_inicial = 0 tiempo_riesgo = 0 #CONEXION A BASE DE DATOS #me conecto a la base de datos #INICIO DE LA LOGICA# #Creó la pila #Inicializo los subprocesos while True: #Cálculo del caudal if caudal: if bandera == 0: bandera = 1 tiempo_inicial = time.time() if bandera2 == 0 and bandera == 1 and angulo_estatus: tiempo_inicial_riesgo = time.time() bandera2 = 1 else: if bandera == 0: if angulo_estatus: alarma = True if bandera == 1: if bandera1 == 0: tiempo_descarga = time.time() - tiempo_inicial bandera1 = 1 if not angulo_estatus: if not bandera2: bandera = 0 bandera1 = 0 bandera2 = 0 #logica envio de datos al SQL Server else: Problema de Ingeniería- Técnicas Digitales III 31 tiempo_riesgo = time.time() - tiempo_inicial_riesgo bandera = 0 bandera1 = 0 bandera2 = 0 #logica envio de datos al SQL Server Para explicar en más detalle la lógica principal del programa nos vamos a basar en el siguiente diagrama en bloques simplificado, ya que como comente, solo es una fracción del código. Figura 13: Flujo de funcionamiento del hilo principal A partir del diagrama anterior, nos gustaría dejar claro en el proceso se podía dar en dos ocasiones el caso de que la plataforma está arriba del ángulo crítico y que no esté descargando. Dichos casos se dan cuando el camión todavía no descargo, es decir en la situación de peligro ya que se considera que el mismo está cargado y puede colapsar en cualquier momento, y cuando el camión ya descargo y esta por terminar el proceso. Por ende en la lógica se tuvo que tener en cuenta esta problemática, para no mandar un falso positivo al PLC. También se pensó, que se podría avisar al operario que el proceso terminó para que baje la plataforma y se reanude el proceso con otro camión. Si bien con lo visto hasta ahora, se puede entender el funcionamiento principal, todavía quedan partes del mismo que no están muy claras; por ende se va a pasar a explicar algunos puntos, que si bien no son claves, son pilares del código programado. Entre ellos se encuentran: ● La lógica de comunicación con la base de datos SQLServer ● La lógica de multiprocesamiento ● La estimación del caudal categórica. Problema de Ingeniería- Técnicas Digitales III 32 Detalles del Multiprocesamiento Para lograr una independencia entre los procesos críticos del sistema se optó por usar la librería “threading” que nos permite ejecutar el sistema en múltiples hilos, 3 para ser exactos en este caso. En el mismo hilo principal, se definen las variables “finalizar” y “angulo_estatus” con valores lógicos 0/1 o True/False, dichas variables se llaman como globales dentro de las funcionescorrespondientes a los restantes subprocesos. Por ende, al modificarse las mismas en cualquier subproceso, el valor de la misma se actualiza de forma inmediata en los restantes. q = queue.Queue(maxsize=5) #pila tipo fifo p1 = threading.Thread(target=Receive) p2 = threading.Thread(target=angulo) p1.start() #empiezo a capturar la cámara p2.start() #conecto con el PLC Posteriormente, se crea una pila de tamaño máximo 5, dicho tamaño se debe a que es el que encontramos óptimo para compensar el retardo por la reconexión de la cámara en caso de fallar la misma. Además, se definen los subprocesos mediante las funciones explicadas anteriormente y con el método start() se inicializan. if cv2.waitKey(1) & 0xFF == ord('q'): finalizar = 1 break Más adelante en el código, específicamente al final del bucle principal del hilo principal, se observa la anterior condición if. En dicha condición, en el caso de que el usuario teclee la letra ‘q’ en el teclado, se setea la variable finalizar en 1, con lo que los subprocesos de comunicación finalizarán y además sale del bucle principal en que se encuentra. Una vez que sale está terminando el sistema, con los métodos join() se espera que se terminen de cerrar los restantes subprocesos para un correcto final de ejecución. Estimación categórica del caudal En base a las pruebas realizadas antes de empezar el desarrollo del sistema, nos encontrábamos con los siguientes problemas: ● La detección de color detecta todo el grano, pero para la detección de caudal se necesita detectar solamente lo que está cayendo del camión y no aquello que ya está en la superficie de la plataforma volcadora. ● La detección de movimiento detecta todo el movimiento en la imagen, incluyendo operarios. Para solucionar estos problemas, se optó por combinar ambas técnicas con lo que se logró detectar el movimiento únicamente del grano, pero al no funcionar sólo sobre el grano que se está descargando además se tuvo que aplicar una máscara, es decir, preseleccionar únicamente la sección donde se encuentra dicho caudal. A continuación se pueden visualizar los diferentes estados del caudal que se detectan con el sistema. Problema de Ingeniería- Técnicas Digitales III 33 Figura 14: Detección categórica del caudal y toma del tiempo de descarga al finalizar el proceso Los pasos que se realizan para la estimación categórica del caudal se resumen en el siguiente diagrama en bloques. Figura 15: Flujo de funcionamiento de la estimación del caudal. Problema de Ingeniería- Técnicas Digitales III 34 Como se puede observar, en un primer momento se toman dos frame consecutivos mediante las siguiente líneas de código while True: if q.empty() != True: # si no está vacía la pila frame1 = q.get() a=1 if q.empty() != True and a==1: # si no esta vacia la pila frame2 = q.get() break Se hace de esta forma porque la detección de caudal se realiza mediante la cantidad de movimiento que se detecta en el área seleccionada, y dicho movimiento se realiza haciendo la diferencia entre dos frame. El método get de la pila, recupera el un frame de la pila tipo FIFO y lo elimina de la misma, liberando el espacio para el agregado de uno nuevo mediante el hilo correspondiente. dim = frame1.shape #calculo las dimensiones img1 = mascara(imag=frame1, dimen=dim) # aplico la mascara img2 = mascara(imag=frame2, dimen=dim) # aplico la mascara Posteriormente, se aplican las máscaras a los frame tomados anteriormente, esto se realiza mediante una función que desarrollamos que consiste en crear una matriz de las dimensiones de la imagen capturada, con 0 en los pixeles que no se quieren analizar y 1 en los que sí; para posteriormente aplicar una operación entre dicha matriz y el frame para obtener los resultados de las figuras al inicio de esta sección. Dicha función se puede encontrar en la sección de anexos. Una vez que se tienen los dos frame, ya dentro del bucle, se crea una nueva máscara con el rango de colores que se definió, dejando en este caso todo el grano dentro de la primera máscara que se creó. Cabe destacar que dicha operación se realiza en dos frames consecutivos. Además, con la función findContours() se buscan los contornos de dicha máscara creada. while True: l_hsv = np.array([2, 75, 104]) # Defino el valor bajo de hsv h_hsv = np.array([28, 255, 255]) # Defino el valor alto de hsv hsv1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV) mask1 = cv2.inRange(hsv1, l_hsv, h_hsv) # Creo una máscara res1 = cv2.bitwise_and(img1, img1, mask=mask1) # Hago el filtrado hsv2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV) mask2 = cv2.inRange(hsv2, l_hsv, h_hsv) # Creo una máscara res2 = cv2.bitwise_and(img2, img2, mask=mask2) # Hago el filtrado contornos_soja, _ = cv2.findContours(mask1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) Una vez que se tienen los frame en las condiciones descritas, se realiza la diferencia en busca del movimiento, y posteriormente a dicha diferencia se le aplican diferentes filtros y/o transformaciones para mejorar la detección y se grafican sobre el frame tomado como realimentación alternativa al usuario. diff = cv2.absdiff(res1, res2) gris = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) difuminado = cv2.GaussianBlur(gris, (3, 3), 3) Problema de Ingeniería- Técnicas Digitales III 35 _, binario = cv2.threshold(difuminado, 30, 255, cv2.THRESH_BINARY) limpio = cv2.dilate(binario, (3, 3), iterations=3) contornos, _ = cv2.findContours(limpio, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) cant = 0 for contorno in contornos: (x, y, w, h) = cv2.boundingRect(contorno) if cv2.contourArea(contorno) > 50: continue cv2.circle(img1, ((int)(x + w / 2), (int)(y + h / 2)), (int)(math.sqrt(w * h)), (0, 255, 0), -1) cant += 1 cv2.putText(img1, 'Estado: {}, {}'.format('Movimiento', cant), (10, 20), font, 0.7, (255, 0, 0), 2) Si bien, para una estimación más precisa del caudal se necesita mezclar la cantidad de movimiento y el área que se detectó, para una estimación categórica nos bastó con el cálculo del área a partir de los contornos calculados. Sin embargo, en las líneas anteriores mostramos una base de cómo se podría calcular el movimiento para que con una lógica extra se pueda estimar el caudal de forma continua ya dejando de lado la estimación categórica que se implementó. Como se comentaba, para el cálculo del área se utiliza la función contourArea para cada contorno que se había encontrado, y posteriormente según su valor final se estima cuánto caudal hay actualmente. area = 0 for contorn in contornos_soja: area += cv2.contourArea(contorn) if (area > 11000): cv2.putText(img1, 'Caudal: {}'.format('Mucho'), (10, 50), font, 0.7, (0, 0, 255), 2) caudal = True elif (area < 11000) and (area > 8000): cv2.putText(img1, 'Caudal: {}'.format('Medio'), (10, 50), font, 0.7, (0, 0, 255), 2) caudal = True elif (area < 8000) and (area > 4000): cv2.putText(img1, 'Caudal: {}'.format('Bajo'), (10, 50), font, 0.7, (0, 0, 255), 2) caudal = True elif (area < 4000): cv2.putText(img1, 'Caudal: {}'.format('Nulo'), (10, 50), font, 0.7, (0, 0, 255), 2) caudal = False Finalmente, se guarda el segundo frame en el frame 1 y se toma un segundo frame, con el objetivo de repetir el bucle. img1 = img2 while True: if q.empty() != True: frame2 = q.get() img2 = mascara(imag=frame2, dimen=dim) # aplico la mascara break Nos gustaría hacer una mención especial a la resolución de la cámara que se utilizó para las pruebas. Si bien la única parte del código que sufrirían modificaciones,de utilizar otra resolución serían los límites de áreas que estiman el caudal, según pruebas que se realizaron una resolución de 640x480 (resolución utilizada en las capturas al comienzo de la sección) es suficiente para un correcto funcionamiento. No se optó por una resolución más alta, porque no aportaba una mejora significativa y estaríamos produciendo un cómputo innecesario, además de que se necesita una mejor conexión con la cámara ip (para evitar pérdida de frame en la comunicación). Problema de Ingeniería- Técnicas Digitales III 36 Comunicación con la base de datos El usuario final, como ya se comentó, además de las alarmas precisaba conocer los tiempos en que el camión estaba descargando y el tiempo en que la plataforma estaba en suspensión, si bien este último dato se podría guardar directamente desde el PLC, el guardarlo desde el programa no le agrega un error ya que para el mismo se utiliza solo la comunicación con el PLC Antes de pasar a explicar la comunicación con la base de datos, se muestra a continuación la estructura de la misma, cabe destacar que la columna “Fecha_carga” ya guarda por defecto la fecha y hora en que se ejecuto la query de inserción de datos, por lo que no es necesario mandar la fecha. ID Cámara Tiempo_descarga Tiempo_riesgo Fecha_carga Tabla 3: Estructura de la tabla utilizada en la base de datos. A continuación se va a explicar la comunicación con la base de datos SQLServer, la misma tiene tres partes principales: la conexión, la obtención de la estructura, el envío de datos a la base. server = '' bd = '' user = '' passw = '' tabla = '' try: conexion = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL server};SERVER=' + server + ';DATABASE=' + bd + ';UID=' + user + ';PWD=' + passw) print('Conexion exitosa con la base de datos.') est_tabla = SQL_estructura(tabla, conexion) print(est_tabla) except: print("Error al conectar con la base de datos.") Para la conexión con la base de datos, es necesario definir el servidor, el nombre de la misma, el usuario y contraseña con el que se va a acceder, y el nombre de la tabla con la que se va a trabajar. Posteriormente, se realiza la conexión con la base de datos y a través de la función “SQL_estructura” se obtiene la estructura de la misma para posteriormente realizar la query para guardar los datos. Cabe destacar que en caso de fallar la conexión, la misma se informa, pudiendo agregarse una nueva alarma en el PLC para dicho caso. La función “SQL_estructura”, se puede buscar en los anexos, pero sintetizando realiza la siguiente query en lenguaje SQL: exec sp_columns ? , devolviendo la estructura de la tabla, además de que columnas tienen datos por defectos (en este caso en particular la columna “Fecha_carga”). Finalmente, el envío de los datos se realiza en el hilo principal por las siguientes líneas donde se crea una lista “datos” con los datos ordenados correspondientes a cada columna que se necesita y posteriormente con la función “SQL_Insertar” los mismos se guardan en la base de datos. Problema de Ingeniería- Técnicas Digitales III 37 datos = [1, Seg_Transformacion(tiempo_descarga), Seg_Transformacion(tiempo_riesgo)] SQL_Insertar(tabla, est_tabla, datos, conexion) A continuación se muestra la función “SQL_Insertar”, pero al igual que con la función que nos devuelve la estructura de la tabla, la misma consiste en la creación de la query para insertar datos la cual tiene la siguiente forma: “INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);”. #inserta datos en la base de datos def SQL_Insertar(tabla, db_tabla, datos, conexion): cursor = conexion.cursor() columnas = "" variables = "" datos = tuple(datos) for row in db_tabla: if not row[3]: columnas += '[' + str(row[1]) + '],' variables += "?," variables = variables[:-1] columnas = columnas[:-1] consul = f"""INSERT INTO [dbo].[{tabla}] ({columnas}) VALUES ({variables})""" cursor.execute(consul, datos) cursor.commit() cursor.close() print('Datos cargados.') Problema de Ingeniería- Técnicas Digitales III 38 Conclusiones Por medio de este proyecto, se ha podido aprender muchos conceptos nuevos de diversos temas, como así también, se ha podido refrescar conceptos de materias de años anteriores e incluso de este mismo. Por otro lado, también muy importante, fué el hecho de haber trabajado en grupo, ya que constantemente se aprende uno del otro y además ayuda mucho para trabajos grupales posteriores. A la hora del trabajo en sí, se han presentado varios problemas que se han podido llevar a cabo con pruebas y errores, además de soluciones alternativas para llevar al objetivo. Posibles mejoras y extensiones Como posibles mejoras se pueden señalar dos puntos principalmente, uno de ellos es el uso de una red neuronal (la cual puede ser Yolo v4) para detectar la compuerta trasera de los camiones y ampliar el rango de uso del software, principalmente evitando errores de detección en caso de camiones de un solo acoplado. La principal función de dicha red sería crear la máscara de detección, comentada durante la explicación del código, en una posición específica según cada camión en particular, en vez de que la misma se establezca de manera predeterminada. Otra mejora a tener en cuenta, en el caso de necesitar, es una estimación continua del caudal que desciende del camión. Si bien ya se explicó durante el desarrollo del informe una posible solución a esta alternativa, hay que tener en cuenta que de implementarse se debería contar con por lo menos 30 fps en velocidad de procesamiento con el objetivo de estimar mejor el movimiento de los granos durante la descarga en el proceso. Problema de Ingeniería- Técnicas Digitales III 39 Seguridad Seguridad en el proceso Este proyecto aporta mucha seguridad en cuanto al proceso en sí, ya que, previene tanto los accidentes laborales como así también los daños materiales. Ambas situaciones van a reducir su probabilidad de ocurrencia debido a que el proyecto tiene ese fin como objetivo. Esto se logra partiendo de la base de que el camión no estará elevado y con carga, por lo tanto, no proporcionará riesgos en cuanto a los accidentes laborales y a los daños estructurales, por ende, aumenta la seguridad en el proceso. Hay que tener en cuenta, que el proceso será más eficiente en cuanto a la seguridad si hay un buen complemento entre el proyecto en sí, y la empresa en la cual se coloca el mismo. En un primer momento, si se configura el sistema como se desarrolló en el apartado de “Conexión con el proceso”, la seguridad va a depender del operario que esté presente en la sala de control, ya que el mismo es el que debería accionar el descenso de la plataforma en caso de alarma. Sin embargo, si además de dicha parada de emergencia se opta por automatizar el descenso de la plataforma en caso de que el PLC recibiera la señal de alarma, se podría reforzar la seguridad del proceso considerablemente ya que se independizara de un posible error humano. Seguridad en el código Si bien el proyecto surgió en torno a la seguridad del proceso, principalmente la de los operarios que se encuentran en el proceso, es necesario que el software tenga medidas de seguridad ante posibles fallas, ya que si el software fallará sin notificar a los operarios sería aún más riesgoso para los mismos la situación. Las medidas de seguridad que se tuvieron en cuenta durante el desarrollo del código fueron las siguientes: ● Falla de comunicación de la cámara: en el software en caso de fallar la comunicación con la cámara es necesario que se mande una señal al PLC para que los operarios estén al tanto de la situacióny a continuación el software trata de reconectar la cámara, para continuar con el proceso. ● Comunicación lenta con la cámara: para solucionar este problema es que se optó por el uso de una pila que independiza los procesos de captura de la cámara de la análitica del video, de esta forma se tiene un mayor tiempo para obtener el frame. ● Falla de comunicación con el PLC: este tipo de fallas es más complejo de comunicar con los operarios ya que es la vía de comunicación con los mismos, sin embargo se podría optar por el envío de un correo. Problema de Ingeniería- Técnicas Digitales III 40 Anexos Código detección de color import numpy as np import cv2 def nothing(x): pass cap = cv2.VideoCapture(r'Muestra04.mp4') cv2.namedWindow('Tracking') cv2.createTrackbar('LHue','Tracking',0,255,nothing) cv2.createTrackbar('HHue','Tracking',255,255,nothing) cv2.createTrackbar('LSat','Tracking',0,255,nothing) cv2.createTrackbar('HSat','Tracking',255,255,nothing) cv2.createTrackbar('LVal','Tracking',0,255,nothing) cv2.createTrackbar('HVal','Tracking',255,255,nothing) while True: _, frame = cap.read() #Creo una matriz de la imagen en colores HSV hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) l_hue = cv2.getTrackbarPos('LHue', 'Tracking') h_hue = cv2.getTrackbarPos('HHue', 'Tracking') l_sat = cv2.getTrackbarPos('LSat', 'Tracking') h_sat = cv2.getTrackbarPos('HSat', 'Tracking') l_val = cv2.getTrackbarPos('LVal', 'Tracking') h_val = cv2.getTrackbarPos('HVal', 'Tracking') l_hsv = np.array([l_hue,l_sat,l_val]) #Defino el valor bajo de hsv h_hsv = np.array([h_hue,h_sat,h_val])#Defino el valor alto de hsv mask = cv2.inRange(hsv, l_hsv, h_hsv) #Creo una máscara res = cv2.bitwise_and(frame,frame,mask = mask) #Hago el filtrado cv2.imshow('Frame',frame) cv2.imshow('Mask', mask) cv2.imshow('Result', res) key = cv2.waitKey(1000) & 0xFF if key == 27: break cap.release() cv2.destroyAllWindows() Problema de Ingeniería- Técnicas Digitales III 41 Código detección de movimiento import numpy as np import cv2 cap = cv2.VideoCapture(r'Muestra04.mp4') ret, frame1 = cap.read() ret, frame2 = cap.read() font = cv2.FONT_HERSHEY_SIMPLEX while cap.isOpened(): diff = cv2.absdiff(frame1, frame2) gris = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY) difuminado = cv2.GaussianBlur(gris, (3, 3), 3) _, binario = cv2.threshold(difuminado, 30, 255, cv2.THRESH_BINARY) limpio = cv2.dilate(binario, (5,5), iterations=3) contornos, _ = cv2.findContours(limpio, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) #cv2.drawContours(frame1,contornos,-1,(0,255,0),2) for contorno in contornos: (x, y, w, h) = cv2.boundingRect(contorno) if cv2.contourArea(contorno) < 500: continue cv2.rectangle(frame1,(x,y),(x+w,y+h),(0,255,0),2) cv2.putText(frame1,'Estado: {}'.format('Movimiento'), (10, 20), font, 0.7, (255,0,0), 2) cv2.imshow('diferencia',diff) cv2.imshow('binario', binario) cv2.imshow('difuminado', difuminado) cv2.imshow('limpio', limpio) cv2.imshow('frame1', frame1) frame1 = frame2 ret, frame2 = cap.read() if (cv2.waitKey(40) & 0xFF)== 27: break cap.release() cv2.destroyAllWindows() Problema de Ingeniería- Técnicas Digitales III 42 Código Completo ########################LIBRERIAS######################### import queue #controlar la pila lifo import threading #trabajar con multiprocesamiento import cv2 #vision import numpy as np import math import time #import snap7 #comunicación con el plc #import pyodbc #comunicación con la base de datos SQLServer # #######################FUNCIONES Y CLASES################ #proceso paralelo de captura de cámara, mantiene 5 tomas en pila tipo lifo #si la pila está llena no carga el frame #si la variable global pasa a 1 termina y libera la cámara def Receive(): global finalizar print('Inicializando la cámara...') #muestra en pantalla #cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") cap = cv2.VideoCapture(r'Muestra05.mp4') ret, frame = cap.read() q.put(frame) while True: if ret: time.sleep(0.02) ret, frame = cap.read() if not q.full(): q.put(frame) if finalizar: cap.release() #libera la camara out.release() #grabo el video break else: #simulación cap.release() print('Error conexion con la camara') break #real #manda un señal booleana al PLC para informar falla de comunicación con la cámara #esta parte no está programada pero consistiría en el agregado de otra variable global que se #comunique con #el hilo de comunicación al PLC #print('Error. Reconectando...') #cap = cv2.VideoCapture("rtsp://usuario:contraseña@ip:554") def angulo(): global angulo_estatus, finalizar, alarma #real """ #desabilitar el acceso optimizado al bloque en el PLC IP = '192.168.1.10' RACK = SLOT = DB_NUMBER_lec = Problema de Ingeniería- Técnicas Digitales III 43 DB_NUMBER_esc = START_ADDRESS_lec = #colocar direccion en bytes donde esta el dato bool START_ADDRESS_esc = #colocar direccion en bytes donde guardar el dato bool SIZE = 1 plc = snap7.client.Client(lib_location="snap7.dll") plc.connect(IP, RACK, SLOT) while plc.get_connected(): db = plc.db_read(DB_NUMBER_lec, START_ADDRESS_lec, SIZE) angulo_estatus = bool(db[START_ADDRESS]) if alarma: db1 = plc.db_read(DB_NUMBER_esc, START_ADDRESS_esc, SIZE) snap7.util.set_bool(db1,0,0,True) plc.db_write(DB_NUMBER_esc, START_ADDRESS_esc,db1) alarma = False if finalizar: break print('Error de conexcion con el plc') #en este punto se podría mandar un correo al usuario para informarle que no funciona la #comunicación con el PLC #creemos que esta funcionalidad no se va a usar mucho ya que el PLC es un dispositivo prioritario en #el proceso #pero esta bueno asegurarse """ #simulación cont=0 angulo_estatus = False while True: cont += 1 time.sleep(0.02) print(angulo_estatus) if cont == 10: angulo_estatus = True if alarma: print('Mandar señal al PLC') alarma = False if finalizar: break #funciones para la comunicación con la base de datos SQLServer y guardar los tiempos de descarga y #de riesgo para #temas de logistica #pasa los segundos a hh:mm:ss en formato string def Seg_Transformacion(segundos): horas = int(segundos / 3600) segundos -= horas * 3600 minutos = int(segundos / 60) segundos -= minutos * 60 segundos = int(round(segundos, 2)) TimerTiempo = f'{horas:02d}:{minutos:02d}:{segundos:02d}' print('Segundos convertidos al formato hh:mm:ss.') return TimerTiempo #obtiene la estructura de la tabla solicitada def SQL_estructura(tabla, conexion): db_tabla = list() cursor = conexion.cursor() consul = """exec sp_columns ?""" cursor.execute(consul, tabla) Problema de Ingeniería- Técnicas Digitales III 44 rows = cursor.fetchall() for row in rows: db_tabla.extend([[row.ORDINAL_POSITION, row.COLUMN_NAME, row.TYPE_NAME, row.COLUMN_DEF, row.IS_NULLABLE]]) cursor.commit() cursor.close() print('Estructura obtenida.') return db_tabla #inserta datos en la base de datos def SQL_Insertar(tabla, db_tabla, datos, conexion): cursor = conexion.cursor() columnas
Compartir