IBCBiomech / insolesibc

Prototipo de aplicación para plantillas
0 stars 1 forks source link

Desarrollo de la nueva UI - Fase I Entrega de Prototipo Funcional no testado totalmente #39

Open ivanjimenez opened 1 year ago

ivanjimenez commented 1 year ago

Estado actual release

Image

Image

Especificaciones fórmulas de IEE

Esto está sólo a modo de documentación:

ADC_neg = 4095 – VALUE_digital 

//Donde ADC_neg será el valor sin tara de cada sensor y VALUE_digital
// es el dato que recibe el sensor.

//Opción mBar: Transformamos el dato en mBar (milibares)

VALUE_mbar = rd(0.0006 * (ADC_neg * ADC_neg) + 0.6975 * ADC_neg)

//rd es una función de redondeo, puedes utilizar una función tipo Math.Round de tres decimales.

//Opción N
//G-DPV [eN] = P [Pa] x A [m2]

N = (VALUE_mbar * 100) * (435 / 10^6)

Investigaciones sobre LiveCharts y Syncfusion

Probando una celda de 12 gráficos con fake data en tiempo real a 100hz no va nada mal.

Dejo el simple proyecto para tenerlo en cuenta.

Hay ciertas cosas que esta librería aún no me acaba de convencer eso sí. Creo que ScottPlot es mucho más completo en otras cosas.

Image

liveplot.zip

El proyecto en zip

Entonces, la UI la mostramos:

Image

ivanjimenez commented 1 year ago

Image

bernatDiaz commented 1 year ago

En uno de los commits no funcionaba, en el ultimo commit esta arreglado

bernatDiaz commented 1 year ago

Si sigue sin funcionar hay que borrar las carpetas bin/ y obj/ y recrear la database: Para recrearla te la puedes volver a bajar o ejecutar esto desde cmdline en la carpeta insoles/ dotnet ef migrations add InitialCreate dotnet ef database update

bernatDiaz commented 1 year ago

Habra que instalar el dotnet ef supongo dotnet tool install --global dotnet-ef https://learn.microsoft.com/es-es/ef/core/cli/dotnet

ivanjimenez commented 1 year ago

Ok, genial, viene muy bien esa información, la puedes poner luego en el Readme.md (si no está creado lo creas) para acordarnos y la chequeo.

Por otro lado, comienza por la etapa de análisis, utiliza por ahora scottplot, pues ahora estoy probando syncfusion, otra librería de gráficos por si nos facilita el trabajo. Pero por ahora scottplot. Revisa el figma para recordar cómo está hecho. Nos vemos el lunes.

Buen fin de semana.

ivanjimenez commented 1 year ago

He subido un logo y hecho al final el Readme.md pero no me deja hacer push sobre tu rama. He subido los cambios a MVVM_ivan por si puedes luego merguearlos a la tuya de MVVM.

ivanjimenez commented 1 year ago

Esto para priorizar a partir del lunes 19. Ponerse como comentaba con la etapa de análisis del prototipo que se está haciendo:

Casos de uso para esta etapa:

Vale, entonces, Recordando el mockap de la ui de figma, he puesto unas anotaciones:

