Loading repository data…
Loading repository data…
gonzafernan / repository
Simulador de brazo robótico manipulador serie Mitsubishi RV-2AJ mediante interfaz gráfiza Qt en lenguaje de programación C++.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
#+TITLE: Trabajo Práctico Integrador: C++ Avanzado #+AUTHOR: Claribel Manzano; Gonzalo Fernández
El presente trabajo se responde a lo solicitado como trabajo práctico integrador de la cátedra de Programación Orientada a Objetos de la /Facultad de Ingeniería/ de la /Universidad Nacional de Cuyo/, Mendoza, Argentina. Año 2018. Prof. Ing. César Aranda.
[[https://www.youtube.com/watch?v=4ekSfEu83dY&feature=youtu.be]]
Objetivos El objetivo del trabajo consiste en controlar un robot de 3 grados de libertad con efector final, a modo de simulación.
Requerimientos generales Dado que la cátedra es de programación orientada a objetos, la resolución del problema planteado está representada e implementada usando un paradigma orientado a objetos. Está diseñado utilizando un modelo de capas, de manera que la solución puede usarse independientemente de que haya interfaz gráfica o de consola. Debido a que el lenguaje de programación aprendido y utilizado durante el cursado de la cátedra es C++, lenguaje que cumple los requerimientos que tiene la solución del problema siendo uno de los más indicados en problemas de éste tipo, se lo adoptó como lenguaje principal del proyecto. Todo el proyecto es desarrollado bajo sistema operativo Linux. Para la implementación de la interfaz de usuario, es requerido que sea gráfica, con interacción estándar mediante mouse y teclado. En este caso se utiliza las librerías del framework Qt5.
Sobre el brazo robótico simulado El robot que se simula es un modelo RRR, lo que quiere decir que sus tres grados de libertad corresponden a rotaciones. El tipo propuesto es uno similar al modelo Mitsubishi RV-2AJ.
** Modelo 3D del robot La solución propuesta para la vista del robot en la interfaz, es que ésta sea 3D. Buscando en la web, se encontró en la página [[https://grabcad.com/library][GrabCad Community]] un gran aporte de [[https://grabcad.com/filipe.barbosa-3][Filipe Barbosa]] de un robot [[https://grabcad.com/library/mitsubishi-rv-6s-1][Mitsubishi RV-6S Industrial MELFA Series]] que responde al modelo RRR.
#+CAPTION: Render de modelo de robot Mitsubishi Industrial MELFA Series #+NAME: fig:RV-6S [[./imgs/RV-6S.jpg]]
** Incorporación del modelo al proyecto El modelo se encontraba en formato con extensión /.stp/. Para poder utilizarlo correctamente en el framework Qt5, se convirtió el modelo a formato /.obj/. El proceso de conversión fue de /.stp/ a un ensamble de piezas en formato /.stl/, y con ayuda del software /Blender/, se exportó este ensamble en una versión simplificada de 5 piezas en formato /.obj/, que se encuentran en la carpeta [[./assets/][assets]].
| Instrucción | Descripción | |-------------+--------------------------------------------------------------------------------------------------------------------------------------| | G0 AX PY | Consigna de posición, donde X es la articulación a rotar e Y los grados. | | G1 AX VY | Consigna de velocidad, donde X es la articulación a setear velocidad e Y el valor de la velocidad en radianes por segundo [rad/s]. | | G28 | Homing y/o encender robot. | | M0 | Apagar robot. | | TX | Cambio de actividad del efector final. Donde X es:\+ 0: Pintar\+ 1: Sostener\+ 2: Soltar\+ 3: Rotar | | DXX | Duración de la actividad del efector final, dada en segundos [s]. | | EF | Inicio de actividad del efector final. |
[[./vids/camera_control.gif]] ** Panel de control [[./vids/aplicacion.gif]] *** Ventana principal El panel de control consiste en una ventana principal (clase /Widget/), con botones que permiten el encendido y apagado del robot. El encendido procede automáticamente con un secuencia de movimientos de homing. La acción de apagado frenará el robot en la posición en que esté, dandole un estado inactivo. Esta ventana principal también posee un cuadro de texto indicador del estado global del robot (encendido o apagado) y otros dos cuadros de texto que proveen la información del ángulo en que se encuentra cada articulación, su velocidad relativa, e información de la configuración del efector final. Los botones "Establecer características iniciales", "Cargar archivo de comandos" y "Comenzar movimiento" abren las otras respectivas ventanas. En el inferior de la ventana se encuentra el botón salir para cerrar ésta. *** Características Desde la ventana principal, si se presiona el botón "Establecer características iniciales", se abre la ventana de "Características". En esta ventana el usuario puede introducir los parámetros que desee del robot: Ángulos de las articulaciones y sus respectivas velocidades. Una vez introducidos estos parámetros, cuando el usuario presione "Aceptar" estos datos serán cargados y si son diferentes a los previos el robot procederá a ejecutar los movimientos correspondientes.
*** Operación Si desde la ventana principal el usuario presiona la ventana principal, se abre la ventana de operación. Básicamente desde esta ventana el usuario tiene completo control sobre el robot, y puede moverlo ya sea introduciendo linea a linea comandos GCode en el cuadro de texto correspondiente o controlando ángulo y velocidad de cada articulación a través de los correspondientes sliders de la ventana. En el inferior de la ventana se encuentra un botón para cargar un archivo de comandos GCode y otro para realizar homing del robot. El botón "Terminar" cierra la ventana.
*** Carga de archivo de comandos Si desde la ventana principal o desde la ventana de operación, el usuario presiona el botón para cargar archivo de comandos, se abrirá una ventana con dos cuadros de texto y una pestaña superior. La pestaña superior "File" puede presionarse, y se abrirá el gestor de archivos correspondiente para que el usuario cargué su archivo de texto con el programa de instrucciones GCode que desee ejecutar. Una vez seleccionado, en un cuadro de texto de la ventana se pude observar una vista preliminar del archivo y en el otro la ruta de éste. En la parte inferior de la ventana se encuentran dos botones, "Aceptar" y "Cancelar". El botón Aceptar cargará el programa seleccionado y lo ejecutará, El botón Cancelar cerrará la ventana sin que ninguna acción suceda.
Características del lenguaje y framework utilizado Como se mencionó antes, el proyecto está desarrollado en C++ basado en el framework Qt5, específicamente la versión 5.11. Se aplicó la mayor parte de los conceptos aprendidos en clases: /abstracción/, /modularidad/, /encapsulamiento/, otros más específicos como /herencia/, /agregación/ y /composición/, /constructores/ y /destructores/, /polimorfismo/, /sobrecarga de métodos/, etc. Por extensión del documento, se decide exponer a continuación una característica del framework que no se dió en clases y por lo tanto puede resultar más enriquecedor. Todo los conocimientos adquiridos del framework Qt fueron obtenidos gracias a su [[https://www.qt.io/][documentación]]. El framework posee librerías que brindan las herramientas para conectar diferentes clases mediante la emisión y recepción de señales, esto se denomins SIGNALS y SLOTS. El gran potencial de ésto es que hay señales que son emitidas y están implícitas en la librería del framework (y no explícitas en la implementación), que se pueden utilizar de la dorma que se expone a continuación: Dando como ejemplo un caso utilizado. La clase /BaseRobot/ es de la forma: #+BEGIN_SRC cpp // baserobot.h #include
class BaseRobot : public QObject { public: ... public slots: void endReceiver(); } #+END_SRC El método endReceiver implementato en [[./baserobot.cpp]], recibe la señal /finished()/ perteneciente a la clase /QPropertyAnimation/ propia del framework. Esta señal se emite cada vez que un clip de animación asociado (en este caso la animación de un movimiento del robot) finaliza. En el programa se utiliza para saber cuando ejecutar la siguiente instrucción en la cola. Para conectar la animación con el /SLOT/ /endReceiver()/, se utiliza la función /connect()/ de la siguiente forma: #+BEGIN_SRC cpp // baserobot.cpp #include "baserobot.h"
void BaseRobot::externalGdl1(int value){ if (this->estado == ACTIVE){ QParallelAnimationGroup *motion = new QParallelAnimationGroup(); this->gdl1Changed(value);
motion->addAnimation(this->p2->animate(this->p2->getPrevious_angle(0), this->p2->getAngle(0), this->p2->getDuration(), 0));
...
connect(motion, &QParallelAnimationGroup::finished, this, &BaseRobot::endReceiver);
motion->start();
this->estado = RUNNING;
}
} #+END_SRC El objeto /motion/ es de la clase /QParallelAnimation/, y contiene el conjunto de animaciones a ejecutar al cambiar el primer grado de libertad. Como puede observarse la función /connect()/ recibe 4 argumentos: el objeto que envía la señal (/motion/), la dirección de la declaración de la señal a conectar (/finished/), el objeto que recibe la señal (/BaserRobot/, es decir, /this/), y por último la dirección de la declaración del slot a conectar (/endReceiver()/). Una vez configurado ésto, cada vez que se emita la señal /finished()/ de parte de /motion/, se ejecutará la función /endReceiver()/. Para una explicación más clara y profunda, ir a la [[http://doc.qt.io/qt-5/signalsandslots.html][documentación oficial]].
Diagrama UML El diagrama UML de la figura fue realizado con el software /Umbrello UML Modeller/. Es provisorio ya que todavía está sujeto a cambios, pero estos cambios no provocarías grandes modificaciones en la estructura del proyecto y, por lo tanto, en el plano, sino más bien son cambios que modificarían algunos métodos de la clase /BaseRobot/, /Elemento/ y /Controller/.
#+CAPTION: Diagrama UML provisorio del proyecto. #+NAME: fig:UML [[./imgs/diagramaUML.png]]