Tag Archives: MSRS

Spaß mit Microsoft Robotics Studio

Es ist ja schon angeklungen, dass ich mich mit Microsoft Robotics Studio beschäftige. Gestern habe ich im SimulationTutorial2 eine witzige Stelle gefunden:

// we use the http get handler for something unusual, but fun:
// Whenever a web browser does a GET, we will throw some objects in the simulation

Wie bitte? Einfach per Klick immer mehr und mehr Sachen reinwerfen? Das wird ausprobiert…

Get the Flash Player to see this content.

lol2

MinusPiPiTransform

Da wird sich doch der eine oder andere fragen, was diese seltsame Überschrift zu bedeuten hat. *gg* Also heute in diesem Kino nicht etwa das Wasserlassen von Kleinkindern sondern:
Wie transformiere ich Winkel in das Intervall [−π, π]?

Das Problem stellte sich mir vor einigen Wochen im Rahmen meiner Studienarbeit das erste mal. Ich hatte zunächst einen Algorithmus entwickelt, der sich in einer Schleife so lange dem Zielintervall näherte, bis der Winkel transformiert war. Das ist zuverlässig, leicht zu durchschauen und langweilig. Meine Idee für eine elegante einzeilige Lösung war ein wenig mit der Signum-Funktion rumzuspielen und durch geschicktes Anwenden von Runden und aller vier Grundrechenarten die Geschichte mit der Schleife zu umgehen.

Im Prinzip gehe ich dabei ähnlich vor wie im Schleifenalgorithmus: ich addiere oder subtrahiere solange Vielfache von 2π bis ich im Zielintervall bin. Will ich das in einer Zeile tun, muss ich das notwendige Vielfache rausbekommen und das Vorzeichen.

Stellt man sich den allseits beliebten Zahlenstrahl vor – vorstellen mit Zettel und Stift ist leichter ;-) – erkennt man die Zuordnung:

  • [−5π, −3π] : 2
  • [−3π, −π] : 1
  • [−π, π] : 0
  • [π, 3π] : −1
  • [3π, 5π] : −2

Das Intervall [−π, π] um 0 rum stört. Das erste was ich deshalb tue: ich addiere sign(inAngle)*π zu meinem Einganswinkel inAngel. Dadurch schaffe ich mir zwar einen toten Bereich um 0 rum, aber die neuen Abschnitte haben ihre Grenzen bei vollen Vielfachen von 2π, so dass ich nun durch 2π teilen kann. Das Ergebnis runde ich derart, dass ich auf die nächste volle Zahl in Richtung 0 runde, d.h. ich runde bei positiven Zahlen ab und bei negativen auf oder kurz gesagt: ich schneide einfach die Nachkommastellen des Divisionsergebnisses ab. ;-) Damit habe ich schon die gesuchten Koeffizienten mit richtigem Vorzeichen. Die multipliziere ich dann wieder mit 2π und das Ergebnis ziehe ich vom Eingangswinkel ab, fertig. In Simulink sieht das dann aus wie auf dem folgenden Bild (zum Vergrößern anklicken):

Transformation von minus PI bis PI in Simulink

In Matlab liest sich das wie folgt:

function outAngle = MinusPiPiTransform(inAngle)
    outAngle = inAngle - ...
        fix( (inAngle + sign(inAngle)*pi) / (2*pi) ) * ...
        2*pi;
end%function

Diese Lösung hatte ich wie gesagt vor ein paar Wochen entwickelt. Heute brauchte ich das ganze wieder, allerdings in C# – kein Problem. Einfach den Teil aus dem Matlab-Skript in C# übersetzt und dann sieht das ganze so aus:

public double MinusPiPiTransform(double inAngle) {
    return inAngle -
        Math.Truncate((inAngle + Math.Sign(inAngle) * Math.PI) / (2 * Math.PI)) *
        2 * Math.PI;
}

C# für Ingenieure

In meinem Studium geht es auf die Zielgerade. Im Rahmen dessen beschäftige ich mich zur Zeit mit dem Microsoft Robotics Studio. Auf den ersten Blick eine interessante Sache: eine leistungsfähige Physik-Engine dabei, die sogar mit den PhysX Beschleuniger-Karten von AGEIA arbeiten kann, eine ansprechende 3D-Visualisierung aus der Spielewelt der Xbox (XNA Framework) und als Backend ein modulares System aus Services, die alle über HTTP kommunizieren – also wenn ich das richtig verstanden habe. ;-)

Die Geschichte fußt natürlich auf .NET und in den Tutorials wird man immer wieder mit der Nase drauf gestoßen, dass man doch bitte Visual Studio und C# benutzen solle. »Kann ja nicht so schwer sein«, hab ich mir gedacht und mir erstmal das einzig noch verfügbare Buch über C# aus unserer Bibliothek geholt. Die gut 230 Seiten hab ich in ein paar Stunden durchgearbeitet und bin um einige Erkenntnisse reicher:

  • Fußnoten können den Lesefluss erheblich stören.
  • Ich ärgere mich über Fußnoten, in denen Begriffe wie »Microsoft«, »Informatik« oder »Editor« erläutert werden. Ingenieure sind doch nicht dumm.
  • C# sieht C/C++ und Java sehr ähnlich.
  • Der Unterschied zwischen dynamischer Polymorphie und Interfaces ist esoterischer Natur, aber, da Java und C# keine Mehrfachvererbung unterstützen, sinnvoll.
  • Es gibt Software die besser geeignet ist, ein Buch zu schreiben als MS Word.

Die wichtigste Erkenntnis jedoch: wenn man die Grundkonzepte der Programmierung, also elementare Datentypen, Kontrollstrukturen, Algorithmen und auch OOP verstanden hat, ist die Syntax einer Sprache nur noch Nebensache und in wenigen Stunden drin. Der Umkehrschluss: um Programmieren zu lernen, kann man eigentlich eine beliebige höhere Sprache benutzen, die es ermöglicht die genannten Konzepte umzusetzen. Ob das jetzt wie in diesem Fall C# ist oder Java, Perl, PHP, Delphi, C++ usw. – eigentlich egal. Ich hab das an verschiedener Stelle schon behauptet und das heute sozusagen im Selbstversuch untermauert. *gg*