Image

  1. El Timeline se queda ahora como estaba
  2. Aquí aparece el cuadro de Sujetos que supongo se puede incrustar otro TreeView o referenciar el mismo. Aquí hay un evento nuevo de botón derecho sobre la carpeta del test tal y como se relata en UC1. Una vez que se haya cargado el test con los ficheros ya podemos trabajar, es decir, movernos por el time, line, animar el heatmap, y hacer un par de cosas con el gráfico de fuerzas, y esto sería casi todo lo que vamos a realizar por ahora en la etapa de ánalisis.
  3. Quitas las conversiones que teníamos antes de adc_neg, etc. no hace más que complicar lo que necesitamos. Poner título de "Butterfly" para el gráfico y poner que se vea bien cuál es cada una de las plantillas: L y R.
  4. Aquí este gráfico no hay que tocar mucho: sólo añadir L y R y creo que las presiones no sé si al final se hacían individualmente, chequear eso, por favor. El resto, animación, funciones max, min y avg, todo perfecto
  5. Vale, este es el punto que lleva más cosas y que tenemos que ver:

    • Librería utilizada por ahora: ScottPlot 4.6.1 que sería la que estaba. A ver el gráfico inicialmente deben ser dos curvas L y R como pone en la leyenda y se debe seleccionar el total en Newtons por cada plantilla y también la conversión a Kg (la vonversión es N/a siendo a = 9.80665) y con dos decimales.
    • Debe existir un botó no casilla que haga la Desvicación típica del gráfico junto con las curvas, cada curva por separado y cada color por separado. Eliges rojo y verde para las curvas y otros tonos más claros pero del mismo color para la desviación estándar. La desviación estándar la calculas por ahora como lo tenías hecho.
    • Ahora viene un punto importante y es que podemos seleccionar dos puntos o líneas verticales en el gráfico y seleccionas un rango del gráfico quedando sólo la selección de entre las dos líneas. A ese rango se le debe puede realizar la STDDEV quedando una curva con la desviación estándard sólo del rango seleccionado.

Bien, verás, para este punto me importa que se puedan establecer dos vertical lines y luego hacer la std deviation. Yo en el siguiente código calcula la STDDEV por otro método y luego aplico unos eventos para sacar la gráfica pero están incompletos.

 double[] xs = DataGen.Consecutive(51);
        double[] ys = DataGen.Sin(51);

        List<double> ys_temp = new List<double>();

        foreach (double y in ys)
        {
            ys_temp.Add(y);
        }

        double std_dev = ys_temp.PopulationStandardDeviation();
        double[] std_array = DataGen.Consecutive(51);

        for (int i = 0; i < ys.Length; i++)
        {
            std_array[i] = std_dev;
        }

        WpfPlot1.Plot.AddScatterLines(xs, ys, System.Drawing.Color.Red, 3);
        WpfPlot1.Plot.AddFillError(xs, ys, std_array, System.Drawing.Color.FromArgb(50, System.Drawing.Color.Blue));
        WpfPlot1.Render();

        WpfPlot1.LeftClicked -= WpfPlot1.DefaultRightClickEvent;
        WpfPlot1.LeftClicked += DeployCustomMenu;

        this.DataContext = new ViewModel();
    }

    private void DeployCustomMenu(object sender, RoutedEventArgs e)
    {

        (x, y) = WpfPlot1.GetMouseCoordinates();
        x0 = x;
        y0 = y;
        var vline = WpfPlot1.Plot.AddVerticalLine(x);

        vline.LineWidth = 2;
        vline.PositionLabel = true;
        vline.PositionLabelBackground = vline.Color;
        vline.DragEnabled = true;
        count++;
        WpfPlot1.Render();

        if (count == 1 )
        {

            WpfPlot1.Plot.SetAxisLimitsX(xMin: x0, xMax: x + 1);
            count = 0;
        }

    }

Si tienes tiempo, pruebas a sacar la STDDEV con el rango en el gráfico como ejemplo de selección:

Image

También que se pueda volver a la situación inicial con todo el gráfico.

Me he agenciado una licencia para Syncfusion que lleva bastantes controles gráficos, pero la estoy probando yo para ver si nos funciona. Las que he probado LiveCharts y LiveCharts2 no me llegan a convencer.

  1. Las cámaras se quedan tal y como están, la idea es qu3 se cargue todo de una vez.
ivanjimenez commented 1 year ago

Estoy probando varias opciones con Syncfusion que son bastante interesantes. Por ahora, no es totalmente elegible hasta que no vea cómo puedo hacer rangos con desvicación típica. De momento sigue con ScottPlot

Dejo el proyecto que está desorganizado y que podrías instalar con una versión de syncfusion. No obstante déjame esto a mí y sigue con Scottplot.

Charts.WPF.zip

ivanjimenez commented 1 year ago

Vale, ya está en principio realizado con ScottPlot. Es más simple de lo que pareciera ser. Te adjunto el fichero zip con todo el proyecto actualizado, no lo he subido a un repo. Espero subirlo.

Charts.WPF.zip

