<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>POWER OVERWHELMING - ChallP1 @ HSR</title>
    <description>Log fuer das Challenge Projekt 1 an der HSR</description>
    <link>https://tourn.github.io/ChallP1/ChallP1/</link>
    <atom:link href="https://tourn.github.io/ChallP1/ChallP1/feed.xml" rel="self" type="application/rss+xml" />
    
      <item>
        <title>(Update) Implementieren eines Kalman-Filters</title>
        <description>&lt;p&gt;Das bestimmen der eigenen Position zur Entscheidung, wie in Zukunft gas gegeben werden soll, ist nicht ganz einfach. Insbesondere ist es schwierig, herauszufinden, wie sich die Strecke verändert. Ein Mitstudent hat uns einen &lt;a href=&quot;http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/#mjx-eqn-kalgainfull&quot;&gt;spannenden Artikel&lt;/a&gt; zukommen lassen.&lt;/p&gt;

&lt;p&gt;Nach einigen Stunden Einlesen waren wir uns immer noch nicht sicher, wie gut sich ein Kalman-Filter auf unser Problem anwenden lässt. Vor allem das bestimmen der Daten, die durch den Filter gelassen werden. Die einfachen Beispiele, warfen zwei Dinge in den Filter: Geschwindigkeit und Position. Des weiteren sind uns noch andere Kandidaten in den Sinn gekommen, hier eine kurze Auflistung:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Geschwindigkeit: Eigentlich die ideale Grösse für unsere Rechnungen - Leider haben wir keinen Geschwindigkeitssensor, und die Berechnung aufgrund der Motorpower ist recht unverlässlich.&lt;/li&gt;
  &lt;li&gt;Position: Zu wissen, wo auf der Strecke wir uns befinden klingt super. Jedoch haben wir auch keinen Positionssensor und müssen uns deshalb die Position anhand der onehin schon unzuverlässigen Geschwindigkeit orientieren&lt;/li&gt;
  &lt;li&gt;Gyro-Z: Der einzige verlässliche Sensorwert. Wie genau dieser sich im Filter verwerten lässt ist jedoch unklar, da der Einfluss auf Geschwindigkeit und Position mathematisch nicht so einfach darzustellen ist.&lt;/li&gt;
  &lt;li&gt;Beschleunigung: Lässt sich auch aus dem Sensor ziehen, aber auch nach ausführlicher Analyse mit R lassen sich neben dem Rauschen kaum Schlüsse zur Strecke ziehen.&lt;/li&gt;
  &lt;li&gt;Motorpower: Ist nicht wirklich ein Sensorwert, gehört wahrscheinlich in die Kontrollmatrix?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Das generelle Problem: Wir haben eigentlich keine brauchbaren Sensordaten, und müssen eigentlich alles selbst berechnen. Wir waren uns dann nicht mehr sicher, ob es sich überhaupt lohnt, solch einen Filter zu implementieren. Auch war es nicht klar, wie genau die 3 Dimensionen der Sensordaten verwendet werden sollen.&lt;/p&gt;

&lt;p&gt;Parallel zum ChallP1 kam in Prof. Müllers Vorlesung “Wahrscheinlichkeitsrechnung und Statistik” der Kalmanfilter im Unterrichtsstoff vor. Eine Diskussion mit Herrn Műller ergab, dass es sich durchaus lohnen würde, einen Kalman-Filter auf unser Problem anzuwenden. Die Daten für den Filter wären Geschwindigkeit und die zurückgelegte Distanz.&lt;/p&gt;

