Está en la página 1de 166

Diseño e implementación

Diseño e implementación del sistema de


simulación somatosensorial general

┊ Resumen

┊ El sistema de simulación somatosensorial tiene Con más de 40 años de historia de desarrollo
maduro, se utiliza principalmente en los campos de la aviación militar y civil en forma de controladores de hardware.
Seguir
┊ Con el surgimiento y popularización de la realidad virtual y las tecnologías de
realidad aumentada, los usuarios comerciales y personales también han comenzado a tener una
necesidad urgente de sistemas de simulación somatosensorial.

┊ Sin embargo, todavía hay pocas investigaciones y resultados sobre sistemas de
simulación somatosensorial baratos impulsados por software.
┊Este artículo propone un diseño de software universal y un método de implementación de un
sistema de simulación somatosensorial. Este artículo analiza primero el tradicional
┊ El principio de realización del sistema maduro de simulación somatosensorial impulsado
por hardware proporciona un esquema de uso de software para impulsar la plataforma de
movimiento. Recoger

┊ A continuación, basado en la idea de modularidad y arquitectura de acoplamiento
flexible, este artículo diseña e implementa un sensor de movimiento configurable, reemplazable y
extensible.
┊ Simule el software del sistema, hágalo tener una sólida compatibilidad con la
plataforma de movimiento y capacidades de personalización personalizadas, y aproveche al máximo
el software impulsado
┊ Ventaja. Finalmente, con el fin de demostrar que el sistema de propósito general tiene la
capacidad de resolver necesidades específicas, este artículo prueba laVuelo de Microsoft
Atuendo
Software Simulator X combinado para lograr el efecto de simulación de vuelo a nivel personal.


┊ Palabras clave: simulación somatosensorial, algoritmo de lavado, simulación de vuelo


Or
de
n






ne
a



I
Diseño e implementación









II
El diseño e implementación de
un software genérico de simulación de movimiento


┊ RESUMEN

┊ En las últimas cuatro décadas, los simuladores de movimiento controlados por hardware se han
desarrollado y
┊ se utilizan ampliamente en los campos de la aviación civil y militar. Sin embargo, el movimiento controlado
por software

Los simuladores dirigidos al uso comercial y personal carecen de suficiente atención, lo que se convierte en

un activo
┊ demanda hoy en día bajo el desarrollo y popularización de la realidad virtual y la realidad aumentada
┊ tecnología.

Este artículo presentó el diseño de la arquitectura y la implementación de una simulación de

movimiento genérica.
┊ software para controlar plataformas de movimiento. En primer lugar, la teoría y el enfoque de
Atuendo se dan simuladores de movimiento, junto con las adaptaciones a realizar para ser implementadas con
softwares.

Se presenta el diseño e implementación de nuestro software de simulación de movimiento, basado en
módulos

┊ programación y arquitectura de acoplamiento flexible para lograr configuraciones, reemplazables y
extensibles
┊ funcionalidades, lo cual es difícil cuando se usan controladores de hardware. Finalmente, para mostrar que
nuestra

el software es lo suficientemente adaptable para satisfacer una demanda específica, probamos el
rendimiento del vuelo personal
Orden
┊ simulaciones de movimiento conectando nuestro software con Microsoft Flight Simulator X.


Palabras clave: indicación de movimiento, algoritmo de lavado, simulación de vuelo



ne
a













Tabla de contenido

┊ 1. Introducción..............................................................................................................................................1
┊ 1.1 La fuente del tema y el propósito y significado de la investigación.................................................1
┊ 1.2 Historial de desarrollo y estado de la investigación.........................................................................2
┊ 1.2.1 Simulador somatosensorial....................................................................................................2
┊ 1.2.2 Plataforma deportiva..............................................................................................................2
┊ 1.2.3 Algoritmo de simulación somatosensorial............................................................................3
┊ 1.3 Estructura del artículo.......................................................................................................................4
┊ 2 Teoría básica..............................................................................................................................................5
┊ 2.1 Resumen............................................................................................................................................5
┊ 2.2 Plataforma de movimiento paralelo de seis grados de libertad Stewart...........................................5
┊ 2.2.1 Tipo........................................................................................................................................5
┊ 2.2.2 Mecanismo en serie y paralelo..............................................................................................6
Atuendo 2.2.3 Grados de libertad..................................................................................................................7
┊ 2.2.4 Sistema de coordenadas.........................................................................................................7
┊ 2.2.5 Posición y actitud de la plataforma........................................................................................8
┊ 2.2.6 Solución de cinemática inversa...........................................................................................10
┊ 2.3 Teoría de la percepción del movimiento humano...........................................................................10
┊ 2.3.1 Propioceptores......................................................................................................................11
Orden 2.3.2 El sistema vestibular............................................................................................................11
┊ 2.3.3 Sistema de visión.................................................................................................................13
┊ 2.4 Teoría de la simulación somatosensorial........................................................................................13
┊ 2.4.1 Desplazamiento simulado....................................................................................................13
┊ 2.4.2 Simulación de una aceleración lineal repentina..................................................................13
┊ 2.4.3 Simular aceleración lineal continua.....................................................................................13
línea 2.4.4 Simular rotación...................................................................................................................14
┊ 2.4.5 Simulación de aceleración angular......................................................................................14
┊ 2.5 Algoritmo de lavado clásico............................................................................................................14
┊ 2.5.1 Flujo del algoritmo...............................................................................................................14
┊ 2.5.2 Sistema de coordenadas del cuerpo.....................................................................................15
┊ 2.5.3 Zoom....................................................................................................................................15
┊ 2.5.4 Filtro.....................................................................................................................................17
┊ 2.5.5 Coordinación de inclinación de la plataforma de movimiento...........................................17
┊ 2.5.6 Movimiento de desplazamiento de la plataforma de movimiento......................................19
┊ 2.5.7 Movimiento giratorio de la plataforma de movimiento...........................................veintiuno
┊ 2.6 Desarrollo de software escalable.........................................................................................Veintitres
┊ 2.6.1 Modularidad.............................................................................................................Veintitres
┊ 2.6.2 Cohesión y acoplamiento.........................................................................................Veintitres
┊ 2.6.3 Principios SOLID.................................................................................................veinticuatro
2.6.4 Modelo IO.............................................................................................................veinticuatro
3 Análisis de requisitos de software y diseño de esquemas.......................................................................26
3.1 Resumen de demanda.....................................................................................................................26
3.1.1 Requerimientos funcionales.........................................................................................26
3.1.2 Entorno operativo...........................................................................................................26
3.2 Diseño general.............................................................................................................................27
3.2.1 Diagrama de flujo de datos.........................................................................................27
3.2.2 Arquitectura.........................................................................................................................27
3.2.3 La relación entre requisitos funcionales y módulos............................................................29
┊ 4 Investigación sobre la implementación de software del algoritmo de simulación somatosensorial......31
┊ 4.1 Realización digital de filtro analógico............................................................................................31
┊ 4.2 Realización digital de puntos..........................................................................................................33
┊ 4.3 Análisis de complejidad de algoritmos...........................................................................................34
┊ 5 Implementación detallada del marco básico del lado del servidor.........................................................35
┊ 5.1 Tecnología de servidor y selección de componentes......................................................................35
┊ 5.2 Tecnología de interfaz de configuración del servidor y selección de componentes......................35
┊ 5.3 Implementación del sistema impulsado por eventos......................................................................36
┊ 5.3.1 Flujo de datos del módulo....................................................................................................36
┊ 5.3.2 Lista de eventos....................................................................................................................36
┊ 5.3.3 Implementación específica..................................................................................................37
┊ 5.4 Implementación del sistema de complementos..............................................................................38
┊ 5.4.1 Formulario de complemento................................................................................................38
Atuendo 5.4.2 Descubrimiento de complementos.......................................................................................39
┊ 5.4.3 Carga de la capa lógica del complemento...........................................................................40
┊ 5.4.4 Clase base de la capa lógica del complemento....................................................................40
┊ 5.4.5 Carga de la capa de interfaz de complemento.....................................................................41
┊ 5.4.6 Comunicación entre la capa de interfaz de complemento y la capa de interfaz de marco. 43
┊ 5.4.7 Comunicación entre la capa de interfaz de complemento y la capa lógica.........................46
Orden 5.4.8 Implementación de selección de plug-in.............................................................................46

┊ 6 Implementación detallada del módulo plug-in........................................................................................48
┊ 6.1 Módulo FSX....................................................................................................................................48
┊ 6.1.1 Mecanismo SimConnect y FSUIPC....................................................................................48
┊ 6.1.2 Muestreo en tiempo real de la actitud de vuelo...................................................................48
línea 6.1.3 Implementación de la comunicación entre complementos de señal FSX...........................51
┊ 6.2 Módulo de entrada de actitud de vuelo estándar.............................................................................62
┊ 6.2.1 Almacenamiento de posiciones y posturas..........................................................................62
┊ 6.2.2 Entrada de señal de posición y actitud.................................................................................63
┊ 6.3 Módulo de algoritmo de lavado clásico..........................................................................................64
┊ 6.3.1 Descripción general del proceso..........................................................................................64
┊ 6.3.2 Configuración de parámetros de filtro.................................................................................64
┊ 6.3.3 Cálculo de filtros.............................................................................................sesenta y cinco
┊ 6.3.4 Implementación de algoritmos........................................................................sesenta y cinco
┊ 6.4 Módulo de salida de simulación visual de la plataforma de movimiento Stewart.........................66
┊ 6.4.1 Tecnología WebGL y marco Three.js.................................................................................66
┊ 6.4.2 Construcción de formas geométricas...................................................................................67
┊ 6.4.3 Cálculo de posición y actitud...............................................................................................69
┊ 6.4.4 Mecanismo de comunicación del módulo...........................................................................70
6.4.5 Visualización de efectos......................................................................................................71
7 Pruebas y optimización............................................................................................................................72
7.1 Módulo FSX....................................................................................................................................72
7.1.1 Resultado de muestreo...................................................................................................72
7.1.2 Eficiencia de muestreo.................................................................................................75

7.2 Algoritmo de lavado clásico...................................................................................................76


7.2.1 Resultados de la simulación somatosensorial.......................................................76
7.2.2 Eficiencia computacional.............................................................................................80
7.3 Efecto servidor...........................................................................................................................81
┊ 7.4 Efecto de simulación visual de la plataforma de movimiento Stewart..........................................82
┊ 8 Conclusión y perspectivas.......................................................................................................................84
┊ 8.1 Conclusión.......................................................................................................................................84
┊ 8.2 Outlook............................................................................................................................................84
┊ referencias..............................................................................................................................................85

┊ Gracias......................................................................................................................................................88






Pa
qu
et
e





Or
de
n






ne
a













Diseño e implementación del

1 Introducción
1.1 La fuente del tema y el

propósito y significado de la investigación
┊ La simulación de movimiento también se denomina simulación de movimiento y
simulación de movimiento. Simulación somatosensorial a través del espacio físico limitado

Simule diferentes aceleraciones y direcciones de vez en cuando, engañando al cerebro del

usuario para proporcionar una sensación de movimiento, como cambios de posición, cambios de velocidad,
┊ Cambios de aceleración, etc.[1]. En la actualidad, con la popularización y aplicación de la
tecnología de realidad virtual y realidad aumentada, usuarios comerciales e individuales
┊ El precio puede realizar simulación visual y auditiva, y sobre esta base, existe una
necesidad urgente de simulación somatosensorial de bajo costo. Simulación somatosensorial

Sistema desde el siglo pasado Desde la década de 1970, ha logrado resultados y aplicaciones muy
┊ en los campos de la aviación civil y militar, pero debido a su costo
ricos
┊ Generalmente más de $ 100,000 dólar estadounidense[2], Los usuarios personales o
empresariales son insoportables.
┊ El alto costo de los simuladores somatosensoriales existentes proviene
principalmente de:

Personalizado según las características y necesidades del campo

┊ Un conjunto completo de hardware de simulación de control de conducción para
fines de formación o investigación.
Atuendo Plataforma de movimiento de alta precisión, alto rendimiento y gran capacidad de
carga

Costos de mantenimiento y costos de capacitación del personal

┊ Desde el siglo XXI, algunas empresas y entusiastas de los vuelos individuales han comenzado a
explorar simuladores somatosensoriales de gama baja para los entusiastas del bricolaje.
┊ Los entusiastas del bricolaje eligen el hardware apropiado para ensamblar y depurar por sí mismos, y
utilizan software de simulación somatosensorial comercial para realizar la simulación somatosensorial. Esta

El costo de un simulador somatosensorial de gama baja se ha reducido a $ 10,000 USD
┊ el seguimiento[3], Pero requiere que los usuarios tengan una habilidad práctica muy fuerte,
que sigue siendo un producto de nicho y no se puede adaptar a las necesidades actuales. Además, estos
┊ El software de simulación somatosensorial tampoco tiene la capacidad de ajustar el
algoritmo de simulación somatosensorial y la capacidad de expandirse. El efecto de simulación
somatosensorial dependerá completamente del software

En sí misma, la función también es limitada[4, 5].

┊ Este artículo propone que para un simulador somatosensorial a nivel personal, el
software de simulación somatosensorial debe ser similar al sistema operativo de este simulador.
línea Para las computadoras personales, el software de simulación somatosensorial controla el
hardware y no se limita a un hardware específico, y proporciona un entorno operativo básico para el
software de aplicación.

No limitado a aplicaciones específicas. Entre ellos, el hardware del simulador
somatosensorial es principalmente una plataforma deportiva, y el software de aplicación es
principalmente para diferentes necesidades.

┊ Se desarrollaron varios componentes.

Total 88 Primero 1
Diseño e implementación del

┊ En base a esto, este artículo diseña un software de sistema de simulación


somatosensorial general, con módulos funcionales configurables, reemplazables y ampliables.
┊ Como concepto central, la intención es lograr los siguientes propósitos:

┊ A. Proporcionar soporte de hardware de plataforma deportiva abierta
┊A través de una interfaz abierta, los diferentes fabricantes de plataformas de movimiento
pueden adaptarse a la interfaz establecida propuesta en este tema (es decir, proporcionar un
"controlador"
┊ O reutilizar los "controladores" existentes), eliminar las barreras del hardware y software
patentados, introducir la competencia en la industria y, en teoría, permitir a los usuarios

┊ Acceso directo a un conjunto completo de soluciones de hardware de plataforma de
movimiento a un costo menor.
┊ B. Realizar una integración flexible con otros sistemas
┊ Para los desarrolladores, se permite el desarrollo y montaje libres de módulos
para lograr la integración con otros sistemas como simuladores de vuelo y cascos de
realidad virtual para satisfacer diversas necesidades de los usuarios. Para los
investigadores, se les permite reutilizar otros componentes y enfocarse en la
mejora e innovación de uno de los componentes (como el algoritmo de simulación
somatosensorial). Al mismo tiempo, pueden conectar fácilmente estos módulos a la
plataforma de hardware para pruebas de integración y realizar experimentos
Contraste.
C. Dar una solución factible para implementar un algoritmo de simulación somatosensorial basado en
hardware en el software.

Total 88 Primero 2
Por razones históricas, la mayoría de los algoritmos de simulación
somatosensorial existentes están diseñados en base a señales analógicas, que se
implementan directamente a través de hardware, y el análisis de simulación se
realiza en software a través de software de simulación numérica. Este artículo se
basa en las sugerencias dadas en artículos anteriores. [6], Estudió el principio de
realización de software del algoritmo de simulación somatosensorial, y dio la
realización de operación de alto rendimiento, para proporcionar una referencia para
el tema de seguimiento de dicho software de simulación somatosensorial.
┊ Permite a los investigadores de algoritmos de simulación somatosensorial continuar utilizando
procesos y herramientas familiares para diseñar e investigar algoritmos basados en señales
analógicas.
┊ D. Dar un diseño detallado de la arquitectura y un plan de implementación de este tipo de software de
simulación.

Proporcionar una referencia para la investigación de seguimiento de este tipo,

especialmente la formulación de estándares de interfaz.
┊ 1.2 Historial de desarrollo y estado de la investigación

┊ 1.2.1 Simulador somatosensorial

┊ Motion Simulator fue el primer simulador de vuelo para entrenamiento de pilotos [7].
1910
┊ Nació un simulador somatosensorial Sanders Teacher[8], El piloto puede realizar tres grados
de libertad cuando hay viento(3 grados de libertad,

3-DOF) Simulación de control de vuelo. En 1929, Link Trainer se desarrolló con éxito. Implementó un

sistema de movimiento que permitía a los pilotos utilizar
┊ Usa el controlOperación de palanca y, en consecuencia, utilice la plataforma de
accionamiento eléctrico para una rotación de tres grados de libertad [9]. El cometa IV
desarrollado en 1958 se actualizóAtuendo Para el uso de la unidad hidráulica y para darse
cuenta del sentido real de la simulación de movimiento, y luego realizar gradualmente un
simulador de movimiento de mayor grado de libertad[7].

Desde la década de 1960, en el contexto del Proyecto Apollo, las agencias de la NASA en los Estados
Unidos han realizado muchas investigaciones sobre simulación somatosensorial. [7],liberación

┊ Se presentan varios algoritmos y modelos importantes de simulación somatosensorial.
Después de eso, como simulador de conducción de automóviles, simulador de conducción de
motocicletas,
┊ Simuladores de conducción de tanques, simuladores de movimiento de barcos, simuladores
de conducción de trenes, etc. se han desarrollado uno tras otro. [10].

Orden






ne
a


┊ Figura 1.1 Entrenador de enlaces Simulador de vuelo Figura 1.2 Simulador de vuelo del
cometa 4


┊ 1.2.2 Plataforma deportiva

┊Plataforma deportiva ( Motion Platform, Motion Base) es la base de los simuladores somatosensoriales
modernos, e incluso en muchos casos, "somatosensory
┊ El término "simulador" se refiere a una plataforma deportiva. [1]. La plataforma
deportiva generalmente consta de una parte fija fija en el suelo (llamado plano fijo).

┊ Plataforma, plataforma fija, plataforma fija) y una parte que puede moverse una cierta
distancia o girar en un ángulo (llamada plataforma de carga,
┊ Composición de plataforma móvil, plataforma de carga útil)[1]. El estándar de
clasificación de la plataforma de movimiento es generalmente el grado de libertad, es decir, la
plataforma gira en tres direcciones.
┊ La capacidad de rotar y trasladar en tres direcciones. El mayor grado de libertad
de la plataforma de movimiento es de seis grados de libertad, pero en los últimos
años también se ha propuesto el concepto de ocho grados de libertad, que enfatiza
principalmente la provisión de dos direcciones adicionales de desplazamiento
extendido.[11].
Gough-Stewart La plataforma (conocida como la plataforma Stewart, también
conocida como la plataforma Hexapod) es una plataforma común de seis grados de
libertad. El famoso artículo "Una plataforma con seis grados de libertad" publicado
por D Stewart en 1965[12]Criado en. La plataforma Stewart se compone de una
plataforma superior e inferior, seis patas retráctiles y bisagras que las conectan.
Es una conexión paralela
Estructura. Debido a su estructura compacta, su gran capacidad de carga y su fácil
solución cinemática inversa, se ha convertido en la opción estándar para los
simuladores somatosensoriales de alta gama.[13].









┊ Figura 1.3 UnoStewart típico Plataforma deportiva Figura 1.4 CableRobot Plataforma de
movimiento de seis grados de libertad


┊ Aunque las plataformas deportivas tienen una larga historia de desarrollo, todavía
se están inventando nuevas plataformas deportivas, como Investigación alemana 2016
┊ Los investigadores han desarrollado un nuevo tipo de plataforma de movimiento
basada en cuerdas con seis grados de libertad. CableRobot[14], Porque se deshizo de la
instalación de base fija
Es limitado y tiene un amplio rango de movimiento, mostrando un gran potencial en la

simulación somatosensorial.

1.2.3 Algoritmo de simulación somatosensorial

┊ El algoritmo de señalización de movimiento (MCA) se refiere a la capacidad de
convertir el movimiento de un vehículo o modelo de vehículo en

Un algoritmo que mantiene el movimiento del cuerpo humano mientras mantiene la
postura de la plataforma de movimiento.[15], Es el algoritmo central del simulador
somatosensorial, que determina directamente la configuración somatosensorial
┊ La fidelidad de la simulación.
┊ El rango de movimiento de la plataforma de movimiento es extremadamente limitado y
el rango de movimiento del vehículo excede en gran medida el rango de movimiento de la
plataforma de movimiento, por lo que

Desde un punto de vista físico, la plataforma de movimiento no puede simular
completamente el movimiento del vehículo. El algoritmo de simulación somatosensorial aprovecha
los defectos de la percepción humana,

┊ Bajo las limitaciones físicas de la plataforma móvil, es posible simular los factores
requeridos por el cuerpo humano para percibir el movimiento tanto como sea posible, y "engañar" al
cuerpo humano para que el cuerpo humano tenga
línea Sensación de movimiento[dieciséis].

El algoritmo de simulación somatosensorial corriente principal actual es el
algoritmo de lavado(Algoritmo de lavado), incluye principalmente el algoritmo de lavado clásico,
adaptativo

┊ Algoritmo de lavado, algoritmo de lavado óptimo, etc.
┊ A. Algoritmo de lavado clásico
┊ A l g o r i t m o d e l a v a d o c l á s i c o (Algoritmo de lavado clásico) también se llama
algoritmo de simulación lineal (algoritmo de señalización lineal)

┊ Algoritmo)[17, 18], Es el algoritmo de simulación somatosensorial más antiguo y más
utilizado. La fórmula del algoritmo es simple, con menos parámetros,
┊Después de la calibración, puede tener un buen efecto de simulación somatosensorial.
┊ El algoritmo de lavado clásico toma la aceleración lineal y la velocidad angular
como entrada, y la aceleración lineal abrupta se integra doblemente y se usa como

┊ Reproduzca la aceleración para el desplazamiento de la plataforma móvil; la velocidad
lineal fija es fácil de hacer que la plataforma se mueva más allá del límite físico, así que use
┊ Ajuste de inclinación en lugar de desplazamiento para reproducir la aceleración; la
velocidad angular fija se descarta porque el cuerpo humano no la percibe fácilmente; ángulo
abrupto
┊ Una vez integrada la velocidad, se utiliza como ángulo de rotación de la plataforma de
movimiento para reproducir.
B. Algoritmo de lavado adaptativo
Algoritmo de lavado adaptativo[19]sí El Centro de Investigación Langley de la NASA mejoró
el algoritmo de lavado clásico e introdujo cambios adaptativos a los parámetros del filtro. El algoritmo
de lavado adaptativo tiene un mayor grado de fidelidad que el algoritmo de lavado clásico cuando la
plataforma está en el origen. Según estudios [6], El algoritmo de lavado adaptativo puede
lograr en comparación con el algoritmo de lavado clásico
Mayor fidelidad. Sin embargo, debido a que el algoritmo de lavado adaptativo
introduce fórmulas más complejas y más parámetros, es más difícil ajustar los
parámetros y el tiempo de cálculo es más largo.
C. Algoritmo de lavado óptimo
┊ Algoritmo de lavado óptimo[20]Utilice principalmente la investigación sobre la
percepción del movimiento humano para poner el cuerpo humano frente a
┊ El modelo del sistema de cancha se introduce en el algoritmo de lavado, con el
objetivo de minimizar la brecha de percepción motora bajo este modelo. El efecto del algoritmo
de lavado óptimo es directo

La conexión depende de la precisión del modelo vestibular y es difícil ajustar la

referencia al algoritmo de lavado clásico.
┊ La Tabla 1.1 compara la complejidad de los tres algoritmos de simulación somatosensorial anteriores.
Entre ellos, el tiempo de ejecución está enCálculo de Perkin Elmer 3250
┊ Dibuja en el avión.


┊ mesa 1.1 Comparación de tres
┊ algoritmos de lavado[6]
┊ algoritmo Número de horas de operación/ Número de Transparen
┊ ecuaciones Iteración (ms) parámetros cia de
┊ diferenciales libres parámetros
Pa por resolver
qu Algoritmo de 13 1.0 veintiuno Muy bueno
et lavado clásico
e



1.3 Estructura del artículo

┊ Este artículo se divide en ocho capítulos, organizados según la siguiente
estructura:
Orden
El primer capítulo describe los antecedentes, el propósito, la importancia, el
historial de desarrollo de los campos relacionados, el estado de la investigación de campo y la
estructura de este artículo;

┊ El segundo capítulo describe la teoría y la tecnología básicas del tema, incluido
el modelo de plataforma de movimiento, la teoría de simulación somatosensorial y el algoritmo de
simulación somatosensorial.
┊ Modelo, principio de desarrollo modular;

El Capítulo 3 presenta el análisis de la demanda y el diseño del esquema del
software que se implementará en este artículo;

línea El cuarto capítulo estudia y realiza un método de aplicación de algoritmo de
simulación somatosensorial en software para un cálculo eficiente;
┊ Los capítulos quinto y sexto dan el diseño detallado del software y la
implementación del código de las partes clave del módulo;

El Capítulo 7 muestra el software implementado en este trabajo y realiza la prueba
de efecto y análisis de optimización;

┊ El Capítulo 8 resume los resultados y la importancia de este proyecto y espera con
interés el trabajo futuro.









2 Teoría básica
2.1

Resumen
┊ El simulador somatosensorial es un tipo de equipo que proporciona al personal una
sensación de movimiento similar a la de un vehículo en un espacio limitado.

Una plataforma de movimiento que permite a las personas moverse o rotar en un espacio

limitado. Debido al espacio limitado del simulador somatosensorial, el vehículo simulado será
┊ Movimiento en un espacio virtual infinito, por lo que físicamente el simulador
somatosensorial no puede aplicar directamente el movimiento del vehículo simulado para controlar
el movimiento.
┊ Movimiento de plataforma. Esto convierte la postura de movimiento del modelo de
vehículo en la postura de la plataforma de movimiento (incluido el ángulo de desplazamiento y
rotación) mientras se mantiene

El algoritmo de percepción del movimiento humano se denomina algoritmo de simulación

somatosensorial, que es el algoritmo central del simulador somatosensorial, que determina
directamente la simulación somatosensorial.
┊ Realismo.

┊ 2.2 Plataforma de movimiento paralelo de seis grados de libertad Stewart

La plataforma de movimiento se puede dividir en una plataforma en serie y una
plataforma paralela según el mecanismo. Según el grado de libertad, se puede dividir en una
plataforma de seis grados de libertad y una plataforma de cinco grados de libertad .

Atuendo Plataforma, plataforma de cuatro grados de libertad, plataforma de tres grados de
libertad, etc. La plataforma Stewart a la que se adapta el software de este artículo es una de
las más avanzadas en simuladores somatosensoriales.
┊ La plataforma de movimiento paralelo de seis grados de libertad ampliamente utilizada,
también conocida como plataforma Hexapod, fue desarrollada por primera vez por el investigador
alemán D Stewart.

En la revista británica en 1965 Publicado en IMECHE[12]. Los primeros robots industriales
utilizaban principalmente formas en tándem. Los robots tándem tienen mayor

┊ Espacio para el movimiento, mientras que los robots paralelos tienen espacio limitado,
por lo que La plataforma Stewart no se ha utilizado ampliamente. Posteriormente con el simulador somatosensorial
┊Conviértete en un hotspot de investigación, Plataforma Stewart debido a su buen efecto en espacios
reducidos y mayor capacidad de carga.[10], Poco a poco conviértete en el maestroOrden Plataforma
de transmisión de movimiento para simulador somatosensorial.

┊ 2.2.1 Tipo

