<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/feed.xml" rel="self" type="application/atom+xml" /><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/" rel="alternate" type="text/html" /><updated>2026-04-15T13:50:31+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/feed.xml</id><title type="html">TFG 2025 Joan Aristizábal (Weblog)</title><subtitle>Bitácora del desarrollo del Trabajo de Fin de Grado.</subtitle><author><name>Joan Aristizábal Guillén</name></author><entry><title type="html">Semana 24. Mejora de brain y vuelta a las simulaciones</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-24/" rel="alternate" type="text/html" title="Semana 24. Mejora de brain y vuelta a las simulaciones" /><published>2026-04-15T00:00:00+00:00</published><updated>2026-04-15T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-24</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-24/"><![CDATA[<p>Esta semana ya he tenido acceso a un servidor (Solomillo) para poder simular correctamente en Carla.</p>

<ul>
  <li>
    <p>Para poder continuar con el desarrollo de brain con predicción de control, primero he adaptado tanto el código que usamos para la grabación de dataset como el de predicción, <em>brain_rec</em> y <em>brain_predict</em>.</p>
  </li>
  <li>
    <p>Se han eliminado, por el momento, el sensor LiDAR y su visualización, ya que se está trabajando con la cámara frontal y así reducimos el coste computacional.</p>
  </li>
  <li>
    <p>Modo síncrono para que la simulación avance de forma controlada, frame a frame, y para que los sensores, imágenes, control y etiquetas queden alineados temporalmente.</p>
  </li>
  <li>
    <p>Ajuste del tamaño de imagen a mejor resolución, para reducir carga computacional.</p>
  </li>
</ul>

<p>He estado probando la simulación con los últimos modelos entrenados en semanas anteriores para testear qué tal funcionan en este nuevo entorno de simulación. Se predice de forma coherente el steering, realizando correcciones de volante y giros siguiendo las carreteras de los entornos. No obstante, está por refinar el balanceo de los datos y su el entrenamiento.</p>

<p>Ahora estoy en la grabación de un dataset que esté bien registrado y con el entrenamiento de un modelo con PilotNet con este nuevo conjunto de datos.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Throttle" /><category term="PilotNet" /><category term="Predict" /><summary type="html"><![CDATA[Esta semana ya he tenido acceso a un servidor (Solomillo) para poder simular correctamente en Carla.]]></summary></entry><entry><title type="html">Semana 23. Redacción de la memoria</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-23/" rel="alternate" type="text/html" title="Semana 23. Redacción de la memoria" /><published>2026-04-08T00:00:00+00:00</published><updated>2026-04-08T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-23</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-23/"><![CDATA[<p>Estas dos últimas semanas se ha continuado con los primeros capítulos de la memoria del presente proyecto.
En cuanto al capítulo 1, está prácticamente terminado, a falta de concretar el contenido de los capítulos donde se expone el proyecto en cuestión.</p>

<p>Ya se ha empezado y avanzado con la redacción del segundo capítulo y se sigue a la espera de que esté operativo el servidor Libélula, para poder continuar con el desarrollo y las pruebas en Carla del sistema de control (brain) con un modelo de predicción entrenado con PilotNet.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Memoria" /><category term="Estado del Arte" /><summary type="html"><![CDATA[Estas dos últimas semanas se ha continuado con los primeros capítulos de la memoria del presente proyecto. En cuanto al capítulo 1, está prácticamente terminado, a falta de concretar el contenido de los capítulos donde se expone el proyecto en cuestión.]]></summary></entry><entry><title type="html">Semana 22</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-22/" rel="alternate" type="text/html" title="Semana 22" /><published>2026-03-04T00:00:00+00:00</published><updated>2026-03-04T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-22</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-22/"><![CDATA[<p>Esta semana se ha continuado, al igual que en las semanas anteriores, en el inicio de la memoria. Estamos a la espera de que esté operativo de nuevo el servidor Libélula, para poder continuar con el trabajo que llevábamos hasta ahora.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Memoria" /><summary type="html"><![CDATA[Esta semana se ha continuado, al igual que en las semanas anteriores, en el inicio de la memoria. Estamos a la espera de que esté operativo de nuevo el servidor Libélula, para poder continuar con el trabajo que llevábamos hasta ahora.]]></summary></entry><entry><title type="html">Semanas 19, 20 y 21</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-21/" rel="alternate" type="text/html" title="Semanas 19, 20 y 21" /><published>2026-02-24T00:00:00+00:00</published><updated>2026-02-24T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-21</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-21/"><![CDATA[<h2 id="semanas-19-y-20-inicio-y-organización-de-memoria-en-overleaf">Semanas 19 y 20: Inicio y organización de memoria en Overleaf</h2>

<p>Estas últimas semanas, debido a que se está pendiente de que se restablezca el servidor Libélula, he estado organizando el contenido en Overleaf y la bibliografía de consulta para la realización de este proyecto, además de redactar el contenido de la introducción y el estado del arte de la memoria.</p>

<p>Además, se estuvo probando en otro PC (con Carla instalado) el último modelo entrenado con PilotNet. Sin embargo, no se pueden extraer conclusiones de las simulaciones realizadas debido a diversos factores condicionantes (PC, GPU del equipo, dataset, entrenamiento, etc).</p>

<h2 id="semana-21-redacción-de-la-memoria">Semana 21: Redacción de la memoria</h2>

<p>Esta última semana se ha continuado con la redacción del capítulo introductorio y con la estructura de los ficheros de Overleaf (que causaban errores la semana anterior).</p>

<p>La estructura que se plantea para el índice de la memoria, con respecto a los dos primeros capítulos, es la siguiente:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>1.Introducción y objetivos
- 1.1 Contexto y motivación
- 1.2 Aprendizaje profundo extremo a extremo
- 1.3 Objetivos
- 1.4 Metodología
- 1.5 Organización de la memoria

2.Estado del Arte
- 2.1 Sensores LiDAR
- 2.2 Segmentación semántica
- 2.3 Conducción autónoma
- 2.4 Aprendizaje por Imitación
</code></pre></div></div>

<p>Se espera poder seguir avanzando en las próximas semanas con el entrenamiento de modelos de conducción autónoma.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Throttle" /><category term="PilotNet" /><category term="Predict" /><summary type="html"><![CDATA[Semanas 19 y 20: Inicio y organización de memoria en Overleaf]]></summary></entry><entry><title type="html">Semana 18: Brain Predict</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-18/" rel="alternate" type="text/html" title="Semana 18: Brain Predict" /><published>2026-02-03T00:00:00+00:00</published><updated>2026-02-03T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-18</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-18/"><![CDATA[<p>Esta semana se ha creado y perfeccionado <em>brain_predict</em>, una versión modificada de <em>brain</em> original para poder probar el modelo basado en PilotNet, entrenado durante las últimas semanas, en simulación con Carla.</p>

<p>Esta modificación de nuestro cerebro es una adaptación para poder simular la conducción autónoma del coche mediante la predicción de un modelo. A diferencia de <em>brain</em>, este módulo no cuenta con teleoperación por teclado del vehículo, si no que a medida que avanza la simulación, el modelo entrenado predice los actuadores del vehículo y se aplican al simulador con <em>vehicle_control</em>.</p>

<p>Además, y pese a las dificultades para simular con el equipo actual, se ha ido probando la predicción de los últimos modelos entrenados en varios escenarios de Carla. Se ha configurado en dichas pruebas que throttle sea constante (=0.5) y steer sea el valor de salida del modelo de PilotNet.</p>

<p>El coche acaba por desviarse o colisionar con obstáculos en las vías, ya que la tasa de frames a la que se generan imágenes (entrada del modelo) y la velocidad a la que puede procesar/recibir el modelo es muy baja. Por tanto, se va acumulando error en la predicción a causa del retardo. El modelo acaba prediciendo frames de momentos que ya han sucedido y la predicción llega tarde, por lo que no reacciona a tiempo.</p>

<p>Como se ha explicado anteriormente, con throttle constante y a un valor intermedio, conseguimos “ganar tiempo” para que el modelo pueda predecir y reaccionar. Los resultados de simulación con las predicciones de steer han sido satisfactorias y coherentes, en cuanto a conducción se refiere, y a pesar de las dificultades.</p>

<p>A continuación, un ejemplo de la predicción del último modelo entrenado con PilotNet: https://youtu.be/bm7dYxGvnlc</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Throttle" /><category term="PilotNet" /><category term="Predict" /><summary type="html"><![CDATA[Esta semana se ha creado y perfeccionado brain_predict, una versión modificada de brain original para poder probar el modelo basado en PilotNet, entrenado durante las últimas semanas, en simulación con Carla.]]></summary></entry><entry><title type="html">Semana 17: Revisión del dataset, nuevos entrenamientos y pruebas</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-17/" rel="alternate" type="text/html" title="Semana 17: Revisión del dataset, nuevos entrenamientos y pruebas" /><published>2026-01-27T00:00:00+00:00</published><updated>2026-01-27T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-17</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-17/"><![CDATA[<p>Esta semana hemos vuelto al entrenamiento de un modelo con los actuadores steer y throttle, usados en semanas anteriores.</p>

<p>Principalmente, se ha revisado el dataset completo con el objetivo de eliminar muestras que pudieran causar error en el aprendizaje del modelo durante el entrenamiento, es decir, todas aquellas muestras que son de mala conducción hecha a propósito que finalmente tienen una rectificación (reflejada en los actuadores). Dejando las muestras que forman parte de la rectificación o corrección del error.</p>

<p>Posteriormente se ha balanceado el dataset, ya con las muestras que son de interés, y se ha procedido al entrenamiento de un modelo de redes neuronales con PilotNet. A diferencia de estas últimas semanas, la salida de esta red neuronal será de los actuadores steer y throttle.</p>

<p>Tras realizar varios entrenamientos y ver progresos positivos con respecto a las anteriores semanas y que el modelo converge (comparando los valores de pérdida de train y val), se piensa que el error no está en el entrenamiento o en el dataset. La predicción, como se ha explicado en anteriores reportes semanales, empieza siendo acertada y coherente desde el punto de vista de la conducción en los primeros segundos. No obstante, a causa de un frame rate muy bajo (5 FPS) la predicción no está sincronizada con los frames a medida que avanza nuestro vehículo. Esto provoca que el coche se desvíe, a falta de recibir un valor actualizado de los actuadores, y a pesar de poder llegar a ‘reengancharse’ a la conducción con algún frame nuevo actualizado, la corrección en la predicción no llega a tiempo.</p>

<p>Para  aumentar el número de FPS se ha intentado optimizar el código durante la simulación: evitar prints innecesarios, corregir funciones asíncronas (callbacks), quitar la visión de la cámara frontal (que visualizábamos con pygame), etc. Sin embargo, sigue siendo insuficiente.</p>

<p>Se plantea, por ahora, la realización de un test off-line, con la creación de un nuevo dataset (o buscar alguno de dominio público) y realizar pruebas de predicción para poner a prueba el modelo.</p>

<p>A continuación, un ejemplo de la predicción del último modelo entrenado con PilotNet: https://youtu.be/h_bwam8taaE</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Throttle" /><category term="PilotNet" /><summary type="html"><![CDATA[Esta semana hemos vuelto al entrenamiento de un modelo con los actuadores steer y throttle, usados en semanas anteriores.]]></summary></entry><entry><title type="html">Semana 16: Ampliación y balanceo de dataset y entrenamientos de PilotNet y MobileNet</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-16/" rel="alternate" type="text/html" title="Semana 16: Ampliación y balanceo de dataset y entrenamientos de PilotNet y MobileNet" /><published>2026-01-19T00:00:00+00:00</published><updated>2026-01-19T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-16</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-16/"><![CDATA[<p>Esta semana se ha ampliado el dataset de 17-18k muestras a 42k muestras de variedad (sin balancear). Se han sumado al dataset, creado las semanas anteriores, 23k muestras más y en en nuevos escenarios.</p>

<p>Posteriormente se ha balanceado el conjunto de datos de siguiendo el siguiente criterio: la parte central del (valores de steer rondando el 0) se han mantenido con mayor número de muestras al ser el caso más común en conducción, se ha aumentado el resto de los bins que eran menos comunes y los valores más extremos (que representan giros forzados o volantazos) se han aumentado también, pero en menor proporción que los demás casos. El aumento de datos se ha realizado repitiendo casos ya existentes en el dataset.</p>

<p>A diferencia de las anteriores semanas y por probar con alternativas al uso de steer_rate label de entrada a nuestro modelo, se ha vuelto probado con el valor de steer, cuyos valores obtenidos son a partir del mismo valor de steer_rate. Gracias al valor de steer_rate, como entrada de teclado, obtenemos valores de steer mucho más graduales que en semanas anteriores, lo cual nos proporciona gran variedad de etiquetas para entrenar un modelo.</p>

<p>A continuación se muestra el balanceo explicado anteriormente para ambas etiquetas: steer_rate y steer, respectivamente.</p>

<figure class="align-center" style="max-width: 100%">
  <img src="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/assets/images/semana16/Figure_1.png" alt="Figura1" />
</figure>

<figure class="align-center" style="max-width: 100%">
  <img src="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/assets/images/semana16/Figure_2.png" alt="Figura2" />
</figure>

<p>Finalmente, se han entrenado modelos con PilotNet y MobileNet.</p>

<p>-PilotNet: para el dataset con etiquetas de steer_rate no ha sido para nada exitoso, pues se desvía con rapidez y pasa a valores extremos. Por otra parte, con valores de steer en los labels sí muestra una buena conducción con giros coherentes y corrección en los giros. Todo esto teniendo en cuenta que se ha probado en varias simulaciones y distintos escenarios con un valor de throttle constante y con el manejo de los actuadores de throttle y brake.</p>

<p>-MobileNet: no ha dado tiempo a probar un modelo entrenado, por errores en la entrada del modelo para su predicción y falta de tiempo. Es decir, errores en para conectar el modelo a Brain.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Steer_rate" /><category term="Pytorch" /><category term="PilotNet" /><category term="MobileNet" /><summary type="html"><![CDATA[Esta semana se ha ampliado el dataset de 17-18k muestras a 42k muestras de variedad (sin balancear). Se han sumado al dataset, creado las semanas anteriores, 23k muestras más y en en nuevos escenarios.]]></summary></entry><entry><title type="html">Semana 15</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-15/" rel="alternate" type="text/html" title="Semana 15" /><published>2026-01-12T00:00:00+00:00</published><updated>2026-01-12T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-15</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-15/"><![CDATA[<p>Durante estas semanas hemos estado con diversas cosas. Por una parte, hemos podido continuar con la preparación de un dataset para posteriormente entrenar modelos de redes neuronales que puedan predecir el giro de volante de un vehículo simulado. Por otra, se ha estado analizando la manera en que hemos estado avanzando para crear y balancear el dataset, y para entrenar un modelo y su posterior predicción mediante un test online; con el objetivo de ver qué puede estar generando errores de predicción.</p>

<h2 id="semanas-anteriores">Semanas anteriores.</h2>

<p>Este post es un resumen de lo realizado estas semanas, así que vamos a repasar lo que teníamos hasta ahora.</p>

<ol>
  <li>
    <p>Hemos creado un cerebro (brain.py), para visualizar mediante una cámara frontal y un sensor LiDAR, y teleoperar un vehículo mediante teclado en el simulador Carla. Realizado a partir de trabajo previo hecho por compañeros.</p>
  </li>
  <li>
    <p>Hemos creado (esta última vez) un dataset para registrar por una parte, los frames de la cámara frontal del vehículo (simulado en Carla), y por otra, los valores de steer_rate obtenidos tras pulsar A o D (con los que se calcula steer, es decir, una variable intermedia que mide la velocidad de giro del volante).</p>
  </li>
  <li>
    <p>Tras la creación del dataset, de 17k muestras (aprox.), hemos balanceado el mismo para igualar el número de muestras/etiqueta del conjunto, para que haya un número igual o parecido de muestras para cada valor de steer_rate. No obstante, se ha dejado un número superior de muestras para un steer_rate que ronde el origen, para que siga habiendo superioridad en el caso más común de conducción, “ir recto”. Finalmente, el dataset balanceado es de 40k muestras.</p>
  </li>
  <li>
    <p>Tras el balanceo, se ha construido un modelo de PilotNet (mostrado en las anteriores semanas) para entrenarlo con el dataset balanceado. Tras varios intentos tras el entrenamiento del modelo, que no ha dado resultados de giro coherente del volante, surge la duda de dónde podría estar el error.</p>
  </li>
</ol>

<figure class="align-center" style="max-width: 100%">
  <img src="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/assets/images/semana15/Figure_1.png" alt="Figura1" />
</figure>

<p>Al analizar qué es lo que puede estar fallando en la predicción, hay varias partes de nuestro trabajo que podrían estar causando error:</p>

<ul>
  <li>El conjunto de datos: tanto el contenido de información como la manera en que obtenemos los frames (espacio de color, tamaño, etc.) como las etiquetas o los valores de steer_rate.</li>
  <li>El balanceo del dataset: el número de muestras por cada ‘label’.</li>
  <li>El modelo de redes neuronales (PilotNet en nuestro caso) en el entrenamiento.</li>
  <li>Brain, al predecir el modelo el valor de steer_rate: la predicción, el cálculo de steer o el input del modelo entrenado.</li>
</ul>

<p>Se han identificado y corregido errores en las imágenes del dataset, en el balanceo del mismo y en el cálculo de steer (tras obtener la predicción de steer_rate) que, a priori, podían ser los causantes de la mala conducción. Sin embargo, seguimos teniendo un volante (con velocidad constante, throttle = 0.5) que gira de extremo a extremo. Pasa de forma gradual de valores de steer=1 a steer=-1. Analizando varias pruebas, puede que realmente el error de predicción esté en el balanceo del conjunto de datos.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Control" /><summary type="html"><![CDATA[Durante estas semanas hemos estado con diversas cosas. Por una parte, hemos podido continuar con la preparación de un dataset para posteriormente entrenar modelos de redes neuronales que puedan predecir el giro de volante de un vehículo simulado. Por otra, se ha estado analizando la manera en que hemos estado avanzando para crear y balancear el dataset, y para entrenar un modelo y su posterior predicción mediante un test online; con el objetivo de ver qué puede estar generando errores de predicción.]]></summary></entry><entry><title type="html">Dataset con variable intermedia</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-14/" rel="alternate" type="text/html" title="Dataset con variable intermedia" /><published>2025-12-22T00:00:00+00:00</published><updated>2025-12-22T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-14</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-14/"><![CDATA[<p>Esta semana el objetivo era el de crear un nuevo dataset, balancearlo en base a su distribución estadística, y entrenar un modelo con PilotNet. Esta última no ha sido del todo posible, pues el servidor Libélula sigue sin estar operativo.</p>

<h2 id="creación-de-un-nuevo-dataset">Creación de un nuevo dataset</h2>

<p>Se ha creado un dataset nuevo, en varios escenarios del simulador Carla, controlando con los actuadores la aceleración (throttle), el freno (brake) y la velocidad de giro (steer_rate). Este último parámetro, como se intrudujo la semana pasada, se trata de una variable intermedia a partir de la cual se obtiene el actuador steer (ángulo/desplazamiento de giro del volante).</p>

<p>Inicialmente, se ha creado un dataset de 17k muestras, pues por el momento no es posible entrenar un conjunto de datos mayor por las limitaciones del equipo y por la inactividad del servidor, Libélula.</p>

<p>Para el balanceo del dataset, se ha normalizado a área 1 el histograma (cálculo de la FDP) y, posteriormente, se han ido eliminando bins hasta obtener una forma lo más parecida posible a la función gaussiana calculada con la media (media=0.00847) y desviación típica (desv=0.274) del propio conjunto de datos. A continuación, se muestra la FDP del conjunto de muestras antes y después del balanceo, respectivamente:</p>

<figure class="align-center" style="max-width: 100%">
  <img src="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/assets/images/hist_inicial.png" alt="Histograma inicial" />
</figure>

<figure class="align-center" style="max-width: 100%">
  <img src="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/assets/images/hist_balanceado.png" alt="Histograma dataset balanceado" />
</figure>

<h2 id="entrenamiento-y-simulación-para-predecir-steer">Entrenamiento y simulación para predecir STEER</h2>

<p>Como se ha comentado antes, no se ha podido entrenar un modelo con PilotNet, ni simular posteriormente con el modelo que pueda predecir el valor de steer_rate.</p>

<p>Sí se ha realizado, con las limitaciones que tiene el equipo actual, un entrenamiento con 10k muestras en local. No obstante, se tiene en cuenta que el número de muestras es muy bajo e insuficiente como para poder entrenar un modelo funcional.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Control" /><summary type="html"><![CDATA[Esta semana el objetivo era el de crear un nuevo dataset, balancearlo en base a su distribución estadística, y entrenar un modelo con PilotNet. Esta última no ha sido del todo posible, pues el servidor Libélula sigue sin estar operativo.]]></summary></entry><entry><title type="html">Velocidad de giro</title><link href="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-13/" rel="alternate" type="text/html" title="Velocidad de giro" /><published>2025-12-15T00:00:00+00:00</published><updated>2025-12-15T00:00:00+00:00</updated><id>https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-13</id><content type="html" xml:base="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/weblog/Semana-13/"><![CDATA[<h2 id="nuevo-controlador-con-la-velocidad-de-giro-como-variable-intermedia">Nuevo controlador con la velocidad de giro como variable intermedia</h2>

<p>Esta semana hemos creado un nuevo controlador para teleoperar un vehículo simulado en Carla con el objetivo de mejorar nuestro dataset. Esta vez, nos centramos en el steering y, para ello, hemos seguido la idea con la que trabajamos la anterior semana: crear una variable intermedia entre teclas y actuadores. Nos vamos a enfocar, para probar cómo aprende nuestro modelo de redes neuronales, en la velocidad de giro (<em>steer_rate</em>).</p>

<p>El target representa la intención de giro del conductor (o del sistema), y se obtiene a partir de la entrada por teclado: pulsar la tecla A genera un target negativo (giro a la izquierda) y  la tecla D genera un target positivo (giro a la derecha). Si no hay entrada, el target es cero. Este target no corresponde al ángulo del volante, sino a una velocidad deseada de giro (<em>steer_rate_cmd</em>).</p>

<p>Para evitar cambios bruscos e irreales, el comando de velocidad se somete a un filtro de primer orden:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>- steer_rate : es la velocidad real del volante
- steer_rate_cmd : es la velocidad objetivo
- ALPHA_STEER : parámetro de suavizado para hacer más gradual el aumento/disminución de la velocidad. Es la inercia del sistema del volante.
</code></pre></div></div>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">steer_rate</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">ALPHA_STEER</span><span class="p">)</span> <span class="o">*</span> <span class="n">steer_rate</span> <span class="o">+</span> <span class="n">ALPHA_STEER</span> <span class="o">*</span> <span class="n">steer_rate_cmd</span>
</code></pre></div></div>

<p>A partir de esta velocidad de giro del volante, obtenemos el ángulo o el desplazamiento de giro del volante (steer_real), que es el que irá directamente al actuador de steer:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">steer_real</span> <span class="o">+=</span> <span class="n">steer_rate</span> <span class="o">*</span> <span class="n">dt</span>
</code></pre></div></div>

<p>A continuación, se muestra el código completo del controlador del vehículo:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1"># Parámetros del volante
</span><span class="n">STEER_RATE_MAX</span> <span class="o">=</span> <span class="mi">1</span>     <span class="c1"># velocidad máxima de giro
</span><span class="n">ALPHA_STEER</span> <span class="o">=</span> <span class="mf">0.2</span>        <span class="c1"># suavizado
</span>
<span class="k">def</span> <span class="nf">control</span><span class="p">(</span><span class="n">vehicle</span><span class="p">):</span>
    <span class="k">global</span> <span class="n">steer_real</span><span class="p">,</span> <span class="n">steer_rate</span><span class="p">,</span> <span class="n">last_time</span><span class="p">,</span> <span class="n">throttle</span>

    <span class="n">control</span> <span class="o">=</span> <span class="n">carla</span><span class="p">.</span><span class="n">VehicleControl</span><span class="p">()</span>
    <span class="n">keys</span> <span class="o">=</span> <span class="n">pygame</span><span class="p">.</span><span class="n">key</span><span class="p">.</span><span class="n">get_pressed</span><span class="p">()</span>

    <span class="n">now</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="n">time</span><span class="p">()</span>
    <span class="n">dt</span> <span class="o">=</span> <span class="n">now</span> <span class="o">-</span> <span class="n">last_time</span>
    <span class="n">last_time</span> <span class="o">=</span> <span class="n">now</span>

    <span class="c1"># Velocidad objetivo según el giro izquierda(A)/derecha(D)
</span>    <span class="k">if</span> <span class="n">keys</span><span class="p">[</span><span class="n">pygame</span><span class="p">.</span><span class="n">K_a</span><span class="p">]:</span>
        <span class="n">steer_rate_cmd</span> <span class="o">=</span> <span class="o">-</span><span class="n">STEER_RATE_MAX</span>
    <span class="k">elif</span> <span class="n">keys</span><span class="p">[</span><span class="n">pygame</span><span class="p">.</span><span class="n">K_d</span><span class="p">]:</span>
        <span class="n">steer_rate_cmd</span> <span class="o">=</span> <span class="n">STEER_RATE_MAX</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">steer_rate_cmd</span> <span class="o">=</span> <span class="mf">0.0</span>
        <span class="n">steer_real</span> <span class="o">=</span> <span class="mf">0.0</span>

    <span class="c1"># Velocidad real de giro del volante
</span>    <span class="n">steer_rate</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">ALPHA_STEER</span><span class="p">)</span> <span class="o">*</span> <span class="n">steer_rate</span> <span class="o">+</span> <span class="n">ALPHA_STEER</span> <span class="o">*</span> <span class="n">steer_rate_cmd</span>


    <span class="c1"># Cálculo de Steer
</span>    <span class="n">steer_real</span> <span class="o">+=</span> <span class="n">steer_rate</span> <span class="o">*</span> <span class="n">dt</span>

    <span class="c1"># Limitar ángulo de giro
</span>    <span class="n">steer_real</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="o">-</span><span class="mf">1.0</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="mf">1.0</span><span class="p">,</span> <span class="n">steer_real</span><span class="p">))</span> 
    <span class="n">control</span><span class="p">.</span><span class="n">steer</span> <span class="o">=</span> <span class="n">steer_real</span>
   
    <span class="n">velocidad_giro</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">steer_rate</span><span class="p">)</span>
    <span class="n">tiempo</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">now</span><span class="p">)</span>

    <span class="c1"># W throttle 
</span>    <span class="k">if</span> <span class="n">keys</span><span class="p">[</span><span class="n">pygame</span><span class="p">.</span><span class="n">K_w</span><span class="p">]:</span>
        <span class="n">throttle</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">throttle</span> <span class="o">+</span> <span class="mf">0.25</span><span class="p">,</span> <span class="mf">1.0</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">throttle</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">throttle</span> <span class="o">-</span> <span class="mf">0.25</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">)</span>

    <span class="n">control</span><span class="p">.</span><span class="n">throttle</span> <span class="o">=</span> <span class="n">throttle</span>

    <span class="c1"># S freno