&lt;p&gt;Aus Zeitmangel und Unsicherheit, wie genau wir die Korrelationsmatrizen ermitteln sollen, sind wir leider nicht mehr dauzgekommen, einen solchen Filter anzuwenden.&lt;/p&gt;
</description>
        <pubDate>Fri, 08 Jan 2016 00:00:00 +0000</pubDate>
        <link>https://tourn.github.io/ChallP1/ChallP1/2016/01/08/kalman/</link>
        <guid isPermaLink="true">https://tourn.github.io/ChallP1/ChallP1/2016/01/08/kalman/</guid>
      </item>
    
      <item>
        <title>Kalibrierung des physischen Models während der Lernphase</title>
        <description>&lt;p&gt;Während des ersten Testlaufs auf der echten Bahn wurde uns bewusst, dass konstante Werte in unserem Physikmodel(Motor-Efficency, Reibungskoeffizienten) nicht akurat genug sind um eine Geschwindigkeit oder Distanz zu berechnen. Der Simulator verhält sich relativ konstant, im Gegensatz zum echten Modell, wo jedes Auto unterschiedliche Reibung mit sich bringt und die Berechnung extrem beinflusst. Unser Ziel ist es nun mit den Daten, die wir während der Lernphase sammeln, Reibungskoeffizienten für Gerade und Kurven zu berechnen.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Vorgehen:
    &lt;ul&gt;
      &lt;li&gt;Aufstellung einer Gleichung zur Berechnung der Reibungskoeffizienten&lt;/li&gt;
      &lt;li&gt;Anpassung der Gleichung durch Annäherung&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Endgültiges Gleichungssystem&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Genauigkeit&lt;/li&gt;
&lt;/ol&gt;

</description>
        <pubDate>Wed, 11 Nov 2015 00:00:00 +0000</pubDate>
        <link>https://tourn.github.io/ChallP1/ChallP1/2015/11/11/AdvancedPhysicsModel/</link>
        <guid isPermaLink="true">https://tourn.github.io/ChallP1/ChallP1/2015/11/11/AdvancedPhysicsModel/</guid>
      </item>
    
      <item>
        <title>Testfahrt auf der echten Bahn</title>
        <description>&lt;p&gt;Nachdem wir Vormittags noch kurz einen Logger zusammengebaut haben, der unsere Fahrtergebnisse als JSON abspeichern kann, konnten wir heute unsere ersten Testfahrten auf der echten Carrerabahn durchführen. Dabei haben wir einige Dinge gelernt.&lt;/p&gt;

&lt;h3 id=&quot;allgemein&quot;&gt;Allgemein&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Runden Start/Ende-Event abfangen und Zustand entsprechend anpassen (z.B beim Rundenanfang loeschen)&lt;/li&gt;
  &lt;li&gt;Konstanten entfernen - Werte sollen gelernt werden (z.B Reibungskoeffizienten für Kurven und Geraden in der Lernphase berechnen)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;trackanalyzerphase-1&quot;&gt;Trackanalyzer(Phase 1)&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Funktionioniert im Moment mit RoundEndMessage - Stattdessen sollte er mit Cycle Detection arbeiten&lt;/li&gt;
  &lt;li&gt;Autos haben verschiedene physikalische Eigenschafften; Motorstaerke und Reibung unterscheiden sich. Physische Eigenschafften sollen während der Lernphase approximiert werden.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;speedoptimizerphase-2&quot;&gt;SpeedOptimizer(Phase 2)&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Auf Penalties muss reagiert werden&lt;/li&gt;
  &lt;li&gt;History von vergangenen Runden soll auf aktuelle Fahrstrategie mit einwirken
    &lt;ul&gt;
      &lt;li&gt;Ein Historyelement pro TrackSection sollte beinhalten
        &lt;ul&gt;
          &lt;li&gt;Eingangsgeschwindigkeit&lt;/li&gt;
          &lt;li&gt;Verwendete Power&lt;/li&gt;
          &lt;li&gt;Punkt (Prozentual), ab dem gebremst wird&lt;/li&gt;
          &lt;li&gt;Durchquerungszeit&lt;/li&gt;
          &lt;li&gt;Wurde ein Penalty kassiert?&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 06 Nov 2015 00:00:00 +0000</pubDate>
        <link>https://tourn.github.io/ChallP1/ChallP1/2015/11/06/testfahrt/</link>
        <guid isPermaLink="true">https://tourn.github.io/ChallP1/ChallP1/2015/11/06/testfahrt/</guid>
      </item>
    
      <item>
        <title>Daten Visualisierung</title>
        <description>&lt;p&gt;Bis anhin haben wir alle möglichen Daten, welche wir irgendwie bekommen konnten, in unsere erstellten Datenstrukturen gespeichert. Damit man bei dieser Unmenge an Daten davon verschohnt werden den Wald voller Bäume nicht mehr zusehen, stellen wir die wichtigsten Informationen visuell dar.&lt;/p&gt;