┊ La plataforma Stewart consta de dos plataformas superior e inferior y múltiples varillas de soporte que
conectan las plataformas en paralelo. Varias varillas de soporte pueden ser independientes
┊ Realiza ejercicios telescópicos. La plataforma superior es la
plataforma móvil y la plataforma inferior es la plataforma fija, como
se muestra en la figura.2.1 como se muestra. línea













Figura 2.1 Modelo de plataforma Stewart

Según el número de barras de soporte conectadas a las plataformas superior e


inferior y la estructura de cadena cinemática de las barras de soporte, el Stewart se
divide en diferentes tipos[veintiuno], Como el tipo 6-6-SPS se refiere a la conexión de la plataforma
inferior 6 varillas de soporte, la plataforma superior conecta 6 varillas de soporte, enlace de
movimiento de varilla de soporte
Bisagra esférica articulación articulada articulada esférica (Esférico-Prismático-
Esférico); 6-6-UPS Tipo de estructura de cadena cinemática de varilla de soporte es diez milHacia la
bisagra, mueva la bisagra secundaria esférica (Universal-Prismatic-Spherical).













Figura 2.2 Dos comunes Modelo de estructura de plataforma Stewart

Atuendo
┊ Debido a diferentes tipos de Stewart Los parámetros de la estructura de la plataforma
son diferentes, por lo que si no hay una explicación, este artículo usa la figura como se muestra en
la figura. 2.2

Mostrado Plataforma Stewart de estructura 6-6-UPS.

┊ 2.2.2 Mecanismo en serie y paralelo

Orden Serial Manipulator (Serial Manipulator) es la estructura de robots industriales
más utilizada.
┊ Dos cadenas cinemáticas están conectadas en serie; el manipulador paralelo es la
estructura más utilizada en simuladores somatosensoriales.

Varias cadenas cinemáticas están conectadas en paralelo entre la punta y la base. Figura

2.3 Figura 2.4 Demostrado una máquina tándem típica
┊ Estructura y un mecanismo paralelo típico.


ne
a






┊ Figura 2.3 Un mecanismo en tándem Figura 2.4 Un mecanismo paralelo


┊ En el simulador somatosensorial, el uso del mecanismo paralelo tiene las
siguientes ventajas:

La plataforma móvil del simulador somatosensorial debe tener una gran

capacidad de carga para transportar la pantalla, el controlador, el conductor, etc.
┊ El terminal (plataforma) del mecanismo paralelo está soportado por múltiples
cadenas cinemáticas. Comparado con el mecanismo en serie, tiene las ventajas de
estructura estable, gran rigidez y fuerte capacidad de carga;
El simulador somatosensorial requiere que cuanto mayor sea la precisión del movimiento, mejor. El
error de movimiento del mecanismo tándem es la superposición de cada cadena cinemática, El mecanismo
paralelo no tiene el problema de la amplificación del error y tiene una mayor
precisión de movimiento;
El simulador somatosensorial necesita realizar una solución de cinemática inversa en tiempo real, es
decir, la longitud objetivo de la cadena cinemática se calcula mediante la postura de la plataforma
conocida.
Luego controle la plataforma de movimiento para lograr la postura deseada. El
mecanismo en serie es difícil de resolver el movimiento a la inversa y la solución
de avance es fácil, mientras que el mecanismo paralelo es fácil de resolver el
movimiento en retroceso y la solución de avance es difícil, por lo que tiene una
mayor velocidad de cálculo.

2.2.3 Grados de libertad



┊ El número de parámetros de movimiento independientes que se deben dar al
determinar el movimiento se llama grado de libertad (Grado de libertad, abreviado como
┊ DOF). Por ejemplo, un automóvil que se mueve sobre un riel tiene un grado de libertad
(1-DOF), porque el riel puede mover la posición del automóvil.

La distancia está determinada; la posición y orientación de un cuerpo rígido libre en
un espacio tridimensional tiene seis grados de libertad(6-DOF), se puede utilizar en tres
direcciones

┊ Se determinan la longitud de desplazamiento y el ángulo de rotación en las tres
direcciones. Obviamente, si un cuerpo rígido libre tiene más de seis grados de libertad, su
posición y orientación
┊ La dirección también se puede determinar de forma única, pero debido a que seis grados
de libertad son suficientes para determinar su posición y orientación, algunos de los grados de
libertad son redundantes.

Para un simulador somatosensorial, cuantos más tipos de ejercicios pueda realizar una
plataforma deportiva, mayor será su capacidad para reproducir deportes, por lo que el
somatosensorial

┊ El simulador es más adecuado para usar una plataforma de movimiento con seis grados de
libertad o más.
┊ Según Chebychev – Grübler – Kutzbach Directrices, puede utilizar la siguiente fórmula
para calcular el grado de libertad del sistema[Veintidós]:
┊ j

F = 6 (N - 1) - Σ 6 - ƒi (2,1)
Atuendo i=1

┊ entre ellos, F es el grado de libertad calculado del
sistema;
┊ N es el nú mero de cuerpos rígidos;

j es el nú mero de parejas deportivas;

Orden ƒi es el grado de libertad de cada par de
movimientos.
┊ Para uno Plataforma 6-6-UPS Stewart, su plataforma móvil es una bisagra esférica con tres grados de
libertad; la conexión del medio es un par móvil,

Tiene un grado de libertad; la plataforma fija es una bisagra universal con dos grados
de libertad[Veintitres]. Entonces su grado de libertad es:

┊ FStewart = 6 (14 - 1) - 6 × 3 - 6 × 5 - 6 × 4 = 6 (2,2)

línea
2.2.4 Sistema de coordenadas

┊ Para la conveniencia de una descripción posterior, este artículo es común La
plataforma 6-6-UPS Stewart establece un espacio sentado con el centro de la plataforma fija como origen

Estándar Oxyz, como se muestra Como se muestra en 2.5.









Figura 2.5 6-6 Diagrama esquemático del sistema de coordenadas de la plataforma UPS
Stewart
Donde ¯O¯B→ Es el punto central de la plataforma fija y el origen del sistema de
coordenadas;
O¯P→ Es el punto central de la plataforma móvil;
B¯→7 (I A 1. .6) son los seis puntos de articulació n de la
plataforma fija;
┊ P¯→7 (I A 1. .6) son los seis puntos
de articulació n de la plataforma mó vil;
┊ LI = | P¯ → 7 - B¯ → 7 | (i ∈ 1. .6) es la longitud de seis varillas de soporte.

┊ 2.2.5 Posición y actitud de la plataforma

┊ A. Parámetros estructurales
┊ Como se muestra en la Figura 2.5 En la estructura Stewart, la plataforma móvil y la plataforma fija
están cortadas por un triángulo regular y un círculo.

Polígono, se puede determinar por el radio del círculo. ry la mitad del á ngulo central del lado
corto α para describir, como se muestra en la figura Como se muestra en 2.6.





Pa
qu
et
e





Or
de
n

┊ Figura 2.6 Gráficos planos de plataforma móvil y plataforma fija.


┊ Definir los parámetros de la plataforma móvil y la plataforma fija. r, α son
respectivamente rP, αP, rB, αB, luego en la situació n inicial, en la vista superior del sistema de coordenadas Oxz
línea Debajo de la imagenEl modelo se muestra en la Figura 2.7.












(A) Establecer plataforma ( b) Plataforma móvil


Figura 2.7 Plataforma dinámica y modelo de plataforma fija
confirmado rP, αP, rB, αB y altura L = OBOP, entonces El estado inicial de la plataforma Stewart se puede determinar
por completo:

θ¯B→ = [210 ° - αB veintiuno0° + αB 330° - αB 330° + αB 90° - αB 90° + αB]

┊ θ¯P→ = [150 ° + αP 270° - αP 270° + αP 30° - αP 30° + αP 150° - αP]



┊ rB ∙ cos (θB <i>) r P ∙ cos (θP <i>)
¯B¯→7 0 ] , P¯ →7 L ], yo ∈ 1. .6 (2,3)