Lo mejor antes de explicar nada es que veas un gif de lo que se hace en el proyecto ejemplo:

Image

Con lo cual, a lo que estás realizando con la pestaña de Análisis, realiza lo siguiente con el gráfico de Fuerzas y fijándote en el código que he realizado.

ivanjimenez commented 1 year ago

Puedes comentarme los cambios realizados y cómo estaría la integración de lo de arriba. Veo la disposición actual de Análisis algo para que se integre bien todo. Por puntos:

1- En primer lugar no puedo ejecutar los ejemplos por un desborde de pila, ¿puede ser que la animación no esté realizada?

Image

2- La disposición de ventanas no va a dejar hacer nada más. Pon tabs, como estaba antes. El video puede estar agrupado en tabs, y así dejas un video libre para poner el gráfico.

3- La línea de timeline es muy grande, a ver si puedes hacerla menos alta, pero que sea proporcional a como está. UPDATE ESTA TARDE 21 DE JUNIO Hay que cambiar más cosas:

Image

No sé como está construida esta vista, pero el uso de frames no es conveniente porque la idea es dejar las referencias a ventanas con el "current". Si quieres usas un dock, o un grid.

4- El consumo de CPU es bastante, no sé si a ti te pasa. Esto ya has visto la solución.

5- Fase de Análisis. Además de poner el GRF como hemos comentado anteriormente, reajustar la UI

Image

ivanjimenez commented 1 year ago

Apuntes de cambio en Registro y análisis

Image

ivanjimenez commented 1 year ago

z

ivanjimenez commented 1 year ago

Reporting

https://ibcbiomechanics-my.sharepoint.com/:w:/r/personal/jlparreno_ibc_bio/_layouts/15/Doc.aspx?sourcedoc=%7B45C881D0-BA3A-44DF-B907-D8E81125FAEA%7D&file=report.docx&action=default&mobileredirect=true

ivanjimenez commented 1 year ago

a

bernatDiaz commented 1 year ago

El GRF no me funciona bien. Me salen 2 lineas cada vez que clico y siempre coje el grafico entero. No se si me he equivocado en algo, esta el fichero en UserControls/GRF.xaml.cs

ivanjimenez commented 1 year ago

a

bernatDiaz commented 1 year ago

El problema es que al hacer click izquierdo se mueve el grafico por eso se dibujan 2 lineas.

bernatDiaz commented 1 year ago

Solucionado, he desactivado el comportamiento por defecto

bernatDiaz commented 1 year ago

En el calculo de la Std estas elevando al cuadrado:

double diferenciaCuadrada = Math.Pow(diferencia, 2);

Para numeros grandes esto se puede disparar bastante. He hecho la raiz cuadrada de esto y se ve bien

ivanjimenez commented 1 year ago

Algunas cosas, he subido algunos cambios de ui y otras issues:

Image

* Fnominal = Peso / G, (siendo G = 9.80665). 
* Este peso siempre será mayor debido a lo que calculamos. 
* Luego del total que viene de las plantillas Fregistrada, hay que hacer un factor de corrección calculado como: Fc= Fnominal / Fregistrada >= 1.0 y que será siempre un valor superior o igual a 1. 
* Si chequeamos esta casilla debe salir entonces Frectificada = Fnominal * FC

Image

bernatDiaz commented 1 year ago

Sigue tardando una eternidad cargando el pressure map. He precalculado las otras matrices. Tambien he puesto un dropbox para seleccionar cuantos frames coger para el heatmap live, estaba antes a 1 / 10, lo he dejado a 1 / 50, si sigue yendo lento lo puedes bajar a 1/ 100 o 1 / 500

ivanjimenez commented 1 year ago

Modificaciones:

Image

ivanjimenez commented 1 year ago

Lo de arriba está casi todo hecho y para que no se pierda he mudado dos cosas de arriba a la siguiente lista y que tiene actualizadas las cosas:

Sobre los sujetos:

Algunas cosas que he visto en las pruebas:

Informes El asunto informes lo tengo que debatir contigo, pues igual hacemos algo más simple.

bernatDiaz commented 1 year ago

