En este punto compararemos los resultados de la simulación en Simulink con la prueba HIL. El objetivo de este análisis es validar la implementación en el hardware real
mediante comparación directa de los resultados.
Para realizar este análisis se establecerá la siguiente ruta de waypoints a seguir por la aeronave:
122
A B C D E F
X 0 1000 1400 1000 400 -200
Y 0 0 600 1000 800 400
Z 1200 1300 1400 1300 1205 1400
COMPARACIÓN DE TRAYECTORIAS EN EL PLANO XY
En las siguientes figuras se muestran las trayectorias seguidas en el plano horizontal tanto en la simulación en Simulink, como en la prueba HIL.
Simulink:
Figura 79 Trayectoria seguida en Simulink
Simulación HIL:
123 Se puede apreciar como el error en trayectoria realizada con el hardware real es despreciable. Este error viene dado principalmente por el hecho de usar aritmética de punto flotante de 32bits, en lugar de los 64bit que emplea Simulink.
COMPARACIÓN DE TRAYECTORIAS EN EL EJE Z
Simulink:
Figura 81 Altura del UAV en la simulación con Simulink
Simulación HIL:
124 En estas gráficas también se observa que las trayectorias son prácticamente
coincidentes.
Con estos resultados podemos afirmar que la respuesta de la implementación en el microcontrolador LPC2148 con FreeRTOS es válida, cumpliendo los requisitos funcionales de más alto nivel al ser su respuesta muy próxima a la simulación.
En un entorno de producción real, este hardware ya sería integrable en un UAV. A este proceso le seguiría un proceso de refinamiento de los controladores, ya que con toda seguridad, la respuesta del avión real no se ajuste completamente al modelo
125
8 CONCLUSIÓN
Tras el estudio de la familia, las herramientas y recursos disponibles, y la
implementación de un sistema de control con las mismas, hemos comprobado cómo es viable el uso de herramientas libres para configurar un entorno de desarrollo fiable y de alta calidad y prestaciones. Hemos verificado la versatilidad de la arquitectura y la gran cantidad de recursos libres disponibles.
Este conjunto de características, hacen de esta familia una buena plataforma docente, ya que además de ser una arquitectura ampliamente implantada y en continua
evolución, disponemos de todas las herramientas necesarias de forma gratuita, y en el caso del hardware, a muy bajo coste.
Por otra parte se ha verificado la capacidad computacional de la misma, obteniendo resultados satisfactorios en la implementación de un sistema de control en tiempo real, cuya validez se ha probado mediante la realización de una prueba de tipo hardware in the loop. Adicionalmente se ha demostrado la utilidad de este tipo de pruebas, ya que permiten la verificación de un diseño de forma sencilla y fiable, ya que se centra en la comprobación de requisitos funcionales de alto nivel.
127
9 LÍNEAS FUTURAS
Como desarrollo adicional de este proyecto se propone el estudio de la integración de código generado automáticamente desde Simulink con la herramienta Realtime Workshop. La integración de código generado mediante herramientas de diseño basado en modelos puede presentar ventajas como la eliminación de errores de codificación y permitir que se puedan hacer modificaciones en los modelos sin que ello suponga una carga de trabajo adicional de codificación.
También resulta interesante el estudio de las familias Cortex-M3 y Cortex-R4,
especialmente indicadas para sistemas en tiempo real. Un desarrollo adicional podría ser la implementación de un port de FreeRTOS para Cortex-R4, ya que todavía está disponible.
Con respecto a la pruebas HIL, resulta interesante investigar este campo,
especialmente si se realizan con hardware especifico para tal propósito, como los equipos PXI para LabView Realtime. Esto equipos permiten la realización de estas pruebas en un verdadero entorno en tiempo real, contando con tarjetas de E/S mediante las cuales se podría interfasear el sistema de control a más bajo nivel, por ejemplo, se podría conectar la salida PWM de un controlador de servos directamente al equipo PXI, este realizaría la decodificación de esta señal PWM y la aplicaría a la modelo del sistema bajo control. De esta forma las pruebas HIL permiten probar no solo la funcionalidad en cuanto a cálculo, sino también la correcta implementación de los protocolos de E/S del sistema.
129
BIBLIOGRAFÍA
ARM7TDMI Technical Reference Manual , ARM Limited
The insider’s guide to the Philips ARM7 based microcontrollers, Trevor Martin, Hitex Ltd., ISBM: 0-9549988 1
Using Open Source Tools for AT91SAM7S Cross Development, James P. Lynch LPC214x User Manual, Koninklijke Philips Electronics
FreeRTOS reference manual, Richard Barry, Real Time Engineers Ltd.
Using the FreeRTOS Real Time Kernel – A Practical Guide, Richard Barry, Real Time Engineers Ltd.
131 REFERENCIAS WEB www.nxp.com/ http://www.arm.com/ http://www.freertos.org/ http://www.embeddedrelated.com/groups/lpc2000/1.php http://openocd.berlios.de/web/ http://www.eclipse.org/ http://www.highintegritysystems.com/ http://www.mathworks.com/matlabcentral/ http://forum.sparkfun.com/
133
ANEXO A: FAMILIAS SOPORTADAS POR FREERTOS
Altera: Nios II
Atmel: CortexM3, ARM7, ARM9, AVR Cortus: APS 3
Energy Micro: EFM32, Cortex M3 Freescale: HCS12, Coldfire, PowerPC Fujitsu: MB91460, MB96340
Luminary Micro (adquirida por TI): Cortex M3 Microchip: PIC32, PIC24, dsPIC, PIC18
NEC: V850ES, 78K0R NXP: Cortex M3, ARM7 Renesas: SuperH, H8S Silicon Labs: 8051
ST: Cortex M3, ARM7, ARM9 TI: MSP430
Xilinx: Microblaze, PowerPC Intel/AMD/Otros: x86
135
ANEXO B: CÓDIGO PARA EL CÁLCULO DE REFERENCIAS DE TRAYECTORIAS
function k = track(u)
global I_ANT
global J_ANT
%Sacar los valores de la entrada.
long = (length(u)-4)/3; x_camino = u(1:long); y_camino = u(long+1:2*long); h_camino = u(2*long+1:3*long); x_v = u(3*long+1); y_v = u(3*long+2); reset=u(3*long+3); tipo=u(3*long+4);
%Valores de los indices correspondientes al camino.
i=I_ANT; j=J_ANT; %Calculamos variables. x_dif=x_camino(i)-x_camino(j); y_dif=y_camino(i)-y_camino(j); ang=atan2(x_dif,y_dif); modulo=sqrt(((x_camino(i)-x_camino(j))^2)+((y_camino(i)- y_camino(j))^2)); x_track=-(x_v*(cos(ang-pi/2))-(y_v*(sin(ang- pi/2))))+(x_camino(j)*(cos(ang-pi/2)))-(y_camino(j)*(sin(ang- pi/2)))+modulo;
%Calculo el ángulo siguiente.
m=i+1; if (m==long+1) m=1; end xd2=x_camino(m)-x_camino(i); yd2=y_camino(m)-y_camino(i); angsig=atan2(xd2,yd2);
%Calculo la magnitud del giro siguiente.
angtot=abs(angsig-ang); if (angtot>pi) angtot=(2*pi)-angtot; end %Selección de ganancias if (tipo==1) k=-(500/modulo)*0.002; else k=-(500/modulo)*0.002e7; end
%Calculamos cuándo se realizará el giro
136 error2=modulo*error/100; %logica de guiado. if (x_track<error2) j=i; i=i+1; if i==long+1 j=long; i=1; end end if (reset==1) i=2; j=1; end %Salidas. k=[x_camino(j),y_camino(j),x_camino(i),y_camino(i),k,h_camino(i)]; I_ANT=i; J_ANT=j;