=[ rB ∙ pecado = [ rP ∙ pecado
┊ (θB <i>) (θP <i>)

será rP, αP, rB, αB, L se denominan pará metros de estructura de plataforma. Después de
determinar los pará metros estructurales, en cualquier momento, si se determina la diná mica

La postura de la plataforma (es decir, el →
dieciséis La dirección del vector normal

centro de la plataforma móvil se determina ¯O¯P → del plano), puede
Plataforma coordinada y móvil ¯P
┊ Seguro en este momento Stewart El estado de la plataforma incluye las coordenadas de los
seis puntos de articulación de la plataforma móvil, la longitud de la barra de soporte y las
coordenadas del punto final de la barra de soporte.
┊ B. Ubicación

┊ Este artículo utiliza el vector espacial t→ Describa el desplazamiento de posición de
la plataforma móvil en cualquier momento:
┊ t→ = [x, y, z] T (2,4)
Atuendo
┊ Entre ellos, x, y, z son los desplazamientos en las
┊ direcciones de los ejes X, Y y Z, respectivamente.
Defina el desplazamiento de posición de la plataforma móvil
bajo la condición inicial t¯7¯¯norte¯7¯t¯7¯a¯ →l por:

t¯7¯norte¯7¯t¯7a¯ →l = [0, 0, 0] T (2,5)

┊ Mueva el centro de ¯PAG→
la plataforma en cualquier
momentoOrden por: O¯ ¯PAG→ =7n7t7al
O ¯ ¯PAG¯ ¯ ¯¯¯ → + t→ (2,6)


entre ellos, ¯ ¯ ¯ ¯ ¯¯¯ → Mueva el centro de la plataforma en la situación inicial.
O
┊ P
7n7t7al

┊ C. Postura
┊ Este artículo utiliza el vector r de ángulo de Euler→
Describa el á ngulo de rotació n de actitud de la plataforma mó vil en
cualquier momento:línea
┊ r→ = [α, β, γ] T (2,7)

Entre ellos, α, β, γ son los ángulos de rotación en las direcciones de los ejes
X, Y y Z, respectivamente.

┊ Defina el ángulo de rotación inicial de la plataforma móvil r¯7¯¯n¯7¯t¯7¯a¯ →l por:
┊ r¯7¯¯n¯7¯t¯7¯a¯ →l = [0, 0, 0] T (2,8)

┊ Entonces el vector normal unitario del plano donde se ubica la plataforma móvil en
cualquier momento es:

V¯P→ = RX ∙ RY ∙ RZ ∙ V¯P

¯ ¯→ ()2.9
7n7t7al
┊ Donde ¯ ¯→ Es el vector normal unitario del plano donde se ubica la plataforma
V¯PAG móvil en la situación inicial:
7n7t7al

¯ ¯→ = [0, 1, 0] T
7n7t7al

V¯PAG

RX es la matriz de rotació n que
gira alrededor del eje X:
1 0 0
RX = [0 cos α pecad
o α]
0 - Sin α cos α
porque β0 - Sin β
RY = [ 010 ]
pecado β0cos β

RZ es la matriz de rotació n que gira alrededor del eje Z:


┊ porque γsin γ0

┊ RZ = [- Pecado γcos γ 0]
001


2.2.6 Solución de cinemática inversa

┊ Desplazamiento de posición de la plataforma conducida t y la rotació n de la postura r para
resolver la expansió n y contracció n ΔLi de cada barra de soporte se denomina solució n de cinemá tica inversa
(Inverso

Cinemática), y viceversa se llama Cinemática Directa. El simulador somatosensorial debe ajustarse de

acuerdo con la actitud del vehículo.
┊ La actitud de la plataforma, la forma de ajustar la actitud de la plataforma es
ajustar la expansión y contracción de la varilla de soporte, por lo que el simulador
somatosensorial realiza la solución de cinemática inversa.
┊ Por conveniencia, el sistema de coordenadas auxiliar xyz se establece con el punto
central de la plataforma móvil en la situación inicial. O ' :

┊ ¯O¯¯o¯F¯ F¯¯s¯mi7n7t7al
¯ t→ = O ¯ ¯PAG¯ ¯ ¯¯¯7n7t7al
→ - ¯B→ = O ¯ ¯PAG¯ ¯ ¯¯¯ → (2,10)
Atuendo
¯O¯ ¯ ¯¯ → = O ¯¯¯¯ → + O¯¯¯¯¯¯¯ →
' (2,11)


xyz xyz compensar
Luego, en el sistema de coordenadas auxiliar O ' Abajo, la coordenada inicial del
punto central de la plataforma móvil O ' por:
xyz PAGini
┊ cial

O¯¯'¯¯¯¯ ¯ →
PAG7n7t7al
= O ¯ ¯PAG¯ ¯ ¯¯¯ → - O¯¯ o¯F¯ F¯¯s¯mi¯ t→ = [0, 0, 0]T (2,12)
7n7t7al

Orden De acuerdo con la fórmula de transformación espacial, cualquier coordenada V en el
espacio es la coordenada después de rotar ry desplazar t con el origen del eje de coordenadas
como centro de rotación
┊ V'es:

┊ ¯V¯→' = R X ∙ RY ∙ RZ ∙ V¯ → + t → (2,13)

Por lo tanto, en cualquier momento, si la posición dada de la plataforma móvil
está desplazada t → y el ángulo de rotación de actitud r →, cada punto de articulación de la
plataforma móvil se asienta

Coordenadas marcadas ¯'¯¯'¯'→
línea 1..6 por:
en el sistema de coordenadas
auxiliar
┊ P
P¯'¯¯ '→' = R ∙ R ∙ R ∙ P¯¯ → '+ t →, i ∈ 1. .6 (2,14)
7 XYZ 7

┊ Donde P ¯' ¯→ Es la coordenada de cada punto de articulación de la plataforma móvil en el

sistema de coordenadas auxiliar P¯1¯..¯6→:
1..6
PAG¯ →' = PAG ¯→ - O¯¯¯¯¯¯ ¯ → , yo ∈ 1. .6
77 compensar

┊ En resumen, el sistema de coordenadas original ¯'¯¯'¯→
1..6 por:
Las coordenadas de cada punto de articulació n de la plataforma mó vil
en cualquier momento bajo Oxyz P

PAG'→' = PAG ¯'¯¯'→' + O¯¯¯¯¯¯¯ → = R ∙ ∙ R ∙ (P¯ → - O¯¯¯¯¯¯ →) + t→ + O¯¯¯¯¯¯¯ → ,
R
┊ 77 comp XYZ 7 comp comp (2,15)
ensar ensar ensar

┊ yo ∈ 1. .6

De la foto 2.5 Se puede observar que la longitud de la varilla de soporte en cualquier momento es:
┊ ¯L→7 = | P¯ '→' - B¯ →|, yo ∈ 1. .6
┊ (2,16)
77

La longitud de cada barra de soporte cuando se conoce la situación inicial. En el caso
de LiO (i ∈ 1. .6), la expansió n y contracció n ΔLi de cada barra de soporte es:
ΔLI = LiO - | P¯ '→'
7 - B¯ → 7 |, i ∈ 1. .6 (2,17)

2.3 Teoría de la percepción del movimiento humano


La percepción del movimiento del cuerpo humano es la clave del simulador
somatosensorial para reproducir el efecto somatosensorial. Precisamente porque el
sistema de percepción del movimiento del cuerpo humano no puede lograr una
percepción precisa y precisa, permite que el simulador somatosensorial reproduzca
el movimiento del vehículo simulado en un espacio infinito en un espacio limitado
sin violar los principios físicos.
┊ El cerebro recibe y procesa señales de diferentes sistemas sensoriales para formar
la percepción del cuerpo humano y el entorno circundante, como la visión, la audición y el
equilibrio.
┊ Y contactar, etc. Estas señales son generadas por los receptores que reciben estímulos
externos. Los extraceptores se distribuyen en la piel, los órganos visuales,

Los dispositivos auditivos, etc., reciben estímulos externos del cuerpo humano como

presión, temperatura, ondas luminosas, ondas sonoras, etc .; la interocepción se distribuye en
┊ Los vasos sanguíneos, etc., reciben presión osmótica, dolor y otra estimulación
interna del cuerpo humano; los propioceptores se distribuyen en los músculos y
┊ Secciones, oídos internos, etc., para recibir estimulación de los cambios de
movimiento y equilibrio.[veinticuatro].

El cuerpo humano se basa principalmente en los propioceptores, el sistema
vestibular y el sistema visual para mantener el equilibrio y percibir el posicionamiento
espacial.[25].






Pa
qu
et
e



Figura 2.8 Método de percepción del movimiento humano


Or
de
n
2.3.1 Propioceptores

┊ Los propioceptores se utilizan principalmente para percibir la posición espacial
del cuerpo humano. Cuando la velocidad del movimiento espacial supera el umbral,

┊ Los propioceptores no podrán percibir el movimiento.[26], En este momento el cuerpo
humano depende del sistema visual (como ver objetos que se mueven fuera de la ventana) o cambios
en la fuerza
┊ (Como sentir el empuje del respaldo de la silla) Percibir cambios de posición.
línea El simulador somatosensorial utilizará este defecto para eliminar la posición de
la plataforma. El lavado se refiere a devolver lentamente la plataforma a su punto original para

La siguiente simulación somatosensorial deja suficiente espacio para el ejercicio.

Cuando la velocidad de movimiento excede el umbral, los propioceptores no pueden sentir el
movimiento, esto
┊ Cuando el simulador somatosensorial realiza una acción de lavado, el cuerpo humano
piensa que todavía está realizando un movimiento continuo.

┊ 2.3.2 El sistema vestibular

El sistema vestibular detecta el movimiento y la rotación del cuerpo humano en el
espacio, para equilibrar la postura corporal.

┊ Es la principal fuente de señales de movimiento. El sistema vestibular está ubicado en
el oído interno, con tres canales semicirculares perpendiculares llenos de ciertos fluidos,
┊ Globo y utrículo, como se muestra Como se muestra en 2.9. Juntos, el globo y el utrículo se
denominan otolitos. Los canales semicirculares pueden detectar la velocidad angular, los otolitos pueden

Para detectar la aceleración lineal. El movimiento uniforme no estimula el sistema
vestibular.

┊ Cuando la cabeza tiene aceleración, el líquido en los canales semicirculares
fluirá, impulsando el movimiento de los folículos pilosos, estimulando así las terminaciones
nerviosas.
┊ El cerebro percibe la velocidad angular y la aceleración lineal. Pero cuando la
aceleración en una dirección dura de 10 a 20 segundos, el folículo piloso volverá a
su posición original, haciendo que el cerebro perciba la aceleración como una
parada.[27].










Figura 2.9 Estructura del sistema vestibular[28]


┊ Según estudios[29], La percepción de la aceleración lineal por los
otolitos es una fuerza específica (EspecíficaFuerza). La definición de relación es: carga
┊ ƒ→ = a → - G → (2,18)
┊ →
entre ellos, ƒ Es el vector de fuerza específica (m / s2);

┊ a→ Es el vector de aceleración lineal absoluta del cuerpo humano (m / s2);
┊ gramo→ Es el vector de
Orden
aceleración gravitacional (m / s2).
Los defectos del sistema
vestibular incluyen:

┊ Es imposible saber qué fuerza se compone de la fuerza específica;
┊ El sistema vestibular solo detectará la aceleración o la velocidad que supere el umbral.
┊ Según la investigación de Meiry y Young[30]Y la investigación de Peters[31], El umbral sensorial del
sistema vestibular se muestra en la tabla 2.1 como se muestra.

línea
┊ mesa 2.1 El umbral sensorial del sistema vestibular[30, 31]
┊ Tipos de Umbr
┊ al
┊ Aceleración hacia 0,17
┊ adelante y hacia
┊ atrás(M / s ^ 2)
┊ Aceleración 0,17
┊ izquierda y
┊ derecha(M / s ^ 2)
┊ Aceleración hacia 0,28
┊ arriba y hacia
┊ abajo(M / s ^ 2)
┊ Aceleración de tono 0,5
(grados / s ^ 2)
Aceleración de rollo 0,5
(grados / s ^ 2)
Aceleración
Similar al propioceptor, el simulador de 0,14 puede aprovechar los defectos del
somatosensorial
sistema vestibular para hacer que la acción de lavado sea invisible para el cuerpo
humano.
2.3.3 Sistema de visión

Lo visual es una fuente importante de percepción del movimiento de las personas. El cerebro
juzga la visión al ver el tamaño y la dirección del paisaje circundante.
Sienta la posición espacial absoluta y la dirección del cuerpo humano. La señal visual simulada
proporcionada por la simulación somatosensorial debe ser la misma que la aceleración y la
velocidad angular proporcionadas.

Paso, de lo contrario, debido a que el cerebro no puede coordinar las señales
introducidas por estos receptores, las personas se sentirán mareadas y con una fuerte
incomodidad.[1].

┊ 2.4 Teoría de la simulación somatosensorial

┊ El rango de movimiento de la plataforma de movimiento está limitado físicamente,
por lo que la mayoría de las veces debe basarse en la teoría de percepción del movimiento humano
descrita en la sección anterior.
┊ En teoría, utilizar los defectos de la percepción del movimiento humano para simular
el movimiento del vehículo de forma somatosensorial, en la medida de lo posible para "engañar"
al cerebro para que produzca

Los estudiantes tienen un sentido de movimiento similar. Esta sección describe

específicamente los métodos de simulación de varios deportes.
┊ 2.4.1 Desplazamiento simulado

┊ Dado que el sistema vestibular humano y los propioceptores no pueden percibir la
posición y la velocidad absolutas, solo pueden percibir cambios en la velocidad relativa (es
decir, aumentar

velocidad)Por lo tanto, el cerebro depende completamente del sistema visual para
proporcionar la base para el movimiento. Por ejemplo, en un automóvil que se mueve a velocidad
constante, además del sistema de visión

Atuendo Además, el sentimiento es el mismo que el estado estático.
┊ En base a esto, el desplazamiento se puede simular mediante simulación visual.

┊ 2.4.2 Simulación de una aceleración lineal repentina

La aceleración lineal repentina se puede reproducir directamente. Sin embargo, la

máxima aceleración que puede alcanzar la propia plataforma deportiva es limitada, lo que
determina la repentina
Orden La fidelidad de la aceleración lineal.
┊ Además, debido a que el espacio de la plataforma de movimiento es limitado,
después de que ocurre la aceleración lineal repentina, la plataforma debe ser invisible para los
humanos.

La aceleración vuelve al origen para que haya suficiente espacio para la siguiente

simulación de aceleración.
┊ 2.4.3 Simular aceleración lineal continua

línea El espacio de la plataforma es limitado, por lo que la aceleración lineal continua
no se puede simular directamente, sino porque las personas no pueden percibir la composición de
la aceleración.

Y una aceleración precisa, para que pueda confiar en la plataforma basculante para
convertir parte de la aceleración gravitacional en las direcciones delantera y trasera o
izquierda y derecha.

┊ La aceleración da a las personas una sensación constante de aceleración. Además, la
presión sobre la persona por la inclinación del respaldo del asiento aumentará o disminuirá, lo
que aún más
┊ Los pasos mejoran la sensación de movimiento del cuerpo humano. Este método se llama
Coordinación de inclinación.








(A) Antes del ajuste de inclinación (B) Después del ajuste de inclinación
Figura 2.10 Ejemplo de coordinación de inclinación
Como se muestra Como se muestra en 2.10, el tamaño del cuerpo humano en la dirección vertical
antes de la inclinación es La aceleració n gravitacional de g. La aceleració n gravitacional del cuerpo
humano no cambia después de la inclinació n, pero la aceleració n en la direcció n vertical es g '= g ∙
cos θ y la aceleració n en las direcciones delantera y trasera es
┊ a = aceleració n de g ∙ sin θ. Siempre que el ángulo de inclinació n no sea demasiado grande, la
aceleració n en la direcció n vertical no se reduce significativamente y los humanos no pueden percibir
┊ A este cambio.

Por ejemplo, para una aceleración de 1 m / s2 en la dirección de adelante hacia

atrás que dura 10 segundos, el desplazamiento después de 10 segundos es S =
┊ 50 m, la plataforma de movimiento general no puede lograr un desplazamiento tan grande, por lo que
se utiliza la simulació n de coordenadas de inclinació n. Si la inclinació n es de 5,8 °, la posteridad se inclinará
┊ La aceleración en la dirección vertical del cuerpo es g '= g ∙ cos (5.8 °) = 0.995g,
la diferencia es muy pequeña y no se puede sentir; las direcciones frontal y posterior del
cuerpo

Allí a '= g ∙ sin (5.8 °) = 1m / s2 se puede detectar una aceleració n, lo que proporciona una sensació n
de aceleració n lineal continua.

┊ La coordinación inclinada tiene ciertas limitaciones:
┊ Solo puede simular la aceleración en las direcciones delantera y trasera e
izquierda y derecha, y no puede simular la aceleración en la dirección vertical;

La velocidad de inclinación y la aceleración no pueden exceder la mesa. 2.1

Umbral de rotación hacia adentro, de lo contrario se detectará la inclinación;
┊ Sólo se pueden simular pequeñas aceleraciones, cambios evidentes
en la aceleración en la dirección vertical harán que se detecte la inclinación.Atuendo
2.4.4 Simular rotación


En la actualidad, la rotación no se puede simular, solo se puede dar visualmente
el sentido de rotación.

┊ 2.4.5 Simulación de aceleración angular

Orden En la actualidad, no es posible engañar al cuerpo humano para que produzca una
sensación de aceleración angular, y solo puede reproducir directamente una aceleración angular
repentina. Una vez finalizada la recurrencia, para
┊ Para poder reproducir la siguiente aceleración angular, no debe exceder la tabla 2.1
Realice la operación de lavado por debajo del umbral dado para permitir que la plataforma regrese

Bit de restauración.

┊ Cabe señalar que, dado que el ángulo de inclinación de la plataforma se ha
utilizado para la simulación de la aceleración lineal, el ángulo de simulación se incrementa en
algunos casos.
┊ La velocidad será ambigua con la aceleración
lineal simulada, lo que reducirá el efecto de simulación.
línea
┊ 2.5 Algoritmo de lavado clásico

┊ Con base en la teoría de simulación somatosensorial de la sección anterior, los
investigadores han propuesto una variedad de algoritmos de simulación somatosensorial, es decir, el
vehículo o modelo de vehículo puede ser
┊ Un algoritmo que convierte el movimiento en la postura de la plataforma de movimiento
mientras mantiene el sentido del movimiento humano. El algoritmo clásico de lavado se aplica en un
simulador somatosensorial
┊ El algoritmo más extendido y uno de los primeros propuestos. El algoritmo de lavado clásico
tiene fórmulas simples, pocos parámetros, ajuste de parámetros conveniente y efectos de simulación

┊ Buen cálculo rápido y otras ventajas.

2.5.1 Flujo del algoritmo

┊ El flujo del algoritmo de lavado clásico se muestra en la figura Como se muestra en 2.11.

entre ellos, ingresar ƒ¯Æ→ Es el vector de fuerza específico en el sistema de

coordenadas del cuerpo;
┊ ingresar ω¯Æ→ Es el vector de velocidad angular en el sistema de coordenadas
del cuerpo;
constante gramo→ Es el vector de aceleració n gravitacional;
Producción S→ Es el vector de desplazamiento de posición de
la plataforma de movimiento, es decir, la fórmula(2.4) El
vector definido; salida θ→ Es el vector de ángulo de
rotación de actitud de la plataforma de movimiento, a
saber(2.7) El vector definido;
s ¿Es el operador de Laplace (Laplace Operador), todas las entradas y salidas están en s
Bajo el dominio (dominio-s).











┊ Figura 2.11 Flujo del algoritmo de lavado clásico

Atuendo
En la mayoría de los casos, la señal de entrada original del algoritmo de
Æ
simulación de movimiento es la aceleración de línea absoluta en el sistema de coordenadas del
cuerpo.Grado a¯ →. Según Bi Li

┊ Fórmula de cálculo (2.18), la fuerza específica de entrada ƒ¯Æ → se puede calcular de
la siguiente manera:

ƒ¯Æ→ = ¯Æ→ (2,19)
a¯Æ→ - G

┊Entre ellos, ¯g¯Æ→ Es el vector de aceleració n
gravitacional en el sistema de coordenadas del
cuerpo.Orden
┊ 2.5.2 Sistema de coordenadas del cuerpo

Las direcciones delantera y trasera del vehículo se especifican como El eje x, las

direcciones izquierda y derecha son el eje y, la direcció n vertical es el eje z, y hacia adelante, izquierda y hacia
arriba son positivas
┊ Dirección; alrededor El á ngulo de Euler de la rotació n del eje x es α, el á ngulo de Euler de la rotació n
del eje y es β, y el ángulo de Euler de la rotació n del eje z es γ, y hacia la derecha
┊ Rodar, zambullirse y guiñar hacia la izquierda son
direcciones positivas, como se muestra en la figura. Como se
muestra en 2.12. línea











┊ Figura 2.12 Sistema de coordenadas del vehículo

2.5.3 Zoom

Las limitaciones de hardware de la plataforma de movimiento incluyen desplazamiento y ángulo,


velocidad y aceleración, etc., por lo que la fuerza específica de entrada ƒÆ Y velocidad
angular rotacional
ωÆ debe escalarse para evitar exceder el límite de hardware de la plataforma de movimiento[18]. Además,
generalmente es deseable poder tratar con señales de entrada de menor amplitud
Realice las mejoras adecuadas para que haya una sensación de movimiento.[10].
Para una señal de entrada que necesita ser escalada x, la operació n de escalado se puede
expresar como:
ymax X > xmax
┊ y = { ƒ (x) 0 < x ≤
(2,20)
xmax
┊ —Ƒ (—x) —Xmax ≤ x <0
┊ -Ymax X <—Xmax
┊ entre ellos, y es la señ al
escalada;

ƒ (x) es una funció n de escala, para 0 ≤ x ≤ xmax, 0 ≤ ƒ (x) ≤ ymax;

┊ xmax es el valor má ximo de la señ al de entrada, que está relacionado con la señ al de
entrada y debe determinarse de antemano;
┊ ymax es el valor má ximo de la señ al después del escalado, que está determinado por las
limitaciones físicas de la plataforma de movimiento.
┊ Puede verse en la ecuación (2.20) que la operación de escalado es una función
impar, y la señal de entrada del rango [—xmax, xmax] es utilizada por la función de escalado

┊ número ƒ (x) se escala a [—ymax, ymax], y la señ al de entrada fuera del rango | x |> xmax está
limitada a | y | = ymax.
┊ La función de escala generalmente usa una función lineal y una función cúbica.
┊ A. Escala lineal
Atuendo
El escalado lineal utiliza una función lineal para escalar:

┊ ƒ (x) = c1x + cO (2,21)

┊ El coeficiente es:
┊ max
=yXmax
Orden

{c1
┊ ┊

cual es:



línea
líneaEl efecto de zoom se
muestra en la Figura 2.13.












cO = 0

ƒ (x) = ymax ∙ X

(2,22)
Xmax

Figura 2.13 Utilice la función de escala lineal para escalar (Xmax = 10, ymax = 6)

B. Zoom tres veces


El escalado tres veces usa una función cúbica para escalar:
ƒ (x) = c3x3 + c2x2 + c1x + cO (2,23)

El
coeficient c = x – 3 (kx -añ2os + k X)
e es:

┊ 3
‫ﻟ‬ max O max max 1 má ximo
c2 = x – 2 (—2k + 3 - K X)

x añ
s o
max O max max 1 má ximo

┊ (c1 = kO
lcO =

0
┊ Entre ellos: kO, k1 son las pendientes cuando x = 0, x = xmax, generalmente kO
= 1, k1 = 0.1.

El efecto de zoom de tres veces se muestra en la figura Como se muestra en 2.14, se puede
ver en la figura que la transición de la señal después de escalar con la función cúbica es relativamente suave.






Pa
qu
et
e





Or
de
n


Figura 2.14 Utilice la función de zoom cúbico para hacer zoom (Xmax = 10, ymax = 6)



línea 2.5.4 Filtro

El filtrado de paso alto generalmente se incluye en el algoritmo de lavado(Filtro
de paso alto) y Filtro de paso bajo (Filtro de paso bajo). Ampliamente alto

┊ El filtrado de paso se refiere a un filtro que permite que las señales de alta
frecuencia pasen y debilite las señales de baja frecuencia. El filtrado de paso bajo se refiere
a un filtro que permite que pasen las señales de baja frecuencia,
┊ Un filtro que atenúa las señales de alta frecuencia.

En el simulador somatosensorial, la señal de alta frecuencia en el dominio del
tiempo significa una señal de ráfaga y la señal de baja frecuencia significa una señal continua.
cual es

┊ El filtrado de paso alto atenúa la señal continua y deja una señal de ráfaga, mientras
que el filtro de paso bajo atenúa y filtra la señal de ráfaga para dejar una señal continua.
┊ De acuerdo con la teoría de la simulación somatosensorial descrita en la sección
anterior de este artículo, debido a las limitaciones físicas de la plataforma de movimiento, con
el fin de maximizar el efecto de la simulación somatosensorial
┊ Como resultado, la aceleración lineal continua y la aceleración lineal repentina
requieren diferentes estrategias de simulación: la aceleración lineal continua es muy fácil de
usar

┊ Debido a que la plataforma de movimiento está fuera de rango, es necesario confiar en
la simulación de inclinación, y la aceleración lineal repentina no es fácil para hacer que la
plataforma de movimiento esté fuera de rango.
┊Por lo tanto, se puede usar directamente en la plataforma de movimiento sin simulación.
Mediante el uso de un filtro de paso alto y un filtro de paso bajo, la línea de ráfaga se puede
┊ Se utilizan diferentes estrategias para la aceleración y la aceleración lineal
continua.
Cabe señalar que el filtro en el simulador somatosensorial se usa para usar un
filtro analógico, es decir, la entrada del filtro es una señal analógica continua y
la función de transferencia utilizada para describir el filtro es una función en el
dominio s.

2.5.5 Coordinación de inclinación de la plataforma de movimiento


La aceleración lineal continua del vehículo simulado delante y detrás (x) e
izquierda y derecha (y) se simula utilizando la coordinación de inclinación. Para
el vector de fuerza específica escalada de entrada ƒ¯S →, las componentes en las
direcciones xey se obtienen mediante el uso de un filtro de paso bajo de segundo
orden para obtener ƒx y ƒy. La función de transferencia de filtro
por: LP LP

x, y
┊ ƒLP 2
ωnorte (2,24)
=
┊ ƒ x, y 2
s + 2Çωns + ωn 2
S

┊ entre ellos, ωn es la frecuencia de
corte del filtro;
┊ Ç es la relació n de
amortiguació n.

Según estudios[6], Los parámetros

recomendados del filtro son:

┊ mesa 2.2 Parámetros recomendados del
┊ filtro de paso bajo de aceleración[6]

filtrar en C

┊ x direcció n 5,0 1.0
Pa direcció n y 8.0 1.0
qu
et
e

┊ Para probar el filtro de paso bajo, ahora configure la actitud del vehículo para
que sea consistente con el marco de referencia, sin escalar, y tenga el siguiente movimiento: 0s
┊ Sin aceleración, se obtiene instantáneamente una aceleración lineal absoluta de 1 m /
s2 a 1 s, y volverá instantáneamente a ninguna aceleración después de 5 s. La suerte
┊ Señal de naceleración lineal que
aceleració lineal filtrada ƒx como se se mueveenhacia
muestra adelante
la figura Como se y muestra
hacia atrás.
en 2.15.ƒx = ƒx y la señ al de
┊ SÆLP
Orden






ne
a







┊ Figura 2.15 Entrada y salida de filtro de paso bajo de segundo orden


Ahora calcule la relación entre la señal filtrada de paso bajo y el ángulo de
inclinación. De acuerdo con la Figura 2.10, cuando el ángulo de inclinación delantero y trasero
es the, el peso puede ser

┊ La fuerza de aceleración se genera en la dirección frontal y posterior del sistema de
coordenadas del cuerpo x = g sin θ es el componente de magnitud, por lo que para simular el anverso y el
reverso de x
┊ Componente direccional, el ángulo de inclinación requerido θ es:
θ = sin – 1 x
gramo (2,25)

El ángulo de inclinación en las direcciones izquierda y derecha se calcula de la


misma manera.
Después de corregir el positivo y el negativo según el sistema de coordenadas, se
puede obtener la siguiente fórmula:
y
ƒ
F pecado-1 LP 1
I gramo I
θLP = I ƒX I (2,26)
I- Sin – 1 LPI
I gramo I
┊ L 0 ‫ے‬

┊ Finalmente, para que el proceso de inclinación sea invisible para el cuerpo humano
durante la coordinación de la inclinación, es necesario limitar la velocidad angular de la
coordinación de la inclinación en la mesa. 2.1 El
┊ Por debajo del umbral de la columna, es decir, satisface:

θx˙ ≤ 3,2, θy˙ ≤ 2.6 (2,27)
┊ TC TC

┊ 2.5.6 Movimiento de
desplazamiento de la plataforma de
movimiento

La aceleración lineal repentina en las direcciones delantera y trasera (x),

izquierda y derecha (y) y vertical (z) del vehículo simulado se reproduce directamente en la
plataforma de movimiento.
┊ Dado que la entrada es un vector de fuerza específico escalado ƒ¯S→, Por lo que es
necesario obtener la aceleración lineal absoluta a¯ ¯S → según la fórmula (2.18):

a¯ S→ = ¯ƒS → + g → (2,28)

Atuendo CorrectoPara a¯ ¯S →, es necesario utilizar un filtro de paso alto para extraer
la señal de aceleración de alta frecuencia ¯H¯P → después de la segunda integración

Entonces se puede obtener el desplazamiento objetivo S → de la plataforma de
movimiento. El filtro está en el papel del algoritmo de lavado clásico.[17]El filtro de paso alto
de segundo orden utilizado en:

┊ ¯ a¯H¯P→ s2 ()2,29
┊ a→ = s2 + 2Çω s + ω2
Snn

Entre ellos, ωn es la frecuencia de corte del filtro;
Orden
┊ Ç es la relació n de amortiguació n.
┊ Según estudios[6], Los parámetros recomendados del filtro se muestran en la tabla 2.3
como se muestra.


┊ Cuadro 2.3 Parámetros recomendados del filtro de paso alto de segundo orden de
aceleración[6]
línea filtrar en C

X dirección 2.5 1.0

┊ y dirección 4.0 1.0
┊ z dirección 4.0 1.0


┊ El uso del filtro de paso alto de segundo orden no hará que el desplazamiento de
la plataforma S → vuelva al origen después de la segunda integración, pero debido a que la
aceleración está escalada,
┊ Y los vehículos reales rara vez tienen una aceleración continua, por lo que en la
mayoría de los casos un filtro de paso alto de segundo orden es suficiente. [17, 18]. A

Para que vuelva al punto original, puede agregar un filtro de primer orden para que se

convierta en un filtro de paso alto de tercer orden:2
┊ a ¯H¯P→ s s
()2.30
┊ a¯ ¯→ = s2 + 2Çω s + ω2 ∙ s + ω
Snnb

entre ellos, ωn es la frecuencia de corte del filtro de segundo orden;
ωb es la frecuencia de corte del filtro de primer orden;
Ç es la relació n de amortiguació n del filtro de segundo orden.
Frecuencia de corte de este filtro adicional de primer orden Valor recomendado de
ωb[32]por ωb = ωn / 10.
Ahora adoptado con este artículo Pruebe los efectos del filtro de segundo orden y del filtro de
tercer orden en el mismo escenario que en la sección 2.5.5 (consulte la página 17).











┊ Figura 2.16 Comparación de la salida de la señal de pulso mediante filtros de paso alto de
segundo y tercer orden


Atuendo Como se muestra en la Figura 2.16 Como se muestra, la salida de aceleración de los
filtros de paso alto de segundo y tercer orden son muy similares.





Or
de
n






ne
a

Figura 2.17 Comparación del desplazamiento de salida de la señal de pulso mediante filtros de
paso alto de segundo y tercer orden


┊ Como se muestra en la Figura 2.17 Como se muestra, para la entrada de aceleración de
pulsos, la salida de desplazamiento de los filtros de paso alto de segundo y tercer orden puede
volver al origen.

La ventaja del filtro de paso alto de tercer orden es que, para una aceleración
continua, el desplazamiento de salida también puede volver al origen. Ahora pruebe la
aceleración de entrada

┊ Cuando la señal de grado es una señal de paso, la curva se muestra en la figura Como se
muestra en 2.18.
┊ Como se muestra Como se muestra en 2.19, bajo la condición de aceleración continua, la salida de
desplazamiento del filtro de tercer orden puede regresar lentamente al origen, y el filtro de segundo orden
┊ No se pudo volver al origen.












Figura 2.18 Entrada de aceleración escalonada





Pa
qu
et
e





Or
de
n


Figura 2.19 Comparación del desplazamiento de salida de la señal de paso por filtros de paso
┊ de segundo y tercer orden
alto


línea 2.5.7 Movimiento giratorio de la plataforma de movimiento

La rotación de baja frecuencia en las tres direcciones del vehículo simulado no se
puede simular ni reproducir, por lo que se descarta y no se simula, y la rotación de alta
frecuencia es directamente

┊ Reproducir en la plataforma deportiva. Para la velocidad angular ampliada de entrada ω¯
¯S→, Utilice un filtro de paso alto para extraer la parte de alta frecuencia,
┊ Señal de ¯H¯P→ Después de una integración, ¯R→. El ángulo de rotación es el
velocidad angular de alta se puede obtener el ángulo de mismo quePérdida coordinada inclinada en
frecuencia ω rotación.
la sección 2.5.5
┊ →
El ángulo θ¯¯T¯¯C Después de la adición, el ángulo de rotación final de la plataforma θ
→:

┊ θ→ ¯R→ + θ¯¯T¯¯C→ (2,31)

┊ ┊
Filtros en los papeles de los algoritmos clásicos de

lavado[17]El filtro de paso alto de primer orden se utiliza en: s
(2,32)

┊ ¯ω¯ s + ωn
┊ S→
┊ entre ellos, ωn es la frecuencia
de corte del filtro.

mesa 2.4 Parámetros recomendados del filtro de paso alto de primer orden
de velocidad angular[6]
filtrar en
Todas las direcciones 1.0
Según estudios[6], Los parámetros recomendados del filtro se muestran en la tabla 2.4
como se muestra.
El ángulo obtenido por el filtro paso alto de primer orden tras una integración
no tiene la característica de volver al origen. Si el vehículo puede girar en
cualquier dirección en un rango grande en una dirección determinada y no gira hacia
atrás, el filtro debe ser reemplazado por un filtro de paso alto de segundo orden
para asegurar el ángulo de lavado.
┊ El grado es cero. Generalmente va a dar la vueltaLa rotació n del eje z, el á ngulo de guiñ ada γ, se
actualiza a un filtro de paso alto de segundo orden:

¯γ¯→ s2
¯ω
┊ HP
=2 2 (2,33)
┊ ¯γ s + 2Çωns + ωn

S
¯ω

┊ entre ellos, ωn es la frecuencia de corte del filtro;
┊ Ç es la relació n de amortiguació n del filtro y Ç = 1.

Suponga que la señal de entrada es la señal de velocidad angular escalonada. Ahora
compare la salida de velocidad angular entre los filtros primario y secundario y la integración
de salida

┊ La diferencia de ángulo.



Pa
qu
et
e





Or
de
n




┊ Figura 2.20 Comparación de la salida de filtros de paso alto de primer y
segundo orden con señales escalonadas
línea













F i gu r a 2.21 Comparación de los ángulos de salida de los filtros de paso alto de
primer y segundo orden con las señales escalonadas

De la Figura 2.20 Puede verse que las velocidades angulares emitidas por los filtros
de primer y segundo orden para señales escalonadas pueden volver a cero al final.
De la foto 2.21 Se puede observar que el filtro de primer orden para señales escalonadas no tiene la
característica de regresar lentamente el ángulo al origen, mientras que el filtro de segundo orden
El dispositivo puede hacer que el ángulo integrado regrese lentamente al origen.

2.6 Desarrollo de software escalable

Esta asignatura necesita desarrollar un software altamente escalable, que sea diferente

del software que se usa habitualmente para lograr un objetivo específico.
┊ Al mismo tiempo, es necesario tener una arquitectura e interfaz bien diseñadas para
satisfacer las necesidades actuales y adaptarse a los cambios futuros a un costo relativamente
pequeño. Llegar
┊ Una de las formas de escalabilidad es componer funciones de software a partir de
módulos altamente independientes.

┊ 2.6.1 Modularidad

┊ El módulo es una colección de objetos de grado, como descripción de datos y
declaraciones ejecutables. La modularización consiste en dividir el programa en varios
┊ Cada módulo tiene una determinada subfunción y la combinación de estos módulos puede
completar la función especificada. En el departamento de software
┊ Cuando el sistema está modularizado, el principio más importante es el grado de
independencia del módulo, y sus estándares de medición cualitativa incluyen la cohesión y el
acoplamiento.[33].

┊ 2.6.2 Cohesión y acoplamiento

┊ Cohesión (Cohesión) es uno de los estándares de medición del grado de
independencia del módulo, que mide la rigidez de la integración entre las funciones internas del
módulo.
Atuendo [33]. La cohesión tiene las siguientes categorías:

Cohesión accidental (Coincidente Cohesión): las unidades en el módulo simplemente se
juntan;

┊ Cohesión lógica(Lógico C ohesion): Cada unidad en el módulo es lógicamente la misma, que
se completa con el módulo de determinación de parámetros
┊ Función

Recolección de tiempo (Temporal Cohesión): Cada unidad del módulo debe
ejecutarse dentro del mismo período de tiempo;
┊ Cohesión del proceso (Procesal Cohesión): cada unidad del módulo debe ejecutarse en un
orden específico;
┊ Cohesión comunicativaunicacional Cohesion): Cada unidad en el módulo procesa los mismos
datos de entrada, o produce

Genere los mismos datos de salida;

┊ Cohesión secuencial (Secuencial Cohesión): la salida y la salida de cada unidad en el
módulo están relacionadas entre sí, como una tubería
línea Hacer lo mismo

Cohesión funcional (Funcional Cohesión): cada unidad del módulo cumple una función
única y clara.

┊ La cohesión funcional es el grado más alto de cohesión y la cohesión accidental es
el grado más bajo de cohesión. Cuanto mayor sea el grado de cohesión, más independiente será el
módulo.
┊ Fuerte.
┊ El acoplamiento es otra medida del grado de independencia del módulo, que mide el
grado de interdependencia entre diferentes módulos.[33].

┊ El acoplamiento tiene las siguientes categorías:
┊ Acoplamiento de contenido: un módulo usa directamente los datos de otro módulo, y hay una
parte del código
┊ Superponer o ingresar a otro módulo a través de una entrada anormal;

┊ Acoplamiento público (Común Acoplamiento): un grupo de módulos accede a los mismos
datos globales;
┊ Acoplamiento externo: un grupo de módulos comparte formato de datos o protocolo;
┊ Acoplamiento de control(Control Acoplamiento): cuando un módulo llama a otro
módulo, se pasa la variable de control, que esEl módulo de llamada realiza una determinada
función de acuerdo con la variable de control;
Acoplamiento de sellos: registros compartidos mediante transferencia de
parámetros entre varios módulos; Acoplamiento de datos (Datos Acoplamiento):
intercambio de datos entre módulos a través de parámetros;
Sin acoplamiento: el módulo no intercambia datos con otros módulos en absoluto.
Ningún acoplamiento es el grado más bajo de acoplamiento y el acoplamiento de
contenido es el grado más alto de acoplamiento. Cuanto menor sea el grado de
acoplamiento, mayor será la independencia del módulo. El principio general es
utilizar el acoplamiento de datos tanto como sea posible, menos acoplamiento de
control y ningún acoplamiento de contenido.[33].

2.6.3 Principios SOLID



┊ SOLID es un acrónimo de los cinco principios básicos principales del diseño orientado a objetos [34].
Juntos, estos principios pueden ayudar
┊ Ayuda a lograr un diseño de módulo de alta cohesión y bajo acoplamiento y facilita a
los programadores desarrollar software que sea fácil de mantener y expandir.

Principio de responsabilidad única (S - Único Responsabilidad): El módulo debe tener
una sola función;

┊ Principio abierto y cerrado (O - Abierto / Cerrado): El módulo debe estar abierto para
extensión y cerrado para modificación, es decir,
┊ Cambiar el comportamiento cuando se cambia el código fuente original;

El principio de sustitución de Richter (L - Liskov Sustitución): el módulo de objeto
debería poder cambiar la corrección del programa

┊ Bajo la premisa de ser reemplazada por su subclase, es decir, la subclase debería
extender la función de la clase padre y evitar cambiar la función original de la clase padre;
┊ Principio de aislamiento de interfaz (I - Interfaz Segregation): el usuario del objeto
solo debe preocuparse por los métodos que le interesan,

Es decir, evite las interfaces enormes e infladas e implemente interfaces pequeñas y
específicas;

Atuendo Principio de inversión de dependencia (D - Delawarependiente Inversion): Los módulos
de alto nivel no deben depender de la implementación de módulos de bajo nivel,
┊ En cambio, se basa en su interfaz abstracta.

┊ 2.6.4 Modelo IO

Al comunicarse entre módulos, ambos extremos de la comunicación a menudo necesitan

esperar los datos del otro extremo y deben tratar con varios clientes
Orden conexión. Tomando el servidor como ejemplo, generalmente hay varias formas de esperar los
datos y varias formas de gestionar varias conexiones de clientes. Están agrupadas
┊ Colectivamente llamado IO Modelo (entrada / salida Modelo).

A. Un solo hilo síncrono

┊ Se refiere al uso de un solo hilo (Single Thread) para procesar la conexión y al
uso de sincrónico (Sincrónico) para cada conexión.
┊ Estilo IO.
línea
Este modelo maneja la conexión en un solo hilo y usa un método síncrono para IO, es
decir, IO como enviar o recibir La operación se bloqueará cuando

┊ Hilo frontal, solo IO Después del final, el hilo continuará con el siguiente paso.
┊ Debido al método de sincronización, el modelo solo puede procesar una conexión
antes de procesar la siguiente conexión, que es una única

El modelo de IO del cliente también es el más simple Modelo IO.

┊ B. multiproceso síncrono
┊ Se refiere al uso de subprocesos múltiples (Multi Thread) maneja múltiples conexiones y
usa E / S síncrona para cada conexión.

Cuando un nuevo cliente se conecta, el modelo inicia un nuevo hilo para manejar la
conexión. En este hilo, use el método de sincronización

┊ subirse IO.
┊ El subproceso múltiple síncrono es el tipo de multicliente más utilizado en la
mayoría de los lenguajes de programación. Modelo IO, fácil de desarrollar e intuitivo

Las ventajas. Pero debido a que cada conexión necesita abrir un nuevo subproceso para su
procesamiento, y cada subproceso necesita consumir importantes recursos del sistema,

Por lo tanto, no se puede utilizar en escenarios con una gran cantidad de conexiones
simultáneas. Pregunta C10k [??].
C. Hilo único asíncrono
H i l o ú n i c o Método (Single Thread) para manejar múltiples conexiones y asíncrono
para cada conexión
(Asincrónica) forma IO.
Debido a que la E / S se realiza de forma asincrónica, el subproceso que maneja la
conexión no será La operación IO se bloquea para que se puedan procesar varias conexiones al
mismo tiempo.
El subproceso único asíncrono es el modelo de E / S asíncrono más simple, como libuv,
libev, Node.js Etc. han adoptado este modelo. debido a
┊ El código asincrónico no se ejecuta en el orden de escritura del código, por lo que es
más difícil de desarrollar que el código sincrónico. El modelo se debe a
┊ No es necesario abrir un nuevo hilo para cada conexión, por lo que el consumo de
recursos se compara con la sincronización con el mismo número de conexiones.

Menos multiproceso. Pero también debido al procesamiento de un solo subproceso, la

cantidad de conexiones simultáneas admitidas por este modelo depende del rendimiento del
procesamiento de un solo núcleo. Orden asincrónico
┊ Los subprocesos se pueden resolver mientras una pequeña cantidad de conexiones permanecen
activas Problema de C10k[35], Pero no puede manejar campos donde la mayoría de las conexiones
permanecen activas
┊ vista.

D. multiproceso asincrónico

┊ Se refiere al uso de múltiples subprocesos para procesar múltiples conexiones y de
forma asíncrona para cada conexión. IO.
┊ La diferencia entre este modelo y el subproceso único asíncrono es que utiliza la
tecnología de grupo de subprocesos para procesar cada conexión utilizando varios subprocesos,
cada uno de los cuales

Varias conexiones se procesan de forma asincrónica en los subprocesos IO.

┊ A diferencia del subproceso múltiple síncrono, no crea un nuevo subproceso para
cada conexión, pero lo mantiene en un máximo fijo Atuendo Hilos. Esta tecnología generalmente
no excedeEl número de subprocesos de la CPU lógica de la computadora para garantizar la máxima
utilización de cada recurso de la CPU.

Debido al uso de la tecnología de subprocesos múltiples, este modelo extiende la
capacidad de procesamiento de conexión de un solo subproceso asíncrono a varios núcleos. los

┊ El modelo puede utilizar completamente los recursos informáticos de una computadora de
varios núcleos y tiene una mayor potencia de procesamiento que el subproceso múltiple síncrono. Es
una especie de C10k preguntar
┊ La solución al problema, pero su complejidad de programación también es la más alta [36].

Orden






ne
a













3 Análisis de requisitos de software y diseño de
esquemas
3.1 Resumen de requisitos

┊ 3.1.1 Requisitos funcionales

┊ A. Microsoft Flight Simulator X Simulación somatosensorial
┊ Después de la configuración, los usuarios pueden usarMicrosoft Flight Simulator X (FSX para

abreviar) software de simulación de vuelo, en tiempo real
┊ El suelo produce los correspondientes efectos somatosensoriales en una plataforma
deportiva de acuerdo con el estado de vuelo actual. Si el vuelo se suspende o detiene,
no más
┊ Efecto somatosensorial.
┊ B. Simulación de movimiento de vuelo prefabricada

┊ Los usuarios pueden optar directamente por realizar simulaciones somatosensoriales de
despegue, aterrizaje, guiñada a la izquierda y guiñada a la derecha de la aeronave.
┊ Los efectos somatosensoriales correspondientes se producen en la plataforma móvil.
┊ C. Simular una plataforma de movimiento de seis grados de libertad
Atuen
do El usuario puede ver una plataforma de movimiento simulada de seis grados de libertad
┊ que ajusta su postura y posición de acuerdo con el estado de movimiento en tiempo real.
La plataforma de simulación
┊ Debe poder reproducir la situación de la plataforma real y admitir el ajuste de los
parámetros de la plataforma, como el radio de las plataformas superior e inferior, el
ángulo central del lado corto y la distancia entre las plataformas superior e inferior.
┊ Número, para que los usuarios prueben la situación de simulación bajo varios
parámetros.

D.Ajuste de parámetros semiautomático del algoritmo de simulación somatosensorial incorporado

Orden Algoritmo de simulación somatosensorial incorporado basado en el algoritmo clásico de
lavado. Los usuarios pueden ajustar según las condiciones del hardware, las condiciones
de funcionamiento del vehículo simulado, etc.
┊ Los parámetros del algoritmo de simulación para lograr un mejor efecto de simulación
somatosensorial.

E. Desarrollar y usar complementos de entrada

┊ Permite a los desarrolladores conectar otras fuentes de datos al sistema de simulación
somatosensorial para realizar una simulación somatosensorial. La fuente de datos debe
admitir al menos tres partes
┊ Retroalimentación en tiempo real de la aceleración lineal y la velocidad angular en
tres direcciones. El usuario puede elegir la fuente de datos por sí mismo.
línea
F. Desarrollar y utilizar algoritmos de simulación somatosensorial

┊ Permite a los desarrolladores implementar otros tipos de algoritmos de simulación
somatosensorial y proporcionar una interfaz de configuración de parámetros. Permitir
que los usuarios instalen y utilicen diferentes
┊ El algoritmo de simulación somatosensorial realiza una simulación somatosensorial.
┊ G. Desarrollar y utilizar un controlador de plataforma de movimiento

┊ Permite a los desarrolladores conectar la postura de movimiento a un modelo de hardware
real para lograr el impulso de la plataforma de movimiento. Permitir usuarios
┊ Instale y use diferentes unidades de plataforma de movimiento.
┊ H. Desarrollar y usar complementos de salida

┊ Permite a los desarrolladores obtener datos como la plataforma de movimiento actual,
debe tener la postura del movimiento, la postura del vehículo y otros usos, como la
implementación.
┊ Conexión con el sistema de visión. Permita que los usuarios instalen y utilicen
complementos de salida normales.

┊ 3.1.2 Entorno operativo

gráfico 3.1 Describe los requisitos ambientales mínimos necesarios para garantizar el
funcionamiento normal del software.
mesa 3.1 Entorno mínimo requerido para el funcionamiento normal
Componente RAM UPC Sistema operativo Retraso Ancho de
de la banda de la
red red
Complemento 4GB + 2+ Windows 7 o superior <10 ms > = 1 Mbps
FSX
┊ Componentes 1GB + 2+ De acuerdo con el <10 ms > = 1 Mbps
del controlador de
controlador hardware
de hardware
┊ Todos los demás componentes 4GB + 2 + Windows ┊
7+ ┊


Ubuntu 14.04+ flujo de datos de capa 0

┊ ┊
┊ ┊ 3.2.2
┊ 3.2 Diseño general Arquitectura
┊ ┊
3.2.1 Diagrama de flujo de datos

┊ El diagrama de flujo de datos de este software sujeto
se muestra en la figura 3.1 y Figura 3.2.


P
a
q
u
e
t
e





Orden Figura 3.1 Diagrama de
flujo de datos de nivel superior




l
í
n
e
a




<10 ms> = 5 Mbps
┊ El software en cuestión se compone de tres partes: parte de entrada del vehículo,
parte de cálculo somatosensorial y parte de salida de la plataforma. Sección de entrada del
vehículo
┊ Se genera el estado del vehículo, la parte de cálculo somatosensorial utiliza un algoritmo
para calcular el estado de la plataforma de acuerdo con el estado del vehículo, y la parte de
salida de la plataforma se basa en la plataforma.

Estado de control de hardware específico, hardware virtual o pasado a otro software, como
el sistema de simulación visual. Los datos se generan o ingresan desde la parte de
entrada del vehículo, fluyen a la parte de cálculo somatosensorial para el cálculo
y, finalmente, el resultado del cálculo fluye a la parte de salida de la plataforma
para la salida, como se muestra en la Figura 3.3. Entre ellos, cada parte es
reemplazable, configurable y expandible, y solo hay una única entrada del vehículo
y una parte de cálculo somatosensorial, y puede haber múltiples partes de salida de
la plataforma.
┊ Figura 3.3 Composición del software


┊ Para lograr tal diseño en ingeniería, el módulo de diseño de patrón de adaptador
en el patrón de diseño se utiliza en la arquitectura para diseñar
┊ La arquitectura general se muestra en la figura. 3.4 como se muestra. Para facilitar la
comprensión general, lo que se muestra aquí es la división de módulos de alto nivel, es decir, las funciones de los
módulos.

Puede ser completado específicamente por una o más clases, en lugar de un módulo
correspondiente a una clase.







Pa
qu
et
e





Or
de
n






ne
a
┊ Figura 3.4 Arquitectura de software


La función de cada módulo se explica en detalle a continuación.

┊ A. Módulo adaptador de entrada
┊ Este módulo se encarga de descubrir, gestionar y acoplar un módulo de entrada
específico según la configuración del usuario. El acoplamiento incluye aceptar módulos de
entrada

Bloquear la entrada de datos en tiempo real, aceptar la interfaz de configuración
definida por el módulo y transmitir la configuración del usuario del módulo.

┊ B. Complemento de generación de señal FSX
┊ El módulo es en tiempo real desde un sistema actual en ejecución. Leer la posición de la
aeronave en la instancia de Microsoft Flight Simulator X

Y los datos de actitud se utilizan como estado de entrada del vehículo.

┊ C. Plug-in de recepción de señal FSX
Como FSX se ejecuta en sistemas Windows. Para permitir que el servidor no se limite a este sistema
operativo, el "complemento de generación de señal FSX" no forma parte del servidor. El servidor solo
contiene el "plug-in receptor de señal FSX", es decir, un módulo remoto que coincide con el "plug-in
generador de señal FSX". Se comunica con el "plug-in generador de señal FSX" para obtener datos en
tiempo real . Además, la configuración del "plug-in de generación de señal FSX" también es
proporcionada y gestionada por el módulo en el lado del servidor. De esta forma, el usuario
Se pueden realizar varias configuraciones en un solo lugar en el lado del servidor.
D. Complemento de entrada de actitud de vuelo
El módulo tiene cambios de posición y actitud incorporados en cuatro estados de la aeronave:
despegue, aterrizaje y guiñada de izquierda a derecha. El usuario puede
┊ Una vez que se completa un cambio de estado, cambie a otro estado a través de la
interfaz. Estos estados se utilizarán como estados de entrada del vehículo en tiempo real. Además
┊ El módulo también proporciona las funciones de configuración correspondientes, lo que
permite a los usuarios definir nuevamente otros datos de estado o modificar los datos de estado
de la aeronave existentes.

E. Módulo de adaptación de algoritmos

┊ Este módulo se encarga de descubrir, gestionar y acoplar un módulo de algoritmo
específico según la configuración del usuario. El acoplamiento incluye la entrada del vehículo.
┊ Transferencia en tiempo real al módulo de algoritmo para el cálculo, obtener los datos de
estado de la plataforma calculados del módulo de algoritmo en tiempo real y aceptar la configuración
definida por el módulo.

Interfaz, configuración de usuario de transferencia del módulo, etc.

┊ F. Complemento de algoritmo de lavado clásico
┊ Este módulo proporciona una simulación somatosensorial basada en el algoritmo
clásico de lavado y calcula los datos de estado de la plataforma basándose en el estado del
vehículo en tiempo real.

Permite ajustar parámetros mediante configuración.

┊ G. Módulo adaptador de salida
Atuendo Este módulo se encarga de descubrir, gestionar y acoplar un módulo de salida
específico según la configuración del usuario. El acoplamiento incluye el estado de la
plataforma

Los datos se pasan al módulo de salida, se acepta la interfaz de configuración
definida por el módulo y se pasa la configuración del módulo por parte del usuario.

┊ H. Complemento de simulación visual para plataforma de movimiento
┊ Este módulo presenta una simulación tridimensional en tiempo real basada en la
actitud de la plataforma. La posición y postura de la plataforma de movimiento de seis grados de libertad Stewart

Expresar. Los usuarios pueden observar esta plataforma de movimiento simulado desde
cualquier ángulo. Con este módulo, los usuarios pueden observar el orden somatosensorial sin
hardware
┊ Simular la situación, analizar el funcionamiento de la entrada, el cálculo y otros
pasos. Los usuarios también pueden ejecutar la plataforma de movimiento simulado con la
plataforma real
┊ El estado se compara para proporcionar una referencia para el ajuste de parámetros.

Controlador de hardware

┊ Este módulo es un conjunto de módulos imaginarios, que se utilizan para impulsar
módulos de acoplamiento requeridos por hardware de plataforma de movimiento específico, y sus
responsabilidades son similares a
línea Los controladores del sistema operativo deben ser desarrollados por desarrolladores o
proveedores de hardware. Dado que no existe un hardware de plataforma de movimiento adecuado
para este tema,

Por lo tanto, aquí no se proporcionan módulos de muestra para controladores de
hardware.

┊ Varios escenarios comunes de este módulo:
┊ Si el hardware específico es de seis libertades de alto nivel que recibe directamente los datos de
posición y actitud de la plataforma a través de la comunicación en serie
┊ Si el hardware de la plataforma de movimiento es alto, el módulo del controlador debe
realizar una comunicación en serie con el hardware y transmitir los datos de posición y actitud
de la plataforma;

┊ Además, sobre la base de (1), si la comunicación con el hardware solo puede
Ventanas En el sistema operativo, necesitas
┊Para dividir el módulo de la unidad en dos partes, a saber, una parte remota y una parte de
control, para garantizar que el servidor pueda ejecutarse entre plataformas;
┊ Si el hardware específico es un conjunto de varillas de transmisión
ensambladas por el usuario(Actuador), la varilla de transmisión solo acepta la posición a través
del puerto serie

┊ Y el control de velocidad para formar un hardware de plataforma de movimiento de seis
grados de libertad de bajo nivel, entonces el módulo de la unidad debe realizar la solución de
posición inversa y combinar con esto
┊ Estas varillas de transmisión realizan la comunicación en serie y transfieren los
datos de posición de la varilla de transmisión después de la solución inversa.

3.2.3 La relación entre requisitos funcionales y módulos

Según los requisitos funcionales, la relación entre cada requisito y el módulo se


muestra en la tabla 3.2 Mostrado.
Diseño e implementación del sistema de simul

Total 88 páginas Página 30


Cuadro 3.2 Requisitos

FSX FSX Actitud Plataforma deportiva


Características \ Adaptación de entrada de vuelo Adaptaci Lavado Adaptaci Controlado
Módulo Generaci recepció ón de clásico ón de r de
ón de n de ingresar algoritm salida hardware
señales señal os Simulación visual

Desarrollar y usar - - - - - ✔ -
complementos de
salida
Desarrollar y - - - - - ✔ - ✔
utilizar un
controlador de
plataforma de
movimiento
Desarrollar y - - - ✔ - - -
utilizar un
algoritmo de
simulación
somatosensorial.
funcionales y relación del
módulo

Diseño e implementación

4 Investigación sobre la implementación de software del


algoritmo de simulación somatosensorial

┊ La mayor parte de la investigación existente sobre algoritmos de simulación
somatosensorial se basa en el sistema de medición continua. Transformada de Laplace para resolver
ecuaciones diferenciales
┊ Contar. El simulador somatosensorial basado en software es un sistema de muestreo y los
datos somatosensoriales de entrada son discretos. Algoritmo de simulación somatosensorial

La implementación del software del método requiere el establecimiento de un algoritmo
discreto equivalente al algoritmo continuo. Este tema ha sido investigado y realizado.

┊ Los algoritmos de simulación somatosensorial generalmente incluyen filtros
analógicos y componentes integrales en sistemas continuos.
┊ Algoritmos implementados en el sistema.

┊ 4.1 Realización digital de filtro analógico

┊ El procesamiento de datos discretos es en realidad el campo del procesamiento
digital. La transformación bilineal es un estándar
┊ Un método para convertir un filtro continuo en un filtro digital equivalente.
┊ La fórmula de transformación bilineal es:
Atuendo
┊ H (z) = H (s) | z
zs+
s = 2f (4,1)
┊ –1
┊ entre ellos, ƒs es
la frecuencia.
┊ Usando la transformación bilineal, la función de transferencia del filtro analógico
se puede convertir a la función de transferencia del filtro digital:
┊ B (z) b b + bz – 1 + bz – 2 + ... + z-NORTE
Orden H (z) O 12N (4,2)
Ariz = 1 + a1z-1 + a2z-2 + . .. + aMz-
= METRO
ona

)
┊ A continuación, puede utilizar directamente la fórmula
de cálculo de la diferencia del filtro digital para calcular:
┊ (4,3)
┊ ym = bOxm + b1xm – 1 + ... +
bPxm – P

- A1ym – 1 - A2ym – 2 -… - AQym – Q
línea
┊ entre ellos, x es la señ al de entrada;

y es la salida del filtro.

┊ Como se usa en este artículo Tome el filtro de paso bajo de segundo orden en la direcció n x
como ejemplo, la fó rmula (2.24) Complete los parámetros en la Tabla 2.2 para obtener filtrado analógico
┊ Función de transferencia:
┊ n ┊ Tomando
ω 2 ┊
┊ H (s) = norte
= 2Çωns
ω2
+
100Hz como
Total 88 Primero 31
Diseño e implementación

frecuencia ƒs, de acuerdo con la fórmula (4.1), podemos obtener: 25


┊ 25 (4,4)
┊ H (z) = s2 + 10s + 25
┊ (200 z - 1) 2 + 10 ∙ 200 z - 1 + 25 (4,5)
┊ z+1 z+1
Terminad
o:
z2 + 2z + 1
H (z) = (4,6)
1681z2 - 3198z + 1521

Según la fórmula(4.2) La función de transferencia del filtro digital se puede


obtener normalizando los coeficientes:

Total 88 Primero 32
0.000596z2 + 0.001190z + 0.000596
H (z) =
z2 - 1.902439z + 0.904819 (4,7)
= 0,000596 + 0,001190z – 1 + 0,000596z
–2
┊ 1 - 1,902439z – 1 + 0,9048192z – 2
Por lo tanto, de acuerdo con la ecuación (4.3), la fórmula

de diferencia de filtro es:
┊ ym = 0.000596xm + 0,001190xm – 1 + (4,8)
0,000596xm – 2

- (—1,902439) ym – 1 - 0,904819ym – 2

┊ De acuerdo con la fórmula (4.3), el código 4.1 implementa la clase de cálculo de
filtro, y su parámetro de inicialización es el parámetro de coeficiente de filtro digital, que
proporciona

┊ La interfaz debe pasar un nuevo valor como señal de entrada y calcular la respuesta de
salida.

┊ clase RealtimeFilter():
┊ def en eso (uno mismo, b, a):
┊ afirmar(len(B) == len(a)) uno
┊ mismo.norte = len(B) # n =
Pa orden + 1 uno mismo.B = B
qu uno mismo.a
= a uno
et
mismo.Reinic
e iar()

┊ def Reiniciar(uno mismo):
┊ uno mismo.aporte = notario público.cerosuno
┊ mismo.n, dtype=notario público.flotador) uno
┊ mismo.producción = notario público.cerosuno
mismo.n, dtype=notario público.flotador)
Or
de def aplicar(uno mismo, v):
n uno mismo.aporte[uno
┊ mismo.norte - 1] = v uno
┊ mismo.producción[uno
┊ mismo.norte - 1] = 0
┊ producción = 0
por yo en abarcar(0, uno mismo.norte):
┊ producción = producción + \
lí uno mismo.bi] * uno mismo.aporte[uno
ne mismo.norte - 1 - I] - \ uno mismo.ai] *
a