El pressure map al seleccionar min, avg, o max se vuelve a cambiar de tamaño. Tiene que ocupar siempre todo su marco con el mismo tamaño. A mi me va bien, no se ve igual que en este video? https://github.com/IBCBio/insolesibc/assets/18369978/0cd47ef9-46ec-4524-8b23-70cec441dc92

ivanjimenez commented 1 year ago

Image

ivanjimenez commented 1 year ago

Image

Image

ivanjimenez commented 1 year ago

https://ibcbiomechanics-my.sharepoint.com/:i:/g/personal/ijimenez_ibc_bio/ETdok27ICvZIqcFM_qBzxm0BZMu0byXwZ021tBHuIkhYDA?e=3tZ2QK

Aquí está el proyecto:

https://github.com/hightower70/WPFHeatMap

No obstante, después vemos cómo podemos acometer la matriz de 200K puntos con Scottplot antes y si no resulta pues deberemos ver otras opciones.

bernatDiaz commented 1 year ago

El que esta ahora es de 445 x 615 = 273.675 puntos

bernatDiaz commented 1 year ago

Al animar la plantilla del heatmap se vuelve pequeña No se muy bien como hacer esto, estoy usando:

plot.Plot.SetInnerViewLimits(xMin, xMax, yMin, yMax);
plot.Plot.SetOuterViewLimits(yMin: 0);

plot.Plot.SetAxisLimits(xMin, xMax, yMin, yMax);

A mi me funciona bien pero parece que no va bien en todos los ordenadores

bernatDiaz commented 1 year ago

Para Lunes 3 de Julio

Paso a comentar por aquí tareas:

Butterfly -> UserControls/GrafoMariposa.xaml.cs variable plot Heatmap -> UserControls/Heatmap.xaml.cs variables plot

Vas a realizar lo siguiente para que quede más claro:

Image

Image

Tengo una reunión con Jose como a las 10, después de dicha reunión hablamos.

bernatDiaz commented 1 year ago

Aquí es ver cómo está diseñado. ¿Puedo recuperar en GRF.xaml.cs la vista con los Heatmap y Butterfly para acceder a sus plots? Para esto habria que crear un Servicio y hacerlo todo desde alli mejor. Lo he creado en Services/InformesGeneratorService y he movido el codigo del GRF. El servicio tiene una referencia al Heatmap y mariposa tambien

ivanjimenez commented 1 year ago

Image

Image

Entonces aquí hay algo que debemos concretar. Todos los ficheros se graban en Documents, verdad? Y de ahí saca la bd. Porque siendo así tendremos que igualmente grabar ahí los informes. Los ficheros img se pueden grabar en alguna carpeta Temp que tengamos en la aplicación.

ivanjimenez commented 1 year ago

Bernat, prefiero que priorices lo de la calibración. Quiero probar ambos métodos, el de calibración y el otro de multiplicar por 2 el resultante de cada plantilla y he quedado con Claudia el jueves para hacer tests.

ivanjimenez commented 1 year ago

Image

Yo veo los newtons en streaming que están más o menos bien.

Image

20230705-23-46-57-216.txt

Image

bernatDiaz commented 1 year ago

Si que estaban intercanviados Total_left y total_right al escribir. Lo he cambiado

bernatDiaz commented 1 year ago

He hecho lo del FC lo he subido en mi rama quitando lo del * 2. En la rama principal solo he arreglado lo que estaban intercanbiados y lo he dejado como lo tenias.

ivanjimenez commented 1 year ago

Perfecto, gracias. Puedes hacerme una release de la de fc y otra de *2? La dejas en releases. Muchas gracias

bernatDiaz commented 1 year ago

https://github.com/IBCBio/insolesibc/releases/tag/MVVMx2 https://github.com/IBCBio/insolesibc/releases/tag/MVVM_fc

ivanjimenez commented 1 year ago

Ayer hicimos algunos tests, sobretodo el 299:

https://ibcbiomechanics-my.sharepoint.com/:f:/g/personal/ijimenez_ibc_bio/ElYrc1gV5m9Lh_EC9VMU-4MBBDk-SVDfwfz9qNr2_izJgg?e=oBrgsg