&lt;p&gt;Nach einem kurzen Proof-of-Concept viel die Technologiewahl auf ein Java Swing Framework(&lt;a href=&quot;http://www.jfree.org/jsfreechart/&quot;&gt;JFreeChart&lt;/a&gt;). Somit müssen wir keine weitere Sprache einführen und halten unseren Technologie-Zoo möglichst kompakt.&lt;/p&gt;

&lt;p&gt;Zu Begin versuchten wir das &lt;code&gt;DataChart&lt;/code&gt;-Objekt im &lt;code&gt;JavaPilotActor&lt;/code&gt; zu instanzieren, da wir dort sehr nah bei den darzustellenden Daten waren. Anfangs liefen wir in eine HeadlessException, welche grundsätzlich bedeutet, dass man im momentanen Kontext kein Java Swing Frame erstellen kann. Als Workaround setzten wir das System-Property &lt;code&gt;headless&lt;/code&gt; auf false, anschliessend konnte ein erstes DataChart(Gyro-Z) erstellt werden.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/ChallP1/images/visualizer.png&quot; alt=&quot;Visualizer&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Das Swing Fenster dem &lt;code&gt;JavaPilotActor&lt;/code&gt; anzuhängen, war längerfristig gesehen ein schlechter Entscheid! Es könnte ein Situation enstehen in welcher der Pilot auf die Swing Applikation warten müsste, was fatal wäre in einer Applikation, welche zu Runtime schnelle Berechnungen und Entscheidungen erledigen muss! Mit dieser Erkenntnis starteten wir ein Refactoring um eine möglichst asynchrone Verbindung zu initialisieren. Da wir nur in eine Richtung Daten senden müssen (&lt;code&gt;JavaPilotActor&lt;/code&gt; -&amp;gt; &lt;code&gt;DataChart&lt;/code&gt;), können wir auf einen Callback Mechanismus verzichten.&lt;/p&gt;

&lt;p&gt;Aufbau der Schnittstelle &lt;em&gt;Pilot / Visualizer&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code&gt;DataVisService&lt;/code&gt;: -Wird vom Spring Framework Injected bei der Erstellung des Pilots
                  -instanziert das DataChart Objekt
                  -Hat die Permission Swing Fenster zu zeichnen&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;PilotToVisualConnector&lt;/code&gt;: -Implementiert das Interface &lt;code&gt;PilotToVisualConnection&lt;/code&gt;
                          -Gibt dem Pilot die Möglichkeit dem &lt;code&gt;DataChart&lt;/code&gt; Updates zu senden&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;DataChart&lt;/code&gt;: -Darstellung der Gyro-Z Werte(XY-Chart)
             -Darstellung der Velocity Werte(XY-Chart)
             -Tabellendarstellung der erkannten TrackSections
             -Positiosanzeige des Pilots auf der Strecke(Streckentabelle)
Mit diesem Setup kann der Pilot seine Berechnungen dem &lt;code&gt;DataVisService&lt;/code&gt; mitteilen, welcher diese dann dem &lt;code&gt;DataChart&lt;/code&gt; zur Darstellung weitergibt. Somit erreichen wir eine saubere Trennung von Datenverarbeitung und Darstellung und verhindern eine Blockade des Pilots!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;img src=&quot;/ChallP1/images/visualize-gyro.gif&quot; alt=&quot;Gyro-Z&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/ChallP1/images/visualize-sections.gif&quot; alt=&quot;Carposition&quot; /&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 15 Oct 2015 00:00:00 +0000</pubDate>
        <link>https://tourn.github.io/ChallP1/ChallP1/2015/10/15/DataVisualizer/</link>
        <guid isPermaLink="true">https://tourn.github.io/ChallP1/ChallP1/2015/10/15/DataVisualizer/</guid>
      </item>
    
      <item>
        <title>TrackAnalyzer und Kurvenerkennung</title>
        <description>&lt;p&gt;Eine einfache Idee zur Streckenerkennung hatten wir relativ schnell: Sobald der Z-Gyro-Sensor einen gewissen Wert positiv/negativ überschreitet, befinden wir uns in einer Links- bzw. Rechtskurve. Es war schon recht befriedigend, dem Piloten bei der Kurvenerkennung zuzuschauen, aber noch weit weg vom eigentlichen Erlernen der Strecke.&lt;/p&gt;

&lt;p&gt;Die Strecke wird folgendermassen gespeichert: Jede Kurve und jedes Geradensegment dazwischen wird als einzelnes Objekt, eine &lt;code&gt;TrackSection&lt;/code&gt;, gespeichert. Dieses enthält die Durchfahrungszeit, Richtung (Links/Rechts/Gerade), eventuell eine Bewertung der Kurvenschärfe und einen Zeiger auf die nächste &lt;code&gt;TrackSection&lt;/code&gt;. Die geschwindigkeitsmessenden Checkpoints sowie die Position des Autos enthalten einen Zeiger auf das &lt;code&gt;TrackSection&lt;/code&gt;, in dem sie sich befinden, sowie einen zeitlichen Offset vom Start des Abschnitts.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/ChallP1/images/trackdata.png&quot; alt=&quot;tracksections&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Gelernt wird die Strecke in einer sogenannten Kennenlernphase, wo das Auto mit einer konstanten Geschwindigkeit um die Bahn kurvt, um all diese Abschnitte zu analysieren. Aus den mehreren Runden wird für eine höhere Verlässlichkeit dann ein Durchschnitt berechnet. Dies bringt mehrere Problemstellungen mit sich:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Der Beginn der ersten Runde ist nicht wirklich repräsentativ, da das Auto zuerst beschleunigen muss. Hier bieten sich verschiedene Lösungen an, wovon keine so wirklich toll klingt:
    &lt;ul&gt;
      &lt;li&gt;Ignorieren des Problems&lt;/li&gt;
      &lt;li&gt;Ignorieren der ersten Runde&lt;/li&gt;
      &lt;li&gt;Versuchen, die Beschleunigungsphase irgendwie herauszurechnen&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Wie oft soll die Strecke umfahren werden? Ist die Geschwindigkeit zu hoch, fliegt das Auto aus der Bahn (bzw. erhält es Penalties), was die Daten der Umfahrung wesentlich weniger nützlich macht.
    &lt;ul&gt;
      &lt;li&gt;Diese Frage steht noch offen, es soll ja möglichst viel Zeit für die eigentliche Fahrphase zur Verfügung stehen. Momentan experimentieren Wir mit 1-3 Runden.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Wie werden die Daten von mehreren Runden zusammengeführt? Theoretisch sollten mit derselben konstanten Geschwindigkeit in jeder Runde gleich viele &lt;code&gt;TrackSections&lt;/code&gt; vorkommen. Die Praxis zeigt aber, dass durch das Rauschen der Sensoren insbesondere in schnellen Abfolgen von kurzen Kurven gerne einmal ein Zwischenstück einfach als Gerade erkannt wird.
    &lt;ul&gt;
      &lt;li&gt;Unsere neue Idee plant die Vereinfachung von mehreren, kurz aufeinanderfolgenden Kurvensegmenten in ein langes. Dies führt auch dazu, dass die Kurvenrichtung verlorengeht, was aber eigentlich nicht so wichtig ist. Das Ziel ist ja einfach, in Kurven vorsichtiger zu fahren. Stimmen die Daten von mehreren Runden nicht überein, so wird einfach die Lösung mit weniger Abschnitten genommen.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;
</description>
        <pubDate>Thu, 08 Oct 2015 00:00:00 +0000</pubDate>
        <link>https://tourn.github.io/ChallP1/ChallP1/2015/10/08/trackanalyzer-kurven/</link>
        <guid isPermaLink="true">https://tourn.github.io/ChallP1/ChallP1/2015/10/08/trackanalyzer-kurven/</guid>
      </item>
    
      <item>
        <title>Schlachtplan</title>
        <description>&lt;p&gt;Heute haben wir uns hingesetzt und festgestellt, dass wir gar nicht so recht wissen, wo anzufangen. Dies brachte uns dazu, eine Übersicht unser nächsten Aufgaben aufzustellen.&lt;/p&gt;

&lt;h2 id=&quot;algorithmus&quot;&gt;Algorithmus&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;2 Phasen
    &lt;ul&gt;
      &lt;li&gt;Kennenlernen
        &lt;ul&gt;
          &lt;li&gt;Konstante geschwindigkeit (verschiedene)&lt;/li&gt;
          &lt;li&gt;Aufteilen in Segmente (Geraden, Kurven, Geschwindigkeit, Rundenzeit)&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Optimieren
        &lt;ul&gt;
          &lt;li&gt;Geschwindigkeit anpassen (Anhand gelernter Strecke)&lt;/li&gt;
          &lt;li&gt;Streckenveraenderung Modellieren&lt;/li&gt;
          &lt;li&gt;Aktuelle Position tracken
            &lt;ul&gt;
              &lt;li&gt;Berechnung&lt;/li&gt;
              &lt;li&gt;An Checkpoints/Rundenende abgleichen&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;visualisierung&quot;&gt;Visualisierung&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Was wird Visualisiert?
    &lt;ul&gt;
      &lt;li&gt;Sensordaten&lt;/li&gt;
      &lt;li&gt;Gelerntes Rundenmodell&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Wie wird Visualisiert?&lt;/li&gt;
  &lt;li&gt;Realtime Visualisierungstools&lt;/li&gt;
  &lt;li&gt;Statistkisoftware wie R&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;fahrstil&quot;&gt;Fahrstil&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;Verhalten der des Autos ermitteln
    &lt;ul&gt;
      &lt;li&gt;Manuelle Geschwindigkeitseinstellung implementieren&lt;/li&gt;
      &lt;li&gt;Mit Brute Force verschiedene Kurvenstrategien evaluieren&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 01 Oct 2015 00:00:00 +0000</pubDate>
        <link>https://tourn.github.io/ChallP1/ChallP1/2015/10/01/schlachtplan/</link>
        <guid isPermaLink="true">https://tourn.github.io/ChallP1/ChallP1/2015/10/01/schlachtplan/</guid>
      </item>
    
      <item>
        <title>Willkommen</title>
        <description>&lt;p&gt;Dies ist das Lablog Gruppe POWER OVERWHELMING für das Challengeprojekt 1 an der &lt;a href=&quot;http://www.hsr.ch&quot;&gt;Hochschule Rapperswil&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Folgende Erfolge lassen sich bereits festhalten:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Kickoff-Event überstanden&lt;/li&gt;
  &lt;li&gt;Entwicklungsumgebung eingerichtet&lt;/li&gt;
  &lt;li&gt;Lablog mit Jekyll auf die Beine gestellt&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 21 Sep 2015 00:00:00 +0000</pubDate>
        <link>https://tourn.github.io/ChallP1/ChallP1/2015/09/21/willkommen/</link>
        <guid isPermaLink="true">https://tourn.github.io/ChallP1/ChallP1/2015/09/21/willkommen/</guid>
      </item>
    
  </channel>
</rss>