Código 4.1 Realización de la clase de cálculo de filtro digital


┊ Para facilitar al usuario el ajuste de los parámetros, los parámetros del filtro
analógico deben usarse directamente como parámetros, y el filtro digital debe calcularse.

Parámetros, se necesita software para realizar el cálculo de transformación bilineal.

usarLa biblioteca de computación científica de Python scipy puede completar el cálculo de manera fácil y eficiente.
┊ Calcule, como se muestra en el código 4.2. Entre ellos, los parámetros de entradab_analog y
a_analog son el numerador y la función de transferencia del filtro analógico, respectivamente
┊ El coeficiente del denominador; el parámetro de entrada fs es la frecuencia; la salida
b_digital y a_digital son el numerador de la función de transferencia después de la transformación bilineal

Y el coeficiente del denominador.

b_digital, a_digital = scipy.señal.bilineal (b_analog, a_analog, fs)

Código 4.2 Filtro analógico a código de muestra de filtro digital


Todavía en fórmulaLa función de transferencia que se muestra en (4.4) se toma como
ejemplo, y el código para convertirlo en un filtro digital mediante transformación
bilineal se muestra en el código 4.3
Como se muestra, el resultado de la ejecución es como código Como se muestra en 4.4, el resultado
de la ejecución es consistente con el coeficiente calculado en la ecuación (4.7).

┊ b_analog = [0, 0, 25]


┊ a_analog = [1, 10, 25]
┊ b_digital, a_digital = señal.bilineal (b_analog, a_analog, 100)
┊ El código 4.3 será la fórmula(4.7) El código para convertir el filtro mostrado en
un filtro digital


┊ b_digital: [ 0,00059488 0,00118977 0,00059488]
┊ a_digital: [ 1. -1,90243902 0,90481856]
┊ Código 4.4 Resultado de la salida del filtro digital


┊ Basado en código 4.2. Realice las funciones de fábrica de los filtros de paso alto y paso bajo de
primer orden a tercer orden, respectivamente, y utilice el filtro analógico como parámetro para construir
┊ Cree una clase de cálculo de filtro
digital, como se muestra en el código
4.5.Atuendo

┊ def build_1st_filter(omega, lp=Cierto, frecuencia=FREQ):
┊ B = [1, 0] si no lp demás [0, omega]
┊ a = [1, omega]
regreso RealtimeFilter (*señal.bilineal (b, a, fs=frec))

Or def build_2nd_filter(omega, zeta, lp=Cierto, frecuencia=FREQ):
de B = [1, 0, 0] si no lp demás [0, 0, omega ** 2]
n a = [1, 2 * zeta * omega, omega ** 2]
┊ regreso RealtimeFilter (*señal.bilineal (b, a, fs=frec))

┊ def build_3rd_filter(omega, zeta, omega_1, lp=Cierto,
frecuencia=FREQ): b = [1, 0, 0, 0] si no lp demás [0, 0, 0,

omega ** 3]
┊ a = [1, 2 * zeta * omega + omega_1, omega ** 2 + omega_1 * 2 * zeta * omega, omega
lí ** 2 * omega_1]
ne regreso RealtimeFilter (*señal.bilineal (b, a, fs=frec))
a


Código 4.5 Realización de la función de fábrica de la clase de cálculo de filtro digital



4.2 Realización digital de puntos

┊ Los algoritmos de simulación somatosensorial generalmente requieren integración
para convertir la aceleración en desplazamiento y la velocidad angular en ángulo. Según integral
definida

Fórmula de cálculo aproximada, la función se puede aproximar mediante corte

rectangular:
n–1

┊ ƒ ƒ (t) dt ≈ Σ (xi + 1 - xi) ƒ (ci) (4,9)
I
┊ i=O
┊ Para la función de diferencia del filtro de paso bajo de segundo orden de
aceleración obtenido en la ecuación (4.8), la expresión de velocidad en el caso
discreto se puede obtener aplicando la fórmula de cálculo aproximada:
t–1
1 t–
1 (4.10)
vt = Σ yt = Σ 0.01yt
ƒs
t=O
t=O

┊ Integre nuevamente para obtener la


expresión de desplazamiento en el caso discreto:
┊ t–1 t–1
┊ 1
┊ St = Σ vt = Σ 0.01vt (4,11)
┊ ƒs
t=
t=O
┊ O
┊ 4.3 Análisis de
complejidad de algoritmos

┊ Para el simulador somatosensorial, es necesario asegurarse de que el algoritmo
pueda completar el cálculo en una implementación corta, para lograr un movimiento suave.
┊ Por lo tanto, el análisis de complejidad del algoritmo es particularmente importante.

El cálculo del filtro incluye dos pasos: filtro analógico a filtro digital y
cálculo del filtro digital. Dado que los parámetros están en somatosensorial

┊ Se determina de antemano antes de la simulación, por lo que el paso de convertir el
filtro analógico al filtro digital no tiene ningún efecto sobre el rendimiento del sistema, por
lo que no se considerará aquí.
Atuendo considerar. Para el paso de cálculo del filtro digital, es fácil encontrar que la
complejidad de tiempo y espacio de cada señal que necesita calcularse es O (1),

Muy eficiente.

┊ Para el paso de cálculo integral, si se calcula directamente mediante el método
dado en la ecuación (4.10), la complejidad del tiempo y la complejidad del espacio son ambas
┊ O(NORTE)(N es el número actual de puntos muestreados) Con más y más puntos de
muestreo, se consumirán cada vez más recursos.