Mañanta tengo otras pruebas programadas con Claudia como a las 12.

bernatDiaz commented 1 year ago

leftOnly.txt rightOnly.txt Diria que esta todo bien. He grabado un test solo con el pie izquierdo y otro solo con el derecho y salen bien.

bernatDiaz commented 1 year ago

El fichero csv resultante debería tener los datos con el FC calculado, si no, para el visual3d no sería válido. Creo que es mejor grabar a fuego el FC calculado en el csv y obviar el fC en la etapa de análisis. O eso o exportar con alguna opción un csv con el FC calculado. Y no sólo para el LTOTAL y RTOTAL si para todos los sensores, ya que los clientes usan el Visual3d para todos los sensores no los totales. Coméntame qué opción ves más simple. Gracias Es mas facil poner una opcion para exportar con el fc calculado

bernatDiaz commented 1 year ago

He hecho la segunda opcion que es mas simple. He añadido un menu contextual "Exportar FC" genera un fichero en la misma carpeta con el nombre file.txt -> filefc.txt

ivanjimenez commented 1 year ago

leftOnly.txt rightOnly.txt Diria que esta todo bien. He grabado un test solo con el pie izquierdo y otro solo con el derecho y salen bien.

La cámara no está invertida? Puedes hacer un test con cámara y comprobarlo? Es raro pq tuve que cambiar el csv.

bernatDiaz commented 1 year ago

yo lo veo bien, te he pasado los ficheros por teams porque aqui no me deja subir el video

ivanjimenez commented 1 year ago

Image

ivanjimenez commented 1 year ago

Bernat:

Dados los tests del viernes hay que ver algunas cosas y priorizarlas:

Test plantillas.docx

Mañana hablamos.

bernatDiaz commented 1 year ago

Codigo de la grabación (no veo nada que este mal) (los fragmentos importantes son el primero y el ultimo)

private void ImageGrabbedCallback(object? sender, EventArgs eventArgs)
        {
            Mat frame = new Mat();
            videoCapture.Retrieve(frame);
            cameraService.InvokeFrameAvailable(index, frame);
        }
public void InvokeFrameAvailable(int index, Mat frame)
        {
            try
            {
                FrameAvailable?.Invoke(indicesMap[index], frame);
            }
            catch(KeyNotFoundException)
            {
                Trace.WriteLine("InvokeFrameAvailable KeyNotFoundException");
            }
        }
cameraService.FrameAvailable += (int index, Mat frame) =>
            {
                if (index == 0)
                {
                    Application.Current.Dispatcher.BeginInvoke(() =>
                    {
                        CurrentFrameTop = FormatConversions.ToBitmapSource(frame);
                    });
                    saveService.AppendVideo(frame, index);
                }
                else if(index == 1)
                {
                    Application.Current.Dispatcher.BeginInvoke(() =>
                    {
                        CurrentFrameBottom = FormatConversions.ToBitmapSource(frame);
                    });
                    saveService.AppendVideo(frame, index);
                }
            };
public void AppendVideo(Mat frame, int index)
        {
            if (!state.paused)
            {
                if (videoWriters != null)
                {
                    if (videoWriters[index] != null) // Race condition
                    {
                        lock (videoWriters[index])
                        {
                            if (videoWriters[index] != null)
                                videoWriters[index].Write(frame);
                        }
                    }
                }
            }
        }
bernatDiaz commented 1 year ago

https://ibcbiomechanics-my.sharepoint.com/:f:/g/personal/bdiaz_ibc_bio/EgfJdXZCmNxHv_gkynoTm40BmnMZOQujj7S7i5EOku3Tqg?e=sDo71L

bernatDiaz commented 1 year ago

https://ibcbiomechanics-my.sharepoint.com/:f:/g/personal/bdiaz_ibc_bio/Eil49LwYFq9OgX2UyNIT3KQBMO9VDe2kwHvbB7ZV7CmK7g?e=Kxc2X4 yo lo veo mas ajustado así

ivanjimenez commented 1 year ago

Has hecho algún cambio? Algún commit?