Story Transcript
RAL - Robotics and Automation Laboratory - Prof. M. Torres T. ´ctrica Departamento de Ingenier´ıa Ele ´ lica de Chile Pontificia Universidad Cato
Plantilla para Proyectos en C/C++ del RAL / Estructura y L´ogica del Programa .
1
Objetivos • Proveer una plantilla con la estructura y l´ogica b´asica para la implementaci´ on m´as r´apida de algoritmos en proyectos del ´area de rob´otica, como algoritmos de control, estimaci´ on y otros de adquisici´ on, procesamiento e interpretaci´ on de datos. • Fijar un est´andar m´ınimo para los proyectos del grupo RAL que garantice: – Orden y simplicidad ⇒ claridad. – Modularidad y reusabilidad. – Portabilidad.
2
Descripci´ on
La estructura general de toda soluci´on de automatizaci´on requiere de tres pasos fundamentales: 1. Sensado: Medir ciertas variables que se desean controlar. 2. Procesamiento: Procesar los datos medidos para extraer informaci´on de inter´es. 3. Decisi´on/Acci´on: Verificar que las variables de inter´es cumplan un cierto objetivo fijado por el usuario, y de lo contrario, tomar acciones que ajusten las variables de inter´es del sistema. Las tres etapas anteriores se repiten una y otra vez durante la operaci´on del sistema. Cabe notar que en estas etapas est´an implicitos dos hechos. Primero, que el programa recoge o recibe datos, luego opera sobre estos y finalmente entrega ciertos resultados. Por otra parte, est´a el hecho de que existe un usuario que de alguna manera interactua con el sistema para fijar tanto objetivos como otros par´ametros deseados de operaci´on. En este sentido, la soluci´on puede descomponerse en tareas o funciones de bajo nivel, aquellas encargadas de interactuar con el hardware, y otras de m´as alto nivel encargadas de la interacci´ on entre el usuario y la m´aquina. Por lo anterior podemos afirmar que existen por lo menos tres dimensiones principales con respecto a las cuales debe concebirse la soluci´on: • Entradas-Salidas: Consistente en las especificaciones de datos requeridos por el programa y los resultados que este debe generar. • Temporal: Relacionada con la secuencia de ejecuci´on de tareas necesarias para obtener los resultados. • Niveles de abstracci´ on de tareas: Relacionada con la separaci´on de las funciones en grupos que abarcan desde la capa f´ısica hasta capas o niveles de abstracci´on mayor que implementan la interacci´ on humanom´aquina. En otras palabras, las capas inferiores implementan lo que en el ´ambito del control autom´atico se conocen como interfaces controlador-proceso, mientras que las capas superiores implementan las interfaces usuario-controlador en alguna forma como una GUI (Graphical User Interface), HMI (HumanMachine Interface), MMI (Man-machine Interface) o una simple CLI (Command-Line Interface). Para una implementaci´ on eficiente, que garantice las caracter´ısticas de claridad, modularidad, reusabilidad del c´odigo, es conveniente dedicar el tiempo que sea necesario a la definici´ on clara y precisa de c´omo ser´ıa el programa en cada una de las tres dimensiones anteriores. Esta inversi´ on inicial de tiempo siempre es 2008.12.14
1
RAL - Robotics and Automation Laboratory - Prof. M. Torres T. ´ctrica Departamento de Ingenier´ıa Ele ´ lica de Chile Pontificia Universidad Cato Plantilla para
Proyectos en C/C++ del RAL
recompensada, pues evita tener que reparar errores de dise˜ no o estructuraci´ on que de lo contrario ocurren a medio camino. En las siguientes secciones se discuten brevemente las tres dimensiones tomando el programa plantilla PTZ como modelo de referencia. El documento concluye con una serie de recomendaciones para implementaci´ on de soluciones seg´ un el programa plantilla PTZ para proyectos RAL.
3
Especificaciones Funcionales
En ingenier´ıa de sistemas y desarrollo de software, las especificaciones funcionales (llamadas en ingl´es functional specifications, functional specs o FSD = functional specifications document) corresponden al conjunto de documentos que describen el comportamiento requerido de un cierto sistema de ingenier´ıa. Las espcificaciones funcionales permiten fijar un marco general de trabajo entre diversos programadores de un proyecto y describir lo que se requiere implementar. El documento t´ıpicamente se compone de las siguientes listas con descripciones de las propiedades de los datos y funciones que las componen: 1. Inputs del Usuario: Lista de datos entregados por el usuario a la aplicaci´on. Algunos datos pueden ser variables modificables durante la ejecuci´on a trav´es de la interfaz de usuario, otros datos pueden ser par´ametros establecidos al inicio de la ejecuci´on de la aplicaci´on. 2. Inputs del Entorno/Proceso: Lista de datos requeridos por la aplicaci´on que son obtenidos desde el entorno. 3. Outputs al Usuario: Lista de datos o resultados que son entregados al usuario. 4. Outputs al Entorno/Proceso: Lista de datos que son entregados por la aplicaci´on al entorno de modo que otras partes del entorno o sistema puedan realizar las acciones para las cuales fueron creadas. 5. Funcionalidad: Lista de funciones y comportamientos que debe poseer la aplicaci´on.
2008.12.14
2
RAL - Robotics and Automation Laboratory - Prof. M. Torres T. ´ctrica Departamento de Ingenier´ıa Ele ´ lica de Chile Pontificia Universidad Cato Plantilla para
Proyectos en C/C++ del RAL
Ejemplo Especificaciones Funcionales PTZ Nombre de la Aplicaci´ on ptz Objetivos Abrir un archivo, secuencia de archivos, archivo de video o captura de una c´amara y segmentar cada imagen o cuadro en base a caracter´ısticas de color empleando las componentes de crominancia roja y crominancia azul del espacio de colores YCrCb. Adem´as aplica un proceso simple de detecci´ on de bordes a la imagen segmentada. Inputs del Usuario Opciones de l´ınea de comando -h Prints some help. -nv Turns verbose off. -np Do not wait for user to press ESC when done. -nd Do not display images. -no Do not save the output. -e Filename extension [=jpg ] -sq initial value final value Tells ptz to process a sequence of images starting at filename.ext and ending in filename.ext By default the sequence range is assumed to be between 0 and 10 with zero-padding = 3, i.e. 000, 001,..., 010. -zp num Pad filename suffix with num zeros. -fps num Frames per seconds [=max fps]. GUI, Mouse y Teclado ESC quit the program. Mouse-L show position and intensity values of selected pixel. Mouse-R select region. Mouse-R+CTRL draw on buffer. p Process current image using loaded or precomputed data. a Add class. r Remove current class. l List existing classes. u Calculate feature vector for current region and update the class parameters. b Blank current class data. v Fill current class data with random values. < Decrease current class. > Increase current class. h Toggle process holding (temporarily disables/enables processing). g Get class data from cpd.txt. s Save class data to cpd.txt. t Test basic functions. Threshold slidebars Segmentation threshold and edge thickness threshold. Inputs del Entorno Image or video Image file or video sequence from AVI file or USB camera.
2008.12.14
3
RAL - Robotics and Automation Laboratory - Prof. M. Torres T. ´ctrica Departamento de Ingenier´ıa Ele ´ lica de Chile Pontificia Universidad Cato Plantilla para
Outputs al Usuario Segmentation Edges Outputs al Entorno Segmentation map Funcionalidad
Proyectos en C/C++ del RAL
Image containing the segmentation of the input into the differnt classes. Image containing the edges of the segmented input. Image containing the segmentation map (result).
1. La aplicaci´on detecta en forma autom´atica el tipo de input (archivo u ´nico de imagen, secuencia de archivos de video, archivo de video AVI o captura directa de c´amara USB). 2. La imagen puede ser segmentada seg´ un las caracter´ısticas de color seleccionadas por el usuario. Para esto el usuario primero debe seleccionar una regi´on de inter´es con Mouse-R+CTRL, luego a˜ nadir una clase con ’a’, y actualizar los valores de la clase actual con ’u’. El procesamiento se inicia cuando el usuario presiona ’h’.
Referencias sobre Especificaciones Funcionales [1] Wikipedia. Functional Specifications. Versi´ on 28 de octubre, 2008. http://en.wikipedia.org/wiki/Functional specifications [2] Allen Smith. Functional Spec Tutorial: What and Why. Visitada 16 de diciembre, 2008. http://www.mojofat.com/tutorial/
4
Estructura Temporal
La estructura temporal se refiere a la secuencia l´ogica de ejecuci´on. Esta puede describirse mediante diagramas de flujo o pseudoc´odigo. Los diagramas de flujo pueden resultar m´as explicativos que los pseudoc´odigos cuando se requiere describir el flujo de datos, pasos de un proceso o sistema con muchas etapas de decisi´ on. En cambio los pseudoc´odigos resultan m´as eficaces para describir funciones o algoritmos, los cuales por lo general contienen m´as pasos de c´alculo que etapas de decisi´on. Ejemplos de Pseudoc´ odigo Para ilustrar el uso de pseudoc´odigos y diagramas de flujo se presentan a continuaci´ on algunos procesos computacionales. El algoritmo 1 corresponde a una descripci´ on en pseudoc´odigo de alto nivel de los pasos principales llevados a cabo en el programa PTZ. Esta estructura corresponde a la estructura general de toda aplicaci´on de automatizaci´on, como se explic´o en la secci´on 2. La secuencia de tareas principales realizadas por el programa PTZ tambi´en puede describirse empleando un pseudoc´odigo de bajo nivel como se muestra en el algoritmo 2. La diferencia entre un pseudoc´odigo de alto nivel y uno de bajo nivel yace en que el primero est´a escrito empleando oraciones similares a las del lenguaje habitual de las personas junto con f´ormulas matem´aticas, mientras que el pseudoc´odigo de bajo nivel emplea t´erminos y un lenguaje que asemeja un lenguaje de programaci´on. En un pseudoc´odigo de bajo nivel es habitual observar t´erminos que representan las bifurcaciones condicionales (if-then-else) y otros t´erminos que usualmente se emplean para loops o bucles de programa (for-from-to-do, while-do, do-while o repeat-until). Otro ejemplo de pseudoc´odigo de bajo nivel se muestra en el algoritmo 3. Este u ´ltimo algoritmo corresponde a la implementaci´ on de la funci´ on ComputeSegmentation del programa PTZ. Al comparar el pseudoc´odigo con el c´odigo original en C/C++ de la funci´ on, podr´a notar que el pseudoc´odigo es bastante m´as f´acil y r´apido de leer que el c´odigo fuente. 2008.12.14
4
RAL - Robotics and Automation Laboratory - Prof. M. Torres T. ´ctrica Departamento de Ingenier´ıa Ele ´ lica de Chile Pontificia Universidad Cato Plantilla para
Proyectos en C/C++ del RAL
Finalmente, el pseudoc´odigo de bajo nivel de un proceso general de automatizaci´on se muestra en el programa 4. Cabe destacar que en este caso el pseudoc´odigo de bajo nivel hace uso de una sintaxis similar a la del lenguaje C/C++. Por ejemplo, el inicio y el fin de cada funci´ on est´an definidos por los delimitadores {, }, respectivamente. Por otro lado, los comentarios emplean // y las funciones indican el tipo de dato que retornan. ¿Cu´ ando utilizar pseudoc´ odigo de alto o de bajo nivel? Utilice pseudoc´odigo de alto nivel para describir procesos muy generales o procesos en los que las etapas de decisi´on son pocas o son elementos secundarios del proceso. Un pseudoc´odigo de alto nivel es ideal para entregar una visi´ on general de la secuencia de pasos que se debe realizar, sin entrar en los detalles de cada paso. Los pseudoc´odigos de ´ bajo nivel permiten explicar de mejor manera algoritmos y funciones. Los pseudocdigos de bajo nivel no ofrecen mayor ventaja para explicar una secuencia general de pasos de un programa o aplicaci´on. Al emplear pseudoc´odigo de bajo nivel, procure utilizar un lenguaje gen´erico como en los algoritmos 2 y 3. Existen herramientas en LATEX, como el paquete algorith2e que permiten escribir pseudoc´odigo de bajo nivel est´andar (vea el c´odigo fuente de este documento). Evite utilizar pseudoc´odigo de bajo nivel que recurra a t´erminos y sintaxis de un lenguaje de programaci´on espec´ıfico. Recuerde que el prop´osito del pseudoc´odigo es que sea entendido por cualquiera y pueda ser implementado en cualquier lenguaje de programaci´on. Utilice una sintaxis espec´ıfica a un cierto lenguaje solo cuando sea necesario referirse a programas escritos en ese lenguaje, como en ejemplos de programaci´on o aplicaci´on del lenguaje particular.
Algorithm 1: Main Program Structure (High-level Pseudocode) input : Image sequence output: Segmented image using YCrCb color features 1. Initialize data structures 2. Parse command line parameters and update data structures 3. Get the input image Depending on the context some of the typical actions may include commands with names such as: Allocate/Create/Open/Load/Read/Get/Retrieve/Grab/Capture 4. Process image 5. Store the results Depending on the context some of the typical actions may include commands with names such as: Save/Write/Set/Put/Close/Release/Free/Clear/Destroy 6. Show/display results 7. Handle keyboard inputs from user 8. Repeat 3-7 until some ending condition is met, skipping 6 and 7 if no user interaction through CLI or GUI is required in order to save time.
2008.12.14
5
RAL - Robotics and Automation Laboratory - Prof. M. Torres T. ´ctrica Departamento de Ingenier´ıa Ele ´ lica de Chile Pontificia Universidad Cato Plantilla para
Proyectos en C/C++ del RAL
Algorithm 2: Main Program Structure (Low-level Pseudocode) input : Image sequence output: Segmented image using YCrCb color features —— Initialization ——; InitCmdLineStruct(&CmdLineParam); ParseCmdLine(&CmdLineParam); CheckInputType(&CmdLineParam); CreateInputContainer; if &CmdLineParam.display = TRUE then CreateGUI; end InitProcessParam(&ProcessParam); —— Begin Process ——; while (capture)∧(run) do &img ← GetImage(); &img ← ProcessImage(&img, &ProcessParam); StoreImage(&img); if &CmdLineParam.display = TRUE then DisplayImage(); end ProcessKeyboard(); end
Algorithm 3: ProcessImage (Low-level Pseudocode) input : &img (input image), &ProcessParam (process parameters) output: &img (segmented image) &imgaux ← &img; —— ComputeSegmentation ——; for row = 0 to &img.height do for col = 0 to &img.width do for class = 1 to &ProcessParam.Nclasses do if kConvertToYCrCb(&imgaux(row,col ))−&ProcessParam.FeatureVector(class)k