</span>    <span class="k">if</span> <span class="n">keys</span><span class="p">[</span><span class="n">pygame</span><span class="p">.</span><span class="n">K_s</span><span class="p">]:</span>
        <span class="n">control</span><span class="p">.</span><span class="n">brake</span> <span class="o">=</span> <span class="mf">1.0</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">control</span><span class="p">.</span><span class="n">brake</span> <span class="o">=</span> <span class="mf">0.0</span>

    <span class="n">vehicle</span><span class="p">.</span><span class="n">apply_control</span><span class="p">(</span><span class="n">control</span><span class="p">)</span>

    <span class="k">print</span><span class="p">(</span>
        <span class="s">"| steer_rate:"</span><span class="p">,</span> <span class="nb">round</span><span class="p">(</span><span class="n">steer_rate</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
        <span class="s">"| steer:"</span><span class="p">,</span> <span class="nb">round</span><span class="p">(</span><span class="n">steer_real</span><span class="p">,</span> <span class="mi">3</span><span class="p">),</span>
        <span class="s">"| throttle:"</span><span class="p">,</span> <span class="nb">round</span><span class="p">(</span><span class="n">control</span><span class="p">.</span><span class="n">throttle</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
    <span class="p">)</span>

    <span class="k">return</span> <span class="n">steer_rate</span><span class="p">,</span> <span class="n">control</span><span class="p">.</span><span class="n">throttle</span><span class="p">,</span> <span class="n">control</span><span class="p">.</span><span class="n">steer</span><span class="p">,</span> <span class="n">control</span><span class="p">.</span><span class="n">brake</span>

</code></pre></div></div>

<p>Para comprobar que los progresos fueran por “buen camino”, se ha ido representando la evolución de la velocidad del volante en función del tiempo en varias simulaciones. A continuación, se muestra una figura en que se pueden observar varios picos positivos, que indican giros a la derecha (botón D) y un pico negativo, que es un giro a la izquierda (botón A):</p>

<figure class="align-center" style="max-width: 100%">
  <img src="https://roboticslaburjc.github.io/2025-tfg-joan-aristizabal/assets/images/Figure_1.png" alt="Velocidad de giro" />
</figure>

<p>Se ha relizado una captura de unos pocos minutos de una simulación mientras se teleopera el coche con este nuevo controlador. A continuación, el enlace del vídeo: https://youtu.be/XJHhS1smjVQ</p>

<h3 id="conclusiones">Conclusiones</h3>

<p>Esta semana hemos creado un nuevo controlador para obtener un parámetro intermedio (entre botón y actuador), la velocidad de giro del volante, con el que vamos a generar un nuevo dataset como único parámetro.</p>

<p>La próxima semana, el objetivo será el de crear un dataset con dicho parámetro como <em>label</em> y estudiar cómo mejora el entrenamiento y aprendizaje de nuestro modelo de redes neuronales.</p>]]></content><author><name>Joan Aristizábal Guillén</name></author><category term="Weblog" /><category term="Carla" /><category term="Brain" /><category term="PythonAPI" /><category term="Steer" /><category term="Control" /><summary type="html"><![CDATA[Nuevo controlador con la velocidad de giro como variable intermedia]]></summary></entry></feed>