Aceptado. Tenga en cuenta que la
expresión integral es equivalente a la relación
de
┊ recurrencia: Establecer 1
v
+ ƒs yt – 1, t (4.12)
┊ vt = { t – 1
>0
┊ 0, t =0

El mismo resultado se puede calcular utilizando esta relación de recurrencia,

pero la complejidad de tiempo y espacio también son O (1), y la eficiencia se mejora
enormemente.línea Utilice esta relación de recurrencia con la fórmula (4.11)La implementación
se muestra en el código 4.6.


output_v [i] = output_v [i-1] + 0,01 * salida [i-1];

output_s [i] = output_s [i-1] + 0,01 * output_v [i-1];

┊ Código 4.6 El código de ejemplo de lenguaje C equivalente de la fórmula
(4.11)








5 Implementación detallada del marco básico del lado
del servidor
5.1 Tecnología de servidor y selección de componentes


El servidor de esta asignatura incluye el módulo de entrada del vehículo, el módulo
de cálculo somatosensorial y el módulo de salida de la plataforma. Este servicio de temas

┊ El diseño del servidor tiene las siguientes características:
┊ Operación multiplataforma;
┊ Apoyo a La interfaz presentada en forma web se utiliza para la configuración del módulo;

┊ Módulos fáciles de reemplazar y expandir;
┊ alta eficiencia;
┊ A continuación se enumeran los componentes en los que se basa el servidor de este
tema y los factores para seleccionar los componentes.

┊ A. Python 3.5+ (lenguaje de programación)
┊ Como lenguaje de programación multiplataforma, puede cumplir con los requisitos
multiplataforma del servidor;
Atuendo Desde 3,5 A partir de la versión, admite sintaxis de escritura asíncrona y
síncrona, y puede escribir asincrónica de alta calidad con código intuitivo.

Programa de energia

┊ Poseer muchas bibliotecas de computación científica, que pueden convertir
fácilmente filtros analógicos en filtros digitales;
┊ Como lenguaje de scripting, no hay necesidad de compilar al escribir
complementos para él, y tiene una escalabilidad extremadamente fuerte.

B. Sanic (marco web)
Orden
┊ Basado en Python 3.5 Realización de características asincrónicas;
┊ La eficiencia es la más alta entre marcos similares;

Con todas las funciones.

┊ C. MongoDB (base de datos)
línea Base de datos de documentos, no es necesario definir la estructura del
registro de antemano;

Apoyar la operación asincrónica;

┊ Puede persistir
┊ alta eficiencia.

┊ 5.2 Tecnología de interfaz de configuración del servidor y selección de componentes

┊ A. Tecnología web
┊ Este tema usa La tecnología web se da cuenta de la interfaz de configuración.
┊ En comparación con otras tecnologías de interfaz, Web La tecnología es altamente
dinámica, lo que proporciona un fuerte apoyo para la fácil realización de interfaces de plug-in;

Se puede realizar fácilmente una hermosa interfaz de usuario;

┊ La interfaz de configuración es principalmente de tipo formulario, y el Los
componentes web son suficientes, sin la necesidad de componentes complejos como la interfaz del
cliente; Permitir que el servidor de software se ejecute en un sistema
operativo que no tenga una interfaz gráfica, como los servicios que utilizan
los servidores convencionales.
Versión Sistema operativo Linux.
B. Webpack (herramienta de empaquetado frontal)
Los recursos utilizados por el complemento se pueden empaquetar en un directorio, lo que reduce la
dificultad de distribución del complemento;
Simplemente importe un archivo JavaScript empaquetado para completar
automáticamente la carga de otros recursos; Permite a los desarrolladores
llevar a cabo un desarrollo front-end modular con menor dificultad.
C. Vue (marco de renderizado MVVM de front-end)
┊ La interfaz de configuración es principalmente una interfaz de formulario, por lo que el uso del
marco MVVM puede reducir en gran medida la dificultad del desarrollo;
┊ Viene con un motor de plantilla amigable, y el código es más legible;

Admite funciones de componentes, lo que permite a los desarrolladores

implementar controles de interfaz separados y realizar la reutilización del control de interfaz.
┊ 5.3 Implementación del sistema impulsado por eventos

┊ 5.3.1 Flujo de datos del módulo

┊ Para lograr un acoplamiento flexible entre los complementos y los módulos, el lado
del servidor de este tema utiliza el patrón de diseño del observador (patrón de diseño del
observador)
┊ La idea de utilizar una arquitectura impulsada por eventos para comunicarse entre diferentes
tipos de módulos, incluso entre complementos y módulos de adaptación, módulos de adaptación

Etc. entre el bloque y el módulo de adaptación. Diagrama de flujo de datos entre módulos

clave 5.1 Como se muestra, la secuencia del flujo de datos es de ① a ⑥.

Pa
qu
et
e





Or
de
n
┊ Figura 5.1 Diagrama de flujo de datos del código clave


┊ 5.3.2 Lista de eventos

línea Además de los eventos entre módulos, el marco también proporciona eventos. Todos los
eventos definidos ennombre
el lado del servidor dedescripción
este tema se muestranRemitent 5.1 Mostrado.
en la tablarecipien Número de
┊ e te dibujo DFD
┊ hexi.pipeline.start Comienza la simulación cuadro Arbitrar /
somatosensorial
mesa 5.1 Lista de eventos del servidor io

┊ hexi.pipeline.stop Finaliza la simulación cuadro Arbitrar /
somatosensorial io

┊ hexi.pipeline.input. Señal de entrada, incluida la Compleme Adaptaci ①
adición del vehículo analógico nto de ón de
┊ raw_data entrada entrada
┊ Velocidad y otra información, en
┊ milisegundos después del inicio
de la simulación
Disparador de nivel
hexi.pipeline.input.data Señal de entrada procesada de Adaptaci Compleme ②③
forma unificada ón de nto de
entrada algoritm
o




Continuado 5.1
nombre descripción Remitent recipien Número de
e te dibujo DFD
hexi.pipeline.mca.data Señal de posición y actitud de Adaptaci Compleme ⑤⑥
┊ la plataforma de procesamiento ón de nto de
┊ unificada algoritm salida
os

┊ hexi.start Inicio del software cuadro Arbitrar /
io

hexi.stop Apagado del software cuadro Arbitrar /

io

hexi.plugin.activate Un complemento está activado cuadro Arbitrar /


5.3.3 Implementación específica

┊ El núcleo de la gestión de eventos es el módulo de programación de eventos.(Event
Dispatcher), es decir, otros módulos se suscriben al módulo para eventos, o

Solicitud para transmitir un evento a los módulos que se hayan suscrito al evento. Este
tema utiliza una arquitectura asincrónica, por lo que la programación de eventos asincrónica se
implementa en consecuencia

Atuendo Módulo. En este módulo de programación, la operación del mensaje de difusión se realiza
de forma asíncrona: los suscriptores recibirán el mensaje de difusión al mismo tiempo.
┊ Una vez que los lectores han procesado el mensaje, finaliza la operación de difusión
del mensaje. Debido a la naturaleza asincrónica, varios suscriptores pueden ser asincrónicos al
mismo tiempoIO

La operación mejora la eficiencia del procesamiento.


┊ _suscriptores = {}
Or
de asincrónico def publicar(valor clave):
n corrutinas = [abonado({'llave': llave, 'valor': valor})
┊ por suscriptor, key_set en _subscribers.artículos()
┊ si clave en
key_set] espera
┊ asyncio.recolectar(*corrutinas)

┊ def suscribir(devolución de llamada, teclas):
lí afirmar escribe(claves) en (colocar, lista, tupla)
ne _subscribers [devolución de llamada] = teclas
a

def darse de baja(llamar de vuelta):
┊ si devolución de llamada en
┊ _subscribers:



Código 5.1 Implementación del programador de eventos asincrónico


┊ Tome hexi.pipeline.input.data como ejemplo. Si no le importa cuándo se procesa el evento, puede usar
el código5.2 Eventos de transmisión;

Si necesita realizar operaciones de forma asincrónica después de que se procesa el
evento, puede usar el código 5.3 Evento de transmisión: si necesita esperar el evento sincrónicamente

┊ Después del procesamiento, puede utilizar el código para operaciones posteriores. 5.4
E v e n t o d e t r a n s m i s i ó n ; s e p u e d e u s a r c ó d i g o 5.5 Suscríbete a eventos.

asyncio.asegurar_futuro (evento.publicar('hexi.pipeline.input.data', param))

C ó d i g o 5.2 Utilice el programador de eventos asincrónico para transmitir eventos


de forma asincrónica sin preocuparse por los resultados de la transmisión
def on_task_done(futuro):
# EVENTO DE MANEJO PUBLICADO
pasar

tarea = asyncio.asegurar_futuro (evento.publicar('hexi.pipeline.input.data',


┊ param)) tarea.add_done_callback (on_task_done)

┊ C ó d i g o 5.3 Utilice el programador de eventos
┊ asincrónico para transmitir eventos de manera
asincrónica y preocuparse por los resultados de la
┊ transmisión
lazo = asyncio.bucle get_event_loop ().run_until_complete
┊ (evento.publicar('hexi.pipeline.input.data', param))




Código 5.4 Utilice el programador de eventos
asincrónico def on_input_data(mi):
┊ # MANEJO DE LLEGADA DELasincrónico
EVENTO para transmitir eventos de forma
┊ pasar sincrónica

Pa evento.subscribe (on_input_data, ['hexi.pipeline.input.data'])
qu
et
e


┊ Código 5.5 Utilice el programador de eventos
asincrónico para suscribirse a eventos
┊ 5.4
Implementación del sistema de
complementos

Orden Los módulos reemplazables y extensibles son complementos. El sistema de plug-in del
servidor es la clave a resolver en la parte de implementación del software de esta asignatura.
┊ Uno de los problemas es que el software de simulación somatosensorial existente no tiene
suficiente arquitectura abierta y completa para admitir sistemas enchufables.

Tiene la importancia de investigación de este tema. Para ser configurable, el sistema

de complemento también debe admitir una interfaz. El sistema de plug-in de esta asignatura se da
cuenta de:
┊ Mecanismo de complemento de capa lógica. Por ejemplo, para un complemento de
entrada, la señal de entrada generada por el complemento puede fluir normalmente para usar
┊ Un componente informático configurado por el usuario y finalmente fluye a un componente
de salida configurado por el usuario.
línea
Mecanismo de complemento de la capa de interfaz. Por ejemplo, para el
complemento de entrada (1), también puede proporcionar una interfaz de configuración.

┊ Se puede configurar en la superficie para realizar la configurabilidad del módulo.
┊ La interfaz del complemento está unificada. La interfaz proporcionada por
cada complemento independiente se combina con continuidad y unidad, es decir, para el usuario

Para los usuarios, se pueden configurar diferentes complementos a través de la misma
entrada, en lugar de a través de las entradas dispersas.

┊ Fuera de la caja. Los usuarios pueden instalar un complemento o eliminar un
complemento con muy pocas operaciones, sin tener que pasar por complicadas
┊ El proceso (como la compilación de código).

┊ 5.4.1 Formulario de complemento

┊ Lado del servidor Un directorio debajo del directorio de complementos es una unidad, y el
directorio incluye archivos de descripción de complementos, códigos de capa lógica,
┊ Código de capa de interfaz.
┊ Cuando los usuarios necesitan instalar un nuevo complemento, solo necesitan
colocar el nuevo directorio del complemento en Tendrá efecto en los complementos. Si desea
eliminar un complemento, simplemente elimine el complemento en el directorio de complementos. Los
pasos anteriores de "instalar un nuevo complemento" y "eliminar un complemento" se pueden
implementar de manera amigable a través de la interfaz.
A. Archivo de descripción del complemento
Especifica que el archivo de descripción del complemento describe toda la
metainformación sobre el complemento, incluido el identificador único del
complemento.(Id), nombre del complemento
(Nombre), categoría del complemento (Categoría), versión del complemento (Versión),
descripción del complemento (Descripción), entrada del código de la capa lógica
(Módulo), etc. El identificador único debe ser el mismo que el nombre del catálogo
de complementos.
El archivo de descripción debe ser .plugin como extensión, el nombre es arbitrario. Un
complemento solo puede tener un archivo de descripción. Código
┊ 5.6 es un archivo de descripción de muestra.


┊ [Centro]
Id = input_fsx
┊ Categoría = nombre
┊ de entrada =
┊ complemento de
┊ entrada FSX Módulo
┊ = complemento

[Documentación]

┊ Autor = Versión
incorporada = Código 5.6 Archivo de descripción de complemento de muestra

Atuendo
┊ B. Código de capa lógica de complemento

Especificar el uso del código de capa lógica de complemento Escrito en lenguaje Python, es
un módulo Python normal. Archivo de entrada de la capa lógica

┊ Dado por el archivo de descripción. Debido a las restricciones del lenguaje Python,
solo letras, números y
┊ Subrayado.
Orden C.Código de capa de interfaz de complemento

┊ Se estipula que el código de la capa de interfaz del complemento se encuentra en el
directorio .ui_built y el archivo de entrada es .ui_built / main.js. El archivo de entrada será
┊ El servidor se asigna a una ruta web accesible de acuerdo con el identificador único
del complemento que se va a cargar. Generalmente, los desarrolladores de complementos usan
┊ Dado por el tema La configuración del paquete web compila, empaqueta y procesa el código fuente y los
recursos relacionados proporcionados por la ruta relativa en la capa de interfaz

Salida al directorio .ui_built requerido por la capa de interfaz.
línea

5.4.2 Descubrimiento de complementos

┊ El descubrimiento de complementos se refiere a descubrir todos los
complementos instalados actualmente y obtener su información de descripción. Este
paso debe atravesar el directorio del complemento

En todas las subcarpetas de los complementos, busque el archivo de descripción del complemento * .plugin
y analícelo. Este tema está basado en Python
┊ def loadPlugins(): pm.setPluginPlaces
┊ La biblioteca de complementos
(['./plugins']) de yapsy implementa la lógica anterior, y la lógica central es como un código
pm.setPluginInfoExtension
Como se muestra en 5.7.
('enchufar') pm.setCategoriesFilter
┊ (pluginsFilter) pm.collectPlugins ()
┊ por complemento en pm.getAllPlugins ():
tratar:

identificación = enchufar.detalles.obtener('Centro', 'Identificación')
┊ excepto configparser.NoOptionError:
_logger.error('Plugin `{0}` se ignora debido a que falta una
propiedad válida de `Id`.'.formato (complemento.nombre))
tratar:
categoría = enchufar.detalles.obtener('Centro', 'Categoría')



afirmar(categoría en pluginsByCategory.teclas())
excepto configparser.NoOptionError:
_logger.error('Plugin `{0}` se ignora debido a que falta una propiedad de
`Categoría` válida.'.formato (complemento.nombre))

┊ pluginsByCategory [categoría].añadir
┊ (complemento) pluginsById [identificación] =
┊ enchufar
Código 5.7 Utilización yapsy encuentra y carga el complemento


┊ Una vez que se ejecuta el código, la variable pluginsById contiene el complemento
Un par clave-valor con ID como clave y objeto de complemento como valor,
┊ Y cada complemento está de acuerdo con la categoría dada en el archivo de descripción La
categoría se clasifica para facilitar la consulta rápida de un cierto tipo de complemento en el seguimiento.

┊ 5.4.3 Carga de la capa lógica del complemento

┊ usar Característica de lenguaje dinámico Python, el código contenido en el complemento se puede
ejecutar dinámicamente y se puede combinar con otros módulos en el lado del servidor
┊ Interoperar. Por lo tanto, solo es necesario cargar el módulo de entrada especificado de
acuerdo con el archivo de descripción. de acuerdo a yapsy Solicitud, entrada

El módulo debe seguir las siguientes
interfaces, como se muestra en la figura 5.2
como se muestra.Atuendo





Or
de
n


┊ Figura 5.2 diagrama de clases del complemento yapsy


activar (): se llama cuando el usuario activa el complemento. Puede
comenzar a comunicarse con otros módulos. línea
┊ deactivate (): se llama cuando el usuario deshabilita el complemento. Se debe terminar la
comunicación con otros módulos.
┊ En yapsy, pm.collectPlugins () La función de carga de la capa lógica se ha incluido en.

┊ 5.4.4 Clase base de la capa lógica del complemento

La responsabilidad del complemento de entrada es generar señales de entrada, y la

responsabilidad del complemento del algoritmo es generar señales de actitud de la plataforma basadas
en las señales de entrada y el complemento de salida
┊ La responsabilidad del software es aceptar la señal de actitud de la plataforma antes de
continuar con el procesamiento. Basado en esto, en la figura 5.2 Sobre la base de las clases base
mostradas, respectivamente
┊ Encapsulan la implementación del método de clase base, el diagrama de clases se muestra en
la figura 5.3 Mostrado. Entre ellos, BasePlugin La clase base es para todos los complementos
definidos en este tema.

La clase base, que encapsula la carga y el guardado de la configuración actual del

complemento, proporciona el objeto de enrutamiento del complemento actual y proporciona el archivo de
descripción del complemento.
┊ contenido. La clase InputPlugin es la clase base de todos los complementos de entrada,
encapsulando la función de distribución de eventos; la clase MCAPlugin son todos los algoritmos
┊ La clase base del complemento encapsula la función de distribución de eventos y la
función de recepción de eventos; la clase OutputPlugin es la clase base de todos los complementos
de salida, sellando

Función de recepción de eventos instalada. Esta encapsulación de la recepción y distribución
de eventos oculta los detalles específicos de la arquitectura impulsada por eventos y
proporciona
Forma de interfaz abstracta de nivel superior.













Pa
qu
et
e

┊ Figura 5.3 Diagrama de clases de plug-in



Or
de
n

┊ 5.4.5 Carga de la capa
de interfaz de complemento

┊ Para el front-end, para cargar correctamente una sección El archivo de código JavaScript
incluye dos tareas:
┊ Permitir que se acceda a archivos de código a través de una URL específica;
línea
Bajo la premisa de que se conoce la URL, importe el archivo de código a
través de la etiqueta <script> en el archivo HTML, o mediante

┊ JavaScript se introduce de forma dinámica.
┊ De la misma manera, las dos tareas anteriores también son aplicables para cargar otros
recursos en la interfaz, como estilos, imágenes, fuentes, etc. Pero debido a

Hasta Webpack empaqueta el código de la capa de interfaz, por lo que se han empaquetado otros recursos
como estilos, imágenes, fuentes, etc.

┊ Código JavaScript, o ya contiene el código necesario para cargar el recurso, así que asegúrese de lo
siguiente:
┊ El código JavaScript puede pasar Se accede a la URL y se introduce en HTML;

Por no incluido enLos recursos en JavaScript, como imágenes, fuentes y otro contenido
binario, les permiten pasar URL

┊ Ser visitado
┊ Entonces se puede realizar la carga completa de la capa de interfaz. También
empaquetado por WebpackCódigo JavaScript y recursos distintos del código

Los archivos están en el mismo directorio, por lo que la implementación solo debe
garantizar:

Se puede acceder a cada archivo del directorio de recursos;
Introduzca la URL de JavaScript en
HTML.A continuación, se describirá
la implementación específica de los
dos pasos anteriores.
A. Se puede acceder a los archivos del directorio de recursos.
El requisito implícito de este paso son los archivos de recursos de diferentes
complementos Las URL se pueden distinguir y no entrarán en conflicto entre sí. Por supuesto, la URL
del archivo de recursos del complemento no puede entrar en conflicto con la URL involucrada en el
marco del software, por lo que se definen las reglas de enrutamiento estático que se muestran en la
Tabla 5.2.

┊ Cuadro 5.2 Reglas de enrutamiento estático definidas en este tema

Enrutamiento de URL Ruta del sistema de descripción
┊ archivos

/ core / static ./hexi/.ui_built Directorio

de recursos
┊ del marco

┊ Según esta regla de enrutamiento, cada complemento solo necesita tener un
identificador independiente, es decir plugin_id, puede garantizar el acceso al archivo de recursos
┊ Sin conflicto, implementación como código Como se muestra en 5.8.


┊ bp = Plano('centro', url_prefix='/centro')
Pa bp.estático('/estático', 'hexi /
qu .ui_built') aplicación.plano (bp)
et
e
bp = Plano('complemento- {0}'.formato(identificación), prefijo_url='/
┊ plugins / {0}'.formato(identificación)) pb.estático('/estático',
┊ os.camino.unirse (os.camino.dirname (complemento.camino), '.ui_built'))
┊ aplicación.plano (bp)


Orden Código 5.8 Crear diferentes rutas para frameworks y complementos


┊ Murciélago Introducción a la URL de JavaScript en HTML
┊ En este tema, dado que la lista de complementos se desconoce de antemano y depende de la
cantidad de usuarios instalados, debe ser dinámica Contenido HTML.
┊ En circunstancias normales, puede utilizar el motor de plantillas para lograr. Pero
en este tema, el costo de usar un motor de plantillas es demasiado alto y su línea de
renderización de bloqueo
┊ Afectará el buen funcionamiento del resto de la lógica del software, por lo que no se
utiliza el motor de plantilla, sino contenido HTML estático combinado con dinámico
┊ El script se carga dinámicamente. Entre ellos, la carga dinámica se divide en modo
síncrono y modo asíncrono, porque la capa de interfaz debe cargarse en todos los complementos.
┊ Una vez completada la operación, es más conveniente utilizar el método de carga
síncrona.

┊ a. Contenido HTML estático
┊ Estático HTML C ó d i g o s r e l a c i o n a d o s e n e l c o n t e n i d o c o m o c ó d i g o 5.9
M o s t r a d o , d o n d e e l p r i m e r o 1, 2 El gremio cargará el marco y la tercera línea cargará todos
┊ Hay complementos y el contenido de loadPlugins.js es generado dinámicamente por el
servidor.


┊ <texto src="/core/static/core_dll.js"> </texto>
<texto src="/core/static/main.js"> </texto>
<texto src="/core/plugin/loadPlugins.js"> </texto>


┊ Listado 5.9 Estático Código clave HTML

b. Dinámico loadPlugins.js contenido


loadPlugins.js necesita incluir el código para cargar sincrónicamente todas las partes de la interfaz
del complemento actual, lo cual se logra escribiendo la etiqueta <script> usando la función
document.write (). Su contenido se genera dinámicamente mediante el código 5.10 en función de todos
los cálculos de complementos actuales. Suponiendo que esté instalado actualmente
Enchufar ID tiene input_flight_attitude y input_fsx, luego el contenido loadPlugins.js generado se muestra
en el código 5.11.

bp = Plano('enchufar', url_prefix='/ core / plugin')

┊ @ bp.route('/loadPlugins.js')
┊ asincrónico def get_plugins
┊ (petición):
┊ pluginIdList = [enchufar.detalles.obtener('Centro', 'Identificación')
┊ por complemento en pm.getAllPlugins ()]
responseText = 'var EXTERNAL_PLUGINS = {0}; \ n'.formato (json.volcados
┊ (pluginIdList));
┊ por identificación en pluginIdList:
┊ responseText + = ('try {{document.write (\' <script src = "/ plugins / {0}
┊ Código 5.10
/static/main.js"> </script> \ ');}} catchGenerar
(e) código
{{}} \para loadPlugin
n'.formato(identificación))


┊ var EXTERNAL_PLUGINS = ["input_flight_attitude", "input_fsx"];
┊ tratar{documento.escribir('<script src = "/ plugins / input_flight_attitude / static /
main.js"> </script>');}captura(mi){} tratar{documento.escribir('<script src = "/
Pa plugins / input_fsx / static / main.js"> </script>');}captura(mi){}
qu
et
e


Código 5.11 Muestra de contenido LoadPlugin



5.4.6 Comunicación entre la capa de interfaz de complemento y la capa de interfaz de marco
Orden
┊ Una vez que se carga el complemento, debe poder proporcionar uniformemente la
entrada de configuración del complemento en una interfaz de nivel de marco. Por ejemplo, el
complemento puede

┊ Es posible que deba agregar una entrada en la barra lateral, o puede que necesite
agregar una entrada en la interfaz de "lista de complementos". Esta función utiliza el adaptador
para configurar
┊ Para lograr el modo de diseño, la entrada de la interfaz del complemento debe
implementarse como se muestra 5.3 La interfaz que se muestra. Entre ellos, la estructura de clases de Ruta y Menú se
muestra en la figura
┊ Como se
muestra en 5.4.línea
Todos los elementos contienen su propio nombre único (Base.name), el nombre

único del padre (Base.parent) y el peso de clasificación
┊ (Base.order), almacene los datos de la estructura de árbol que respaldan la prioridad
de manera plana, como se muestra en la Figura 5.5.


Cuadro 5.3 Convención de interfaz de capa de interfaz de complemento

┊ Nombre de la firma descripción
┊ interfaz
┊ registrarseRoutes void (Ruta [] rutas) El complemento registra la ruta en esta función y
┊ la interfaz principal de la interfaz se puede
┊ especificar en la ruta.









┊ Figura 5.4 Diagrama de clase de elemento de ruta y elemento de menú






Pa
qu
et
e





Or
de
n






ne
a


┊ Figura 5.5 Estructura de árbol de almacenamiento plano


Para los complementos, debido al orden de carga diferente, es posible que el padre

dependiente aún no se haya cargado, por lo que el complemento en sí tiene una estructura plana
┊ Es una solución más razonable definir débilmente el padre y convertirlo uniformemente
en una estructura de árbol después de que se carguen todos los complementos. Por lo tanto, cada
elemento en sí
┊ Necesita definir el nombre y el nombre del padre. Además, el enrutamiento y las barras
laterales tienen un orden de prioridad, y los complementos que se cargan antes pueden desear
estar al final de la estructura.

Las entradas se agregan al final, por lo que cada elemento puede admitir opcionalmente
┊ peso de clasificación específico.
un
┊ Para el marco, la esperanza final es realizar un procesamiento recursivo en una
estructura de árbol, como se muestra en la figura Como se muestra en 5.6. Código 5.12 Utilización de
funciones
┊ Programación de ideas, mapeo conciso La estructura plana descrita en 5.4 se transforma en una
estructura de árbol.














Pa
qu
et
e
Figura 5.6 Estructura de árbol


┊ importar _ desde 'lodash';

┊ exportar función predeterminada buildTreeFromPlain (lista, idField = 'nombre',
Or orderField = 'orden', parentField = 'padre') {
de constante sortedList = _(lista)
n .map (elemento => {
artículo [orderField] = artículo [orderField] || 0;

regreso Articulo;
┊ })
┊ .sortBy ([orderField])
┊ .map (elemento => {
┊ Eliminar item [orderField];
lí regreso Articulo;
ne })
.valor();
a
┊ constante cartografía = _.keyBy (sortedList, idField);
┊ constante raíz = [];

┊ sortedList.forEach (item => {
┊ constante Identificación de los padres = item [parentField];
si (Identificación de los padres) {

constante padre = mapeo [parentId];
┊ si (padre) {
┊ padres.niños = padres.niños || [];
┊ parent.children.push (elemento);
┊ }
┊ } demás {root.push
┊ (elemento);
}
┊ });

sortedList.forEach (item =>


{
Eliminar item [parentField];
});
regreso raíz;
}

Código 5.12 El código central que convierte la estructura plana en una


estructura de árbol.


┊ 5.4.7 Comunicación entre la capa de interfaz de complemento y la capa lógica

┊ Adopción de la capa de interfaz y la capa lógica Comunicación Ajax + JSON. La capa lógica
define el enrutamiento del lado del servidor de acuerdo con los requisitos, y la capa de interfaz utiliza

Rutas de acceso Ajax de forma asincrónica para lograr la interacción de datos.JSON[39]Nombre completo La
notación de objetos de JavaScript es una

┊ Formato de serialización universal multiplataforma y aplicación cruzada, común en
Comunicación de aplicaciones web. JSON no necesita definir el modo de estructura de datos de antemano
┊ ( Schema), muy flexible, además, está en formato de texto, que es fácil de leer, comprender y depurar, pero en
consecuencia hay datos que no son ajustados
┊ Defectos tales como mucho tiempo para el cifrado, serialización y deserialización, gran
uso de memoria e incapacidad para procesar el flujo. Para la capa de interfaz del complemento y
la lógica

┊ Para la capa de edición, debido a que solo se comunica cuando el usuario necesita
cambiar los parámetros, la frecuencia es extremadamente baja y el contenido es pequeño, por lo
que usa
┊ La comunicación JSON puede tener sus ventajas sin
verse afectada por sus desventajas.Atuendo
┊ 5.4.8 Implementación de selección de plug-in

En el proceso de uso del software, los usuarios pueden cambiar a otros complementos
de entrada, complementos de algoritmo y complementos de salida en cualquier momento.

┊ Implementado con complementos desactivados. Para los complementos de entrada y los
complementos de algoritmo, solo se puede habilitar un complemento; de lo contrario, la entrada
┊ Los números entrarán en conflicto entre sí; para los complementos de salida, se
pueden habilitar múltiples complementos, lo que permite la salida simultánea de
Orden
somatosensorial a múltiples objetivos señal.






ne
a












Figura 5.7 Diagrama de clases del módulo de adaptación

En el nivel lógico, la habilitación y deshabilitación del complemento se realiza


mediante el módulo de adaptación que llama a la función de miembro del complemento.
Implementación activate () y deactivate ()
En la capa de interfaz, el módulo de adaptación debe proporcionar una lista de
información de complemento y responder a la operación de selección única o
selección múltiple del usuario. Este tema utiliza la misma implementación para
complementos de selección única o de selección múltiple, por lo que la clase base
BaseManager de tres módulos de adaptación está diseñada para proporcionar funciones
de selección de complementos El diagrama de clases se muestra en la Figura 5.7.
Vale la pena señalar que BaseManager hereda de BaseCoreModule.
┊ Las responsabilidades de BaseCoreModule son similares a las de BasePlugin. Es una clase base que
implementa la administración de configuración unificada. Es solo el lado de BasePlugin.
┊ A complementos externos, mientras BaseCoreModule es para módulos internos.











Pa
qu
et
e





Or
de
n






ne
a













6 Implementación detallada del módulo plug-in
6.1 Módulo

FSX
┊ Microsoft Flight Simulator, conocido como MSFS, es una familia de software de simulador de vuelo
para entretenimiento familiar.

Se ejecuta en el sistema operativo Windows y se introdujo por primera vez en 1980. MSFS es actualmente el

más antiguo, el más famoso y el más completo
┊ Simulador de vuelo familiar[38]. Microsoft Flight Simulator X, denominado FSX, es la
última versión del software.
┊ Lanzado en 2006.MSFS simula varios elementos encontrados en vuelos del mundo real, como aerodinámica,
meteorología, entorno geográfico, vuelo

Sistema de control de línea, etc., para presentar la visión y el oído del usuario. MSFS

se puede controlar mediante el teclado, el mouse o el asa.
┊ La realización de este tema y Integración FSX, después de que el usuario instala el complemento
correspondiente y completa la configuración, se puede realizar el somatosensorial en tiempo real de FSX
┊ Simulación, donde FSX es responsable de las simulaciones visuales y auditivas.

Gracias a FSX Solo se puede ejecutar en el sistema operativo Windows. Por lo tanto, para mantener la

naturaleza multiplataforma del software en este tema, el modelo FSX
┊ CuadraSe compone de dos partes, una parte se ejecuta en el mismo sistema operativo
que FSX y obtiene datos de FSX en tiempo real, es decir, "señal FSXAtuendo ProducePlug-
in "; la otra parte se ejecuta con el software sujeto y recibe los datos obtenidos por el"
plug-in de generación de señal FSX "en tiempo real

Y realizar una simulación somatosensorial, es decir, "módulo receptor de señal FSX".

┊ 6.1.1 SimConnect y Mecanismo FSUIPC

┊ " El "complemento de generación de señales FSX" necesita obtener datos de actitud de la aeronave
en tiempo real del software FSX en un período determinado. FSX proporciona Orden Enchufe
SimConnectMecanismo de archivo, que permite el acceso a los datos de FSX a través de API;
además, la capa de extensión de terceros FSUIPC de FSX

┊ También se proporciona un mecanismo de complemento similar. debido aSimConnect apareció tarde,
la mayoría de los complementos de MSFS y FSX se basan en
┊ Realizado por FSUIPC. Versión tempranaMSFS no admite complementos ni interfaces de programación, por
lo que FSUIPC utiliza memoria de proceso cruzado para leer y escribir
┊ Y funciones y otras implementaciones de tecnología de bajo nivel Control MSFS; FSUIPC en el
último FSX usa la interfaz superior SimConnect

línea Darse cuenta bien Control de MSFS.

6.1.2 Muestreo en tiempo real de la actitud de vuelo

┊ Dado que FSUIPC tiene más datos y un desarrollo maduro, este tema se basa en El mecanismo FSUIPC
obtiene datos del software FSX en tiempo real

de acuerdo a. Cuando FSX comience, FSUIPC seguiráFSX se carga junto y el complemento debe acceder a
FSUIPC a través de la memoria compartida

┊ Los datos almacenados en la dirección de memoria correspondiente.
┊ Los datos requeridos para este tema, su desplazamiento de dirección y el ancho de los
datos se muestran en la tabla Como se muestra en 6.1. La simulación somatosensorial solo necesita usar la
aceleración de línea

Grados y velocidad angular 6 datos, otros datos solo se muestran en la interfaz, no involucrados en el
cálculo, para que los usuarios vean el estado.

┊ Es importante tener en cuenta que el sistema de coordenadas FSX no es coherente con
el sistema de coordenadas especificado en este artículo. En el sistema de coordenadas FSX, X es
┊ Izquierda y derecha, Y Es vertical, Z E s a n t e s y d e s p u é s , p e r o l a p a r t e
t e ó r i c a d e l s i s t e m a d e c o o r d e n a d a s e n e s t e a r t í c u l o e s X Está al frente y
atrás, Y Es izquierda y derecha, Z Es vertical. Este artículo

Acordado Antes de que el procesamiento de datos FSX se convierta en un evento de "señal de entrada", sus
X, Y y Z representan el sistema de coordenadas FSX;

Después de "señal de entrada", su X, Y y Z representan el sistema de coordenadas acordado en este
artículo.
mesa 6.1 La fuente de muestreo de datos de vuelo de este tema
Direcció Ancho de tipo de descripción
n datos datos
compensa
da

┊ 0x0264 2 Int16 Si está suspendido,1 = pausa, 0 = ejecutar
┊ 0x02BC 4 Int32 Velocidad aerodinámica indicada (nudos *
┊ 128)
┊ 0x6010 8 Doble Latitud de la aeronave (grados),> 0 =
┊ norte, <0 = sur
0x6018 8 Doble
┊ Longitud de la aeronave (grados),> 0 =
┊ este, <0 = oeste
┊ 0x3098 8 Doble Vuela a la izquierda y a la derecha debajo
┊ del sistema de coordenadas del cuerpo.(X)
┊ Velocidad de dirección (pies / seg)
┊ 0x30A0 8 Doble Avión vertical en sistema de coordenadas de
┊ volumen(Y) Velocidad de dirección (pies /
Pa seg)
qu 0x3090 8 Doble Antes y después de la aeronave en el sistema
et de coordenadas del cuerpo.(Z) Velocidad de
dirección (pies / seg)
e
┊ 0x3060 8 Doble Avión a izquierda y derecha en sistema de


┊ FSUIPC proporciona SDK para simplificar la comunicación con FSUIPC. Este tema "Complemento de
generación de señal FSX" se basa en FSUIPC

Desarrollo de C # SDK, adoptarIntente conectarse continuamente a FSUIPC mediante sondeo,
Orden
como se muestra en el código 6.1. Una vez que la conexión sea exitosa, inicie la nueva
┊ Enhebrar, leer datos de vuelo a una frecuencia de 20Hz y transmitirlos a otros módulos para
procesarlos en forma de eventos, como código 6.3, como se muestra en el código 6.4.
┊ Entre ellos, según SDK requiere que se declare la dirección de compensación antes de leer los datos de
vuelo, que se implementa mediante el código 6.2.


┊ tratar
lí {
ne FSUIPCConnection.Open (); FsxiConnected? .Invoke
(esta, EventArgs.Empty); FsxiValueBagUpdated?
a
.Invoke (esta, EventArgs.Empty);
┊ updateThread = nuevo Hilo(nuevo ParameterizedThreadStart
┊ (ThreadFunc)); updateThread.Start (esta);
┊ volver verdadero;
┊ }
┊ captura (FSUIPCException)
┊ {
falso retorno;

}
┊ captura (Excepción e)
┊ {
┊ log.Error (e);
┊ falso retorno;
┊ }

Código 6.1 Conexión de sondeo FSUIPC

privado Desplazamiento <Int16> ipcPaused = nuevo Desplazamiento


<Int16> (0x0264); privado Desplazamiento <Int32> ipcTrueAirSpeed =
nuevo Desplazamiento <Int32> (0x02BC); privado Desplazamiento
<Doble> ipcLat = nuevo Desplazamiento <Doble> (0x6010);
privado Desplazamiento <Doble> ipcLng = nuevo Desplazamiento
<Doble> (0x6018); privado Desplazamiento <Doble> ipcXVelocity =
nuevo Desplazamiento <Doble> (0x3098); privado Desplazamiento
<Doble> ipcYVelocity = nuevo Desplazamiento <Doble> (0x30A0);
privado Desplazamiento <Doble> ipcZVelocity = nuevo
┊ Desplazamiento <Doble> (0x3090);
┊ privado Desplazamiento <Doble> ipcXAcceleration = nuevo
Desplazamiento <Doble> (0x3060); privado Desplazamiento <Doble>

ipcYAcceleration = nuevo Desplazamiento <Doble> (0x3068); privado
┊ Desplazamiento <Doble> ipcZAcceleration = nuevo Desplazamiento
┊ <Doble> (0x3070); privado Desplazamiento <Doble> ipcPitchVelocity =
Código 6.2 Declarar la dirección de desplazamiento


┊ vacío estático privado ThreadFunc(Objeto obj)
┊ {
┊ Controlador FsxController = (FsxController)
┊ obj; DateTime beginTime, endTime;
┊ doble elapsedMs;
┊ mientras (cierto)
Pa {
beginTime = DateTime.Now;
qu controller.threadTick ();
et endTime = DateTime.Now;
e elapsedMs = (endTime - beginTime) .TotalMilliseconds;
┊ si (elapsedMs <UpdateInterval && elapsedMs> = 0)
┊ {
┊ Thread.Sleep (UpdateInterval - (En t) elapsedMs);
}

}
┊ }
Or
de
n

┊ Código 6.3 Algoritmo de frecuencia fija


┊ vacío privado threadTick()
lí {
ne si (! ValueBag.Connected)
a {
regreso;

}
┊ tratar
┊ {
┊ FSUIPCConnection.Process ();
┊ ValueBag.Paused = ipcPaused.Value == 1;
┊ ValueBag.TrueAirSpeed = (doble) ipcTrueAirSpeed.Value / 128d;
┊ ValueBag.Lat = ipcLat.Value;
ValueBag.Lng = ipcLng.Value;
┊ ValueBag.XVelocity = ipcXVelocity.Value;
┊ ValueBag.YVelocity = ipcYVelocity.Value;
┊ ValueBag.ZVelocity = ipcZVelocity.Value;
┊ ValueBag.XAcceleration = ipcXAcceleration.Value;
┊ ValueBag.YAcceleration = ipcYAcceleration.Value;
┊ ValueBag.ZAcceleration = ipcZAcceleration.Value;
ValueBag.PitchVelocity = ipcPitchVelocity.Value * 180d / Math.PI;
ValueBag.RollVelocity = ipcRollVelocity.Value * 180d / Math.PI;
ValueBag.YawVelocity = ipcYawVelocity.Value * 180d / Math.PI;
FsxiValueBagUpdated? .Invoke (esta, EventArgs.Empty);
}
captura (FSUIPCException ex) cuando
(ex.FSUIPCErrorCode == FSUIPCError.FSUIPC_ERR_SENDMSG)
{
Desconectar();
}
┊ captura (Excepción)
┊ {
┊ // En caso de mala conversión de datos
┊ }
}

┊ Código 6.4 Leer datos de vuelo

6.1.3 Implementación de la
comunicación entre complementos de señal FSX

┊ La simulación somatosensorial FSX tiene las siguientes características o requisitos:

Los datos de estado del vehículo no tienen dependencia de adelante hacia
atrás, por lo que los nuevos datos de la actitud del vehículo pueden sobrescribir los datos
antiguos;

┊ Los usuarios no se ejecutarán todo el tiempo FSX, por lo que el "complemento de
recepción de señal" debe admitir el "complemento de generación de señal" en cualquier momento
┊ Conecta o desconecta
Atuendo
El usuario desea controlar todas las configuraciones en un solo lugar, por lo
que el "complemento de generación de señal" debe poder ejecutarse sin configuración;

┊ Por consideraciones de fidelidad, se requiere IO El retraso de la comunicación
es lo más bajo posible;
┊ Debido a la alta frecuencia de muestreo y las consideraciones de retardo, se requiere que el tiempo
dedicado a la serialización en la comunicación sea lo mínimo posible.

Con base en esto, esta asignatura se diseña en base a TCP Control, UDP Transmisión
de datos, modo de comunicación asíncrono de alto rendimiento:

Orden Uso de "plug-in de generación de señales" UDPAG Pase los datos de postura al
"complemento de recepción de señal" para reducir la latencia. su
┊ En, el "complemento de recepción de señal" es UDPAG En el lado del servidor, el "complemento de generación de
señal" es UDPAG Cliente

Uso de "complemento de recepción de señal" TCP controla el flujo de datos UDP del
"complemento de generación de señales", incluida la notificación a UDP

┊ Dirección y puerto de comunicación, etc. Donde el "complemento de recepción de señal" es
TCP En el lado del servidor, el "complemento de generación de señal" es TCPAG Cliente
┊ Tanto el "complemento de generación de señal" como el "complemento de recepción de
señal" envían y reciben datos de forma asincrónica, de modo que puedan esperar en el IO línea Ocúpese de
otras tareas al mismo tiempo;

┊ Tanto el "complemento de generación de señal" como el "complemento de
recepción de señal" realizan una serialización y deserialización binaria de alta eficiencia;
┊ El "complemento de generación de señal" y el "complemento de recepción de señal" se apoyan
mutuamente cuando se desconectan y se vuelven a conectar en cualquier momento, y pueden manejarse entre sí
┊ No puede conectarse.

Un proceso

┊ Según la dirección FSX configurada por el usuario, el "complemento de recepción de señal"
intenta ejecutarse con el FSX en función de la conexión TCP
┊ "Plug-in de generación de señales". Dado que el "complemento de recepción de señales" es un módulo del
lado del servidor, el usuario puede comprobarlo del lado del servidor de forma unificada.

La configuración cumple con los requisitos.

┊ Después de que el servidor "plug-in de generación de señal" recibe la conexión, escribe y
mantiene la dirección de origen de la conexión, es decir, "recepción de señal
┊ Enchufar Dirección IP.

El "complemento de recepción de señal" será la otra configuración del usuario, el "complemento de
recepción de señal" que recibe el número de puerto UDP de datos,
El código de verificación UDP se envía al "complemento de generación de señal" a través de TCP. El
código de verificación UDP es un número aleatorio de 4 bytes que se utiliza para una verificación
simple de la puntualidad de los datos.
El "complemento de generación de señales" registra la configuración, el número de puerto UDP, el
código de verificación y otra información.
Cuando el FSX genera datos, el "complemento de generación de señal" transmite de acuerdo con
todas las conexiones grabadas actualmente, es decirSegún el código de verificación UDP enviado al
registro El puerto UDP.
Cuando el "complemento de generación de señal" detecta que la conexión TCP del "complemento de
recepción de señal" está desconectada, registrará el UDP
┊ Se borra información como el número de puerto. Hacer un seguimientoFSX Los datos ya no
se envían al cliente.
┊ Cuando el "complemento de recepción de señal" detecta que la conexión TCP del
"complemento de generación de señal" está desconectada, sigue intentando volver a entrar

Conexión de línea.

┊ El diagrama de tiempo de las partes clave en el proceso anterior es como se muestra en
6.1 Mostrado.








Pa
qu
et
e





Or
de
n





línea Figura 6.1 Diagrama de tiempos de los módulos clave de comunicación
enchufable

┊ B. TCP mantiene la conexión viva
┊ Se puede ver en el proceso que la conexión TCP se usa para transmitir la
información de configuración requerida para enviar paquetes UDP, e indica el remitente TCP
┊ (Es decir, UDP El extremo receptor) todavía se está ejecutando y no se enviará UDP si no se
está ejecutando Datos para ahorrar recursos de ancho de banda. cambio

┊ En otras palabras, la conexión TCP solo tiene datos en el estado inicial. Una vez
establecida la conexión, mientras el usuario no modifique la configuración, la conexión TCP no
┊ Hay comunicación de datos.
┊ Porque de cada TCP La conexión debe mantener un estado, por lo que la mayoría de las
puertas de enlace o firewalls se descartarán durante mucho tiempo (como 30 minuto)

Sin comunicación de datos Conexión TCP (denominada conexión inactiva). Para la conexión TCP

interrumpida, su estado real está roto
┊ Abierto, pero ninguna de las partes sabe que la conexión se ha desconectado, y solo después
de intentar enviar datos pueden saber que se ha desconectado. Pero para "generación de señales
┊ "Plug-in", no hay comunicación posterior en la conexión TCP, por lo que en realidad no
hay forma de saber que la conexión se ha desconectado. En este momento, la conexión

Una vez que una sección de la red está realmente desconectada, no se puede detectar el otro
extremo.
Para solucionar este problema, se introduce el mecanismo de latido. El mecanismo de
latido significa que ambas partes de la conexión
(Tal como 1 Una vez por minuto) Envíe paquetes de datos que no necesitan contener
contenido significativo. Estos paquetes de datos pueden mantener la conexión activa y
enCuando se interrumpe la conexión, se puede detectar a tiempo.
El diagrama de tiempo del mecanismo de latidos se muestra en la figura. Como se muestra
en 6.2.














Pa
qu Figura 6.2 Diagrama de tiempos del mecanismo de los latidos del corazón
et
e


┊ C. Procesamiento
de paquetes adhesivos TCP

┊ TCP es un protocolo de transmisión basado en flujo de bytes conectados. El significado de flujo es que
no hay bloque de datos. Por un lado, si
Orden Envió un8 bytes de datos a la vez, luego el otro extremo puede recibir 8 bytes de datos
a la vez, o puede recibir 3 bytes a la vez,
┊ Restante 5 El byte se recibe la segunda vez y puede recibirse junto con los datos enviados
la próxima vez. En resumen, el receptor de datos no tiene

El método sabe exactamente cuántos datos envía el remitente cada vez.

┊ Para analizar correctamente cada instrucción, es necesario insertar un prefijo de
longitud en la instrucción para la segmentación, como se muestra en la figura. Como se muestra en
6.3. Prefijo de longitud
┊ Es un número entero cuya longitud se fija en 4 bytes y el orden de los bytes es little-
endian, que representa la longitud de una sola instrucción. La siguiente longitud
correspondientelínea
Los datos son el contenido de la instrucción. Para el extremo receptor, se puede llenar
primero.4
┊ bytes, analice la longitud y luego continúe recopilando los bytes correspondientes, de
┊ Constituye una instrucción completa.







┊ Figura 6.3 Diagrama de prefijo de longitud


D. Pérdida de paquetes UDP y procesamiento fuera de secuencia

UDP es un protocolo sin estado y poco confiable. Los paquetes de datos recibidos por el "complemento
de recepción de señales" pueden estar fuera de servicio o
Puede haber pérdida de paquetes. Sin embargo, debido a que los datos de postura de
FSX no dependen de la secuencia, cuando se reciben los datos de postura más
recientes, los datos de postura antiguos no tienen sentido, por lo que no hay
necesidad de lidiar con la pérdida de paquetes y los paquetes de datos fuera de
secuencia pueden descartarse. .
Aquí se utiliza un contador incrementado para identificar situaciones fuera de
secuencia y descartarlas. Al enviar paquetes de datos mediante el "complemento de
generación de señal" en el extremo de envío,
Con un número de serie creciente, representa el orden en el que se envían los
paquetes. El "complemento de recepción de señal" en el extremo receptor solo
necesita registrar el número de serie máximo recibido actualmente. Si un paquete de
datos que no excede el actual se recibe el número de serie máximo, significa un
paquete de datos caducado, se ha recibido un nuevo paquete de datos, por lo que el
paquete de datos se descarta directamente; si se recibe un paquete de datos que
excede el número de secuencia máximo actual, significa un nuevo paquete de datos
┊ Se pueden utilizar paquetes de datos.
┊ Como se muestra en la Figura 6.4, el extremo receptor recibe paquetes de datos en secuencia 0, 3, 2, 4 y
el paquete 1 se pierde, luego en este proceso

Los paquetes de datos se utilizan realmente 0, 3 y 4 se utilizan como señales de entrada.





┊ Figura 6.4 Diagrama esquemático del trastorno de UDP y caída de paquetes


E. Protocolo de serialización

┊ Búfer de protocolo utilizado en la comunicación[39]Realice la serialización binaria.
Protocol Buffer es un tipo diseñado por Google
Atuendo Formato de serialización universal multiplataforma y aplicación cruzada, comúnmente
utilizado en aplicaciones con requisitos de alto rendimiento, como clientes de juegos y servicios
de juegos

Entre[40]. Después de la serialización del búfer de protocolo, los datos se organizan
estrechamente, el tiempo de serialización y deserialización es corto, pero requiere una secuencia

┊ Ambas partes han negociado una estructura de datos por adelantado.
┊ Código 6.5 Muestra la estructura de datos y el código de la solicitud de control del
"complemento de recepción de señal" al "complemento de generación de señal" en este tema.

6.6 muestra la estructura de datos en respuesta a la solicitud. El código 6.7 muestra el orden de
transmisión del "complemento
mensaje de generación{ de señal" al "complemento de recepción de señal".
TcpRequestMessage
┊ Estructura de datos
enumeración UDP. {
MsgType
┊ MSG_TYPE_SET_CONFIG =
┊ 0;
MSG_TYPE_PING = 1;
┊ MSG_TYPE_TEST_CONNECTION = 2;
┊ }

ne mensaje SetConfigBody {
a int32 el puerto UDP =
┊ 1; int32 udpToken =
2;

}

┊ mensaje PingBody {
┊ int32 timeStamp = 1;
┊ }

┊ mensaje TestConnBody {
int32 magicToken = 1;
┊ }

MsgType msgType = 1;
uno de msgBody {
SetConfigBody setConfigBody = 2;
PingBody pingBody = 3;
TestConnBody testConnBody = 4;



Código 6.5 Definición de código que controla la estructura de datos de
la solicitud

mensaje TcpResponseMessage {
bool éxito = 1;
┊ int32 timeStamp = 2;
┊ }

Código 6.6 Definición de código para controlar la estructura de datos de

respuesta

┊ mensaje UdpResponseMessage {
┊ enumeración MsgType {
┊ MSG_TYPE_TEST_CONNECTION_CALLBACK = 0;
┊ MSG_TYPE_TRANSMISSION_DATA = 1;
┊ }

mensaje TestConnCallbackBody {
┊ int32 magicToken = 1;
┊ }
Pa
qu mensaje TransmissionDataBody {
et doble x Aceleración = 1;
e doble yAceleración = 2;
doble zAceleración = 3;

doble pitchVelocity = 4;
┊ doble rollVelocity = 5;
┊ doble yawvelocidad = 6;
┊ }

Or MsgType msgType = 1;
de int32 número de serie =
2; int32 simbólico = 3;
n
uno de msgBody {
┊ TestConnCallbackBody testConnCallbackBody = 4;
┊ TransmissionDataBody TransmissionDataBody = 5;
┊ }
┊ }


ne
a

┊ Código 6.7 Definición del código de la estructura de datos de actitud de vuelo


┊ F. C o m p l e m e n t o d e g e n e r a c i ó n d e s e ñ a l e s a s i n c r ó n i c o Implementación del
servidor TCP
┊ asincrónico La tarea principal del servidor TCP es recibir la solicitud, procesar y retroalimentar la
respuesta exitosa. Donde para cada conectado

El cliente conectado debe mantener una lista de configuración. Según el código 6.5 Hay
tres tipos de solicitudes para la estructura especificada:

┊ Actualice la configuración del "complemento de recepción de señal", incluido
el número de puerto, etc., correspondiente a la estructura de datos msgType palabra
┊ El segmento es MSG_TYPE_SET_CONFIG Caso;
┊ Mantener el latido, correspondiente al campo msgType en la estructura de datos
como MSG_TYPE_PING Caso;

┊ Pruebe la ruta de conexión, correspondiente a la estructura de datos en
msgType El campo es
El caso de MSG_TYPE_TEST_CONNECTION. Esta función no está implementada en este artículo.
El Listado 6.8 muestra la lógica central de la implementación específica. Debido al uso
deCon la función async / await, el código asincrónico se puede escribir en un estilo sincrónico, lo que
no solo mantiene la legibilidad del código sino que también tiene un alto rendimiento.
mientras (cierto)
{
// Leer tamaño
esperar networkStream.ReadAsync (bufferReqSize, 0, 4,

token); Int32 reqSize = BitConverter.ToInt32
┊ (bufferReqSize, 0);

┊ // Leer cuerpo
┊ bufferReqBody = nuevo byte[reqSize];
┊ esperar networkStream.ReadAsync (bufferReqBody, 0,
┊ reqSize); TcpRequestMessage request = TcpRequestMessage
.Parser
┊ .ParseFrom (bufferReqBody);

┊ bool responseSuccess = falso;
┊ cambiar (request.MsgType)
┊ {
┊ caso TcpRequestMessage.Types.MsgType.Ping:
responseSuccess =
Pa
cierto; descanso;
qu caso TcpRequestMessage.Types.MsgType.SetConfig:
et client.SetTransmissionTarget (
e request.SetConfigBody.UdpPort,
┊ request.SetConfigBody.UdpToken);
┊ responseSuccess =
┊ cierto; descanso;
caso TcpRequestMessage.Types.MsgType.TestConnection:

responseSuccess = cierto;
┊ descanso;
Or }
de
n Respuesta de TcpResponseMessage = nuevo TcpResponseMessage
┊ {
┊ Éxito = respuesta Éxito,
TimeStamp = Utils.GetTimeStamp (DateTime.UtcNow),
┊ };

┊ // Escribe el tamaño y el cuerpo
lí bufferResBody = response.ToByteArray ();
ne bufferResSize = BitConverter.GetBytes (bufferResBody.Length);
a esperar networkStream.WriteAsync (bufferResSize, 0, 4, token);
┊ esperar networkStream.WriteAsync (bufferResBody, 0, bufferResBody.Length, token);
}




┊ Código 6.8 Implementación clave del servidor TCP asíncrono


Debido a que se ejecuta de forma asincrónica en varios subprocesos, las estructuras
de datos compartidas (como la lista de clientes conectados) deben bloquearse, como la generación

┊ c ó d i g o 6,9 Mostrado. Aquí se utiliza el bloqueo de lectura y escritura asincrónico, que
puede esperar de forma asincrónica.

┊ vacío asíncrono privado HandleTcpClientConnectionAsync(TcpClient
┊ tcpClient, token de CancellationToken)
{
Cliente HexiUdpClient = nuevo HexiUdpClient (((IPEndPoint)
tcpClient.Client.RemoteEndPoint) .Address.MapToIPv4 (). ToStri ng ());
usando (esperar ValueBag.HexiClientsLock.WriterLockAsync ())
{
ValueBag.HexiClients.Add (cliente);
}
tratar
{
mientras (cierto)
┊ {
┊ // ......
}

}
┊ captura (OperationCanceledException)
┊ {
┊ lanzar;
┊ }
┊ finalmente
{

si (tcpClient.Connected)
┊ {
┊ tcpClient.Close ();
┊ }
┊ client.Close ();
Pa usando (esperar ValueBag.HexiClientsLock.WriterLockAsync ())
qu {
ValueBag.HexiClients.Remove (cliente);
et
}
e }
┊ }


┊ Código 6.9 Uso de bloqueos de lectura y escritura asíncronos para resolver condiciones de
carrera de subprocesos múltiples

Or
de
n






ne
a













Figura 6.5 Asíncrono Diagrama de secuencia del servidor TCP

El diagrama de tiempos 6.5 describe la relación de tiempos del servidor TCP asíncrono. Diagrama de
tiempoEl "objeto de conexión" en 6.5 es el del código 6.8
TcpClient. Tenga en cuenta el cliente TCP y TCPEl servidor se implementa de forma asincrónica, por lo
que el cliente no esperará a recibir la información anterior.
Una vez que se solicita la respuesta, se envía la siguiente solicitud y el servidor no
esperará a que se envíe la respuesta antes de procesar la siguiente solicitud. Esto
reduce
IO espera para mejorar la eficiencia.
G. Complemento de generación de señal asíncrono Implementación de cliente UDP
┊ Cliente UDP según La configuración determinada por la conexión TCP envía datos e incrementa el
contador La lógica central se muestra en el código 6.10.
┊ por Para UDP, no existe el concepto de flujo, por lo que no es necesario escribir un prefijo de longitud.
Dado que el muestreo en tiempo real de la actitud de vuelo se realiza simultáneamente

El código 6.10 También se implementa una función asíncrona especial SendMessage para entornos

síncronos, y sus tareas se ejecutarán de forma asíncrona en el grupo de subprocesos.
┊ De acuerdo, no bloquee el código de hilo actual.


público Tarea <En t> SendAsync (byte[] bytes, En t norte)

{
┊ si (Válido)
┊ {
┊ regreso client.SendAsync (bytes, n);
┊ }
┊ regreso Task.FromResult <En t> (0);
Pa }
qu
async público Tarea SendMessageAsync(Mensaje UdpResponseMessage)
et {
e // No es necesario agregar un prefijo de longitud ya que el tamaño del paquete es
┊ <MTU
┊ SerialNumber = SerialNumber + 1;
┊ message.Token = Token;
┊ message.SerialNumber = SerialNumber;
var cuerpo = mensaje.ToByteArray ();
┊ esperar SendAsync(cuerpo, cuerpo
Or Longitud);
de }
n
┊ vacío público Enviar mensaje(Mensaje UdpResponseMessage)
┊ {
┊ Task.Run (() => SendMessageAsync (mensaje));


línea GeneracionImplementación clave del cliente UDP asíncrono del código
6.10


┊ H. Reconexión asíncrona y automática del complemento de recepción de señal Implementación del
cliente TCP
┊ La reconexión automática incluye intentos repetidos cuando se establece la conexión
inicial y intentos repetidos después de que se desconecta la conexión. Y debido a que el
complemento puede ser en cualquier momento

Deshabilitado y vuelto a habilitar por el usuario, por lo que el cliente TCP, incluido
┊ mecanismo de reconexión, debe admitir la cancelación y el reinicio. Este tema se basa en
el
┊ La máquina de estado finito realiza la reconexión automática, y el diagrama de transición
de estado se muestra en la figura Como se muestra en 6.6.





Figura 6.6 Diagrama de transición de estado del cliente TCP


Puede verse en el diagrama de transición de estado que la operación "reintentar
y conectar" en el caso de la conexión inicial y la desconexión y reconexión se
puede integrar en la misma lógica de procesamiento, como se muestra en el código
6.11. Para detener las operaciones relacionadas cuando el complemento está
deshabilitado, se almacenan los controladores de ejecución de funciones
asincrónicas o de rutina, como conectar, trabajar, latido, de modo que la ejecución
se puede interrumpir cuando sea necesario.
┊ Como el código Como se muestra en 6.12.


┊ asincrónico def connect_async(uno mismo):
mientras Cierto y (uno mismo.estado en ['conectando', 'reconectando']):
┊ tratar:
┊ futuro = asyncio.conexión_abierta (uno mismo.anfitrión, uno
┊ mismo.puerto) lector, escritor = espera asyncio.wait_for
┊ (futuro, tiempo de espera=3)
┊ _logger.info ('Telemetría
┊ conectada') uno mismo.lector =
lector

uno mismo.escritor =
┊ escritor uno
┊ mismo.Expresar =
Pa 'conectado'
qu uno mismo.trabajo_futuro = asyncio.asegurar_futuro (uno
et mismo.work_async ()) uno mismo.trabajo_futuro.add_done_callback (uno
e mismo.on_work_done) uno mismo.latido_futuro = asyncio.asegurar_futuro
(uno mismo.heartbeat_async ()) uno

mismo.latido_futuro.add_done_callback (uno mismo.on_heartbeat_done)
┊ uno mismo.ee.emitir('tcp_connected')
┊ descanso
┊ excepto (OSError, asyncio.Error de tiempo de espera):
┊ # servidor no conectado, vuelva a intentarlo
Or espera asyncio.dormir(uno mismo.retry_sec)
de
def conectar(uno mismo):
n
afirmar(uno mismo.estado en ['inactivo',
┊ 'desconectado']) afirmar(uno
┊ mismo.connect_future == Ninguno) uno
┊ mismo.Expresar = 'conectando'
┊ uno mismo.connect_future = asyncio.asegurar_futuro (uno


ne
a
┊ Código 6.11 Realización de establecer conexión


┊ def desconectar(uno mismo):
afirmar(uno mismo.estado en ['conectando', 'conectado',
┊ 'reconectando']) uno mismo.Expresar = 'desconectado'
┊ si uno mismo.connect_future ! =
┊ Ninguno: uno
┊ mismo.connect_future.cancelar
┊ ()
┊ si uno mismo.reconnect_future ! =
Ninguno: uno

mismo.reconnect_future.cancelar
┊ ()
┊ si uno mismo.trabajo_futuro
! = Ninguno: uno
mismo.trabajo_futuro.cance
Código 6.12 Implementación de cancelar todas las conexiones y reintentos

Una vez establecida correctamente la conexión, las corrutinas de trabajo y latido se ejecutan
de forma asincrónica al mismo tiempo. En esta asignatura, debido al soporte de reconexión
asincrónica
La lógica del cliente TCP es más complicada, por lo que es un módulo independiente. No le importa cuándo enviar
qué datos, solo a
Proporciona una interfaz para enviar datos y la persona que llama decide el momento
del envío, por lo que No se envía contenido en la corrutina de trabajo, solo se intenta leer la
respuesta de forma asincrónica y generar el evento correspondiente, como se muestra en el Listado 6.13.
Entre ellos, debido a la necesidad de lidiar con la situación del paquete pegajoso, se lee en forma de
flujo, y la longitud de los datos que se leerán posteriormente se determina según el prefijo de longitud.
En consecuencia, la interfaz para enviar mensajes se implementa como
┊ Código 6.14 Mostrado.


┊ asincrónico def work_async(uno mismo):
tratar:
┊ mientras Cierto:
┊ size_buffer = esperar uno mismo.lector.readexactamente4)
┊ Talla = En t.from_bytes (tamaño_buffer,
┊ byteorder='poco') body_buffer = esperar uno
┊ mismo.lector.readexactly (tamaño)
┊ msg = fsx_pb2.TcpResponseMessage ()
msg.ParseFromString (body_buffer) uno

mismo.ee.emitir('tcp_received_message', msg)
┊ excepto (asyncio.IncompleteReadError, ConnectionResetError, ConnectionAbortedError):
┊ pasar Código 6.13 Implementación de la co-rutina de recepción de mensajes
Atuendo

┊ def escribe un mensaje(uno mismo, msg):
datos = msg.SerializeToString ()

datos = len(datos).to_bytes (4, orden de bytes = 'poco')
┊ + datos uno mismo.escritor.escribir (datos)

Código 6.14 Implementación de la interfaz de envío de mensajes
Orden

┊ El módulo de latido necesita enviar paquetes de datos de forma activa periódicamente para mantener la
conexión, como el código Como se muestra en 6.15.


┊ asincrónico def heartbeat_async(uno mismo):
lí mientras Cierto:
ne espera asyncio.dormir(10)
a msg = fsx_pb2.TcpRequestMessage ()
msg.msgType = fsx_pb2.TcpRequestMessage.MSG_TYPE_PING

msg.pingBody.timeStamp = En t(hora.hora()) uno
┊ mismo.escribir_mensaje (msg)


┊ Código 6.15 Realización de latidos del corazón


┊ La última es la lógica de desconexión y reconexión. Cuando se interrumpe la conexión,
el códigoLa función readexactamente asincrónica en 6.13 generará una excepción,
┊ La excepción es asyncio.IncompleteReadError, ConnectionResetError, ConnectionAbortedError

Esto interrumpe el bucle sin fin de intentar leer el flujo de datos, lo
q┊u e r e s u l t a e n La función work_async finaliza y se activa
┊ función de devolución de llamada on_work_done. Cabe señalar que, además de que la función work_async
puede finalizar después de la desconexión, también puede estar deshabilitada.
┊ Después de usar el complemento, On_work_done necesita determinar si está desconectado
pasivamente o cerrado activamente. En el último caso, no se puede volver a conectar, como se muestra
en el código 6.16; en el primer caso, es necesario cambiar el estado y volver a conectar, como se
muestra en el código 6.17.

def on_work_done(uno mismo, futuro):


_logger.info ('Conexión de telemetría perdida')
uno mismo.trabajo_futuro = Ninguno
si uno mismo.latido_futuro ! =
Ninguno: uno
mismo.latido_futuro.cancelar()
uno mismo.lector =
┊ Ninguno
┊ yo.escritor =
┊ Ninguno
Código 6.16 La lógica de procesamiento para el final de la rutina de trabajo


┊ asincrónico def reconnect_async(uno mismo):
┊ esperar uno mismo.connect_async ()

┊ def reconectar(uno mismo):
afirmar(uno mismo.Expresar == 'conectado')
┊ afirmar(uno mismo.reconnect_future == Ninguno)
┊ _logger.info ('Reconexión de
┊ telemetría') uno mismo.Expresar =
┊ 'reconectando'
Pa uno mismo.reconnect_future = asyncio.asegurar_futuro (uno
qu mismo.reconnect_async ()) uno
et mismo.reconnect_future.add_done_callback (uno
e

Código 6.17 Realización de reconexión


┊ El diagrama de tiempos del módulo se muestra en la figura. Como se muestra en 6.7. El
diagrama de secuencia muestra que el complemento está habilitado y deshabilitado en cualquier momento y el FSX se
enciende y apaga en cualquier momento.
┊ La situación del
momento en las
circunstancias. Orden






ne
a












Figura 6.7 Diagrama de tiempos del cliente TCP


I. El complemento de recepción de señales es asíncrono Implementación del servidor UDP
La implementación del servidor UDP es relativamente simple, solo necesita determinar si el código
de verificación UDP (llamado token en el código) es consistente y si es un paquete de datos antiguo que
necesita ser descartado, como se muestra en el código 6.18. En el código, para cada mensaje recibido o
descartado, diferentes cosas
┊ Los archivos se pasan al mundo exterior, de modo que se puedan realizar funciones como
contar el número de mensajes de error.


┊ clase UDPServer(asyncio.DatagramProtocol):
┊ def en eso (uno mismo, gerente, token):
┊ súper(). en eso () uno
┊ mismo.gerente =
┊ gerente uno
┊ mismo.simbólico =
┊ simbólico uno mismo.sn
= 0

┊ def datagram_received(uno mismo, datos, dirección):
┊ tratar:
Pa # Nota: no hay prefijo de longitud en los
qu paquetes UDP msg = fsx_pb2.UdpResponseMessage ()
et msg.ParseFromString (datos)
e si msg.simbólico ! = uno mismo.simbólico:
_logger.advertir('Un mensaje se descarta debido a un token

incorrecto') imprimir(mensaje.simbólico, uno mismo.simbólico) uno
┊ mismo.gerente.ee.emitir('udp_discarded_message')
┊ regreso
┊ si msg.número de serie <= uno mismo.sn:
┊ _logger.advertir('Un mensaje se descarta debido a que se recibió un
Or mensaje más nuevo') uno mismo.gerente.ee.emitir('udp_discarded_message')
de regreso
uno mismo.sn = msg.número de serie uno
n
mismo.gerente.ee.emitir('udp_received_message', msg)
┊ excepto Excepción como mi:
┊ _logger.advertir (e) uno
┊ mismo.gerente.ee.emitir('udp_discarded_message')

┊ def conexión perdida(uno mismo, Exc ª): uno

ne
a

┊ Código 6.18 Implementación del núcleo del servidor UDP


┊ 6.2 Módulo de entrada de actitud de vuelo estándar

El módulo tiene posición y actitud incorporadas de la aeronave en cuatro estados:

despegue, aterrizaje, guiñada a la izquierda y guiñada a la derecha, los usuarios no necesitan
instalar
┊ Microsoft Flight Simulator X puede realizar una simulación somatosensorial de estos movimientos. Además,
el módulo también permite a los usuarios redefinir o crear
┊ Construye un nuevo estado.

┊ 6.2.1 Almacenamiento de posiciones y posturas

┊ Para facilitar al usuario modificar o crear, el módulo utiliza El archivo JSON almacena
los cambios de postura en diferentes estados. El cambio de postura es
Un proceso continuo necesita almacenar un lote de datos de posición y postura
continuos, el módulo Se reproduce a una frecuencia de 20 Hz. Cada estado se almacena en un
archivo y su formato se describe en el esquema JSON que se muestra en el código 6.19.
entre ellos,Cada elemento del campo de actitudes es una matriz de longitud 6. El significado de cada elemento de
la matriz se muestra en la Tabla 6.2;
El campo fromState describe qué estado se puede convertir desde el estado cambiado; si no se especifica, significa
que solo se puede convertir desde el estado inicial
Venir. Código6,20 Es un ejemplo de un archivo de estado que se ajusta al formato.

{
"$ esquema": "http: // jsonorte‐Schema.org/draft‐04/schema# ",
┊ "escribe": "objeto",
┊ "propiedades": {
┊ "identificación": { "escribe": "cuerda" },
┊ "texto": { "escribe": "cuerda" },
┊ "orden": { "escribe": "entero" },
"fromState": {
┊ "escribe": "formación",
┊ "artículos": { "escribe": "cuerda" }
┊ },
┊ "actitudes": {
┊ "escribe":
┊ "formación",
"artículos": {

"escribe": "formación",
┊ "minItems": 6,
Pa "maxItems": 6,
qu "artículos": { "escribe": "número" }
et }
e }
┊ },
"requerido": [ "identificación", "texto", "actitudes" ]

}

┊ Código 6.19 Descripción del formato de archivo de estado del módulo de entrada de actitud
de vuelo

Orden
┊ Tabla 6.2 Archivo de estado del módulo de entrada de actitud de vuelo Descripción del campo de
actitudes
┊ Descripción del tipo de datos de subíndice

0Doble Aceleració n en direcció n X ( m / s ^ 2)

┊ 1Doble Aceleració n en direcció n Y ( m / s ^ 2)
línea 2Doble Aceleració n en direcció n Z ( m / s ^ 2)

3Ddoble α Velocidad angular direccional ( rad / s)

┊ 4Doble Velocidad angular en direcció n β ( rad / s)
┊ 5Doble γ Velocidad angular direccional ( rad / s)


┊ {
┊ "identificación": "despegar",
┊ "texto": "despegar",
┊ "actitudes": [
┊ [0, 0, 0, 0, 0, 0],
[0,5, 0, 0, 0, 0, 0],

[1, 0, 0, 0, 0, 0],
┊ [2, 0, 0, 0, 0, 0],
.......
]
}
Código 6,20 Ejemplo de archivo de estado del módulo de entrada de actitud
de vuelo
6.2.2 Entrada de señal de posición y actitud
El código 6.21 comienza con 20Hz es la frecuencia para generar la señal de entrada de forma
asincrónica a partir del contenido del archivo de estado.

SLEEP_INTERVAL = 1 / 20

asincrónico def send_signal_async(uno mismo,
┊ state_id): estado = uno mismo.estados
┊ [state_id]
┊ por actitud en el estado
┊ ['actitudes']: uno
┊ mismo.emit_input_signal (actitud)
Códi go 6.21 Realización de la señal de entrada generada por el módulo de
┊ entrada de actitud de vuelo
┊ 6.3 Módulo de
algoritmo de lavado clásico

6.3.1 Descripción
general del proceso

┊ Establezca el vector de pose inicial como 0;

Cuando haya una señal de entrada, calcule un nuevo vector de actitud;

Atuendo Basado en el nuevo vector de pose, llame a la interfaz para generar el vector
de pose de plataforma de movimiento.

┊ 6.3.2 Configuración de parámetros de filtro

Para facilitar al usuario la modificación de los parámetros del filtro, el filtro
utiliza archivos de configuración para describir los parámetros. Cada configuración de filtro
tiene como se muestra en la tabla

┊ 6.3S e m u e s t r a n l o s e l e m e n t o s d e c o n f i g u r a c i ó n . L a c o n f i g u r a c i ó n
de parámetros inicial de todos los filtros de este módulo se muestra en
l a t a b l a 6.4 Mostrado.
Orden

mesa 6.3 Descripción de los elementos de configuración del filtro

Nombre del Tipo Opcional descripción

elemento s de
┊ de
┊ configurac
lí ión
ne orden En t No Orden de filtro, valor 1 ~ 3
a
┊ lp bool No Ya sea un filtro de paso bajo, tome Falso significa
filtro de paso alto

┊ zeta flota sí Relación de amortiguación, solo 2, 3 E l f i l t r o


┊ Ruta del mesa 6.4 Configuración
descripción de parámetros
orden lp inicial de todos omega
zeta los filtros omega_1
┊ elemento de
┊ configuraci
ón

┊ tilt.x Coordinación de 2 Ciert 1.0 5,0 /
inclinación Filtro de o

direcció n X

tilt.y Coordinación de 2 Ciert 1.0 8.0 /

inclinación Filtro de o
direcció n Y
movimiento.x Movimiento de 3 Falso 1.0 2.5 0,25
desplazamiento Filtro
de direcció n Z
El código 6.22 puede basarse en la tabla Los elementos de configuración que se
muestran en 6.3 construyen la clase de cálculo de filtro que se muestra en el
código 4.1.

┊ def build_filter(*, orden:En t=1, lp:bool=Cierto,


┊ omega:flotador=0.0, zeta:flotador=1.0, omega_1:flotador=0.0, frecuencia=FREQ):
┊ afirmar ordenar en [1, 2, 3]
si orden == 1:
┊ regreso build_1st_filter (omega, lp, freq)
┊ elif orden == 2:
┊ regreso build_2nd_filter (omega, zeta, lp, freq)
┊ demás:
┊ regreso build_3rd_filter (omega, zeta, omega_1, lp, freq)

def rebuild_filters(uno mismo):

uno mismo.filtros = {}
┊ por tipo, dimensiones en uno mismo.config
┊ ['filtrar'].artículos(): uno mismo.filtros [tipo] =
┊ {}
Pa por d, filter_config en dimensiones.artículos(): unode cálculo del filtro de acuerdo con la
Código 6.22 Construya la clase
qu mismo.filtros [tipo] [d] = dfilter.build_filter
configuración
et
e

┊ 6.3.3 Cálculo de
filtros

┊ Después de construir la clase de cálculo de filtro que se muestra en el código 4.1, puede
pasar el código Las funciones que se muestran en 6.23 se calculan para el movimiento de desplazamiento,
┊ Ajuste de inclinación, filtro de rotación. Estas funciones reciben un conjunto
de vectores y generan un vector filtrado con una estructura consistente. Orden

┊ def apply_movement_filter(uno mismo,
┊ a_i): filtros = uno mismo.filtros
['movimiento'] regreso
┊ numpy.formación([[
┊ filtros ['X'].aplicar (a_i [0] [0]),
lí filtros ['y'].aplicar (a_i [1] [0]),
ne filtros ['z'].aplicar (a_i [2] [0]),
a ]]).T

┊ def apply_tilt_filter(uno mismo,
f_s): filtros = uno
┊ mismo.filtros ['inclinación']
┊ regreso numpy.formación([[
┊ filtros ['X'].aplicar (f_s [0] [0]),
┊ filtros ['y'].aplicar (f_s [1]
┊ [0]), 0,
┊ ]]).T

def apply_rotate_filter(uno mismo,
┊ omega_s): filtros = uno mismo.filtros
┊ ['girar'] regreso numpy.formación([[
┊ filtros ['alfa'].aplicar (omega_s [0] [0]),
┊ filtros ['beta'].aplicar (omega_s [1] [0]),
filtros ['gama'].aplicar (omega_s [2] [0]),
Código 6.23 Utilice la clase de cálculo de filtro para calcular

6.3.4 Implementación de algoritmos


De acuerdo con el proceso que se muestra en la Figura 2.11, el código 6.24 Se realiza el algoritmo
central de la simulación somatosensorial.
def handle_input_signal(uno mismo, datos):
global ig_disp_1, ig_disp_2, ig_rot_1, ps, po
g_a = VECTOR_G
Automóvil club británico =

numpy.array ([datos [0:3]]).T
┊ omega_a = numpy.array ([datos
┊ [3:6]]).T

┊ fa = Automóvil club británico - Georgia
┊ f_s = uno mismo.Apply_movement_scaling
┊ (f_a) a_s = f_s + VECTOR_G
a_hp = uno mismo.apply_movement_filter (a_s)
┊ ig_disp_1 = ig_disp_1 + delta_time * a_hp
┊ ig_disp_2 = ig_disp_2 + delta_time * ig_disp_1
┊ ps = numpy.copiar (ig_disp_2)

┊ f_lp = uno mismo.apply_tilt_filter
┊ (f_s) theta_lp =
numpy.formación([[
Pa
Matemáticas.como en(uno mismo.apply_tilt_scaling (f_lp [1] [0]) /
qu scipy.constantes.gramo),
et -Matemáticas.como en(uno mismo.apply_tilt_scaling (f_lp [0] [0]) /
e scipy.constantes.gramo), 0
┊ ]]).T
┊ theta_tc = theta_lp

omega_s = uno mismo.apply_rotate_scaling

(omega_a) omega_hp = uno
┊ mismo.apply_rotate_filter (omega_s)
Or ig_rot_1 = ig_rot_1 + delta_time * omega_hp
de
n correos = ig_rot_1 +

┊ theta_tc uno
┊ mismo.emit_mca_signal

┊ (datos, [

ne
a
┊ Código 6.24 Implementación del algoritmo de lavado clásico


┊ 6.4 Módulo de salida de simulación visual de la plataforma de movimiento Stewart

┊ Este tema utiliza la tecnología WebGL para realizar la simulación visual en 3D de la
plataforma de movimiento Stewart. Basado en esta simulación 3D, el usuario
┊ Puede ver la postura en tiempo real de la plataforma de movimiento sin necesidad de
hardware, ajustar y verificar varios parámetros y ver el efecto a tiempo.

Reduzca significativamente la dificultad de desarrollar y depurar complementos de

entrada y complementos de simulación somatosensorial.
┊ 6.4.1 Tecnología WebGL y Three.js cuadro

┊ WebGL es un proyecto que utiliza la API de JavaScript para renderizar 3D o Tecnología de gráficos 2D.
La imagen 3D está basada en OpenGL ES

2.0, utilizando GLSL como sombreador. WebGL en HTML5 Introducido en el estándar, es compatible
de forma nativa con los navegadores convencionales y se puede renderizar sin complementos.
WebGL proporciona una interfaz de renderizado de bajo nivel. Generalmente, los desarrolladores
también necesitan utilizar un motor o marco 3D para lograr realmente un renderizado 3D. Este tema usa
el marco Three.js. Three.js es un popular framework 3D de JavaScript entre navegadores para
iluminación,
Escenas, efectos especiales, materiales, animaciones y otras funciones comunes de varios
marcos de renderizado 3D están bien soportados y pueden basarse en WebGL implementa GPU
Renderizado 3D acelerado y eficiente.

6.4.2 Construcción de formas geométricas



┊ en Three.js tiene los siguientes pasos para renderizar un objeto:
┊ Establecer la geometría del objeto, incluidas las coordenadas de cada vértice
y la información de cada superficie;

Establecer el material de la superficie (Material);

┊ Los dos juntos crean un objeto abstracto (Objeto) y el objeto se agrega a la
escena;
┊ Llame a la función para renderizar la escena.

Dado que el material determina el color del objeto, no es importante para la
simulación 3D, por lo que solo se explica el proceso de construcción de la forma geométrica.

┊ Una plataforma
┊ Código 6.25 De acuerdo con la fórmula (2.3) en el En el caso de los pará metros r, α, construya una
figura plana bidimensional de la plataforma centrada en (0, 0)

camino. Entre ellos, el último punto del camino coincide con el primer punto para formar una
figura cerrada. Dado que las plataformas superior e inferior son imágenes especulares,

Atuendo Esta función también acepta la opción inversa, lo que permite la construcción de un gráfico
girado 180 grados.

┊ getPlatePoints (radio, alfa) {
┊ constante shapePoints = [];
┊ constante baseDeg = esta.options.reverse ? Matemáticas.PI : 0;
┊ por (dejar I = 0; I < 3; ++I) {
Or constante orientar = 2 / 3 * Matemáticas.PI *
de I + baseDeg; shapePoints.push (nuevo TRES
n Vector2 (
radio * Matemáticas.cos (orientar
┊ - alfa), radio * Matemáticas.sin
┊ (orientar - alfa)
┊ ));
┊ shapePoints.push (nuevo TRES Vector2
┊ (radio * Matemáticas.cos (orientar
lí + alfa), radio * Matemáticas.sin
(orientar + alfa)
ne
));
a }
┊ shapePoints.push (shapePoints [0]);



Código 6.25 Calcular la geometría de la plataforma en función de los parámetros


┊ usar ExtrudeGeometry en Three.js puede extender la figura cerrada bidimensional a la geometría
espacial tridimensional y automáticamente

Cree la superficie correspondiente, como se muestra en el código 6.26. debido aThree.js es un
sistema de coordenadas para diestros y ExtrudeGeometry no cambia el original

┊ La ruta bidimensional más baja es el eje Z en la dirección delantera y trasera. Por lo
tanto, una vez creada la geometría tridimensional, debe girarse para moverse hacia
┊ Directamente. Además, la plataforma fija en la plataforma Stewart generalmente está
ahuecada, este tema también simula esto, por lo que debe modificarse.

Utilice un radio más pequeño como camino hueco interior.

constante forma = nuevo TRES.Forma (esta.getPlatePoints (


esta.opciones.radio,
esta.options.alpha
));
si (esta.options.innerRadius > 0) {
constante interno = nuevo TRES.Ruta (esta.getPlatePoints (
esta.options.innerRadius,
esta.options.alpha
));
shape.holes.push (interior);
┊ }
┊ constante geometría = nuevo TRES.ExtrudeGeometry
(forma, {cantidad: esta.opciones.espesor,

bevelEnabled: falso,
┊ });
┊ geometry.lookAt (nuevo TRES Vector3 (0, 1, 0));

Código 6.26 Utilice getPlatePoints y ExtrudeGeometry para crear geometría 3D de plataforma


┊ Las varillas de soporte generalmente están conectadas a los puntos de conexión en la
plataforma, en lugar de conectarse directamente a las seis esquinas de la plataforma, por lo que se
requieren definiciones adicionales.

Las coordenadas de las articulaciones de las seis varillas de soporte. Código6.27 Utilice el
radio de círculo definido "jointRadius" del punto de conexión para determinar la posición del punto de conexión.

┊ Marcos.

Pa
esta.jointPoints = esta
qu .getPlatePoints (esta.options.jointRadius, esta.options.alpha)
et .rodaja(0, 6)
e .map (v2 => nuevo TRES Vector3 (v2.x, esta.opciones.espesor / 2, v2.y));



┊ Código 6.27 Establecer las coordenadas de los puntos de conexión

Orden






ne
a



┊ Figura 6.8 Representaciones de renderizado de plataforma 6.9 Estructura alámbrica de la
plataforma


┊ La Figura 6.8 y la Figura 6.9 muestran el efecto de las plataformas superior e inferior renderizadas
desde un cierto ángulo. Los gráficos conectados por las coordenadas de los seis puntos de conexión se muestran en la
figura6,8
┊ se representa como un polígono negro.
┊ B. Varilla de soporte

┊ En la simulación tridimensional de este tema, se utiliza un prisma conectado a una
plataforma fija y una plataforma móvil en lugar del soporte cilíndrico de uso común.
┊ Varillas de soporte para aumentar la velocidad de renderizado sin afectar el realismo. Dadas
las coordenadas tridimensionales de los dos extremos del prisma,
┊ El prisma se puede construir directamente usando TubeGeometry que viene con Three.js, como el
código Como se muestra en 6.28. TubeGeometry se basa en una trayectoria espacial tridimensional (no
limitada a una línea recta) para construir una figura espacial tridimensional con un número específico de
bordes y un radio específico. Finalmente, tomando las coordenadas espaciales de los seis puntos de
conexión de la plataforma fija y las coordenadas espaciales de los seis puntos de conexión de la
plataforma móvil como las coordenadas de los dos extremos de la barra de soporte, se pueden construir
seis barras de soporte, como se muestra en código 6.29.
esta.geometría = nuevo TRES.Tubo Geometría (
nuevo TRES.LineCurve3 (esta.options.p1,
esta.opciones.p2), 1, esta.opciones.radio, 4
);

┊ Código 6.28 Construcción de la geometría del prisma




┊ esta.piernas = [];
por (dejar I = 0; I < 6; ++I) {

constante pierna =
┊ nuevo Pierna ({p1:
┊ jointBase [i],
┊ p2: articulacionesTop [(i + 3) % 6],
┊ radio: 5,
┊ });
leg.addTo (esta.grupo);

┊ esta.legs.push (pierna);
} Código 6.29 Simulación de varillas de soporte basadas en coordenadas de puntos de
conexión y geometría del prisma

Atuendo





Or
de
n



┊ Figura 6.10 Representación translúcida de plataforma y barra de soporte. 6.11 Estructura
metálica de la plataforma y la varilla de soporte


ne
a
┊ F i g u r a 6.10, Figura 6.11 Muestra el efecto general de la plataforma y la barra de
soporte juntas. Para facilitar la observación de la posición del punto de conexión,
┊ La superficie de la figura 6.10 es semitransparente y el punto de conexión y la trayectoria de la varilla de soporte
están marcados con una trayectoria negra.

┊ 6.4.3 Cálculo de posición y actitud

La señal recibida por el módulo de salida es la posición y actitud de la
plataforma de movimiento, es decir, la fórmula (2.4), (2.7), determinan el punto de conexión

┊ El estándar se puede calcular mediante la fórmula (2.15). Debido a que Three.js tiene
incorporadas potentes funciones de cálculo matemático, las coordenadas de los puntos de conexión
se pueden
┊ Se calcula directamente de acuerdo con el desplazamiento de posición y la dirección de
actitud dados, y no es necesario implementar el cálculo de la matriz de rotación por sí mismo, como la
generación de

Código 6.30 Mostrado.


┊ // Establecer la posición y la actitud de la plataforma
┊ esta.object.rotation.x = esta.attitude.roll;
esta.object.rotation.y = esta.attitude.yaw
esta.object.rotation.z = esta.attitude.pitch;
esta.objeto.posición.x = esta.attitude.surge;
esta.objeto.posición.y = esta.attitude.heave + esta.options.yOffset || 0;
esta.object.position.z = esta.attitude.sway;
esta.object.updateMatrix ();
// Actualizar las coordenadas del punto de conexión correspondiente según la posición y postura
de la plataforma
constante matriz = esta.object.matrix;
devuelve esto.jointPoints.map (v3 => v3.clone (). applyMatrix4 (matriz));
┊ Código 6.30 Cálculo de posición y actitud

┊ 6.4.4 Mecanismo de
comunicación del módulo

┊ La simulación tridimensional necesita realizar una simulación de actitud basada en
la señal de simulación somatosensorial actual en tiempo real, y teóricamente puede basarse en
asincrónica Binario UDP
┊ El flujo de datos construye la solución óptima, pero debido a las limitaciones de la
tecnología web, aún no se admite establecer Canal de datos UDP, por lo que el actual
┊ La mejor solución en condiciones técnicas WebSocket + JSON para cumplir.

WebSocket es un protocolo de datos de conexión larga confiable compatible con el navegador, se basa

en TCP y se puede implementar desde el protocolo HTTP.
┊ Actualización de la negociación. A diferencia del protocolo HTTP, WebSocket puede establecer
una conexión bidireccional larga entre el navegador y el servidor; yTCP
┊ La diferencia orientada al flujo es que WebSocket Los datos están enmarcados como una
unidad y el desarrollo es relativamente simple.

Con la función WebSocket de Sanic, puede definir una interfaz de comunicación WebSocket en
┊ lado del servidor del módulo, como el código 6.31
el
Atuendo Mostrar. Entre ellos, el usuario puede abrir varias pestañas del navegador para acceder
a la plataforma de simulación, y la señal de actitud de la plataforma a la plataforma de
simulación es una amplia gama.
┊ Transmitir mensajes, por lo que el módulo debe mantener la conexión actualmenteWebSocket
Lista de clientes e informe a todos los usuarios al recibir la señal de actitud de la plataforma

Hay clientes conectados que difunden mensajes, como códigos. Como se muestra en 6.32.


┊ @ self.bp.websocket('/ api / signal')
Or asincrónico def
de señal_alimentación(solicitud, ws):
n tratar:
┊ uno mismo.clientes_conectados.agregar (ws)
┊ mientras Cierto:
esperar ws.recv ()

finalmente: uno
┊ mismo.clientes_conectados.elimina

línea Código 6.31 Realización del enrutamiento WebSocket del lado del servidor


┊ def handle_motion_signal(uno mismo, input_signal,
┊ motion_signal): datos_para_enviar = json.volcados
┊ (motion_signal)
por cliente en uno mismo.clientes_conectados:

asyncio.asegurar_futuro (cliente.enviar (datos_enviar))
┊ Código 6.32 Realización de la señal de difusión de WebSocket en el servidor


La parte de la interfaz debe establecerse con el servidor.Conexión WebSocket, y

modificar y renderizar cuando se recibe la señal de gestos de la plataforma
┊ Tiñe la apariencia de la plataforma deportiva, como el código. Como se muestra en 6.33.


constante ws = nuevo WebSocket ('ws:// $ {ubicación.host} / plugins /
output_stewart_visualize / api / signal`); ws.addEventListener ('mensaje', ev => {
tratar {
constante datos = JSON.parse (ev.data);
esta.controlOptions.attitude.surge = datos[0] *
50; esta.controlOptions.attitude.sway = datos[1] *
50;
esta.controlOptions.attitude.heave = datos[2] * 50;
esta.controlOptions.attitude.roll = TRES.Matemáticas.radToDeg
(datos [3]); esta.controlOptions.attitude.pitch =
TRES.Matemáticas.radToDeg (datos [4]);
esta.controlOptions.attitude.sway = TRES.Matemáticas.radToDeg
┊ (datos [5]); esta._updateAttitude ();
┊ } captura (e) {
┊ }
┊ });
Código 6.33 El navegador recibe WebSocket Realización de señales en tiempo real

┊ 6.4.5
Visualización de efectos

Figura 6.12 muestra la interfaz general de la plataforma de simulación de postura inicial, y el usuario

puede rotar la vista arrastrando el mouse. Figura 6.13
┊ Muestra el efecto bajo diferentes perspectivas y diferentes posturas.




Pa
qu
et
e





Or
de
n



┊ Figura 6.12 Efecto de simulación visual en el estado inicial


ne
a












┊ Figura 6.13 Visualice el efecto de simulación después de cambiar el ángulo de
observación y la posición y postura de la plataforma
7 Pruebas y optimización
7.1 módulo FSX

┊ 7.1.1 Resultados de muestreo

┊ enFSX usa AirCreation Trike Ultralight como modelo y realiza despegues de pista, desvío a la
izquierda y desvío a la izquierda en el aeropuerto KEDW.
┊ La prueba de guiñada hacia la derecha y aterrizaje en el suelo, muestreando los cambios
de aceleración y velocidad angular que se muestran en la figura Como se muestra en la Figura 7.1 a la
Figura 7.4.








Pa
qu
et
e





Or
de
n






ne
a













Figura 7.1 Cambios en la aceleración y la velocidad angular durante el
despegue













Pa
qu
et
e





Or
de
n






ne
a











Figura 7.2 Cambios de aceleración y velocidad angular en el estado de guiñada a la

izquierda














Pa
qu
et
e





Or
de
n






ne
a











Figura 7.3 Cambios de aceleración y velocidad angular en el estado de guiñada a la

derecha














Pa
qu
et
e





Or
de
n






ne
a







Figura 7.4 Cambios en la aceleración y la velocidad angular durante el aterrizaje


┊ F i g u r a 7.4 Dado que aterrizó en el suelo y tuvo una turbulencia significativa, todos
los valores fluctuaron.

┊ 7.1.2 Eficiencia de muestreo

Prueba de hardware del entorno:
CPU: Intel Core i7 de 1,7 GHz (2 núcleos lógicos);
Memoria: 4GB DDR3;
Gráficos: Intel HD Graphics 5000 512 MB.
Software de entorno de prueba:
Sistema operativo: Windows 7 x64;
El sistema se ejecuta en la máquina virtual Parallels 11;
┊ FSX: 10.0.60905.0.
┊ En el entorno mencionado anteriormente, los indicadores de rendimiento medidos del
módulo son los más grandes, como se muestra en la tabla. 7.1 M o s t r a d o , d o n d e FSX No
importa que la recepción esté suspendida

Todo está ejecutando renderizado de gráficos y ocupando un núcleo. Como puede verse en la

tabla, el impactoFSX L a e f i c i e n c i a d e m u e s t r e o d e l c o m p l e m e n t o
e s FSX sí mismo
┊ En lugar de la implementación del complemento para este tema;FSX no puede reservar
suficientes recursos de CPU para el procesamiento cuando hay escasez de recursos de CPU y GPU.
┊ Amable solicitud.


┊ Cuadro 7.1 Indicadores de rendimiento relacionados con el complemento FSX
┊ Articulo condición rendimient
┊ o
┊ Velocidad de fotogramas FSX 20.0 FPS
┊ de renderizado FSX ejecutándose
Pa en primer
qu plano
et Frecuencia máxima de FSX 35 ± 5
e muestreo del ejecutándose operaciones
┊ complemento FSX en primer /s
plano

Frecuencia máxima de Mostrador de 35 ± 5

muestreo del recepción FSX operaciones
┊ complemento FSX suspendido /s

Or
de
n

┊ Debido a la simulación somatosensorial 20Hz, por lo que la eficiencia de muestreo aún cumple
con la demanda en la situación actual. Después de actualizar el hardware, se puede mejorar la minería.

Este tipo de frecuencia puede lograr un mejor efecto de simulación somatosensorial.

┊ 7.2 Algoritmo de lavado clásico
línea
┊ 7.2.1 Resultados de la simulación somatosensorial

┊ A 7.1.1 El despegue, la guiñada a la izquierda, la guiñada a la derecha y el aterrizaje en la mitad de la
pista son señales de entrada para la simulación somatosensorial para obtener el nivel de movimiento.
┊ El cambio de posición y postura de la estación se muestra en la figura Como se muestra en la
Figura 7.5 a la Figura 7.8.

Tomando como ejemplo el despegue, la aeronave de prueba acelera desde un punto
muerto en la pista (Figura 7.5 en 0 ~ 25 segundo), Hasta después de mantener una velocidad constante

┊ (Figura 7.5 en 25 Segundos después) para despegar del suelo. En este proceso, la
aceleración inicial repentina se recupera por desplazamiento directo
┊ Ahora, como se muestra en la Figura 7.5 (a). Cuando la aceleración continúa manteniéndose, se
reproduce por coordinación de inclinación, como se muestra en la figura.Como se muestra en 7.5 (e), y este

Al mismo tiempo, la plataforma se lava y vuelve al punto original.

















Pa
qu
et
e





Or
de
n






ne
a











Figura 7.5 Cambios de posición y actitud de la plataforma de movimiento en el estado
┊despegue
de














Pa
qu
et
e





Or
de
n






ne
a











Figura 7.6 El cambio de posición y actitud de la plataforma móvil en el estado de

guiñada a la izquierda














Pa
qu
et
e





Or
de
n






ne
a











Figura 7.7 El cambio de posición y actitud de la plataforma móvil en el estado de

guiñada correcto














Pa
qu
et
e





Or
de
n






ne
a



Figura 7.8 Cambios de posición y postura de la plataforma móvil en el
┊ estado de aterrizaje.






┊ 7.2.2 Eficiencia de
cálculo

Prueba de hardware
del entorno:

CPU: Intel Core i7 de 1,7 GHz (4 núcleos lógicos);
Memoria: 8GB
DDR3.Software de
entorno de prueba:
Sistema operativo: Mac OS X Yosemite;
Python: 3.6.1.
En el entorno mencionado anteriormente, los indicadores de rendimiento medidos del
módulo son los más grandes, como se muestra en la tabla. 7.2 Mostrado. Se puede ver a
partir de los datos que el módulo de algoritmo de lavado clásico tiene una eficiencia
computacional muy alta y puede admitir el procesamiento de entrada de señal por encima
de 1000 Hz. Los 20 Hz utilizados en este tema son más que suficientes.

┊ mesa 7.2 Indicadores de rendimiento relacionados del módulo de algoritmo de lavado
clásico

Rendimiento del artículo

┊ Máxima eficiencia operativa del algoritmo 6153 ± 15 ciclos / s
┊ El algoritmo es positivoCPU normal Ocupar 5 ± 2%

Máxima eficiencia en la construcción del filtro 1600 ± 50 por / s



┊ 7.3 Efecto servidor


Pa
qu
et
e





Or
de
n


┊ Figura 7.9 Seleccionar diagrama de fuente de entrada 7.10 Visualización en tiempo real de la
señal de entrada



ne
a








┊ Figura 7.11 FSX Ingrese la configuración del complemento Figura 7.12 Visualización en tiempo
real de la recepción del paquete de datos del complemento de entrada FSX









┊ Figura 7.13 Diagrama de actitud de selección del módulo de actitud de vuelo estándar 7.14 El
módulo de actitud de vuelo estándar reproduce la actitud







Pa
qu
et
e



┊ Figura 7.15 Diagrama de configuración de parámetros del algoritmo de lavado clásico 7.16 Ajuste
de escala automático del algoritmo de lavado clásico

Or
de
n






ne
a



┊ Figura 7.17 Visualización en tiempo real del diagrama de señales de actitud de la plataforma
7.18 Seleccione el objetivo de salida de la señal de la plataforma


┊ 7.4 Efecto de simulación visual de la plataforma de movimiento Stewart

┊ Diagrama de simulación usando el módulo de entrada de actitud de vuelo estándar 7.1
C o m o s e m u e s t r a e n e l e s t a d o d e d e s p e g u e , l a i n t e r f a z d e l
m ó d u l o d e e n t r a d a d e a c t i t u d s e m u e s t r a e n l a f i g u r a 7.19 Como
se muestra,
┊ La señal de entrada en este momento es como se muestra en la figura. Como se muestra en 7.20,
la señal de salida obtenida por el algoritmo de simulación somatosensorial se muestra en la Figura 7.21, y la simulación
visual presenta la operación

Diagrama de plataforma móvil Como se muestra en 7.22.







┊ Figura 7.19 Diagrama de estado del módulo de entrada de postura 7.20 Señal de entrada







Pa
qu
et
e



┊ Figura 7.21 señal de salida Figura 7.22 Simulación visual de la señal
de salida

Or
de
n






ne
a













8 Conclusión y perspectiva
8.1 Conclusión

┊ Con el uso generalizado de equipos de realidad virtual, está aumentando la demanda de
simulación somatosensorial a nivel personal, una simulación somatosensorial
relativamente antigua.

┊ Una nueva demanda de tecnología en la era contemporánea. Para satisfacer esta demanda, este
artículo propone que el simulador somatosensorial controle el hardware y no se limite a
funciones especiales.
┊ Defina hardware, proporcione un entorno operativo básico y abstracción de hardware para los
requisitos, sin limitarse a requisitos específicos.
┊ Basado en la teoría de simulación somatosensorial existente, este artículo primero
estudia e implementa uno de los algoritmos de simulación somatosensorial "algoritmo
clásico de lavado".

┊ Algoritmo eficiente de lógica cardíaca en la computadora. El algoritmo no solo se ejecuta
de manera eficiente, sino que también permite a los investigadores basarse en filtros
analógicos tradicionales.
┊ Teoría para ajustar parámetros. A continuación, este artículo diseña e implementa un cuerpo
universal con una capacidad de configuración y una escalabilidad extremadamente altas.
┊ Sistema de simulación Sense. El sistema implementa completamente un sistema de complemento
extensible, no limitado a hardware específico o necesidades del cliente, y tiene depuración

┊ Características. Finalmente, este artículo diseña e implementa cuatro complementos para
el sistema, a saberMódulo Microsoft Flight Simulator X:
┊ Permitir a los usuarios realizar una simulación de movimiento en tiempo real a través
del simulador de vuelo FSX; Módulo de actitud de vuelo estándar: Permitir que los
usuarios simplemente realicen
Atuen Simulación somatosensorial en diferentes estados de vuelo; Módulo de algoritmo de lavado
do clásico: permite el uso de algoritmos de lavado clásicos para el cálculo de la simulación
somatosensorial;

Módulo de simulación de la plataforma de movimiento Stewart: permite a los usuarios observar efectos de

simulación somatosensoriales sin hardware.
┊ Las pruebas muestran que el rendimiento general del sistema diseñado en este documento
es alto, lo que puede cumplir con la precisión de la simulación somatosensorial que
supera con creces la demanda, y el sistema enchufable funciona bien.
┊ Efectivo, puede separar eficazmente diferentes funciones. Además, los complementos
mencionados anteriormente implementados en este artículo también pueden lograr los
objetivos esperados, pueden cooperar entre sí y completar

Todo el proceso está conectado en serie para realizar de manera eficiente la simulación
Orden somatosensorial en tiempo real.
┊ 8.2 Outlook

┊ Trabajo que debe mejorarse aún más en el futuro:
┊ Debido a la falta de soporte del entorno de hardware, este sujeto solo puede
realizar una simulación de software de la señal de salida. Con barra de hardware

línea Después del software, considere implementar los módulos de salida de varias barras de
transmisión de hardware de plataforma de seis grados de libertad comunes (como SCN5,
SCN6), desde
┊ Y realmente darse cuenta de la simulación somatosensorial.
┊ La investigación en este tema es el algoritmo de lavado clásico más utilizado, y
en el futuro se pueden agregar otros algoritmos de simulación somatosensorial.

┊ Método para mejorar la fidelidad de la simulación somatosensorial.
┊ En el marco de esta asignatura, se asume que la salida es a una plataforma
de movimiento con seis grados de libertad. Dado que muchas personasBricolaje
┊ El usuario está utilizando una plataforma de movimiento de tres grados de libertad y es
necesario brindar soporte para esto. Específicamente, debe proporcionar restricciones para
varios complementos

┊ Soporte condicional, que restringe el uso del complemento solo después de que otros
complementos o entornos cumplan ciertas condiciones.
┊ Este tema actualmente necesita copiar y pegar el directorio para agregar
complementos, eliminar el directorio para eliminar los complementos, se puede
implementar en el futuro
┊ La interfaz de usuario ahora simplifica las operaciones.



referencias
┊ [1] DENNE P. Plataformas de movimiento o asientos de movimiento [J]. Publicado en septiembre de 2004.

[2] WEINBERG G, HARSHAM B. Desarrollo de un simulador de conducción de bajo costo para la
evaluación de

┊ tecnologías de vehículos: Actas de la 1a Conferencia Internacional sobre Interfaces de Usuario Automotriz y
┊ Aplicaciones vehiculares interactivas, 2009 [C]. ACM.
┊ [3] 6DOF Costos [EB / OL]. (2010-10-03) [2017-05-10].

https: //www.xsimulator.net/community/threads/6dof-costs.2711/.

┊ [4] SimTools Motor de juegos [EB / OL]. (21 de octubre de 2013) [10 de mayo de 2017].
http://www.xsimulator.net/simtools-
┊ motor de juegos/.
┊ [5] X-Sim Configuración matemática [EB / OL]. [2017-05-10]. http://www.x-sim.de/manual/math_setup.html.

[6] NAHON MA, REID L D. Algoritmos de accionamiento de movimiento del simulador: perspectiva de
┊ diseñador [J].
un
Atuendo of Guidance, Control, and Dynamics, 1990, 13 (2): 356-362.
┊ [7] PÁGINA R L. Breve historia de la simulación de vuelo [J]. SimTecT 2000 Proceedings, 2000: 11-17.
┊ [8] HAWARD D M. El profesor de lijadoras [J]. Vuelo, 1910,2 (50): 1006-1007.

[9] KELLY L L. The Pilot Maker. [J]. 1970.

┊ [10] Xiao Huiqiong. Investigación sobre el algoritmo somatosensorial de la plataforma Six
Degrees of Freedom [D]. Universidad Jiaotong de Beijing, 2014.
Orden [11] FISCHER M, SEHAMMER H, PALMKVIST G. Indicación de movimiento para 3, 6 y 8 grados de
libertad

Motion Systems [J]. DSC Europe, 2010.

┊ [12] STEWART D. Una plataforma con seis grados de libertad [J]. Actas de la institución de
┊ ingenieros mecánicos, 1965, 180 (1): 371-386.

[13] ALLEN L. Evolución de la simulación de vuelo [M] // Simulación y tecnologías de vuelo 1993:
3545.
línea
[14] MIERMEISTER P, LÄCHELE M, BOSS R, et al. El movimiento a gran escala del simulador

CableRobot
┊ plataforma basada en tecnología de robot de cable: Intelligent Robots and Systems (IROS), 2016 IEEE / RSJ
┊ Conferencia Internacional sobre, 2016 [C]. IEEE.

[15] Movimiento Algoritmos de señalización [EB / OL]. (2017-03-24) [2017-05-10].

┊ http://www.kyb.tuebingen.mpg.de/research/dep/bu/motion-perception-and-simulation/motion-cueing-
┊ algoritmos.html.
┊ [16] von der HEYDE M, RIECKE B E. Cómo hacer trampa en la simulación de movimiento: comparar la
ingeniería

┊ y un enfoque de paseo divertido para la indicación de movimiento [J]. Max-Planck-Institut für biologische
Kybernetik, 2001.
┊ [17] REID LD, NAHON M A. Algoritmos de conducción basados en movimiento de simulación de vuelo: Parte
1. Desarrollo y
┊ probando ecuaciones [R] .Universidad de Toronto, 1985.

[18] REID LD, NAHON M A. Algoritmos de accionamiento de base de movimiento de simulación de
vuelo: Parte 2. Selección del parámetros del sistema [R] .Universidad de Toronto, 1986.
[19] PARRISH RV, DIEUDONNE JE, MARTIN JR D J. Deslave adaptativo coordinado para
simuladores de movimiento [J]. Journal of Aircraft, 1975,12 (1): 44-50.
[20] SIVAN R, ISH-SHALOM J, HUANG J. Un enfoque de control óptimo para el diseño de
simuladores de vuelo en movimiento [J]. IEEE Transactions on Systems, Man, and Cybernetics, 1982,12 (6):
818-827.
[21] SZUFNAROWSKI F. Plataforma Stewart con actuadores giratorios fijos: un estudio de diseño de bajo
costo [J].
Avances en robótica médica, 2013.

┊ [22] WALDRON K J. El análisis de restricciones de los mecanismos [J]. Journal of Mechanisms, 1966,1 (2):
101-
┊ 114.
┊ [23] MAESTRÍA O, WANG J. Evaluación del espacio de trabajo de las plataformas Stewart [J]. Robótica
avanzada,

1994, 9 (4): 443-461.

┊ [24] KANDEL ER, SCHWARTZ JH, JESSELL TM, et al. Principios de la ciencia neuronal [M]. McGraw-
┊ hill Nueva York, 2000.
┊ [25] MEIRY J L. El sistema vestibular y la orientación espacial dinámica humana. [D]. Massachusetts

Instituto de Tecnología, 1965.

┊ [26] MACDONALD S P. Cómo la fisiología humana procesa y responde al movimiento [EB / OL]. (2011-
┊ 15/02) [10 de mayo de 2017]. http://ezinearticles.com/?How-Human-Physiology-Processes-and-Responds-to-
Atuendo Movimiento & id = 5931085.

[27] LEIGH RJ, ROBINSON DA, ZEE D S. Una explicación hipotética de alternancia periódica

┊ Nistagmo: inestabilidad en el sistema optocinético-vestibular [J]. Annals of the New York Academy of
┊ Sciences, 1981, 374 (1): 619-635.

[28] STANGOR C, WALINGA J. Introducción a la psicología [M]. Flatworld Knowledge, 2010.
Orden
┊ [29] ORMSBY CC, YOUNG L R. Percepción de la orientación estática en una gravitoinertial constante
┊ medio ambiente [J]. Aviación, espacio y medicina ambiental, 1976.
┊ [30] JOVEN LR, MEIRY J L. Un modelo de otolito dinámico revisado. [J]. Medicina aeroespacial,

1968, 39 (6): 606.

línea [31] PETERS R A. Dinámica del sistema vestibular y su relación con la percepción del movimiento,
espacial
┊ desorientación e ilusiones [J]. 1969.
┊ [32] Ye Zhengmao, Zhang Hui, Zhang Jin, et al., Investigación sobre el algoritmo de
lavado de Flight Simulator [J]. Machine Tool & Hydraulics, 2006 (6): 177-180.

┊ [33] Qin Zheng. Ingeniería y gestión de software [M]. Tsinghua University Press Co.,
Ltd., 2005.
┊ [34] METZ S. Diseño práctico orientado a objetos en Ruby: An Agile Primer [M]. Pearson Education, 2012.

[35] KEGEL D. El problema de C10K [Z]. 2006.

┊ [36] HU JC, PYARALI I, SCHMIDT D C. Medir el impacto del despacho de eventos y la concurrencia
┊ modelos sobre el rendimiento del servidor web en redes de alta velocidad: Conferencia Global de
Telecomunicaciones,
┊ 1997. GLOBECOM'97., IEEE, 1997 [C]. IEEE.

[37] BRAY T. El formato de intercambio de datos de notación de objetos javascript (json) [J]. 2014.

┊ [38] WIKIPEDIA. Microsoft Flight Simulator [EB / OL]. (25 de mayo de 2017) [26 de mayo de 2017].
https://en.wikipedia.org/w/index.php?title=Microsoft_Flight_Simulator&oldid=782244983.
[39] AUTORES P. protobuf-c – C enlaces para Protocol Buffers – Google Project Hosting
[Z].
[40] FENG J, LI J. Investigación y aplicación de búferes de protocolo de Google en juegos en
línea: Conference Anthology, IEEE, 2013 [C]. IEEE.














Pa
qu
et
e





Or
de
n






ne
a













Gracias

┊ La tesis de graduación (diseño) es una manifestación integral de las diversas
habilidades aprendidas a nivel de pregrado. Este proyecto de graduación me dio una comprensión
profunda de esto.
┊ En el proceso de investigación, diseño e implementación del proyecto, los profesores de
la Escuela de Software me dieron el conocimiento y la capacidad de aprender conocimiento.

Mi gran ayuda me ha permitido finalmente construir de forma sistemática un software que
supera todos los niveles de los proyectos de mis cursos de pregrado.

┊ En primer lugar, agradezco sinceramente al Sr. Yin Changqing, el instructor de este
proyecto de graduación. Cuando estaba perdido en la elección de un tema, el maestro Yin nunca
┊ Las sugerencias profesionales se dan desde el mismo ángulo, y luego el contenido de
investigación y diseño de este artículo está disponible. El maestro Yin tiene muchas de mis
habilidades y potencial personales.

La evaluación está en su lugar, incluso mejor que yo. Hablando francamente, cuando me
decidí por primera vez sobre el tema, no tenía ni idea.

┊ Me preocupaba no poder terminar bien el proyecto porque no era bueno en el campo y
falta de habilidad, además, también estaba preocupado por el tema en ese momento.
┊ Existen muchas dudas sobre hasta qué punto se ha desarrollado y mejorado la capacidad
profesional. Pero a medida que la investigación se profundizó, gradualmente vi la imagen completa
del problema.

Descubrí sus partes interesantes, desafiantes y valiosas, combinadas con mi propio
conocimiento y capacidad de aprendizaje, y finalmente completé el

Atuendo Sujeto. Durante el proceso de investigación, los consejos dados por el profesor Yin
también me hicieron muy gratificante y me dejaron una profunda impresión.
┊ En segundo lugar, me gustaría agradecer a Xiong Dehao de la Escuela de Ingeniería
Mecánica que me ha brindado mucha ayuda en la investigación. La dirección de simulación
somatosensorial está disponible

La mayoría de los artículos están escritos por investigadores en el campo de la
ingeniería mecánica Hay un gran número de hipótesis cognitivas sobre el conocimiento mecánico en
los artículos.

┊ Los diversos conocimientos profesionales que he aportado son un gran desafío para mí,
que no estoy familiarizado en absoluto con el campo de la mecánica y, a menudo, hay sesgos en
términos de comprensión.
┊Pobre, incapaz de captar temas clave, sin comprender conceptos y otros temas. El compañero
de clase Xiong Dehao usó su conocimiento profesional mecánico para responderme mucho Orden
Estaba más confundido y señalé la dirección de exploración que luego resultó ser la
dirección correcta para el problema clave, lo que me ayudó a evitar muchos problemas.

┊ Los desvíos provocados por la familiaridad ahorran mucho tiempo precioso. Fue con su
ayuda que pude en un tiempo relativamente corto
┊ Aprendió, comprendió y verificó con éxito la teoría de la tecnología somatosensorial y
contribuyó al resto de la asignatura, como los sistemas enchufables y el diseño de comunicaciones
de alto rendimiento.
┊ Se ha reservado suficiente tiempo para la planificación y la implementación.

línea Una vez más, me gustaría agradecer a los profesores que me enseñaron varios
conocimientos profesionales, métodos de aprendizaje y me brindaron todas las oportunidades para
practicar en los últimos cuatro años.
┊ El curso del profesor Liu Yan me dio la oportunidad de diseñar y practicar
completamente una arquitectura de sistema impulsada por eventos, que comenzó en este tema.
┊ Ha alcanzado un papel extremadamente crítico; los cursos de Hou Jie me han brindado un
aprendizaje y una comprensión profundos de varios patrones de diseño de software, y me han
convertido en

Puedo diseñar arquitectura de software desde una perspectiva muy profesional, estas

ideas técnicas me han beneficiado mucho y han penetrado en todos los aspectos del proyecto.
┊ Face; El curso del profesor Huang Jie me brindó una comprensión profesional y
sistemática de la ingeniería de software, lo que me permitió aplicar los conocimientos relevantes
en este artículo.
┊ Conocimiento y teoría para escribir contenido profesional; el maestro Rao Weixiong, el
maestro Du Qingfeng, el maestro Zhu Hongming, el maestro Xia Boyong y otras escuelas de software

Los cursos ofrecidos por los profesores también me proporcionaron los conocimientos y

métodos de aprendizaje necesarios para completar la asignatura. Este tema usa C #,
┊ Python, JavaScript y otros lenguajes de programación, combinados con Web, renderizado 3D, WinForm,
multiproceso asíncrono, TCP,
┊ Varias tecnologías, como UDP, utilizan las herramientas o tecnologías más adecuadas para lograr diversas
funciones. Es por la predicación de estos maestros

Confundido, pude aprender por analogía, acumular una habilidad tan completa y completar
esta asignatura con alta calidad.

┊ Finalmente, me gustaría agradecer a mis padres que han estado ayudando y apoyando
silenciosamente mi desarrollo de intereses, sin su continuo apoyo para los intereses personales.
Definitivamente no lograré lo que soy ahora; gracias a los compañeros y amigos que
han estado a mi alrededor en los últimos cuatro años, especialmente a los
compañeros de cuarto y compañeros que se unieron a varios cursos. Todos ustedes han
dejado una profunda impresión en mi vida. La huella me ha traído buenos recuerdos y
me ha permitido afrontar diversos retos con una actitud positiva y optimista.

También podría gustarte