diff --git a/_images/01_boot.png b/_images/01_boot.png new file mode 100644 index 0000000..32eaf7c Binary files /dev/null and b/_images/01_boot.png differ diff --git a/_images/02_psk.png b/_images/02_psk.png new file mode 100644 index 0000000..0cb0df7 Binary files /dev/null and b/_images/02_psk.png differ diff --git a/_images/03_codeServerFile.png b/_images/03_codeServerFile.png new file mode 100644 index 0000000..adec026 Binary files /dev/null and b/_images/03_codeServerFile.png differ diff --git a/_images/04_codeServerRun.png b/_images/04_codeServerRun.png new file mode 100644 index 0000000..7cf650c Binary files /dev/null and b/_images/04_codeServerRun.png differ diff --git a/_images/05_codeServerTerminal.png b/_images/05_codeServerTerminal.png new file mode 100644 index 0000000..bac5b4b Binary files /dev/null and b/_images/05_codeServerTerminal.png differ diff --git a/_images/06_codeServerFolder.png b/_images/06_codeServerFolder.png new file mode 100644 index 0000000..463cb18 Binary files /dev/null and b/_images/06_codeServerFolder.png differ diff --git a/_images/07_irSensor.webp b/_images/07_irSensor.webp new file mode 100644 index 0000000..4a1d412 Binary files /dev/null and b/_images/07_irSensor.webp differ diff --git a/_sources/faq.rst.txt b/_sources/faq.rst.txt new file mode 100644 index 0000000..513a48a --- /dev/null +++ b/_sources/faq.rst.txt @@ -0,0 +1,12 @@ +FAQ +### + +Was ist das Passwort für die Entwicklungsumgebung? +-------------------------------------------------- +``compair`` + +Wie verbinde ich mich zur Entwicklungsumgebung? +----------------------------------------------- + +See :ref:`gettingstarted_codeserver` + diff --git a/_sources/gettingStarted/codeServer.rst.txt b/_sources/gettingStarted/codeServer.rst.txt new file mode 100644 index 0000000..0a7c27c --- /dev/null +++ b/_sources/gettingStarted/codeServer.rst.txt @@ -0,0 +1,11 @@ +.. _gettingstarted_codeserver: + +Programmierumgebung +################### + +Als Umgebung zur Programmierung des Roboters wird `code-server `_ eingesetzt, welche bereits am Roboter vorinstalliert ist. + +Verbindung zur Entwicklungsumgebung herstellen +---------------------------------------------- +Am Roboter wird die IP-Adresse des Raspberry Pi angezeigt. Um nun die Verbindung herzustellen, muss man in einem Web-Browser einfach ``:8080`` eingeben. +Das Passwort für Visual Studio Code im Browser ist ``compair``! \ No newline at end of file diff --git a/_sources/gettingStarted/firstProgram.rst.txt b/_sources/gettingStarted/firstProgram.rst.txt new file mode 100644 index 0000000..cb28686 --- /dev/null +++ b/_sources/gettingStarted/firstProgram.rst.txt @@ -0,0 +1,26 @@ +Mein erstes Programm +#################### + +Um mit der Programmierung zu beginnen, müssen wir zunächst einen neuen Ordner erstellen, in dem alle unsere Python-Dateien gespeichert werden. +|codeServerFolder| + +Sie können diesen Ordner nennen, wie Sie wollen, für dieses Beispiel heißt er ``compAIR``. +Im nächsten Schritt erstellen wir unsere Datei ``main.py``. +|codeServerFile| + +Dann können wir beginnen, unseren Code in diese Datei zu schreiben. + +.. code-block:: python + + print("Hallo Welt") + +Praktischerweise können wir die Datei auch über die VS-Code-Plattform ausführen. +|codeServerRun| + +Dann öffnet sich ein Terminal, der die Ausgabe unseres Programms anzeigt. +|codeServerTerminal| + +.. |codeServerFolder| image:: images/06_codeServerFolder.png +.. |codeServerFile| image:: images/03_codeServerFile.png +.. |codeServerRun| image:: images/04_codeServerRun.png +.. |codeServerTerminal| image:: images/05_codeServerTerminal.png diff --git a/_sources/gettingStarted/index.rst.txt b/_sources/gettingStarted/index.rst.txt new file mode 100644 index 0000000..d3333ef --- /dev/null +++ b/_sources/gettingStarted/index.rst.txt @@ -0,0 +1,11 @@ +Erste Schritte +############## + +.. toctree:: + :maxdepth: 5 + + wifi.rst + codeServer.rst + firstProgram.rst + secondProgram.rst + thridProgram.rst diff --git a/_sources/gettingStarted/secondProgram.rst.txt b/_sources/gettingStarted/secondProgram.rst.txt new file mode 100644 index 0000000..9f7d617 --- /dev/null +++ b/_sources/gettingStarted/secondProgram.rst.txt @@ -0,0 +1,313 @@ +Mein zweites Programm +##################### + +Motoren ansteuern +----------------- + +Um die Motoren des Roboters zu steuern, müssen wir zunächst das entsprechende Python-Modul am Anfang der Datei importieren. Dann können wir Motor.power(port, power) verwenden, um den Motor zu steuern. +Dies ist auch ein guter Punkt, um sich mit der Dokumentation vertraut zu machen: Besuchen wir https://lib.comp-air.at/lib/Motor.html#compLib.Motor.Motor.power. Hier werden die beiden relevanten Parameter beschrieben. + +Als Beispiel wollen wir den rechten Motor für fünf Sekunden auf volle Geschwindigkeit setzen: + +.. code-block:: python + :linenos: + + # motor.py + import time + from compLib.Motor import Motor + + Motor.power(0, 100) + time.sleep(5) + +Gerade fahren +------------- +Um geradeaus zu fahren, müssen wir beide Motoren auf dieselbe Geschwindigkeit einstellen. +Aber Achtung! Der rechte Motor muss umgedreht werden! Das liegt daran, dass einer nach rechts und einer nach links zeigt, sie sind also technisch gesehen gespiegelt. +Wenn wir nun diesen Code ausführen, wird der Roboter 5 Sekunden lang vorwärts fahren: + +.. code-block:: python + :linenos: + + # motor.py + import time + from compLib.Motor import Motor + + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(5) + +**Erläuterung** + +| In ``Zeile 2`` wird das python-Paket ``time`` importiert. Wir brauchen es später, um auf die Fahrt des Roboters zu warten. Z.B.: ``time.sleep(5)`` +| In ``Zeile 3`` importieren wir die notwendigen Funktionen aus dem ``Motor``-Modul der compLib. +| In ``Zeile 5`` stellen wir den ``rechten`` Motor so ein, dass er vorwärts fährt. Da der Motor rückwärts eingebaut ist, müssen wir den Wert auf ``-100`` setzen. +| In ``Zeile 6`` stellen wir den ``linken`` Motor auf Vorwärtsfahrt ein. Hier können wir den Wert ``100`` verwenden, da der Motor in der richtigen Richtung eingebaut ist. +| In ``Zeile 7`` müssen wir warten, bis der Roboter die Fahrbefehle tatsächlich ausführt. In diesem Fall warten wir ``5`` Sekunden lang. + +Danach wird das Programm beendet und der Roboter bleibt stehen. + +Mehr fahren ++++++++++++ + +Jetzt ist es Zeit für einige komplexere Bewegungen. Um unseren Code modular und leicht lesbar zu halten, werden wir jede Aktion in eine eigene Funktion packen. + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(2) + +In ``Zeile 4`` definieren wir die Funktion ``driveForward()``, die den Roboter mit voller Geschwindigkeit zwei Sekunden vorwärts bewegt. + +Jetzt werden wir eine Funktion für das Rückwärtsfahren definieren: + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(2) + + def driveBackward(): + Motor.power(0, 100) + Motor.power(3, -100) + time.sleep(2) + +In ``Zeile 9`` haben wir die Funktion ``driveBackward()`` definiert, die den Roboter zwei Sekunden lang rückwärts fahren lässt. + +Jetzt können wir diese beiden Funktionen aufrufen und vorwärts und dann wieder rückwärts fahren: + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(2) + + def driveBackward(): + Motor.power(0, 100) + Motor.power(3, -100) + time.sleep(2) + + driveForward() + driveBackward() + +Wenn wir diesen Code ausführen, sollte der Roboter zunächst zwei Sekunden vorwärts und dann wieder zwei Sekunden rückwärts fahren und ungefähr an der gleichen Position wie beim Start anhalten. + +Zwischen den Zeilen ``14`` und ``15`` brauchen wir kein ``time.sleep(2)``, da der sleep-Befehl bereits in den Funktionen integriert ist. + +Jetzt wollen wir, dass der Roboter erst vorwärts fährt, dann zwei Sekunden stillsteht und dann wieder rückwärts in seine Ausgangsposition fährt. + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(2) + + def driveBackward(): + Motor.power(0, 100) + Motor.power(3, -100) + time.sleep(2) + + driveForward() + time.sleep(2) + driveBackward() + +Wenn wir den obigen Code ausführen, bleibt der Roboter nicht zwei Sekunden lang stehen, sondern fährt nach der Funktion ``driveForward()`` noch zwei Sekunden lang weiter. Warum passiert das? Um das zu verstehen, müssen wir wie der Roboter denken! + +**Erläuterung** + +| 1. (``Zeile 14``) Die Funktion Vorwärtsfahrt wird aufgerufen +| (``Zeile 5``) Motor 1 wird auf -100 gesetzt +| (``Zeile 6``) Motor 4 wird auf 100 gesetzt +| (``Zeile 7``) Zwei Sekunden warten und Motor 1 mit der Geschwindigkeit -100 und Motor 4 mit der Geschwindigkeit 100 bewegen (z.B. vorwärts fahren) + +| 2. (``Zeile 15``) Zwei Sekunden warten, die Motoren sind immer noch auf -100 und 100 eingestellt, also fahren wir weiter vorwärts + +| 3. (``Zeile 16``) Die Funktion Rückwärtsfahren wird aufgerufen +| (``Zeile 5``) Motor 1 wird auf 100 gesetzt +| (``Zeile 6``) Motor 4 wird auf -100 gesetzt +| (``Zeile 7``) Warte zwei Sekunden und bewege Motor 1 mit der Geschwindigkeit 100 und Motor 4 mit der Geschwindigkeit -100 (z.B. Rückwärtsfahren) + +| 4. Das Programm ist beendet, und alle Motordrehzahlen werden auf 0 gesetzt. + +Wir sehen also, dass wir die Motoren nach der Vorwärts- oder Rückwärtsfunktion wieder auf Geschwindigkeit ``0`` setzen müssen, wenn wir den Roboter anhalten wollen. Für diesen Anwendungsfall können wir eine neue Funktion ``stopMotors()`` schreiben, die die Geschwindigkeit für Motor ``0`` und ``3`` auf ``0`` setzt: + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(2) + + def driveBackward(): + Motor.power(0, 100) + Motor.power(3, -100) + time.sleep(2) + + def stopMotors(): + Motor.power(0, 0) + Motor.power(3, 0) + +Wenn wir nun vorwärts fahren, dann zwei Sekunden warten und dann wieder rückwärts fahren wollen, können wir die Funktionen wie folgt aufrufen: + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(2) + + def driveBackward(): + Motor.power(0, 100) + Motor.power(3, -100) + time.sleep(2) + + def stopMotors(): + Motor.power(0, 0) + Motor.power(3, 0) + + driveForward() + stopMotors() + time.sleep(2) + driveBackward() + +Und endlich bekommen wir die Bewegung, die wir uns wünschen. + +**More Optimizations** + +Während der Code für sehr einfache Bewegungen funktioniert, wollen wir normalerweise nicht, dass unsere Funktionen entscheiden, wie lange wir vorwärts fahren. Vielleicht müssen wir manchmal vier Sekunden vorwärts fahren, und manchmal nur eine Sekunde. + +Nehmen wir an, wir wollen vier Sekunden vorwärts fahren. Wir wissen, dass ``driveForward()`` den Roboter zwei Sekunden vorwärts bewegen wird. Also können wir die Funktion einfach zwei Mal aufrufen! + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(2) + + driveForward() + driveForward() + +Was aber, wenn wir uns nur eine Sekunde vorwärts bewegen wollen? Oder vielleicht drei Sekunden? Mit der Funktion ``driveForward()`` können wir das im Moment nicht machen. + +Stattdessen werden wir die Funktion so umschreiben, dass sie einen Parameter akzeptiert, der die Zeit angibt. + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(seconds): + Motor.power(0, -100) + Motor.power(3, 100) + time.sleep(seconds) + + driveForward(3) + +Und mit dieser neuen Funktion können wir drei Sekunden lang vorwärts fahren. +Wie funktioniert das nun? + +In ``Zeile 4`` definieren wir die Funktion ``driveForward`` und sagen, dass sie einen Parameter ``seconds`` benötigt. Dieser Parameter ist im Grunde eine Variable, die wir uns zum Zeitpunkt der Definition wie einen Platzhalter vorstellen können. Wenn wir die Funktion definieren, wissen wir noch nicht, welchen Wert ``seconds`` haben wird. + +Später in ``Zeile 9``, wenn wir die Funktion aufrufen, übergeben wir den Wert ``3`` an die Funktion und unser Platzhalter ``seconds`` wird den Wert ``3`` haben. Der Roboter wird also drei Sekunden vorwärts fahren. + +Vielleicht wollen wir auch, dass der Roboter mit verschiedenen Geschwindigkeiten fahren kann. Wir können also einen weiteren Parameter mit dem Namen ``speed`` anlegen. Dann werden wir ein Programm schreiben, das den Roboter drei Sekunden mit voller Geschwindigkeit und dann fünf Sekunden mit halber Geschwindigkeit fahren lässt. + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(seconds, speed): + Motor.power(0, -speed) + Motor.power(3, speed) + time.sleep(seconds) + + driveForward(3, 100) + driveForward(5, 50) + +In ``Zeile 9`` wird der Platzhalter ``seconds`` auf ``3`` und die ``Geschwindigkeit`` auf ``100`` gesetzt. +In ``Zeile 10`` wird der Platzhalter ``seconds`` auf ``5`` und die ``Geschwindigkeit`` auf ``50`` gesetzt. + +**Bewährte Praktiken** +Nun werden wir uns einige weitere Optimierungen und bewährte Verfahren ansehen. + +**1. Wir sollten den Schlafbefehl nicht in die Fahrfunktion einbauen.** + +Wir haben das bis jetzt getan, um ein Gefühl dafür zu bekommen, wie Funktionen funktionieren, und der Einfachheit halber. Später, wenn Sie anfangen, komplexere Programme zu schreiben, sollten Sie dies vermeiden. + +Das Beispiel von oben, in dem wir vorwärts und rückwärts gefahren sind und zwei Sekunden gewartet haben, sollte also wie folgt aussehen: + +.. code-block:: python + :linenos: + + import time + from compLib.Motor import Motor + + def driveForward(speed): + Motor.power(0, -speed) + Motor.power(3, speed) + + def driveBackward(speed): + Motor.power(0, speed) + Motor.power(3, -speed) + + def stopMotors(): + Motor.power(0, 0) + Motor.power(3, 0) + + driveForward(100) # Set the motors to forward + time.sleep(2) # Let the robot drive for 2 seconds + stopMotors() # Now stop the robot + + time.sleep(2) # Wait another 2 seconds, robot is not moving + + driveBackward(100) # Now set the motors to a backwards speed + time.sleep(2) # Let the robot continue driving for 2 seconds + stopMotors() # And finally stop it again + +**Warum ist das so wichtig?** + +Normalerweise schlafen wir nicht sehr viel und führen in dieser Zeit andere Verarbeitungen durch. Zum Beispiel könnten wir ein Bild von der Kamera verarbeiten oder die IR-Sensoren auslesen. Wenn wir also eine Funktion wie ``driveForward()`` aufrufen, können wir davon ausgehen, dass sie im Hintergrund abläuft und wir andere Aufgaben erledigen, während sich der Roboter bewegt, anstatt nur darauf zu warten, dass er fertig wird. + +**2. Fahren Sie nicht zu langsam.** + +Wenn du die Fahrgeschwindigkeit auf eine sehr kleine Zahl einstellst, kann es sein, dass sich der Roboter gar nicht mehr bewegt, weil die Motoren eine bestimmte Menge an Energie benötigen, um den Roboter überhaupt zu bewegen. + +**3. Fahren Sie nicht zu schnell.** + +Wenn du die Fahrgeschwindigkeit auf eine sehr hohe Zahl einstellst (z. B. ``100``), könnte dein Roboter zu schnell für seine Sensoren sein. Dies wird später wichtig sein, wenn wir versuchen, eine schwarze Linie zu erkennen, aber zu schnell über sie fahren. diff --git a/_sources/gettingStarted/thridProgram.rst.txt b/_sources/gettingStarted/thridProgram.rst.txt new file mode 100644 index 0000000..762b544 --- /dev/null +++ b/_sources/gettingStarted/thridProgram.rst.txt @@ -0,0 +1,70 @@ +Mein drittes Programm +##################### + +Der offizielle compAIR-Bot ist mit einer Reihe von Sensoren ausgestattet. Die wichtigsten sind die Infrarotsensoren und -sender, die an der Vorderseite des Roboters angebracht sind. Insgesamt gibt es fünf IR-Sensoren. + +Um loszulegen, muss man zunächst das entsprechende Modul wie folgt importieren: + +.. code-block:: python + :linenos: + + from compLib.IRSensor import IRSensor + +|irSensor| + + +Wie im obigen Diagramm zu sehen ist, verfügt jeder Sensor auch über einen entsprechenden IR-Sender / Emitter. Dieser Sender kann mit ``IRSensor.set(port, enable)`` aktiviert werden. + +Schalten wir nun alle fünf Sender ein: + +.. code-block:: python + :linenos: + + from compLib.IRSensor import IRSensor + + IRSensor.enable() + +Diese fünf verschiedenen Sensoren befinden sich an der Vorderseite des Roboters und sind wichtig, um schwarze Linien zu erkennen. + +Es ist sehr einfach, den Wert der Sensoren abzulesen: + +.. code-block:: python + :linenos: + + from compLib.IRSensor import IRSensor + + IRSensor.enable() + + if IRSensor.read_all()[0] > 500: + print("high") + else: + print("low") + +**Erkennen einer schwarzen Linie** +Um den IR-Sensor zu testen, kannst du deinen Roboter auf eine schwarze Linie stellen. Der Sensor in der Mitte sollte auf der schwarzen Linie liegen. + +.. code-block:: python + :linenos: + + from compLib.IRSensor import IRSensor + + IRSensor.enable() + COLOR_BREAK = 900 + + if IRSensor.read_all()[2] > COLOR_BREAK: + print("Robot is standing on a black line") + else: + print("Robot is NOT standing on a black line") + +Wenn das Programm ausgeführt wird, zeigt es an, dass der Roboter auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor des Roboters über einer schwarzen Linie befindet, und es zeigt an, dass der Roboter NICHT auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor nicht über einer Linie befindet. + +| In ``Zeile 1`` importieren wir das ``IRSensor``-Modul, das zur Kommunikation mit dem IR-Sensor-Board verwendet werden kann. +| In ``Zeile 3`` wird der Sensor mit der Nummer ``3`` aktiviert. Wenn wir einen Sensor nicht aktivieren, können wir ihn nicht in unserem Programm verwenden. +| In ``Zeile 4`` stellen wir einen Farbschwellenwert von ``900`` ein, mit dem wir später prüfen werden, ob der Sensorwert unter oder über diesem Schwellenwert liegt. Unterhalb bedeutet, dass sich eine helle Farbe unter dem IR-Sensor befindet und ein höherer Wert als ``900`` bedeutet, dass sich eine dunkle Farbe unter dem IR-Sensor befindet. + +| In ``Zeile 6`` lesen wir den Sensor Nummer ``2`` aus und prüfen, ob der Wert über dem von uns definierten Schwellenwert von ``900`` liegt. Wenn das der Fall ist, hat der IR-Sensor eine schwarze Linie erkannt. + +Wir werden nun das Programm so ändern, dass es alle ``0.1`` Sekunden prüft, ob sich eine schwarze Linie unter dem Roboter befindet, und wenn dies der Fall ist, eine Meldung ausgibt. + + +.. |irSensor| image:: images/07_irSensor.webp \ No newline at end of file diff --git a/_sources/gettingStarted/wifi.rst.txt b/_sources/gettingStarted/wifi.rst.txt new file mode 100644 index 0000000..f845842 --- /dev/null +++ b/_sources/gettingStarted/wifi.rst.txt @@ -0,0 +1,77 @@ +.. _gettingStarted_wifi: + +WLAN-Verbindung herstellen +########################## + +Schritt für Schritt - macOS +--------------------------- +1. SD-Karte aus dem Raspberry Pi bzw. Roboter entnehmen. +2. Einstecken der SD-Karte in den Computer +3. Öffnen der SD-Karte mit dem Namen "boot" |bootImage| +4. Generieren des PSK auf `https://www.wireshark.org/tools/wpa-psk.html `_ |pskImage| +5. Öffnen der Datei "wpa_supplicant.conf" auf der SD-Karte +6. Einfügen der Konfiguration. Dabei muss die SSID und der vorher generierte PSK eingesetzt werden :: + + ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev + update_config=1 + country=AT + + network={ + ssid="EinTollerNameFürDasWlan" + psk="98117b165a48f25cbe36f288ddf597729a40feeea93054c19bfa8e5eab238541" + } + +7. Speichern, Auswerfen und wieder in den Raspberry Pi einbauen +8. Starten des Roboters +9. Die IP-Adresse sollte nun am Roboter angezeigt werden + +.. |bootImage| image:: images/01_boot.png +.. |pskImage| image:: images/02_psk.png + +Weitere Informationen +--------------------- +Die "wpa_supplicant.conf" Datei wird beim Start des Rpasberry Pi automatisch an den richtigen Ort kopiert, damit sich der Roboter zum Wlan verbindet. +Eine genauere Anleitung wird vom Hersteller des Raspberry Pi `hier `_ bereitgestellt. + +Fehlerbehandlung +---------------- +Sollte es dazu kommen, dass der Roboter nicht automatisch die Verbindung mit dem Netzwerk herstellt, kann eine Kabelgebundene Verbindung zur Diagnose von Fehlern genutzt werden. +Dabei wird automatisch die IP-Adresse der Verbindung "eth" am Roboter angezeigt. Nach der erfolgreichen Verbindung zum Roboter mittels SSH kann die "wpa_cli" zur Fehlerbehandlung verwendet werden: +:: + + > wpa_cli + wpa_cli v2.9 + Copyright (c) 2004-2019, Jouni Malinen and contributors + + This software may be distributed under the terms of the BSD license. + See README for more details. + + + Selected interface 'p2p-dev-wlan0' + + Interactive mode + + > interface wlan0 + Connected to interface 'wlan0. + > scan + OK + <3>CTRL-EVENT-SCAN-STARTED + <3>CTRL-EVENT-SCAN-RESULTS + > scan_result + bssid / frequency / signal level / flags / ssid + 68:02:b8:0c:d7:47 2462 -66 [WPA2-PSK-CCMP][ESS] WG + 68:02:b8:0c:d7:40 5220 -63 [WPA2-PSK-CCMP][ESS] WG + 34:2c:c4:da:dd:b9 5200 -65 [WPA-PSK-TKIP][WPA2-PSK-CCMP][WPS][ESS] WLAN10573403 + 98:da:c4:e5:21:d0 2437 -57 [WPA2-PSK-CCMP][ESS] WG + 34:2c:c4:da:dd:c6 2412 -52 [WPA-PSK-][WPA2-PSK-CCMP+TKIP][WPS][ESS] WLAN10573403 + 20:83:f8:07:5b:90 2467 -67 [WPA2-PSK-CCMP][WPS][ESS] A1-075b8c + 7c:39:53:94:49:82 5280 -77 [WPA2-PSK-CCMP][WPS][ESS] A1-944980-5G + 7c:39:53:94:49:81 2427 -68 [WPA2-PSK-CCMP][WPS][ESS] A1-944980 + 90:fd:73:ac:d3:27 2452 -72 [WPA2-PSK-CCMP][WPS][ESS] Drei_H288A_24G_eKy5 + 50:e0:39:3c:e5:80 5180 -82 [WPA2-PSK-CCMP][WPS][ESS] A1-393CE57F + 90:fd:73:ac:d3:28 5500 -83 [WPA2-PSK-CCMP][WPS][ESS] Drei_H288A_5G_eKy5 + 68:02:b8:41:42:f9 5180 -84 [WPA-PSK-TKIP][WPA2-PSK-CCMP][WPS][ESS] WLAN18792472 + 34:2c:c4:30:3c:65 5180 -89 [WPA-PSK-TKIP][WPA2-PSK-CCMP][WPS][ESS] witt + fa:0d:ac:d3:40:d4 2467 -80 [WPA2-PSK-CCMP][WPS][ESS][P2P] DIRECT-d4-HP M28 LaserJet + 0e:84:dc:14:ac:27 2467 -85 [WPA2-PSK-CCMP][WPS][ESS][P2P] DIRECT-wo-BRAVIA + > diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index f10ea78..840e6d7 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -1,7 +1,7 @@ .. image:: images/compair-logo-white.svg -Competition Robot Library -############################# +Dokumentation des Roboters +########################## .. toctree:: :maxdepth: 2 @@ -11,9 +11,11 @@ Contents ********* .. toctree:: - :maxdepth: 5 + :maxdepth: 1 :glob: - self + gettingStarted/index.rst + software/installation.rst + faq.rst other/usage - lib/* + lib/index.rst diff --git a/_sources/lib/classes/Motor.rst.txt b/_sources/lib/classes/Motor.rst.txt new file mode 100644 index 0000000..d647932 --- /dev/null +++ b/_sources/lib/classes/Motor.rst.txt @@ -0,0 +1,50 @@ +.. _lib_motor: + +Motoren +******** + +Dokumentation der Klasse +======================== + +.. autoclass:: compLib.Motor.Motor + :members: + +Genauere Informationen +====================== + +Power vs Speed vs PulseWidth +----------------------------- +Zur ansteuerung der Motoren kann entweder ``Motor.power(...)``, ``Motor.speed(...)`` oder ``Motor.pulse_width(...)``` verwendet werden. +Der Unterschied der 3 Funktionen liegt dabei in der Einheit des 2. Parameters. + +| Bei ``Motor.power()`` wird dabei ein Wert zwischen -100% und 100% der maximalen Geschwindigkeit angegeben. +| ``Motor.speed()`` verwendet die Encoder um die Geschwindigkeit der Motoren mittels closed-loop zu steuern. Diese Funktion sollte nur verwendet werden, wenn ``Motor.power()`` nicht zur Ansteuerung ausreicht. +| ``Motor.pulse_width()`` stellt die Geschwindigkeit des Motors mittels der Pulsbreite der PWM-Steuerung des Motors ein. Diese Funktion ist so nah an der Hardware wie möglich und sollte auch nur verwendet werden, wenn es einen expliziten Grund dafür gibt. + +Normal vs Multiple +------------------ +Der Aufruf der funktionen kann entweder über ``Motor.power(port, percent)`` oder ``Motor.power((port, percent), (port, percent), ..)`` erfolgen. +Der zweite Aufruf ermöglicht dem Entwickler dabei beide Motoren in einem Aufruf anzusteuern und bringt einen kleinen Vorteil in der Leistungsfähigkeit der Software. + + +Beispiele +========= + +Vorwärts fahren +--------------- + +Mit folgenden Programm drehen sich beide Motoren mit 50% ihrer maximalen Geschwindigkeit. +Dabei ist zu beachten, dass ein Motor in die entgegengesetzte Richtung zum aneren Motor gedreht werden muss, da diese spiegelverkehrt montiert sind. + +Zusätzlich ist ein ``time.sleep(5)`` notwendig, welches das Programm für 5 Sekunden pausiert. Diese Pause wird benötigt, da der Roboter automatisch alle Motoren beim Ende des Progammes deaktiviert. + +.. code-block:: python + + from compLib.Motor import Motor + import time + + Motor.power(0, -50) + Motor.power(3, 50) + + time.sleep(5) + diff --git a/_sources/lib/index.rst.txt b/_sources/lib/index.rst.txt new file mode 100644 index 0000000..5a96950 --- /dev/null +++ b/_sources/lib/index.rst.txt @@ -0,0 +1,8 @@ +compLib +####### + +.. toctree:: + :maxdepth: 5 + :glob: + + classes/* diff --git a/_sources/other/usage.rst.txt b/_sources/other/usage.rst.txt index 50fd86d..0296e59 100644 --- a/_sources/other/usage.rst.txt +++ b/_sources/other/usage.rst.txt @@ -1,7 +1,10 @@ .. _other_usage: -Usage -###### +Beispiele +######### + +Vorwärts und rückwärts fahren +***************************** .. code-block:: python diff --git a/_sources/software/installation.rst.txt b/_sources/software/installation.rst.txt new file mode 100644 index 0000000..fb3b6eb --- /dev/null +++ b/_sources/software/installation.rst.txt @@ -0,0 +1,12 @@ +.. _software_installation: + +Installationsanweisungen +######################## + +Diese Anleitung dient dazu die Software auf dem Roboter neu aufzusetzen. Im normalen Gebraucht sollte dies jedoch nicht notwendig sein. + +Betriebssystem aufsetzen +======================== + +Als Basis wird für den Roboter Raspberry Pi OS (64-bit) verwendet. Das 32-Bit Betriebssystem wird nicht unterstützt, da die Software-Komponenten nur für aarch64 bzw. arm64/v8 kompiliert werden. +Genauere Informationen sind `hier `_ zu finden. \ No newline at end of file diff --git a/_static/_stemmer.js b/_static/_stemmer.js new file mode 100644 index 0000000..a5beb8f --- /dev/null +++ b/_static/_stemmer.js @@ -0,0 +1,2506 @@ +// generatedy by JSX compiler 0.9.89 (2014-05-20 06:01:03 +0900; 8e8c6105f36f3dfe440ea026a3c93a3444977102) +var JSX = {}; +(function (JSX) { +/** + * extends the class + */ +function $__jsx_extend(derivations, base) { + var ctor = function () {}; + ctor.prototype = base.prototype; + var proto = new ctor(); + for (var i in derivations) { + derivations[i].prototype = proto; + } +} + +/** + * copies the implementations from source interface to target + */ +function $__jsx_merge_interface(target, source) { + for (var k in source.prototype) + if (source.prototype.hasOwnProperty(k)) + target.prototype[k] = source.prototype[k]; +} + +/** + * defers the initialization of the property + */ +function $__jsx_lazy_init(obj, prop, func) { + function reset(obj, prop, value) { + delete obj[prop]; + obj[prop] = value; + return value; + } + + Object.defineProperty(obj, prop, { + get: function () { + return reset(obj, prop, func()); + }, + set: function (v) { + reset(obj, prop, v); + }, + enumerable: true, + configurable: true + }); +} + +var $__jsx_imul = Math.imul; +if (typeof $__jsx_imul === "undefined") { + $__jsx_imul = function (a, b) { + var ah = (a >>> 16) & 0xffff; + var al = a & 0xffff; + var bh = (b >>> 16) & 0xffff; + var bl = b & 0xffff; + return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0)|0); + }; +} + +/** + * fused int-ops with side-effects + */ +function $__jsx_ipadd(o, p, r) { + return o[p] = (o[p] + r) | 0; +} +function $__jsx_ipsub(o, p, r) { + return o[p] = (o[p] - r) | 0; +} +function $__jsx_ipmul(o, p, r) { + return o[p] = $__jsx_imul(o[p], r); +} +function $__jsx_ipdiv(o, p, r) { + return o[p] = (o[p] / r) | 0; +} +function $__jsx_ipmod(o, p, r) { + return o[p] = (o[p] % r) | 0; +} +function $__jsx_ippostinc(o, p) { + var v = o[p]; + o[p] = (v + 1) | 0; + return v; +} +function $__jsx_ippostdec(o, p) { + var v = o[p]; + o[p] = (v - 1) | 0; + return v; +} + +/** + * non-inlined version of Array#each + */ +function $__jsx_forEach(o, f) { + var l = o.length; + for (var i = 0; i < l; ++i) + f(o[i]); +} + +/* + * global functions, renamed to avoid conflict with local variable names + */ +var $__jsx_parseInt = parseInt; +var $__jsx_parseFloat = parseFloat; +function $__jsx_isNaN(n) { return n !== n; } +var $__jsx_isFinite = isFinite; + +var $__jsx_encodeURIComponent = encodeURIComponent; +var $__jsx_decodeURIComponent = decodeURIComponent; +var $__jsx_encodeURI = encodeURI; +var $__jsx_decodeURI = decodeURI; + +var $__jsx_ObjectToString = Object.prototype.toString; +var $__jsx_ObjectHasOwnProperty = Object.prototype.hasOwnProperty; + +/* + * profiler object, initialized afterwards + */ +function $__jsx_profiler() { +} + +/* + * public interface to JSX code + */ +JSX.require = function (path) { + var m = $__jsx_classMap[path]; + return m !== undefined ? m : null; +}; + +JSX.profilerIsRunning = function () { + return $__jsx_profiler.getResults != null; +}; + +JSX.getProfileResults = function () { + return ($__jsx_profiler.getResults || function () { return {}; })(); +}; + +JSX.postProfileResults = function (url, cb) { + if ($__jsx_profiler.postResults == null) + throw new Error("profiler has not been turned on"); + return $__jsx_profiler.postResults(url, cb); +}; + +JSX.resetProfileResults = function () { + if ($__jsx_profiler.resetResults == null) + throw new Error("profiler has not been turned on"); + return $__jsx_profiler.resetResults(); +}; +JSX.DEBUG = false; +var GeneratorFunction$0 = +(function () { + try { + return Function('import {GeneratorFunction} from "std:iteration"; return GeneratorFunction')(); + } catch (e) { + return function GeneratorFunction () {}; + } +})(); +var __jsx_generator_object$0 = +(function () { + function __jsx_generator_object() { + this.__next = 0; + this.__loop = null; + this.__seed = null; + this.__value = undefined; + this.__status = 0; // SUSPENDED: 0, ACTIVE: 1, DEAD: 2 + } + + __jsx_generator_object.prototype.next = function (seed) { + switch (this.__status) { + case 0: + this.__status = 1; + this.__seed = seed; + + // go next! + this.__loop(this.__next); + + var done = false; + if (this.__next != -1) { + this.__status = 0; + } else { + this.__status = 2; + done = true; + } + return { value: this.__value, done: done }; + case 1: + throw new Error("Generator is already running"); + case 2: + throw new Error("Generator is already finished"); + default: + throw new Error("Unexpected generator internal state"); + } + }; + + return __jsx_generator_object; +}()); +function Among(s, substring_i, result) { + this.s_size = s.length; + this.s = s; + this.substring_i = substring_i; + this.result = result; + this.method = null; + this.instance = null; +}; + +function Among$0(s, substring_i, result, method, instance) { + this.s_size = s.length; + this.s = s; + this.substring_i = substring_i; + this.result = result; + this.method = method; + this.instance = instance; +}; + +$__jsx_extend([Among, Among$0], Object); +function Stemmer() { +}; + +$__jsx_extend([Stemmer], Object); +function BaseStemmer() { + var current$0; + var cursor$0; + var limit$0; + this.cache = ({ }); + current$0 = this.current = ""; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; +}; + +$__jsx_extend([BaseStemmer], Stemmer); +BaseStemmer.prototype.setCurrent$S = function (value) { + var current$0; + var cursor$0; + var limit$0; + current$0 = this.current = value; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; +}; + + +function BaseStemmer$setCurrent$LBaseStemmer$S($this, value) { + var current$0; + var cursor$0; + var limit$0; + current$0 = $this.current = value; + cursor$0 = $this.cursor = 0; + limit$0 = $this.limit = current$0.length; + $this.limit_backward = 0; + $this.bra = cursor$0; + $this.ket = limit$0; +}; + +BaseStemmer.setCurrent$LBaseStemmer$S = BaseStemmer$setCurrent$LBaseStemmer$S; + +BaseStemmer.prototype.getCurrent$ = function () { + return this.current; +}; + + +function BaseStemmer$getCurrent$LBaseStemmer$($this) { + return $this.current; +}; + +BaseStemmer.getCurrent$LBaseStemmer$ = BaseStemmer$getCurrent$LBaseStemmer$; + +BaseStemmer.prototype.copy_from$LBaseStemmer$ = function (other) { + this.current = other.current; + this.cursor = other.cursor; + this.limit = other.limit; + this.limit_backward = other.limit_backward; + this.bra = other.bra; + this.ket = other.ket; +}; + + +function BaseStemmer$copy_from$LBaseStemmer$LBaseStemmer$($this, other) { + $this.current = other.current; + $this.cursor = other.cursor; + $this.limit = other.limit; + $this.limit_backward = other.limit_backward; + $this.bra = other.bra; + $this.ket = other.ket; +}; + +BaseStemmer.copy_from$LBaseStemmer$LBaseStemmer$ = BaseStemmer$copy_from$LBaseStemmer$LBaseStemmer$; + +BaseStemmer.prototype.in_grouping$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_grouping$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_grouping$LBaseStemmer$AIII = BaseStemmer$in_grouping$LBaseStemmer$AIII; + +BaseStemmer.prototype.in_grouping_b$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_grouping_b$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_grouping_b$LBaseStemmer$AIII = BaseStemmer$in_grouping_b$LBaseStemmer$AIII; + +BaseStemmer.prototype.out_grouping$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0X1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + + +function BaseStemmer$out_grouping$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (ch > max || ch < min) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0X1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + +BaseStemmer.out_grouping$LBaseStemmer$AIII = BaseStemmer$out_grouping$LBaseStemmer$AIII; + +BaseStemmer.prototype.out_grouping_b$AIII = function (s, min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + + +function BaseStemmer$out_grouping_b$LBaseStemmer$AIII($this, s, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (ch > max || ch < min) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + ch -= min; + if ((s[ch >>> 3] & 0x1 << (ch & 0x7)) === 0) { + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; + } + return false; +}; + +BaseStemmer.out_grouping_b$LBaseStemmer$AIII = BaseStemmer$out_grouping_b$LBaseStemmer$AIII; + +BaseStemmer.prototype.in_range$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_range$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_range$LBaseStemmer$II = BaseStemmer$in_range$LBaseStemmer$II; + +BaseStemmer.prototype.in_range_b$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$in_range_b$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (ch > max || ch < min) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.in_range_b$LBaseStemmer$II = BaseStemmer$in_range_b$LBaseStemmer$II; + +BaseStemmer.prototype.out_range$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor >= this.limit) { + return false; + } + ch = this.current.charCodeAt(this.cursor); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$out_range$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor >= $this.limit) { + return false; + } + ch = $this.current.charCodeAt($this.cursor); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.out_range$LBaseStemmer$II = BaseStemmer$out_range$LBaseStemmer$II; + +BaseStemmer.prototype.out_range_b$II = function (min, max) { + var ch; + var $__jsx_postinc_t; + if (this.cursor <= this.limit_backward) { + return false; + } + ch = this.current.charCodeAt(this.cursor - 1); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + + +function BaseStemmer$out_range_b$LBaseStemmer$II($this, min, max) { + var ch; + var $__jsx_postinc_t; + if ($this.cursor <= $this.limit_backward) { + return false; + } + ch = $this.current.charCodeAt($this.cursor - 1); + if (! (ch > max || ch < min)) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t - 1) | 0, $__jsx_postinc_t); + return true; +}; + +BaseStemmer.out_range_b$LBaseStemmer$II = BaseStemmer$out_range_b$LBaseStemmer$II; + +BaseStemmer.prototype.eq_s$IS = function (s_size, s) { + var cursor$0; + if (((this.limit - this.cursor) | 0) < s_size) { + return false; + } + if (this.current.slice(cursor$0 = this.cursor, ((cursor$0 + s_size) | 0)) !== s) { + return false; + } + this.cursor = (this.cursor + s_size) | 0; + return true; +}; + + +function BaseStemmer$eq_s$LBaseStemmer$IS($this, s_size, s) { + var cursor$0; + if ((($this.limit - $this.cursor) | 0) < s_size) { + return false; + } + if ($this.current.slice(cursor$0 = $this.cursor, ((cursor$0 + s_size) | 0)) !== s) { + return false; + } + $this.cursor = ($this.cursor + s_size) | 0; + return true; +}; + +BaseStemmer.eq_s$LBaseStemmer$IS = BaseStemmer$eq_s$LBaseStemmer$IS; + +BaseStemmer.prototype.eq_s_b$IS = function (s_size, s) { + var cursor$0; + if (((this.cursor - this.limit_backward) | 0) < s_size) { + return false; + } + if (this.current.slice((((cursor$0 = this.cursor) - s_size) | 0), cursor$0) !== s) { + return false; + } + this.cursor = (this.cursor - s_size) | 0; + return true; +}; + + +function BaseStemmer$eq_s_b$LBaseStemmer$IS($this, s_size, s) { + var cursor$0; + if ((($this.cursor - $this.limit_backward) | 0) < s_size) { + return false; + } + if ($this.current.slice((((cursor$0 = $this.cursor) - s_size) | 0), cursor$0) !== s) { + return false; + } + $this.cursor = ($this.cursor - s_size) | 0; + return true; +}; + +BaseStemmer.eq_s_b$LBaseStemmer$IS = BaseStemmer$eq_s_b$LBaseStemmer$IS; + +BaseStemmer.prototype.eq_v$S = function (s) { + return BaseStemmer$eq_s$LBaseStemmer$IS(this, s.length, s); +}; + + +function BaseStemmer$eq_v$LBaseStemmer$S($this, s) { + return BaseStemmer$eq_s$LBaseStemmer$IS($this, s.length, s); +}; + +BaseStemmer.eq_v$LBaseStemmer$S = BaseStemmer$eq_v$LBaseStemmer$S; + +BaseStemmer.prototype.eq_v_b$S = function (s) { + return BaseStemmer$eq_s_b$LBaseStemmer$IS(this, s.length, s); +}; + + +function BaseStemmer$eq_v_b$LBaseStemmer$S($this, s) { + return BaseStemmer$eq_s_b$LBaseStemmer$IS($this, s.length, s); +}; + +BaseStemmer.eq_v_b$LBaseStemmer$S = BaseStemmer$eq_v_b$LBaseStemmer$S; + +BaseStemmer.prototype.find_among$ALAmong$I = function (v, v_size) { + var i; + var j; + var c; + var l; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = this.cursor; + l = this.limit; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >>> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = common; i2 < w.s_size; i2++) { + if (c + common === l) { + diff = -1; + break; + } + diff = this.current.charCodeAt(c + common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + this.cursor = (c + w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method(w.instance); + this.cursor = (c + w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + + +function BaseStemmer$find_among$LBaseStemmer$ALAmong$I($this, v, v_size) { + var i; + var j; + var c; + var l; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = $this.cursor; + l = $this.limit; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >>> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = common; i2 < w.s_size; i2++) { + if (c + common === l) { + diff = -1; + break; + } + diff = $this.current.charCodeAt(c + common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + $this.cursor = (c + w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method(w.instance); + $this.cursor = (c + w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + +BaseStemmer.find_among$LBaseStemmer$ALAmong$I = BaseStemmer$find_among$LBaseStemmer$ALAmong$I; + +BaseStemmer.prototype.find_among_b$ALAmong$I = function (v, v_size) { + var i; + var j; + var c; + var lb; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = this.cursor; + lb = this.limit_backward; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common === lb) { + diff = -1; + break; + } + diff = this.current.charCodeAt(c - 1 - common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + this.cursor = (c - w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method(this); + this.cursor = (c - w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + + +function BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, v, v_size) { + var i; + var j; + var c; + var lb; + var common_i; + var common_j; + var first_key_inspected; + var k; + var diff; + var common; + var w; + var i2; + var res; + i = 0; + j = v_size; + c = $this.cursor; + lb = $this.limit_backward; + common_i = 0; + common_j = 0; + first_key_inspected = false; + while (true) { + k = i + (j - i >> 1); + diff = 0; + common = (common_i < common_j ? common_i : common_j); + w = v[k]; + for (i2 = w.s_size - 1 - common; i2 >= 0; i2--) { + if (c - common === lb) { + diff = -1; + break; + } + diff = $this.current.charCodeAt(c - 1 - common) - w.s.charCodeAt(i2); + if (diff !== 0) { + break; + } + common++; + } + if (diff < 0) { + j = k; + common_j = common; + } else { + i = k; + common_i = common; + } + if (j - i <= 1) { + if (i > 0) { + break; + } + if (j === i) { + break; + } + if (first_key_inspected) { + break; + } + first_key_inspected = true; + } + } + while (true) { + w = v[i]; + if (common_i >= w.s_size) { + $this.cursor = (c - w.s_size | 0); + if (w.method == null) { + return w.result; + } + res = w.method($this); + $this.cursor = (c - w.s_size | 0); + if (res) { + return w.result; + } + } + i = w.substring_i; + if (i < 0) { + return 0; + } + } + return -1; +}; + +BaseStemmer.find_among_b$LBaseStemmer$ALAmong$I = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I; + +BaseStemmer.prototype.replace_s$IIS = function (c_bra, c_ket, s) { + var adjustment; + adjustment = ((s.length - (((c_ket - c_bra) | 0))) | 0); + this.current = this.current.slice(0, c_bra) + s + this.current.slice(c_ket); + this.limit = (this.limit + adjustment) | 0; + if (this.cursor >= c_ket) { + this.cursor = (this.cursor + adjustment) | 0; + } else if (this.cursor > c_bra) { + this.cursor = c_bra; + } + return (adjustment | 0); +}; + + +function BaseStemmer$replace_s$LBaseStemmer$IIS($this, c_bra, c_ket, s) { + var adjustment; + adjustment = ((s.length - (((c_ket - c_bra) | 0))) | 0); + $this.current = $this.current.slice(0, c_bra) + s + $this.current.slice(c_ket); + $this.limit = ($this.limit + adjustment) | 0; + if ($this.cursor >= c_ket) { + $this.cursor = ($this.cursor + adjustment) | 0; + } else if ($this.cursor > c_bra) { + $this.cursor = c_bra; + } + return (adjustment | 0); +}; + +BaseStemmer.replace_s$LBaseStemmer$IIS = BaseStemmer$replace_s$LBaseStemmer$IIS; + +BaseStemmer.prototype.slice_check$ = function () { + var bra$0; + var ket$0; + var limit$0; + return ((bra$0 = this.bra) < 0 || bra$0 > (ket$0 = this.ket) || ket$0 > (limit$0 = this.limit) || limit$0 > this.current.length ? false : true); +}; + + +function BaseStemmer$slice_check$LBaseStemmer$($this) { + var bra$0; + var ket$0; + var limit$0; + return ((bra$0 = $this.bra) < 0 || bra$0 > (ket$0 = $this.ket) || ket$0 > (limit$0 = $this.limit) || limit$0 > $this.current.length ? false : true); +}; + +BaseStemmer.slice_check$LBaseStemmer$ = BaseStemmer$slice_check$LBaseStemmer$; + +BaseStemmer.prototype.slice_from$S = function (s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = false; + if ((bra$0 = this.bra) < 0 || bra$0 > (ket$0 = this.ket) || ket$0 > (limit$0 = this.limit) || limit$0 > this.current.length ? false : true) { + BaseStemmer$replace_s$LBaseStemmer$IIS(this, this.bra, this.ket, s); + result = true; + } + return result; +}; + + +function BaseStemmer$slice_from$LBaseStemmer$S($this, s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = false; + if ((bra$0 = $this.bra) < 0 || bra$0 > (ket$0 = $this.ket) || ket$0 > (limit$0 = $this.limit) || limit$0 > $this.current.length ? false : true) { + BaseStemmer$replace_s$LBaseStemmer$IIS($this, $this.bra, $this.ket, s); + result = true; + } + return result; +}; + +BaseStemmer.slice_from$LBaseStemmer$S = BaseStemmer$slice_from$LBaseStemmer$S; + +BaseStemmer.prototype.slice_del$ = function () { + return BaseStemmer$slice_from$LBaseStemmer$S(this, ""); +}; + + +function BaseStemmer$slice_del$LBaseStemmer$($this) { + return BaseStemmer$slice_from$LBaseStemmer$S($this, ""); +}; + +BaseStemmer.slice_del$LBaseStemmer$ = BaseStemmer$slice_del$LBaseStemmer$; + +BaseStemmer.prototype.insert$IIS = function (c_bra, c_ket, s) { + var adjustment; + adjustment = BaseStemmer$replace_s$LBaseStemmer$IIS(this, c_bra, c_ket, s); + if (c_bra <= this.bra) { + this.bra = (this.bra + adjustment) | 0; + } + if (c_bra <= this.ket) { + this.ket = (this.ket + adjustment) | 0; + } +}; + + +function BaseStemmer$insert$LBaseStemmer$IIS($this, c_bra, c_ket, s) { + var adjustment; + adjustment = BaseStemmer$replace_s$LBaseStemmer$IIS($this, c_bra, c_ket, s); + if (c_bra <= $this.bra) { + $this.bra = ($this.bra + adjustment) | 0; + } + if (c_bra <= $this.ket) { + $this.ket = ($this.ket + adjustment) | 0; + } +}; + +BaseStemmer.insert$LBaseStemmer$IIS = BaseStemmer$insert$LBaseStemmer$IIS; + +BaseStemmer.prototype.slice_to$S = function (s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = ''; + if ((bra$0 = this.bra) < 0 || bra$0 > (ket$0 = this.ket) || ket$0 > (limit$0 = this.limit) || limit$0 > this.current.length ? false : true) { + result = this.current.slice(this.bra, this.ket); + } + return result; +}; + + +function BaseStemmer$slice_to$LBaseStemmer$S($this, s) { + var result; + var bra$0; + var ket$0; + var limit$0; + result = ''; + if ((bra$0 = $this.bra) < 0 || bra$0 > (ket$0 = $this.ket) || ket$0 > (limit$0 = $this.limit) || limit$0 > $this.current.length ? false : true) { + result = $this.current.slice($this.bra, $this.ket); + } + return result; +}; + +BaseStemmer.slice_to$LBaseStemmer$S = BaseStemmer$slice_to$LBaseStemmer$S; + +BaseStemmer.prototype.assign_to$S = function (s) { + return this.current.slice(0, this.limit); +}; + + +function BaseStemmer$assign_to$LBaseStemmer$S($this, s) { + return $this.current.slice(0, $this.limit); +}; + +BaseStemmer.assign_to$LBaseStemmer$S = BaseStemmer$assign_to$LBaseStemmer$S; + +BaseStemmer.prototype.stem$ = function () { + return false; +}; + + +BaseStemmer.prototype.stemWord$S = function (word) { + var result; + var current$0; + var cursor$0; + var limit$0; + result = this.cache['.' + word]; + if (result == null) { + current$0 = this.current = word; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; + this.stem$(); + result = this.current; + this.cache['.' + word] = result; + } + return result; +}; + +BaseStemmer.prototype.stemWord = BaseStemmer.prototype.stemWord$S; + +BaseStemmer.prototype.stemWords$AS = function (words) { + var results; + var i; + var word; + var result; + var current$0; + var cursor$0; + var limit$0; + results = [ ]; + for (i = 0; i < words.length; i++) { + word = words[i]; + result = this.cache['.' + word]; + if (result == null) { + current$0 = this.current = word; + cursor$0 = this.cursor = 0; + limit$0 = this.limit = current$0.length; + this.limit_backward = 0; + this.bra = cursor$0; + this.ket = limit$0; + this.stem$(); + result = this.current; + this.cache['.' + word] = result; + } + results.push(result); + } + return results; +}; + +BaseStemmer.prototype.stemWords = BaseStemmer.prototype.stemWords$AS; + +function GermanStemmer() { + BaseStemmer.call(this); + this.I_x = 0; + this.I_p2 = 0; + this.I_p1 = 0; +}; + +$__jsx_extend([GermanStemmer], BaseStemmer); +GermanStemmer.prototype.copy_from$LGermanStemmer$ = function (other) { + this.I_x = other.I_x; + this.I_p2 = other.I_p2; + this.I_p1 = other.I_p1; + BaseStemmer$copy_from$LBaseStemmer$LBaseStemmer$(this, other); +}; + +GermanStemmer.prototype.copy_from = GermanStemmer.prototype.copy_from$LGermanStemmer$; + +GermanStemmer.prototype.r_prelude$ = function () { + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var lab1; + var lab2; + var lab3; + var lab5; + var lab7; + var lab8; + var lab9; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + v_1 = this.cursor; +replab0: + while (true) { + v_2 = this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + lab2 = true; + lab2: + while (lab2 === true) { + lab2 = false; + v_3 = this.cursor; + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + this.bra = this.cursor; + if (! BaseStemmer$eq_s$LBaseStemmer$IS(this, 1, "\u00DF")) { + break lab3; + } + this.ket = this.cursor; + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "ss")) { + return false; + } + break lab2; + } + cursor$0 = this.cursor = v_3; + if (cursor$0 >= this.limit) { + break lab1; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab0; + } + this.cursor = v_2; + break replab0; + } + this.cursor = v_1; +replab4: + while (true) { + v_4 = this.cursor; + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + golab6: + while (true) { + v_5 = this.cursor; + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + this.bra = this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_6 = this.cursor; + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s$LBaseStemmer$IS(this, 1, "u")) { + break lab9; + } + this.ket = this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab9; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "U")) { + return false; + } + break lab8; + } + this.cursor = v_6; + if (! BaseStemmer$eq_s$LBaseStemmer$IS(this, 1, "y")) { + break lab7; + } + this.ket = this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "Y")) { + return false; + } + } + this.cursor = v_5; + break golab6; + } + cursor$1 = this.cursor = v_5; + if (cursor$1 >= this.limit) { + break lab5; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab4; + } + this.cursor = v_4; + break replab4; + } + return true; +}; + +GermanStemmer.prototype.r_prelude = GermanStemmer.prototype.r_prelude$; + +function GermanStemmer$r_prelude$LGermanStemmer$($this) { + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var lab1; + var lab2; + var lab3; + var lab5; + var lab7; + var lab8; + var lab9; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + v_1 = $this.cursor; +replab0: + while (true) { + v_2 = $this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + lab2 = true; + lab2: + while (lab2 === true) { + lab2 = false; + v_3 = $this.cursor; + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + $this.bra = $this.cursor; + if (! BaseStemmer$eq_s$LBaseStemmer$IS($this, 1, "\u00DF")) { + break lab3; + } + $this.ket = $this.cursor; + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "ss")) { + return false; + } + break lab2; + } + cursor$0 = $this.cursor = v_3; + if (cursor$0 >= $this.limit) { + break lab1; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab0; + } + $this.cursor = v_2; + break replab0; + } + $this.cursor = v_1; +replab4: + while (true) { + v_4 = $this.cursor; + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + golab6: + while (true) { + v_5 = $this.cursor; + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + $this.bra = $this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_6 = $this.cursor; + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s$LBaseStemmer$IS($this, 1, "u")) { + break lab9; + } + $this.ket = $this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab9; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "U")) { + return false; + } + break lab8; + } + $this.cursor = v_6; + if (! BaseStemmer$eq_s$LBaseStemmer$IS($this, 1, "y")) { + break lab7; + } + $this.ket = $this.cursor; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "Y")) { + return false; + } + } + $this.cursor = v_5; + break golab6; + } + cursor$1 = $this.cursor = v_5; + if (cursor$1 >= $this.limit) { + break lab5; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + continue replab4; + } + $this.cursor = v_4; + break replab4; + } + return true; +}; + +GermanStemmer.r_prelude$LGermanStemmer$ = GermanStemmer$r_prelude$LGermanStemmer$; + +GermanStemmer.prototype.r_mark_regions$ = function () { + var v_1; + var c; + var lab1; + var lab3; + var lab4; + var lab6; + var lab8; + var limit$0; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + this.I_p1 = limit$0 = this.limit; + this.I_p2 = limit$0; + v_1 = cursor$0 = this.cursor; + c = (cursor$0 + 3 | 0); + if (0 > c || c > limit$0) { + return false; + } + cursor$1 = this.cursor = c; + this.I_x = cursor$1; + this.cursor = v_1; +golab0: + while (true) { + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab1; + } + break golab0; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab2: + while (true) { + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab3; + } + break golab2; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + this.I_p1 = this.cursor; + lab4 = true; +lab4: + while (lab4 === true) { + lab4 = false; + if (! (this.I_p1 < this.I_x)) { + break lab4; + } + this.I_p1 = this.I_x; + } +golab5: + while (true) { + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab6; + } + break golab5; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab7: + while (true) { + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII(this, GermanStemmer.g_v, 97, 252)) { + break lab8; + } + break golab7; + } + if (this.cursor >= this.limit) { + return false; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + this.I_p2 = this.cursor; + return true; +}; + +GermanStemmer.prototype.r_mark_regions = GermanStemmer.prototype.r_mark_regions$; + +function GermanStemmer$r_mark_regions$LGermanStemmer$($this) { + var v_1; + var c; + var lab1; + var lab3; + var lab4; + var lab6; + var lab8; + var limit$0; + var cursor$0; + var cursor$1; + var $__jsx_postinc_t; + $this.I_p1 = limit$0 = $this.limit; + $this.I_p2 = limit$0; + v_1 = cursor$0 = $this.cursor; + c = (cursor$0 + 3 | 0); + if (0 > c || c > limit$0) { + return false; + } + cursor$1 = $this.cursor = c; + $this.I_x = cursor$1; + $this.cursor = v_1; +golab0: + while (true) { + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab1; + } + break golab0; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab2: + while (true) { + lab3 = true; + lab3: + while (lab3 === true) { + lab3 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab3; + } + break golab2; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + $this.I_p1 = $this.cursor; + lab4 = true; +lab4: + while (lab4 === true) { + lab4 = false; + if (! ($this.I_p1 < $this.I_x)) { + break lab4; + } + $this.I_p1 = $this.I_x; + } +golab5: + while (true) { + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$in_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab6; + } + break golab5; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } +golab7: + while (true) { + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + if (! BaseStemmer$out_grouping$LBaseStemmer$AIII($this, GermanStemmer.g_v, 97, 252)) { + break lab8; + } + break golab7; + } + if ($this.cursor >= $this.limit) { + return false; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + } + $this.I_p2 = $this.cursor; + return true; +}; + +GermanStemmer.r_mark_regions$LGermanStemmer$ = GermanStemmer$r_mark_regions$LGermanStemmer$; + +GermanStemmer.prototype.r_postlude$ = function () { + var among_var; + var v_1; + var lab1; + var $__jsx_postinc_t; +replab0: + while (true) { + v_1 = this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + this.bra = this.cursor; + among_var = BaseStemmer$find_among$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_0, 6); + if (among_var === 0) { + break lab1; + } + this.ket = this.cursor; + switch (among_var) { + case 0: + break lab1; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "y")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "u")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "a")) { + return false; + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "o")) { + return false; + } + break; + case 5: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "u")) { + return false; + } + break; + case 6: + if (this.cursor >= this.limit) { + break lab1; + } + ($__jsx_postinc_t = this.cursor, this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + break; + } + continue replab0; + } + this.cursor = v_1; + break replab0; + } + return true; +}; + +GermanStemmer.prototype.r_postlude = GermanStemmer.prototype.r_postlude$; + +function GermanStemmer$r_postlude$LGermanStemmer$($this) { + var among_var; + var v_1; + var lab1; + var $__jsx_postinc_t; +replab0: + while (true) { + v_1 = $this.cursor; + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + $this.bra = $this.cursor; + among_var = BaseStemmer$find_among$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_0, 6); + if (among_var === 0) { + break lab1; + } + $this.ket = $this.cursor; + switch (among_var) { + case 0: + break lab1; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "y")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "u")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "a")) { + return false; + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "o")) { + return false; + } + break; + case 5: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "u")) { + return false; + } + break; + case 6: + if ($this.cursor >= $this.limit) { + break lab1; + } + ($__jsx_postinc_t = $this.cursor, $this.cursor = ($__jsx_postinc_t + 1) | 0, $__jsx_postinc_t); + break; + } + continue replab0; + } + $this.cursor = v_1; + break replab0; + } + return true; +}; + +GermanStemmer.r_postlude$LGermanStemmer$ = GermanStemmer$r_postlude$LGermanStemmer$; + +GermanStemmer.prototype.r_R1$ = function () { + return (! (this.I_p1 <= this.cursor) ? false : true); +}; + +GermanStemmer.prototype.r_R1 = GermanStemmer.prototype.r_R1$; + +function GermanStemmer$r_R1$LGermanStemmer$($this) { + return (! ($this.I_p1 <= $this.cursor) ? false : true); +}; + +GermanStemmer.r_R1$LGermanStemmer$ = GermanStemmer$r_R1$LGermanStemmer$; + +GermanStemmer.prototype.r_R2$ = function () { + return (! (this.I_p2 <= this.cursor) ? false : true); +}; + +GermanStemmer.prototype.r_R2 = GermanStemmer.prototype.r_R2$; + +function GermanStemmer$r_R2$LGermanStemmer$($this) { + return (! ($this.I_p2 <= $this.cursor) ? false : true); +}; + +GermanStemmer.r_R2$LGermanStemmer$ = GermanStemmer$r_R2$LGermanStemmer$; + +GermanStemmer.prototype.r_standard_suffix$ = function () { + var among_var; + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var v_7; + var v_8; + var v_9; + var v_10; + var lab0; + var lab1; + var lab2; + var c; + var lab3; + var lab4; + var lab5; + var lab6; + var lab7; + var lab8; + var lab9; + var lab10; + var cursor$0; + var cursor$1; + var limit$0; + var cursor$2; + var cursor$3; + var cursor$4; + var cursor$5; + var cursor$6; + var cursor$7; + var limit$1; + var cursor$8; + v_1 = ((this.limit - this.cursor) | 0); + lab0 = true; +lab0: + while (lab0 === true) { + lab0 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_1, 7); + if (among_var === 0) { + break lab0; + } + this.bra = cursor$0 = this.cursor; + if (! (! (this.I_p1 <= cursor$0) ? false : true)) { + break lab0; + } + switch (among_var) { + case 0: + break lab0; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_2 = ((this.limit - this.cursor) | 0); + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + this.ket = this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 1, "s")) { + this.cursor = ((this.limit - v_2) | 0); + break lab1; + } + this.bra = this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 3, "nis")) { + this.cursor = ((this.limit - v_2) | 0); + break lab1; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + } + break; + case 3: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII(this, GermanStemmer.g_s_ending, 98, 116)) { + break lab0; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + } + } + cursor$2 = this.cursor = (((limit$0 = this.limit) - v_1) | 0); + v_3 = ((limit$0 - cursor$2) | 0); + lab2 = true; +lab2: + while (lab2 === true) { + lab2 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_2, 4); + if (among_var === 0) { + break lab2; + } + this.bra = cursor$1 = this.cursor; + if (! (! (this.I_p1 <= cursor$1) ? false : true)) { + break lab2; + } + switch (among_var) { + case 0: + break lab2; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII(this, GermanStemmer.g_st_ending, 98, 116)) { + break lab2; + } + c = (this.cursor - 3 | 0); + if (this.limit_backward > c || c > this.limit) { + break lab2; + } + this.cursor = c; + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + } + } + cursor$8 = this.cursor = (((limit$1 = this.limit) - v_3) | 0); + v_4 = ((limit$1 - cursor$8) | 0); + lab3 = true; +lab3: + while (lab3 === true) { + lab3 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_4, 8); + if (among_var === 0) { + break lab3; + } + this.bra = cursor$3 = this.cursor; + if (! (! (this.I_p2 <= cursor$3) ? false : true)) { + break lab3; + } + switch (among_var) { + case 0: + break lab3; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_5 = ((this.limit - this.cursor) | 0); + lab4 = true; + lab4: + while (lab4 === true) { + lab4 = false; + this.ket = this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 2, "ig")) { + this.cursor = ((this.limit - v_5) | 0); + break lab4; + } + this.bra = cursor$4 = this.cursor; + v_6 = ((this.limit - cursor$4) | 0); + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 1, "e")) { + break lab5; + } + this.cursor = ((this.limit - v_5) | 0); + break lab4; + } + cursor$5 = this.cursor = ((this.limit - v_6) | 0); + if (! (! (this.I_p2 <= cursor$5) ? false : true)) { + this.cursor = ((this.limit - v_5) | 0); + break lab4; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + } + break; + case 2: + v_7 = ((this.limit - this.cursor) | 0); + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 1, "e")) { + break lab6; + } + break lab3; + } + this.cursor = ((this.limit - v_7) | 0); + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_8 = ((this.limit - this.cursor) | 0); + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + this.ket = this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_9 = ((this.limit - this.cursor) | 0); + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 2, "er")) { + break lab9; + } + break lab8; + } + this.cursor = ((this.limit - v_9) | 0); + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS(this, 2, "en")) { + this.cursor = ((this.limit - v_8) | 0); + break lab7; + } + } + this.bra = cursor$6 = this.cursor; + if (! (! (this.I_p1 <= cursor$6) ? false : true)) { + this.cursor = ((this.limit - v_8) | 0); + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + v_10 = ((this.limit - this.cursor) | 0); + lab10 = true; + lab10: + while (lab10 === true) { + lab10 = false; + this.ket = this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I(this, GermanStemmer.a_3, 2); + if (among_var === 0) { + this.cursor = ((this.limit - v_10) | 0); + break lab10; + } + this.bra = cursor$7 = this.cursor; + if (! (! (this.I_p2 <= cursor$7) ? false : true)) { + this.cursor = ((this.limit - v_10) | 0); + break lab10; + } + switch (among_var) { + case 0: + this.cursor = ((this.limit - v_10) | 0); + break lab10; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S(this, "")) { + return false; + } + break; + } + } + break; + } + } + this.cursor = ((this.limit - v_4) | 0); + return true; +}; + +GermanStemmer.prototype.r_standard_suffix = GermanStemmer.prototype.r_standard_suffix$; + +function GermanStemmer$r_standard_suffix$LGermanStemmer$($this) { + var among_var; + var v_1; + var v_2; + var v_3; + var v_4; + var v_5; + var v_6; + var v_7; + var v_8; + var v_9; + var v_10; + var lab0; + var lab1; + var lab2; + var c; + var lab3; + var lab4; + var lab5; + var lab6; + var lab7; + var lab8; + var lab9; + var lab10; + var cursor$0; + var cursor$1; + var limit$0; + var cursor$2; + var cursor$3; + var cursor$4; + var cursor$5; + var cursor$6; + var cursor$7; + var limit$1; + var cursor$8; + v_1 = (($this.limit - $this.cursor) | 0); + lab0 = true; +lab0: + while (lab0 === true) { + lab0 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_1, 7); + if (among_var === 0) { + break lab0; + } + $this.bra = cursor$0 = $this.cursor; + if (! (! ($this.I_p1 <= cursor$0) ? false : true)) { + break lab0; + } + switch (among_var) { + case 0: + break lab0; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_2 = (($this.limit - $this.cursor) | 0); + lab1 = true; + lab1: + while (lab1 === true) { + lab1 = false; + $this.ket = $this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 1, "s")) { + $this.cursor = (($this.limit - v_2) | 0); + break lab1; + } + $this.bra = $this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 3, "nis")) { + $this.cursor = (($this.limit - v_2) | 0); + break lab1; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + } + break; + case 3: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII($this, GermanStemmer.g_s_ending, 98, 116)) { + break lab0; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + } + } + cursor$2 = $this.cursor = (((limit$0 = $this.limit) - v_1) | 0); + v_3 = ((limit$0 - cursor$2) | 0); + lab2 = true; +lab2: + while (lab2 === true) { + lab2 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_2, 4); + if (among_var === 0) { + break lab2; + } + $this.bra = cursor$1 = $this.cursor; + if (! (! ($this.I_p1 <= cursor$1) ? false : true)) { + break lab2; + } + switch (among_var) { + case 0: + break lab2; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + case 2: + if (! BaseStemmer$in_grouping_b$LBaseStemmer$AIII($this, GermanStemmer.g_st_ending, 98, 116)) { + break lab2; + } + c = ($this.cursor - 3 | 0); + if ($this.limit_backward > c || c > $this.limit) { + break lab2; + } + $this.cursor = c; + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + } + } + cursor$8 = $this.cursor = (((limit$1 = $this.limit) - v_3) | 0); + v_4 = ((limit$1 - cursor$8) | 0); + lab3 = true; +lab3: + while (lab3 === true) { + lab3 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_4, 8); + if (among_var === 0) { + break lab3; + } + $this.bra = cursor$3 = $this.cursor; + if (! (! ($this.I_p2 <= cursor$3) ? false : true)) { + break lab3; + } + switch (among_var) { + case 0: + break lab3; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_5 = (($this.limit - $this.cursor) | 0); + lab4 = true; + lab4: + while (lab4 === true) { + lab4 = false; + $this.ket = $this.cursor; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 2, "ig")) { + $this.cursor = (($this.limit - v_5) | 0); + break lab4; + } + $this.bra = cursor$4 = $this.cursor; + v_6 = (($this.limit - cursor$4) | 0); + lab5 = true; + lab5: + while (lab5 === true) { + lab5 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 1, "e")) { + break lab5; + } + $this.cursor = (($this.limit - v_5) | 0); + break lab4; + } + cursor$5 = $this.cursor = (($this.limit - v_6) | 0); + if (! (! ($this.I_p2 <= cursor$5) ? false : true)) { + $this.cursor = (($this.limit - v_5) | 0); + break lab4; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + } + break; + case 2: + v_7 = (($this.limit - $this.cursor) | 0); + lab6 = true; + lab6: + while (lab6 === true) { + lab6 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 1, "e")) { + break lab6; + } + break lab3; + } + $this.cursor = (($this.limit - v_7) | 0); + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + case 3: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_8 = (($this.limit - $this.cursor) | 0); + lab7 = true; + lab7: + while (lab7 === true) { + lab7 = false; + $this.ket = $this.cursor; + lab8 = true; + lab8: + while (lab8 === true) { + lab8 = false; + v_9 = (($this.limit - $this.cursor) | 0); + lab9 = true; + lab9: + while (lab9 === true) { + lab9 = false; + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 2, "er")) { + break lab9; + } + break lab8; + } + $this.cursor = (($this.limit - v_9) | 0); + if (! BaseStemmer$eq_s_b$LBaseStemmer$IS($this, 2, "en")) { + $this.cursor = (($this.limit - v_8) | 0); + break lab7; + } + } + $this.bra = cursor$6 = $this.cursor; + if (! (! ($this.I_p1 <= cursor$6) ? false : true)) { + $this.cursor = (($this.limit - v_8) | 0); + break lab7; + } + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + } + break; + case 4: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + v_10 = (($this.limit - $this.cursor) | 0); + lab10 = true; + lab10: + while (lab10 === true) { + lab10 = false; + $this.ket = $this.cursor; + among_var = BaseStemmer$find_among_b$LBaseStemmer$ALAmong$I($this, GermanStemmer.a_3, 2); + if (among_var === 0) { + $this.cursor = (($this.limit - v_10) | 0); + break lab10; + } + $this.bra = cursor$7 = $this.cursor; + if (! (! ($this.I_p2 <= cursor$7) ? false : true)) { + $this.cursor = (($this.limit - v_10) | 0); + break lab10; + } + switch (among_var) { + case 0: + $this.cursor = (($this.limit - v_10) | 0); + break lab10; + case 1: + if (! BaseStemmer$slice_from$LBaseStemmer$S($this, "")) { + return false; + } + break; + } + } + break; + } + } + $this.cursor = (($this.limit - v_4) | 0); + return true; +}; + +GermanStemmer.r_standard_suffix$LGermanStemmer$ = GermanStemmer$r_standard_suffix$LGermanStemmer$; + +GermanStemmer.prototype.stem$ = function () { + var v_1; + var v_2; + var v_4; + var lab0; + var lab1; + var lab2; + var lab3; + var cursor$0; + var cursor$1; + var cursor$2; + v_1 = this.cursor; + lab0 = true; +lab0: + while (lab0 === true) { + lab0 = false; + if (! GermanStemmer$r_prelude$LGermanStemmer$(this)) { + break lab0; + } + } + cursor$0 = this.cursor = v_1; + v_2 = cursor$0; + lab1 = true; +lab1: + while (lab1 === true) { + lab1 = false; + if (! GermanStemmer$r_mark_regions$LGermanStemmer$(this)) { + break lab1; + } + } + cursor$1 = this.cursor = v_2; + this.limit_backward = cursor$1; + this.cursor = this.limit; + lab2 = true; +lab2: + while (lab2 === true) { + lab2 = false; + if (! GermanStemmer$r_standard_suffix$LGermanStemmer$(this)) { + break lab2; + } + } + cursor$2 = this.cursor = this.limit_backward; + v_4 = cursor$2; + lab3 = true; +lab3: + while (lab3 === true) { + lab3 = false; + if (! GermanStemmer$r_postlude$LGermanStemmer$(this)) { + break lab3; + } + } + this.cursor = v_4; + return true; +}; + +GermanStemmer.prototype.stem = GermanStemmer.prototype.stem$; + +GermanStemmer.prototype.equals$X = function (o) { + return o instanceof GermanStemmer; +}; + +GermanStemmer.prototype.equals = GermanStemmer.prototype.equals$X; + +function GermanStemmer$equals$LGermanStemmer$X($this, o) { + return o instanceof GermanStemmer; +}; + +GermanStemmer.equals$LGermanStemmer$X = GermanStemmer$equals$LGermanStemmer$X; + +GermanStemmer.prototype.hashCode$ = function () { + var classname; + var hash; + var i; + var char; + classname = "GermanStemmer"; + hash = 0; + for (i = 0; i < classname.length; i++) { + char = classname.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash = hash & hash; + } + return (hash | 0); +}; + +GermanStemmer.prototype.hashCode = GermanStemmer.prototype.hashCode$; + +function GermanStemmer$hashCode$LGermanStemmer$($this) { + var classname; + var hash; + var i; + var char; + classname = "GermanStemmer"; + hash = 0; + for (i = 0; i < classname.length; i++) { + char = classname.charCodeAt(i); + hash = (hash << 5) - hash + char; + hash = hash & hash; + } + return (hash | 0); +}; + +GermanStemmer.hashCode$LGermanStemmer$ = GermanStemmer$hashCode$LGermanStemmer$; + +GermanStemmer.serialVersionUID = 1; +$__jsx_lazy_init(GermanStemmer, "methodObject", function () { + return new GermanStemmer(); +}); +$__jsx_lazy_init(GermanStemmer, "a_0", function () { + return [ new Among("", -1, 6), new Among("U", 0, 2), new Among("Y", 0, 1), new Among("\u00E4", 0, 3), new Among("\u00F6", 0, 4), new Among("\u00FC", 0, 5) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_1", function () { + return [ new Among("e", -1, 2), new Among("em", -1, 1), new Among("en", -1, 2), new Among("ern", -1, 1), new Among("er", -1, 1), new Among("s", -1, 3), new Among("es", 5, 2) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_2", function () { + return [ new Among("en", -1, 1), new Among("er", -1, 1), new Among("st", -1, 2), new Among("est", 2, 1) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_3", function () { + return [ new Among("ig", -1, 1), new Among("lich", -1, 1) ]; +}); +$__jsx_lazy_init(GermanStemmer, "a_4", function () { + return [ new Among("end", -1, 1), new Among("ig", -1, 2), new Among("ung", -1, 1), new Among("lich", -1, 3), new Among("isch", -1, 2), new Among("ik", -1, 2), new Among("heit", -1, 3), new Among("keit", -1, 4) ]; +}); +GermanStemmer.g_v = [ 17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 32, 8 ]; +GermanStemmer.g_s_ending = [ 117, 30, 5 ]; +GermanStemmer.g_st_ending = [ 117, 30, 4 ]; + +var $__jsx_classMap = { + "src/among.jsx": { + Among: Among, + Among$SII: Among, + Among$SIIF$LBaseStemmer$B$LBaseStemmer$: Among$0 + }, + "src/stemmer.jsx": { + Stemmer: Stemmer, + Stemmer$: Stemmer + }, + "src/base-stemmer.jsx": { + BaseStemmer: BaseStemmer, + BaseStemmer$: BaseStemmer + }, + "src/german-stemmer.jsx": { + GermanStemmer: GermanStemmer, + GermanStemmer$: GermanStemmer + } +}; + + +})(JSX); + +var Among = JSX.require("src/among.jsx").Among; +var Among$SII = JSX.require("src/among.jsx").Among$SII; +var Stemmer = JSX.require("src/stemmer.jsx").Stemmer; +var BaseStemmer = JSX.require("src/base-stemmer.jsx").BaseStemmer; +var GermanStemmer = JSX.require("src/german-stemmer.jsx").GermanStemmer; diff --git a/_static/documentation_options.js b/_static/documentation_options.js index 4c199ec..bab9bc2 100644 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,7 +1,7 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), VERSION: '0.2.3', - LANGUAGE: 'None', + LANGUAGE: 'de', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', diff --git a/_static/language_data.js b/_static/language_data.js index 0e7dc7e..9aae0c1 100644 --- a/_static/language_data.js +++ b/_static/language_data.js @@ -10,191 +10,12 @@ * */ -var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; +var stopwords = ["aber","alle","allem","allen","aller","alles","als","also","am","an","ander","andere","anderem","anderen","anderer","anderes","anderm","andern","anderr","anders","auch","auf","aus","bei","bin","bis","bist","da","damit","dann","das","dasselbe","dazu","da\u00df","dein","deine","deinem","deinen","deiner","deines","dem","demselben","den","denn","denselben","der","derer","derselbe","derselben","des","desselben","dessen","dich","die","dies","diese","dieselbe","dieselben","diesem","diesen","dieser","dieses","dir","doch","dort","du","durch","ein","eine","einem","einen","einer","eines","einig","einige","einigem","einigen","einiger","einiges","einmal","er","es","etwas","euch","euer","eure","eurem","euren","eurer","eures","f\u00fcr","gegen","gewesen","hab","habe","haben","hat","hatte","hatten","hier","hin","hinter","ich","ihm","ihn","ihnen","ihr","ihre","ihrem","ihren","ihrer","ihres","im","in","indem","ins","ist","jede","jedem","jeden","jeder","jedes","jene","jenem","jenen","jener","jenes","jetzt","kann","kein","keine","keinem","keinen","keiner","keines","k\u00f6nnen","k\u00f6nnte","machen","man","manche","manchem","manchen","mancher","manches","mein","meine","meinem","meinen","meiner","meines","mich","mir","mit","muss","musste","nach","nicht","nichts","noch","nun","nur","ob","oder","ohne","sehr","sein","seine","seinem","seinen","seiner","seines","selbst","sich","sie","sind","so","solche","solchem","solchen","solcher","solches","soll","sollte","sondern","sonst","um","und","uns","unse","unsem","unsen","unser","unses","unter","viel","vom","von","vor","war","waren","warst","was","weg","weil","weiter","welche","welchem","welchen","welcher","welches","wenn","werde","werden","wie","wieder","will","wir","wird","wirst","wo","wollen","wollte","w\u00e4hrend","w\u00fcrde","w\u00fcrden","zu","zum","zur","zwar","zwischen","\u00fcber"]; /* Non-minified version JS is _stemmer.js if file is provided */ -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} +var JSX={};(function(j){function l(b,e){var a=function(){};a.prototype=e.prototype;var c=new a;for(var d in b){b[d].prototype=c}}function H(c,b){for(var a in b.prototype)if(b.prototype.hasOwnProperty(a))c.prototype[a]=b.prototype[a]}function g(a,b,d){function c(a,b,c){delete a[b];a[b]=c;return c}Object.defineProperty(a,b,{get:function(){return c(a,b,d())},set:function(d){c(a,b,d)},enumerable:true,configurable:true})}function I(a,b,c){return a[b]=a[b]/c|0}var C=parseInt;var r=parseFloat;function J(a){return a!==a}var z=isFinite;var y=encodeURIComponent;var x=decodeURIComponent;var w=encodeURI;var u=decodeURI;var t=Object.prototype.toString;var B=Object.prototype.hasOwnProperty;function i(){}j.require=function(b){var a=q[b];return a!==undefined?a:null};j.profilerIsRunning=function(){return i.getResults!=null};j.getProfileResults=function(){return(i.getResults||function(){return{}})()};j.postProfileResults=function(a,b){if(i.postResults==null)throw new Error('profiler has not been turned on');return i.postResults(a,b)};j.resetProfileResults=function(){if(i.resetResults==null)throw new Error('profiler has not been turned on');return i.resetResults()};j.DEBUG=false;function s(){};l([s],Error);function c(a,b,c){this.F=a.length;this.K=a;this.L=b;this.I=c;this.H=null;this.P=null};l([c],Object);function o(){};l([o],Object);function e(){var a;var b;var c;this.G={};a=this.D='';b=this._=0;c=this.A=a.length;this.E=0;this.C=b;this.B=c};l([e],o);function v(a,b){a.D=b.D;a._=b._;a.A=b.A;a.E=b.E;a.C=b.C;a.B=b.B};function f(b,d,c,e){var a;if(b._>=b.A){return false}a=b.D.charCodeAt(b._);if(a>e||a>>3]&1<<(a&7))===0){return false}b._++;return true};function m(b,d,c,e){var a;if(b._<=b.E){return false}a=b.D.charCodeAt(b._-1);if(a>e||a>>3]&1<<(a&7))===0){return false}b._--;return true};function n(a,d,c,e){var b;if(a._>=a.A){return false}b=a.D.charCodeAt(a._);if(b>e||b>>3]&1<<(b&7))===0){a._++;return true}return false};function k(a,b,d){var c;if(a.A-a._>>1);h=0;c=g0){break}if(d===b){break}if(l){break}l=true}}while(true){a=m[b];if(g>=a.F){f._=e+a.F|0;if(a.H==null){return a.I}o=a.H(a.P);f._=e+a.F|0;if(o){return a.I}}b=a.L;if(b<0){return 0}}return-1};function h(d,m,p){var b;var g;var e;var n;var f;var k;var l;var i;var h;var c;var a;var j;var o;b=0;g=p;e=d._;n=d.E;f=0;k=0;l=false;while(true){i=b+(g-b>>1);h=0;c=f=0;j--){if(e-c===n){h=-1;break}h=d.D.charCodeAt(e-1-c)-a.K.charCodeAt(j);if(h!==0){break}c++}if(h<0){g=i;k=c}else{b=i;f=c}if(g-b<=1){if(b>0){break}if(g===b){break}if(l){break}l=true}}while(true){a=m[b];if(f>=a.F){d._=e-a.F|0;if(a.H==null){return a.I}o=a.H(d);d._=e-a.F|0;if(o){return a.I}}b=a.L;if(b<0){return 0}}return-1};function D(a,b,d,e){var c;c=e.length-(d-b);a.D=a.D.slice(0,b)+e+a.D.slice(d);a.A+=c|0;if(a._>=d){a._+=c|0}else if(a._>b){a._=b}return c|0};function b(a,f){var b;var c;var d;var e;b=false;if((c=a.C)<0||c>(d=a.B)||d>(e=a.A)||e>a.D.length?false:true){D(a,a.C,a.B,f);b=true}return b};e.prototype.J=function(){return false};e.prototype.W=function(b){var a;var c;var d;var e;a=this.G['.'+b];if(a==null){c=this.D=b;d=this._=0;e=this.A=c.length;this.E=0;this.C=d;this.B=e;this.J();a=this.D;this.G['.'+b]=a}return a};e.prototype.stemWord=e.prototype.W;e.prototype.X=function(e){var d;var b;var c;var a;var f;var g;var h;d=[];for(b=0;b=this.A){break b}this._++}continue a}this._=r;break a}this._=m;b:while(true){o=this._;h=true;d:while(h===true){h=false;e:while(true){d=this._;i=true;a:while(i===true){i=false;if(!f(this,a.g_v,97,252)){break a}this.C=this._;j=true;f:while(j===true){j=false;q=this._;l=true;c:while(l===true){l=false;if(!k(this,1,'u')){break c}this.B=this._;if(!f(this,a.g_v,97,252)){break c}if(!b(this,'U')){return false}break f}this._=q;if(!k(this,1,'y')){break a}this.B=this._;if(!f(this,a.g_v,97,252)){break a}if(!b(this,'Y')){return false}}this._=d;break e}p=this._=d;if(p>=this.A){break d}this._++}continue b}this._=o;break b}return true};a.prototype.r_prelude=a.prototype.U;function G(c){var s;var n;var o;var p;var e;var r;var d;var g;var h;var i;var j;var l;var m;var t;var q;s=c._;a:while(true){n=c._;d=true;b:while(d===true){d=false;g=true;c:while(g===true){g=false;o=c._;h=true;d:while(h===true){h=false;c.C=c._;if(!k(c,1,'ß')){break d}c.B=c._;if(!b(c,'ss')){return false}break c}t=c._=o;if(t>=c.A){break b}c._++}continue a}c._=n;break a}c._=s;b:while(true){p=c._;i=true;d:while(i===true){i=false;e:while(true){e=c._;j=true;a:while(j===true){j=false;if(!f(c,a.g_v,97,252)){break a}c.C=c._;l=true;f:while(l===true){l=false;r=c._;m=true;c:while(m===true){m=false;if(!k(c,1,'u')){break c}c.B=c._;if(!f(c,a.g_v,97,252)){break c}if(!b(c,'U')){return false}break f}c._=r;if(!k(c,1,'y')){break a}c.B=c._;if(!f(c,a.g_v,97,252)){break a}if(!b(c,'Y')){return false}}c._=e;break e}q=c._=e;if(q>=c.A){break d}c._++}continue b}c._=p;break b}return true};a.prototype.S=function(){var j;var b;var d;var e;var c;var g;var h;var i;var l;var k;this.I_p1=i=this.A;this.I_p2=i;j=l=this._;b=l+3|0;if(0>b||b>i){return false}k=this._=b;this.I_x=k;this._=j;a:while(true){d=true;b:while(d===true){d=false;if(!f(this,a.g_v,97,252)){break b}break a}if(this._>=this.A){return false}this._++}a:while(true){e=true;b:while(e===true){e=false;if(!n(this,a.g_v,97,252)){break b}break a}if(this._>=this.A){return false}this._++}this.I_p1=this._;c=true;a:while(c===true){c=false;if(!(this.I_p1=this.A){return false}this._++}a:while(true){h=true;b:while(h===true){h=false;if(!n(this,a.g_v,97,252)){break b}break a}if(this._>=this.A){return false}this._++}this.I_p2=this._;return true};a.prototype.r_mark_regions=a.prototype.S;function F(b){var k;var c;var e;var g;var d;var h;var i;var j;var m;var l;b.I_p1=j=b.A;b.I_p2=j;k=m=b._;c=m+3|0;if(0>c||c>j){return false}l=b._=c;b.I_x=l;b._=k;a:while(true){e=true;b:while(e===true){e=false;if(!f(b,a.g_v,97,252)){break b}break a}if(b._>=b.A){return false}b._++}a:while(true){g=true;b:while(g===true){g=false;if(!n(b,a.g_v,97,252)){break b}break a}if(b._>=b.A){return false}b._++}b.I_p1=b._;d=true;a:while(d===true){d=false;if(!(b.I_p1=b.A){return false}b._++}a:while(true){i=true;b:while(i===true){i=false;if(!n(b,a.g_v,97,252)){break b}break a}if(b._>=b.A){return false}b._++}b.I_p2=b._;return true};a.prototype.T=function(){var c;var e;var d;b:while(true){e=this._;d=true;a:while(d===true){d=false;this.C=this._;c=p(this,a.a_0,6);if(c===0){break a}this.B=this._;switch(c){case 0:break a;case 1:if(!b(this,'y')){return false}break;case 2:if(!b(this,'u')){return false}break;case 3:if(!b(this,'a')){return false}break;case 4:if(!b(this,'o')){return false}break;case 5:if(!b(this,'u')){return false}break;case 6:if(this._>=this.A){break a}this._++;break}continue b}this._=e;break b}return true};a.prototype.r_postlude=a.prototype.T;function E(c){var d;var f;var e;b:while(true){f=c._;e=true;a:while(e===true){e=false;c.C=c._;d=p(c,a.a_0,6);if(d===0){break a}c.B=c._;switch(d){case 0:break a;case 1:if(!b(c,'y')){return false}break;case 2:if(!b(c,'u')){return false}break;case 3:if(!b(c,'a')){return false}break;case 4:if(!b(c,'o')){return false}break;case 5:if(!b(c,'u')){return false}break;case 6:if(c._>=c.A){break a}c._++;break}continue b}c._=f;break b}return true};a.prototype.Q=function(){return!(this.I_p1<=this._)?false:true};a.prototype.r_R1=a.prototype.Q;a.prototype.R=function(){return!(this.I_p2<=this._)?false:true};a.prototype.r_R2=a.prototype.R;a.prototype.V=function(){var c;var z;var n;var x;var y;var f;var A;var B;var p;var w;var g;var j;var k;var l;var e;var o;var i;var q;var r;var s;var t;var u;var v;var D;var E;var F;var G;var H;var I;var J;var K;var L;var M;var C;z=this.A-this._;j=true;a:while(j===true){j=false;this.B=this._;c=h(this,a.a_1,7);if(c===0){break a}this.C=D=this._;if(!(!(this.I_p1<=D)?false:true)){break a}switch(c){case 0:break a;case 1:if(!b(this,'')){return false}break;case 2:if(!b(this,'')){return false}n=this.A-this._;k=true;b:while(k===true){k=false;this.B=this._;if(!d(this,1,'s')){this._=this.A-n;break b}this.C=this._;if(!d(this,3,'nis')){this._=this.A-n;break b}if(!b(this,'')){return false}}break;case 3:if(!m(this,a.g_s_ending,98,116)){break a}if(!b(this,'')){return false}break}}G=this._=(F=this.A)-z;x=F-G;l=true;a:while(l===true){l=false;this.B=this._;c=h(this,a.a_2,4);if(c===0){break a}this.C=E=this._;if(!(!(this.I_p1<=E)?false:true)){break a}switch(c){case 0:break a;case 1:if(!b(this,'')){return false}break;case 2:if(!m(this,a.g_st_ending,98,116)){break a}e=this._-3|0;if(this.E>e||e>this.A){break a}this._=e;if(!b(this,'')){return false}break}}C=this._=(M=this.A)-x;y=M-C;o=true;a:while(o===true){o=false;this.B=this._;c=h(this,a.a_4,8);if(c===0){break a}this.C=H=this._;if(!(!(this.I_p2<=H)?false:true)){break a}switch(c){case 0:break a;case 1:if(!b(this,'')){return false}f=this.A-this._;i=true;b:while(i===true){i=false;this.B=this._;if(!d(this,2,'ig')){this._=this.A-f;break b}this.C=I=this._;A=this.A-I;q=true;c:while(q===true){q=false;if(!d(this,1,'e')){break c}this._=this.A-f;break b}J=this._=this.A-A;if(!(!(this.I_p2<=J)?false:true)){this._=this.A-f;break b}if(!b(this,'')){return false}}break;case 2:B=this.A-this._;r=true;b:while(r===true){r=false;if(!d(this,1,'e')){break b}break a}this._=this.A-B;if(!b(this,'')){return false}break;case 3:if(!b(this,'')){return false}p=this.A-this._;s=true;b:while(s===true){s=false;this.B=this._;t=true;c:while(t===true){t=false;w=this.A-this._;u=true;d:while(u===true){u=false;if(!d(this,2,'er')){break d}break c}this._=this.A-w;if(!d(this,2,'en')){this._=this.A-p;break b}}this.C=K=this._;if(!(!(this.I_p1<=K)?false:true)){this._=this.A-p;break b}if(!b(this,'')){return false}}break;case 4:if(!b(this,'')){return false}g=this.A-this._;v=true;b:while(v===true){v=false;this.B=this._;c=h(this,a.a_3,2);if(c===0){this._=this.A-g;break b}this.C=L=this._;if(!(!(this.I_p2<=L)?false:true)){this._=this.A-g;break b}switch(c){case 0:this._=this.A-g;break b;case 1:if(!b(this,'')){return false}break}}break}}this._=this.A-y;return true};a.prototype.r_standard_suffix=a.prototype.V;function A(c){var e;var A;var j;var y;var z;var g;var B;var C;var q;var x;var i;var k;var l;var n;var f;var p;var o;var r;var s;var t;var u;var v;var w;var E;var F;var G;var H;var I;var J;var K;var L;var M;var N;var D;A=c.A-c._;k=true;a:while(k===true){k=false;c.B=c._;e=h(c,a.a_1,7);if(e===0){break a}c.C=E=c._;if(!(!(c.I_p1<=E)?false:true)){break a}switch(e){case 0:break a;case 1:if(!b(c,'')){return false}break;case 2:if(!b(c,'')){return false}j=c.A-c._;l=true;b:while(l===true){l=false;c.B=c._;if(!d(c,1,'s')){c._=c.A-j;break b}c.C=c._;if(!d(c,3,'nis')){c._=c.A-j;break b}if(!b(c,'')){return false}}break;case 3:if(!m(c,a.g_s_ending,98,116)){break a}if(!b(c,'')){return false}break}}H=c._=(G=c.A)-A;y=G-H;n=true;a:while(n===true){n=false;c.B=c._;e=h(c,a.a_2,4);if(e===0){break a}c.C=F=c._;if(!(!(c.I_p1<=F)?false:true)){break a}switch(e){case 0:break a;case 1:if(!b(c,'')){return false}break;case 2:if(!m(c,a.g_st_ending,98,116)){break a}f=c._-3|0;if(c.E>f||f>c.A){break a}c._=f;if(!b(c,'')){return false}break}}D=c._=(N=c.A)-y;z=N-D;p=true;a:while(p===true){p=false;c.B=c._;e=h(c,a.a_4,8);if(e===0){break a}c.C=I=c._;if(!(!(c.I_p2<=I)?false:true)){break a}switch(e){case 0:break a;case 1:if(!b(c,'')){return false}g=c.A-c._;o=true;b:while(o===true){o=false;c.B=c._;if(!d(c,2,'ig')){c._=c.A-g;break b}c.C=J=c._;B=c.A-J;r=true;c:while(r===true){r=false;if(!d(c,1,'e')){break c}c._=c.A-g;break b}K=c._=c.A-B;if(!(!(c.I_p2<=K)?false:true)){c._=c.A-g;break b}if(!b(c,'')){return false}}break;case 2:C=c.A-c._;s=true;b:while(s===true){s=false;if(!d(c,1,'e')){break b}break a}c._=c.A-C;if(!b(c,'')){return false}break;case 3:if(!b(c,'')){return false}q=c.A-c._;t=true;b:while(t===true){t=false;c.B=c._;u=true;c:while(u===true){u=false;x=c.A-c._;v=true;d:while(v===true){v=false;if(!d(c,2,'er')){break d}break c}c._=c.A-x;if(!d(c,2,'en')){c._=c.A-q;break b}}c.C=L=c._;if(!(!(c.I_p1<=L)?false:true)){c._=c.A-q;break b}if(!b(c,'')){return false}}break;case 4:if(!b(c,'')){return false}i=c.A-c._;w=true;b:while(w===true){w=false;c.B=c._;e=h(c,a.a_3,2);if(e===0){c._=c.A-i;break b}c.C=M=c._;if(!(!(c.I_p2<=M)?false:true)){c._=c.A-i;break b}switch(e){case 0:c._=c.A-i;break b;case 1:if(!b(c,'')){return false}break}}break}}c._=c.A-z;return true};a.prototype.J=function(){var f;var g;var h;var b;var a;var c;var d;var i;var j;var e;f=this._;b=true;a:while(b===true){b=false;if(!G(this)){break a}}i=this._=f;g=i;a=true;a:while(a===true){a=false;if(!F(this)){break a}}j=this._=g;this.E=j;this._=this.A;c=true;a:while(c===true){c=false;if(!A(this)){break a}}e=this._=this.E;h=e;d=true;a:while(d===true){d=false;if(!E(this)){break a}}this._=h;return true};a.prototype.stem=a.prototype.J;a.prototype.N=function(b){return b instanceof a};a.prototype.equals=a.prototype.N;a.prototype.O=function(){var c;var a;var b;var d;c='GermanStemmer';a=0;for(b=0;bCopyright %(copyright)s.": "", + "© Copyright %(copyright)s.": "", + ", in ": ", in ", + "About these documents": "\u00dcber dieses Dokument", + "Automatically generated list of changes in version %(version)s": "Automatisch generierte Liste der \u00c4nderungen in Version %(version)s", + "C API changes": "C API-\u00c4nderungen", + "Changes in Version %(version)s — %(docstitle)s": "", + "Collapse sidebar": "Seitenleiste einklappen", + "Complete Table of Contents": "Vollst\u00e4ndiges Inhaltsverzeichnis", + "Contents": "Inhalt", + "Copyright": "Copyright", + "Created using Sphinx %(sphinx_version)s.": "Mit Sphinx %(sphinx_version)s erstellt.", + "Expand sidebar": "Seitenleiste ausklappen", + "Full index on one page": "Gesamtes Stichwortverzeichnis auf einer Seite", + "General Index": "Stichwortverzeichnis", + "Global Module Index": "Globaler Modulindex", + "Go": "Los", + "Hide Search Matches": "Suchergebnisse ausblenden", + "Index": "Stichwortverzeichnis", + "Index – %(key)s": "Stichwortverzeichnis – %(key)s", + "Index pages by letter": "Stichwortverzeichnis nach Anfangsbuchstabe", + "Indices and tables:": "Verzeichnisse und Tabellen:", + "Last updated on %(last_updated)s.": "Zuletzt aktualisiert am %(last_updated)s.", + "Library changes": "Bibliotheks-\u00c4nderungen", + "Navigation": "Navigation", + "Next topic": "N\u00e4chstes Thema", + "Other changes": "Andere \u00c4nderungen", + "Overview": "\u00dcbersicht", + "Permalink to this definition": "Link zu dieser Definition", + "Permalink to this headline": "Link zu dieser \u00dcberschrift", + "Please activate JavaScript to enable the search\n functionality.": "Bitte aktivieren Sie JavaScript, wenn Sie die Suchfunktion nutzen wollen.", + "Preparing search...": "Suche wird vorbereitet...", + "Previous topic": "Vorheriges Thema", + "Quick search": "Schnellsuche", + "Search": "Suche", + "Search Page": "Suche", + "Search Results": "Suchergebnisse", + "Search finished, found %s page(s) matching the search query.": "Die Suche ist fertig, es wurde(n) %s Seite(n) mit Treffern gefunden.", + "Search within %(docstitle)s": "Suche in %(docstitle)s", + "Searching": "Suchen", + "Searching for multiple words only shows matches that contain\n all words.": "", + "Show Source": "Quellcode anzeigen", + "Table of Contents": "Inhaltsverzeichnis", + "This Page": "Diese Seite", + "Welcome! This is": "Willkommen! Dies ist", + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories.": "Ihre Suche ergab keine Treffer. Bitte stellen Sie sicher, dass alle W\u00f6rter richtig geschrieben sind und gen\u00fcgend Kategorien ausgew\u00e4hlt sind.", + "all functions, classes, terms": "alle Funktionen, Klassen, Begriffe", + "can be huge": "kann gro\u00df sein", + "last updated": "zuletzt aktualisiert", + "lists all sections and subsections": "Liste aller Kapitel und Unterkapitel", + "next chapter": "n\u00e4chstes Kapitel", + "previous chapter": "vorheriges Kapitel", + "quick access to all modules": "schneller Zugriff auf alle Module", + "search": "suchen", + "search this documentation": "durchsuche diese Dokumentation", + "the documentation for": "die Dokumentation f\u00fcr" + }, + "plural_expr": "(n != 1)" +}); \ No newline at end of file diff --git a/faq.html b/faq.html new file mode 100644 index 0000000..c91c1f4 --- /dev/null +++ b/faq.html @@ -0,0 +1,228 @@ + + + + + + + + + + FAQ — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
+ + + + +
+
+
+
+ +
+

FAQ

+
+

Was ist das Passwort für die Entwicklungsumgebung?

+

compair

+
+
+

Wie verbinde ich mich zur Entwicklungsumgebung?

+

See Programmierumgebung

+
+
+ + +
+ +
+
+ + + + +
+ +
+

+ + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

+
+ + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
+ +
+
+ +
+ +
+ + + + + + + + + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html index e50ab81..2b8fc17 100644 --- a/genindex.html +++ b/genindex.html @@ -1,13 +1,13 @@ - + - Index — CompLib 0.2.3 documentation + Stichwortverzeichnis — CompLib 0.2.3 Dokumentation @@ -29,12 +29,13 @@ + - - + + @@ -62,7 +63,7 @@
- +
@@ -80,21 +81,11 @@ @@ -141,7 +132,7 @@
  • »
  • -
  • Index
  • +
  • Stichwortverzeichnis
  • @@ -159,178 +150,26 @@
    -

    Index

    +

    Stichwortverzeichnis

    - _ - | A - | C - | D - | E - | G - | H - | I - | L - | M - | O + M | P - | R | S - | T - | U - | W
    -

    _

    - - -
    - -

    A

    - - - -
    - -

    C

    - - - -
    - -

    D

    - - - -
    - -

    E

    - - -
    - -

    G

    - - - -
    - -

    H

    - - -
    - -

    I

    - - -
    - -

    L

    - - - -
    -

    M

    -
    - -

    O

    - -
    @@ -338,45 +177,11 @@

    P

    -
    - -

    R

    - - -
    @@ -384,53 +189,7 @@

    S

    - -
    - -

    T

    - - - -
    - -

    U

    - - -
    - -

    W

    - - -
    @@ -455,11 +214,11 @@ - Built with Sphinx using a + Erstellt mit Sphinx mit einem theme - provided by Read the Docs. + bereitgestellt von Read the Docs. diff --git a/gettingStarted/codeServer.html b/gettingStarted/codeServer.html new file mode 100644 index 0000000..4031d6e --- /dev/null +++ b/gettingStarted/codeServer.html @@ -0,0 +1,234 @@ + + + + + + + + + + Programmierumgebung — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Programmierumgebung

    +

    Als Umgebung zur Programmierung des Roboters wird code-server eingesetzt, welche bereits am Roboter vorinstalliert ist.

    +
    +

    Verbindung zur Entwicklungsumgebung herstellen

    +

    Am Roboter wird die IP-Adresse des Raspberry Pi angezeigt. Um nun die Verbindung herzustellen, muss man in einem Web-Browser einfach <roboter_ip>:8080 eingeben. +Das Passwort für Visual Studio Code im Browser ist compair!

    +
    +
    + + +
    + +
    +
    + + + + +
    + +
    +

    + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

    +
    + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
    + +
    +
    + +
    + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/gettingStarted/firstProgram.html b/gettingStarted/firstProgram.html new file mode 100644 index 0000000..9f5e7e3 --- /dev/null +++ b/gettingStarted/firstProgram.html @@ -0,0 +1,238 @@ + + + + + + + + + + Mein erstes Programm — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Mein erstes Programm

    +

    Um mit der Programmierung zu beginnen, müssen wir zunächst einen neuen Ordner erstellen, in dem alle unsere Python-Dateien gespeichert werden. +codeServerFolder

    +

    Sie können diesen Ordner nennen, wie Sie wollen, für dieses Beispiel heißt er compAIR. +Im nächsten Schritt erstellen wir unsere Datei main.py. +codeServerFile

    +

    Dann können wir beginnen, unseren Code in diese Datei zu schreiben.

    +
    print("Hallo Welt")
    +
    +
    +

    Praktischerweise können wir die Datei auch über die VS-Code-Plattform ausführen. +codeServerRun

    +

    Dann öffnet sich ein Terminal, der die Ausgabe unseres Programms anzeigt. +codeServerTerminal

    +
    + + +
    + +
    +
    + + + + +
    + +
    +

    + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

    +
    + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
    + +
    +
    + +
    + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/gettingStarted/index.html b/gettingStarted/index.html new file mode 100644 index 0000000..c89e751 --- /dev/null +++ b/gettingStarted/index.html @@ -0,0 +1,247 @@ + + + + + + + + + + Erste Schritte — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    + +
    + + + + +
    + +
    +

    + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

    +
    + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
    + +
    +
    + +
    + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/gettingStarted/secondProgram.html b/gettingStarted/secondProgram.html new file mode 100644 index 0000000..04a1c03 --- /dev/null +++ b/gettingStarted/secondProgram.html @@ -0,0 +1,632 @@ + + + + + + + + + + Mein zweites Programm — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Mein zweites Programm

    +
    +

    Motoren ansteuern

    +

    Um die Motoren des Roboters zu steuern, müssen wir zunächst das entsprechende Python-Modul am Anfang der Datei importieren. Dann können wir Motor.power(port, power) verwenden, um den Motor zu steuern. +Dies ist auch ein guter Punkt, um sich mit der Dokumentation vertraut zu machen: Besuchen wir https://lib.comp-air.at/lib/Motor.html#compLib.Motor.Motor.power. Hier werden die beiden relevanten Parameter beschrieben.

    +

    Als Beispiel wollen wir den rechten Motor für fünf Sekunden auf volle Geschwindigkeit setzen:

    +
    1
    +2
    +3
    +4
    +5
    +6
    # motor.py
    +import time
    +from compLib.Motor import Motor
    +
    +Motor.power(0, 100)
    +time.sleep(5)
    +
    +
    +
    +
    +

    Gerade fahren

    +

    Um geradeaus zu fahren, müssen wir beide Motoren auf dieselbe Geschwindigkeit einstellen. +Aber Achtung! Der rechte Motor muss umgedreht werden! Das liegt daran, dass einer nach rechts und einer nach links zeigt, sie sind also technisch gesehen gespiegelt. +Wenn wir nun diesen Code ausführen, wird der Roboter 5 Sekunden lang vorwärts fahren:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    # motor.py
    +import time
    +from compLib.Motor import Motor
    +
    +Motor.power(0, -100)
    +Motor.power(3, 100)
    +time.sleep(5)
    +
    +
    +

    Erläuterung

    +
    +
    In Zeile 2 wird das python-Paket time importiert. Wir brauchen es später, um auf die Fahrt des Roboters zu warten. Z.B.: time.sleep(5)
    +
    In Zeile 3 importieren wir die notwendigen Funktionen aus dem Motor-Modul der compLib.
    +
    In Zeile 5 stellen wir den rechten Motor so ein, dass er vorwärts fährt. Da der Motor rückwärts eingebaut ist, müssen wir den Wert auf -100 setzen.
    +
    In Zeile 6 stellen wir den linken Motor auf Vorwärtsfahrt ein. Hier können wir den Wert 100 verwenden, da der Motor in der richtigen Richtung eingebaut ist.
    +
    In Zeile 7 müssen wir warten, bis der Roboter die Fahrbefehle tatsächlich ausführt. In diesem Fall warten wir 5 Sekunden lang.
    +
    +

    Danach wird das Programm beendet und der Roboter bleibt stehen.

    +
    +

    Mehr fahren

    +

    Jetzt ist es Zeit für einige komplexere Bewegungen. Um unseren Code modular und leicht lesbar zu halten, werden wir jede Aktion in eine eigene Funktion packen.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward():
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(2)
    +
    +
    +

    In Zeile 4 definieren wir die Funktion driveForward(), die den Roboter mit voller Geschwindigkeit zwei Sekunden vorwärts bewegt.

    +

    Jetzt werden wir eine Funktion für das Rückwärtsfahren definieren:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward():
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(2)
    +
    +def driveBackward():
    +    Motor.power(0, 100)
    +    Motor.power(3, -100)
    +    time.sleep(2)
    +
    +
    +

    In Zeile 9 haben wir die Funktion driveBackward() definiert, die den Roboter zwei Sekunden lang rückwärts fahren lässt.

    +

    Jetzt können wir diese beiden Funktionen aufrufen und vorwärts und dann wieder rückwärts fahren:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward():
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(2)
    +
    +def driveBackward():
    +    Motor.power(0, 100)
    +    Motor.power(3, -100)
    +    time.sleep(2)
    +
    +driveForward()
    +driveBackward()
    +
    +
    +

    Wenn wir diesen Code ausführen, sollte der Roboter zunächst zwei Sekunden vorwärts und dann wieder zwei Sekunden rückwärts fahren und ungefähr an der gleichen Position wie beim Start anhalten.

    +

    Zwischen den Zeilen 14 und 15 brauchen wir kein time.sleep(2), da der sleep-Befehl bereits in den Funktionen integriert ist.

    +

    Jetzt wollen wir, dass der Roboter erst vorwärts fährt, dann zwei Sekunden stillsteht und dann wieder rückwärts in seine Ausgangsposition fährt.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward():
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(2)
    +
    +def driveBackward():
    +    Motor.power(0, 100)
    +    Motor.power(3, -100)
    +    time.sleep(2)
    +
    +driveForward()
    +time.sleep(2)
    +driveBackward()
    +
    +
    +

    Wenn wir den obigen Code ausführen, bleibt der Roboter nicht zwei Sekunden lang stehen, sondern fährt nach der Funktion driveForward() noch zwei Sekunden lang weiter. Warum passiert das? Um das zu verstehen, müssen wir wie der Roboter denken!

    +

    Erläuterung

    +
    +
    1. (Zeile 14) Die Funktion Vorwärtsfahrt wird aufgerufen
    +
    +
    (Zeile 5) Motor 1 wird auf -100 gesetzt
    +
    (Zeile 6) Motor 4 wird auf 100 gesetzt
    +
    (Zeile 7) Zwei Sekunden warten und Motor 1 mit der Geschwindigkeit -100 und Motor 4 mit der Geschwindigkeit 100 bewegen (z.B. vorwärts fahren)
    +
    +
    +
    +
    2. (Zeile 15) Zwei Sekunden warten, die Motoren sind immer noch auf -100 und 100 eingestellt, also fahren wir weiter vorwärts
    +
    +
    +
    3. (Zeile 16) Die Funktion Rückwärtsfahren wird aufgerufen
    +
    +
    (Zeile 5) Motor 1 wird auf 100 gesetzt
    +
    (Zeile 6) Motor 4 wird auf -100 gesetzt
    +
    (Zeile 7) Warte zwei Sekunden und bewege Motor 1 mit der Geschwindigkeit 100 und Motor 4 mit der Geschwindigkeit -100 (z.B. Rückwärtsfahren)
    +
    +
    +
    +
    4. Das Programm ist beendet, und alle Motordrehzahlen werden auf 0 gesetzt.
    +
    +

    Wir sehen also, dass wir die Motoren nach der Vorwärts- oder Rückwärtsfunktion wieder auf Geschwindigkeit 0 setzen müssen, wenn wir den Roboter anhalten wollen. Für diesen Anwendungsfall können wir eine neue Funktion stopMotors() schreiben, die die Geschwindigkeit für Motor 0 und 3 auf 0 setzt:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward():
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(2)
    +
    +def driveBackward():
    +    Motor.power(0, 100)
    +    Motor.power(3, -100)
    +    time.sleep(2)
    +
    +def stopMotors():
    +    Motor.power(0, 0)
    +    Motor.power(3, 0)
    +
    +
    +

    Wenn wir nun vorwärts fahren, dann zwei Sekunden warten und dann wieder rückwärts fahren wollen, können wir die Funktionen wie folgt aufrufen:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward():
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(2)
    +
    +def driveBackward():
    +    Motor.power(0, 100)
    +    Motor.power(3, -100)
    +    time.sleep(2)
    +
    +def stopMotors():
    +    Motor.power(0, 0)
    +    Motor.power(3, 0)
    +
    +driveForward()
    +stopMotors()
    +time.sleep(2)
    +driveBackward()
    +
    +
    +

    Und endlich bekommen wir die Bewegung, die wir uns wünschen.

    +

    More Optimizations

    +

    Während der Code für sehr einfache Bewegungen funktioniert, wollen wir normalerweise nicht, dass unsere Funktionen entscheiden, wie lange wir vorwärts fahren. Vielleicht müssen wir manchmal vier Sekunden vorwärts fahren, und manchmal nur eine Sekunde.

    +

    Nehmen wir an, wir wollen vier Sekunden vorwärts fahren. Wir wissen, dass driveForward() den Roboter zwei Sekunden vorwärts bewegen wird. Also können wir die Funktion einfach zwei Mal aufrufen!

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward():
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(2)
    +
    +driveForward()
    +driveForward()
    +
    +
    +

    Was aber, wenn wir uns nur eine Sekunde vorwärts bewegen wollen? Oder vielleicht drei Sekunden? Mit der Funktion driveForward() können wir das im Moment nicht machen.

    +

    Stattdessen werden wir die Funktion so umschreiben, dass sie einen Parameter akzeptiert, der die Zeit angibt.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward(seconds):
    +    Motor.power(0, -100)
    +    Motor.power(3, 100)
    +    time.sleep(seconds)
    +
    +driveForward(3)
    +
    +
    +

    Und mit dieser neuen Funktion können wir drei Sekunden lang vorwärts fahren. +Wie funktioniert das nun?

    +

    In Zeile 4 definieren wir die Funktion driveForward und sagen, dass sie einen Parameter seconds benötigt. Dieser Parameter ist im Grunde eine Variable, die wir uns zum Zeitpunkt der Definition wie einen Platzhalter vorstellen können. Wenn wir die Funktion definieren, wissen wir noch nicht, welchen Wert seconds haben wird.

    +

    Später in Zeile 9, wenn wir die Funktion aufrufen, übergeben wir den Wert 3 an die Funktion und unser Platzhalter seconds wird den Wert 3 haben. Der Roboter wird also drei Sekunden vorwärts fahren.

    +

    Vielleicht wollen wir auch, dass der Roboter mit verschiedenen Geschwindigkeiten fahren kann. Wir können also einen weiteren Parameter mit dem Namen speed anlegen. Dann werden wir ein Programm schreiben, das den Roboter drei Sekunden mit voller Geschwindigkeit und dann fünf Sekunden mit halber Geschwindigkeit fahren lässt.

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward(seconds, speed):
    +    Motor.power(0, -speed)
    +    Motor.power(3, speed)
    +    time.sleep(seconds)
    +
    +driveForward(3, 100)
    +driveForward(5, 50)
    +
    +
    +

    In Zeile 9 wird der Platzhalter seconds auf 3 und die Geschwindigkeit auf 100 gesetzt. +In Zeile 10 wird der Platzhalter seconds auf 5 und die Geschwindigkeit auf 50 gesetzt.

    +

    Bewährte Praktiken +Nun werden wir uns einige weitere Optimierungen und bewährte Verfahren ansehen.

    +

    1. Wir sollten den Schlafbefehl nicht in die Fahrfunktion einbauen.

    +

    Wir haben das bis jetzt getan, um ein Gefühl dafür zu bekommen, wie Funktionen funktionieren, und der Einfachheit halber. Später, wenn Sie anfangen, komplexere Programme zu schreiben, sollten Sie dies vermeiden.

    +

    Das Beispiel von oben, in dem wir vorwärts und rückwärts gefahren sind und zwei Sekunden gewartet haben, sollte also wie folgt aussehen:

    +
     1
    + 2
    + 3
    + 4
    + 5
    + 6
    + 7
    + 8
    + 9
    +10
    +11
    +12
    +13
    +14
    +15
    +16
    +17
    +18
    +19
    +20
    +21
    +22
    +23
    +24
    import time
    +from compLib.Motor import Motor
    +
    +def driveForward(speed):
    +    Motor.power(0, -speed)
    +    Motor.power(3, speed)
    +
    +def driveBackward(speed):
    +    Motor.power(0, speed)
    +    Motor.power(3, -speed)
    +
    +def stopMotors():
    +    Motor.power(0, 0)
    +    Motor.power(3, 0)
    +
    +driveForward(100)   # Set the motors to forward
    +time.sleep(2)       # Let the robot drive for 2 seconds
    +stopMotors()        # Now stop the robot
    +
    +time.sleep(2)       # Wait another 2 seconds, robot is not moving
    +
    +driveBackward(100)  # Now set the motors to a backwards speed
    +time.sleep(2)       # Let the robot continue driving for 2 seconds
    +stopMotors()        # And finally stop it again
    +
    +
    +

    Warum ist das so wichtig?

    +

    Normalerweise schlafen wir nicht sehr viel und führen in dieser Zeit andere Verarbeitungen durch. Zum Beispiel könnten wir ein Bild von der Kamera verarbeiten oder die IR-Sensoren auslesen. Wenn wir also eine Funktion wie driveForward() aufrufen, können wir davon ausgehen, dass sie im Hintergrund abläuft und wir andere Aufgaben erledigen, während sich der Roboter bewegt, anstatt nur darauf zu warten, dass er fertig wird.

    +

    2. Fahren Sie nicht zu langsam.

    +

    Wenn du die Fahrgeschwindigkeit auf eine sehr kleine Zahl einstellst, kann es sein, dass sich der Roboter gar nicht mehr bewegt, weil die Motoren eine bestimmte Menge an Energie benötigen, um den Roboter überhaupt zu bewegen.

    +

    3. Fahren Sie nicht zu schnell.

    +

    Wenn du die Fahrgeschwindigkeit auf eine sehr hohe Zahl einstellst (z. B. 100), könnte dein Roboter zu schnell für seine Sensoren sein. Dies wird später wichtig sein, wenn wir versuchen, eine schwarze Linie zu erkennen, aber zu schnell über sie fahren.

    +
    +
    +
    + + +
    + +
    +
    + + + + +
    + +
    +

    + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

    +
    + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
    + +
    +
    + +
    + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/gettingStarted/thridProgram.html b/gettingStarted/thridProgram.html new file mode 100644 index 0000000..4a276ac --- /dev/null +++ b/gettingStarted/thridProgram.html @@ -0,0 +1,290 @@ + + + + + + + + + + Mein drittes Programm — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    Mein drittes Programm

    +

    Der offizielle compAIR-Bot ist mit einer Reihe von Sensoren ausgestattet. Die wichtigsten sind die Infrarotsensoren und -sender, die an der Vorderseite des Roboters angebracht sind. Insgesamt gibt es fünf IR-Sensoren.

    +

    Um loszulegen, muss man zunächst das entsprechende Modul wie folgt importieren:

    +
    1
    from compLib.IRSensor import IRSensor
    +
    +
    +

    irSensor

    +

    Wie im obigen Diagramm zu sehen ist, verfügt jeder Sensor auch über einen entsprechenden IR-Sender / Emitter. Dieser Sender kann mit IRSensor.set(port, enable) aktiviert werden.

    +

    Schalten wir nun alle fünf Sender ein:

    +
    1
    +2
    +3
    from compLib.IRSensor import IRSensor
    +
    +IRSensor.enable()
    +
    +
    +

    Diese fünf verschiedenen Sensoren befinden sich an der Vorderseite des Roboters und sind wichtig, um schwarze Linien zu erkennen.

    +

    Es ist sehr einfach, den Wert der Sensoren abzulesen:

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    from compLib.IRSensor import IRSensor
    +
    +IRSensor.enable()
    +
    +if IRSensor.read_all()[0] > 500:
    +    print("high")
    +else:
    +    print("low")
    +
    +
    +

    Erkennen einer schwarzen Linie +Um den IR-Sensor zu testen, kannst du deinen Roboter auf eine schwarze Linie stellen. Der Sensor in der Mitte sollte auf der schwarzen Linie liegen.

    +
    1
    +2
    +3
    +4
    +5
    +6
    +7
    +8
    +9
    from compLib.IRSensor import IRSensor
    +
    +IRSensor.enable()
    +COLOR_BREAK = 900
    +
    +if IRSensor.read_all()[2] > COLOR_BREAK:
    +    print("Robot is standing on a black line")
    +else:
    +print("Robot is NOT standing on a black line")
    +
    +
    +

    Wenn das Programm ausgeführt wird, zeigt es an, dass der Roboter auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor des Roboters über einer schwarzen Linie befindet, und es zeigt an, dass der Roboter NICHT auf einer schwarzen Linie steht, wenn sich der mittlere IR-Sensor nicht über einer Linie befindet.

    +
    +
    In Zeile 1 importieren wir das IRSensor-Modul, das zur Kommunikation mit dem IR-Sensor-Board verwendet werden kann.
    +
    In Zeile 3 wird der Sensor mit der Nummer 3 aktiviert. Wenn wir einen Sensor nicht aktivieren, können wir ihn nicht in unserem Programm verwenden.
    +
    In Zeile 4 stellen wir einen Farbschwellenwert von 900 ein, mit dem wir später prüfen werden, ob der Sensorwert unter oder über diesem Schwellenwert liegt. Unterhalb bedeutet, dass sich eine helle Farbe unter dem IR-Sensor befindet und ein höherer Wert als 900 bedeutet, dass sich eine dunkle Farbe unter dem IR-Sensor befindet.
    +
    +
    +
    In Zeile 6 lesen wir den Sensor Nummer 2 aus und prüfen, ob der Wert über dem von uns definierten Schwellenwert von 900 liegt. Wenn das der Fall ist, hat der IR-Sensor eine schwarze Linie erkannt.
    +
    +

    Wir werden nun das Programm so ändern, dass es alle 0.1 Sekunden prüft, ob sich eine schwarze Linie unter dem Roboter befindet, und wenn dies der Fall ist, eine Meldung ausgibt.

    +
    + + +
    + +
    +
    + + + + +
    + +
    +

    + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

    +
    + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
    + +
    +
    + +
    + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/gettingStarted/wifi.html b/gettingStarted/wifi.html new file mode 100644 index 0000000..a09ccce --- /dev/null +++ b/gettingStarted/wifi.html @@ -0,0 +1,303 @@ + + + + + + + + + + WLAN-Verbindung herstellen — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + +
    + + + + + +
    + +
    + + + + + + + + + + + + + + + + + +
    + + + + +
    +
    +
    +
    + +
    +

    WLAN-Verbindung herstellen

    +
    +

    Schritt für Schritt - macOS

    +
      +
    1. SD-Karte aus dem Raspberry Pi bzw. Roboter entnehmen.

    2. +
    3. Einstecken der SD-Karte in den Computer

    4. +
    5. Öffnen der SD-Karte mit dem Namen „boot“ bootImage

    6. +
    7. Generieren des PSK auf https://www.wireshark.org/tools/wpa-psk.html pskImage

    8. +
    9. Öffnen der Datei „wpa_supplicant.conf“ auf der SD-Karte

    10. +
    11. Einfügen der Konfiguration. Dabei muss die SSID und der vorher generierte PSK eingesetzt werden

      +
      ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
      +update_config=1
      +country=AT
      +
      +network={
      +    ssid="EinTollerNameFürDasWlan"
      +    psk="98117b165a48f25cbe36f288ddf597729a40feeea93054c19bfa8e5eab238541"
      +}
      +
      +
      +
    12. +
    13. Speichern, Auswerfen und wieder in den Raspberry Pi einbauen

    14. +
    15. Starten des Roboters

    16. +
    17. Die IP-Adresse sollte nun am Roboter angezeigt werden

    18. +
    +
    +
    +

    Weitere Informationen

    +

    Die „wpa_supplicant.conf“ Datei wird beim Start des Rpasberry Pi automatisch an den richtigen Ort kopiert, damit sich der Roboter zum Wlan verbindet. +Eine genauere Anleitung wird vom Hersteller des Raspberry Pi hier bereitgestellt.

    +
    +
    +

    Fehlerbehandlung

    +

    Sollte es dazu kommen, dass der Roboter nicht automatisch die Verbindung mit dem Netzwerk herstellt, kann eine Kabelgebundene Verbindung zur Diagnose von Fehlern genutzt werden. +Dabei wird automatisch die IP-Adresse der Verbindung „eth“ am Roboter angezeigt. Nach der erfolgreichen Verbindung zum Roboter mittels SSH kann die „wpa_cli“ zur Fehlerbehandlung verwendet werden:

    +
    > wpa_cli
    +    wpa_cli v2.9
    +    Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi> and contributors
    +
    +    This software may be distributed under the terms of the BSD license.
    +    See README for more details.
    +
    +
    +    Selected interface 'p2p-dev-wlan0'
    +
    +    Interactive mode
    +
    +> interface wlan0
    +    Connected to interface 'wlan0.
    +> scan
    +    OK
    +    <3>CTRL-EVENT-SCAN-STARTED
    +    <3>CTRL-EVENT-SCAN-RESULTS
    +> scan_result
    +    bssid / frequency / signal level / flags / ssid
    +    68:02:b8:0c:d7:47       2462    -66     [WPA2-PSK-CCMP][ESS]    WG
    +    68:02:b8:0c:d7:40       5220    -63     [WPA2-PSK-CCMP][ESS]    WG
    +    34:2c:c4:da:dd:b9       5200    -65     [WPA-PSK-TKIP][WPA2-PSK-CCMP][WPS][ESS] WLAN10573403
    +    98:da:c4:e5:21:d0       2437    -57     [WPA2-PSK-CCMP][ESS]    WG
    +    34:2c:c4:da:dd:c6       2412    -52     [WPA-PSK-][WPA2-PSK-CCMP+TKIP][WPS][ESS]        WLAN10573403
    +    20:83:f8:07:5b:90       2467    -67     [WPA2-PSK-CCMP][WPS][ESS]       A1-075b8c
    +    7c:39:53:94:49:82       5280    -77     [WPA2-PSK-CCMP][WPS][ESS]       A1-944980-5G
    +    7c:39:53:94:49:81       2427    -68     [WPA2-PSK-CCMP][WPS][ESS]       A1-944980
    +    90:fd:73:ac:d3:27       2452    -72     [WPA2-PSK-CCMP][WPS][ESS]       Drei_H288A_24G_eKy5
    +    50:e0:39:3c:e5:80       5180    -82     [WPA2-PSK-CCMP][WPS][ESS]       A1-393CE57F
    +    90:fd:73:ac:d3:28       5500    -83     [WPA2-PSK-CCMP][WPS][ESS]       Drei_H288A_5G_eKy5
    +    68:02:b8:41:42:f9       5180    -84     [WPA-PSK-TKIP][WPA2-PSK-CCMP][WPS][ESS] WLAN18792472
    +    34:2c:c4:30:3c:65       5180    -89     [WPA-PSK-TKIP][WPA2-PSK-CCMP][WPS][ESS] witt
    +    fa:0d:ac:d3:40:d4       2467    -80     [WPA2-PSK-CCMP][WPS][ESS][P2P]  DIRECT-d4-HP M28 LaserJet
    +    0e:84:dc:14:ac:27       2467    -85     [WPA2-PSK-CCMP][WPS][ESS][P2P]  DIRECT-wo-BRAVIA
    +>
    +
    +
    +
    +
    + + +
    + +
    +
    + + + + +
    + +
    +

    + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

    +
    + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
    + +
    +
    + +
    + +
    + + + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html index 0ab36b6..6427d95 100644 --- a/index.html +++ b/index.html @@ -1,13 +1,13 @@ - + - Competition Robot Library — CompLib 0.2.3 documentation + Dokumentation des Roboters — CompLib 0.2.3 Dokumentation @@ -29,13 +29,14 @@ + - - - + + + @@ -63,7 +64,7 @@
    - +
    @@ -80,22 +81,12 @@ -
      -
    • Competition Robot Library
    • -
    • Usage
    • -
    • Api
    • -
    • Aruco
    • -
    • Display
    • -
    • Encoder
    • -
    • Infrared Sensor
    • -
    • Linefollower Examples
    • -
    • Logging
    • -
    • Motor
    • -
    • Odometry
    • -
    • Quality Control
    • -
    • Robot
    • -
    • Servo
    • -
    • Vision
    • + @@ -142,13 +133,13 @@
    • »
    • -
    • Competition Robot Library
    • +
    • Dokumentation des Roboters
    • - View page source + Quelltext anzeigen
    • @@ -161,102 +152,19 @@
      - _images/compair-logo-white.svg
      -

      Competition Robot Library

      + _images/compair-logo-white.svg
      +

      Dokumentation des Roboters

      @@ -270,7 +178,7 @@ @@ -288,11 +196,11 @@ - Built with Sphinx using a + Erstellt mit Sphinx mit einem theme - provided by Read the Docs. + bereitgestellt von Read the Docs. diff --git a/lib/classes/Motor.html b/lib/classes/Motor.html new file mode 100644 index 0000000..ab943a6 --- /dev/null +++ b/lib/classes/Motor.html @@ -0,0 +1,368 @@ + + + + + + + + + + Motoren — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      + + + + + +
      + +
      + + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Motoren

      +
      +

      Dokumentation der Klasse

      +
      +
      +class compLib.Motor.Motor
      +

      Klasse zum Ansteuern der Motoren

      +
      +
      +static multiple_power(*arguments: tuple)
      +

      Mehrere Motoren auf eine prozentuale Leistung der Höchstgeschwindigkeit einstellen

      +
      +
      Parameter
      +

      arguments – tuple von port, percentage

      +
      +
      Raises
      +

      IndexError

      +
      +
      +
      + +
      +
      +static multiple_pulse_width(*arguments: tuple)
      +

      Setzen den Pulsbreite mehreer Motoren in Prozent der Periode

      +
      +
      Parameter
      +

      arguments – tuple von port, prozent

      +
      +
      Raises
      +

      IndexError

      +
      +
      +
      + +
      +
      +static multiple_speed(*arguments: tuple)
      +

      Geschwindigkeit mehrerer Motoren einstellen

      +
      +
      Parameter
      +

      arguments – tuple von port, Geschwindigkeit in Radianten pro Sekunde (rad/s)

      +
      +
      Raises
      +

      IndexError

      +
      +
      +
      + +
      +
      +static power(port: int, percent: float)
      +

      Motor auf eine prozentuale Leistung der Höchstgeschwindigkeit einstellen

      +
      +
      Parameter
      +
        +
      • port – Port, an welchen der Motor angestecht wird. 0-3

      • +
      • percent – Prozentsatz der Höchstgeschwindigkeit. zwischen -100 und 100

      • +
      +
      +
      Raises
      +

      IndexError

      +
      +
      +
      + +
      +
      +static pulse_width(port: int, percent: float)
      +

      Setzen den Pulsbreite eines Motors in Prozent der Periode

      +
      +
      Parameter
      +
        +
      • port – Port, an welchen der Motor angestecht wird. 0-3

      • +
      • percent – Prozent der Periode zwischen -100 und 100

      • +
      +
      +
      Raises
      +

      IndexError

      +
      +
      +
      + +
      +
      +static speed(port: int, speed: float)
      +

      Geschwindigkeit des Motors einstellen

      +
      +
      Parameter
      +
        +
      • port – Port, an welchen der Motor angestecht wird. 0-3

      • +
      • speed – Drehzahl, mit der sich ein Motor dreht, in Radianten pro Sekunde (rad/s)

      • +
      +
      +
      Raises
      +

      IndexError

      +
      +
      +
      + +
      + +
      +
      +

      Genauere Informationen

      +
      +

      Power vs Speed vs PulseWidth

      +

      Zur ansteuerung der Motoren kann entweder Motor.power(...), Motor.speed(...) oder Motor.pulse_width(...)` verwendet werden. +Der Unterschied der 3 Funktionen liegt dabei in der Einheit des 2. Parameters.

      +
      +
      Bei Motor.power() wird dabei ein Wert zwischen -100% und 100% der maximalen Geschwindigkeit angegeben.
      +
      Motor.speed() verwendet die Encoder um die Geschwindigkeit der Motoren mittels closed-loop zu steuern. Diese Funktion sollte nur verwendet werden, wenn Motor.power() nicht zur Ansteuerung ausreicht.
      +
      Motor.pulse_width() stellt die Geschwindigkeit des Motors mittels der Pulsbreite der PWM-Steuerung des Motors ein. Diese Funktion ist so nah an der Hardware wie möglich und sollte auch nur verwendet werden, wenn es einen expliziten Grund dafür gibt.
      +
      +
      +
      +

      Normal vs Multiple

      +

      Der Aufruf der funktionen kann entweder über Motor.power(port, percent) oder Motor.power((port, percent), (port, percent), ..) erfolgen. +Der zweite Aufruf ermöglicht dem Entwickler dabei beide Motoren in einem Aufruf anzusteuern und bringt einen kleinen Vorteil in der Leistungsfähigkeit der Software.

      +
      +
      +
      +

      Beispiele

      +
      +

      Vorwärts fahren

      +

      Mit folgenden Programm drehen sich beide Motoren mit 50% ihrer maximalen Geschwindigkeit. +Dabei ist zu beachten, dass ein Motor in die entgegengesetzte Richtung zum aneren Motor gedreht werden muss, da diese spiegelverkehrt montiert sind.

      +

      Zusätzlich ist ein time.sleep(5) notwendig, welches das Programm für 5 Sekunden pausiert. Diese Pause wird benötigt, da der Roboter automatisch alle Motoren beim Ende des Progammes deaktiviert.

      +
      from compLib.Motor import Motor
      +import time
      +
      +Motor.power(0, -50)
      +Motor.power(3, 50)
      +
      +time.sleep(5)
      +
      +
      +
      +
      +
      + + +
      + +
      +
      + + + + +
      + +
      +

      + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

      +
      + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
      + +
      +
      + +
      + +
      + + + + + + + + + + + \ No newline at end of file diff --git a/lib/index.html b/lib/index.html new file mode 100644 index 0000000..c508d20 --- /dev/null +++ b/lib/index.html @@ -0,0 +1,236 @@ + + + + + + + + + + compLib — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      + + + + + +
      + +
      + + + + + + + + + + + + + + + + + +
      + + + + +
      +
      + +
      + + + + +
      + +
      +

      + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

      +
      + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
      + +
      +
      + +
      + +
      + + + + + + + + + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv index ba45558..074af25 100644 Binary files a/objects.inv and b/objects.inv differ diff --git a/other/usage.html b/other/usage.html index 7f4cc7e..e9a8d2d 100644 --- a/other/usage.html +++ b/other/usage.html @@ -1,13 +1,13 @@ - + - Usage — CompLib 0.2.3 documentation + Beispiele — CompLib 0.2.3 Dokumentation @@ -29,14 +29,15 @@ + - - - - + + + + @@ -64,7 +65,7 @@
      - +
      @@ -82,21 +83,14 @@ @@ -143,13 +137,13 @@
    • »
    • -
    • Usage
    • +
    • Beispiele
    • - View page source + Quelltext anzeigen
    • @@ -162,8 +156,10 @@
      -
      -

      Usage

      +
      +

      Beispiele

      +
      +

      Vorwärts und rückwärts fahren

      import time
       from compLib.Motor import *
       
      @@ -188,6 +184,7 @@
           main()
       
      +
      @@ -198,10 +195,10 @@ @@ -218,11 +215,11 @@ - Built with Sphinx using a + Erstellt mit Sphinx mit einem theme - provided by Read the Docs. + bereitgestellt von Read the Docs. diff --git a/search.html b/search.html index c9ff7ee..fa497f2 100644 --- a/search.html +++ b/search.html @@ -1,13 +1,13 @@ - + - Search — CompLib 0.2.3 documentation + Suche — CompLib 0.2.3 Dokumentation @@ -30,13 +30,14 @@ + - - + + @@ -64,7 +65,7 @@
      - +
      @@ -82,21 +83,11 @@ @@ -143,7 +134,7 @@
    • »
    • -
    • Search
    • +
    • Suche
    • @@ -163,7 +154,7 @@ @@ -191,11 +182,11 @@ - Built with Sphinx using a + Erstellt mit Sphinx mit einem theme - provided by Read the Docs. + bereitgestellt von Read the Docs. diff --git a/searchindex.js b/searchindex.js index 63b0a9a..435ec26 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index","lib/Api","lib/Aruco","lib/Display","lib/Encoder","lib/IRSensor","lib/Linefollower","lib/Logging","lib/Motor","lib/Odom","lib/QC","lib/Robot","lib/Servo","lib/Vision","other/usage"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["index.rst","lib/Api.rst","lib/Aruco.rst","lib/Display.rst","lib/Encoder.rst","lib/IRSensor.rst","lib/Linefollower.rst","lib/Logging.rst","lib/Motor.rst","lib/Odom.rst","lib/QC.rst","lib/Robot.rst","lib/Servo.rst","lib/Vision.rst","other/usage.rst"],objects:{"compLib.Api":{DoubleElim:[1,0,1,""],Position:[1,0,1,""],Seeding:[1,0,1,""]},"compLib.Api.DoubleElim":{get_goal:[1,1,1,""],get_items:[1,1,1,""],get_meteoroids:[1,1,1,""],get_opponent:[1,1,1,""],get_position:[1,1,1,""],get_scores:[1,1,1,""]},"compLib.Api.Seeding":{get_cargo:[1,1,1,""],get_delivery:[1,1,1,""],get_garbage:[1,1,1,""],get_material:[1,1,1,""],list_cargo:[1,1,1,""]},"compLib.Display":{Display:[3,0,1,""]},"compLib.Display.Display":{clear:[3,1,1,""],write:[3,1,1,""]},"compLib.Encoder":{Encoder:[4,0,1,""]},"compLib.Encoder.Encoder":{clear:[4,1,1,""],clear_all:[4,1,1,""],handle_wrap:[4,1,1,""],read:[4,1,1,""],read_all:[4,1,1,""],read_all_raw:[4,1,1,""],read_raw:[4,1,1,""]},"compLib.IRSensor":{IRSensor:[5,0,1,""]},"compLib.IRSensor.IRSensor":{read:[5,1,1,""],read_all:[5,1,1,""],set:[5,1,1,""]},"compLib.LogstashLogging":{Logging:[7,0,1,""]},"compLib.LogstashLogging.Logging":{get_logger:[7,1,1,""],set_debug:[7,1,1,""]},"compLib.Motor":{Motor:[8,0,1,""]},"compLib.Motor.Motor":{active_break:[8,1,1,""],all_off:[8,1,1,""],get_motor_curve:[8,1,1,""],power:[8,1,1,""],power_raw:[8,1,1,""],pwm:[8,1,1,""],set_motor_curve:[8,1,1,""]},"compLib.Odom":{Odom:[9,0,1,""],Odometry:[9,0,1,""]},"compLib.Odom.Odom":{clear:[9,1,1,""],get_odom:[9,1,1,""],update:[9,1,1,""]},"compLib.Odom.Odometry":{get_orientation:[9,1,1,""],get_x:[9,1,1,""],get_y:[9,1,1,""]},"compLib.Robot":{Robot:[11,0,1,""]},"compLib.Robot.Robot":{ARBOR_LENGTH_M:[11,2,1,""],ARBOR_LENGTH_MM:[11,2,1,""],LEFT_PORT:[11,2,1,""],RIGHT_PORT:[11,2,1,""],TICKS_PER_METER:[11,2,1,""],TICKS_PER_TURN:[11,2,1,""],WHEEL_CIRCUMFERENCE_MM:[11,2,1,""]},"compLib.Servo":{Servo:[12,0,1,""]},"compLib.Servo.Servo":{set_position:[12,1,1,""],setup_position:[12,1,1,""]},"compLib.Vision":{__Streaming:[13,0,1,""]},"compLib.Vision.__Streaming":{get_frame:[13,1,1,""],publish_frame:[13,1,1,""]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","attribute","Python attribute"]},objtypes:{"0":"py:class","1":"py:method","2":"py:attribute"},terms:{"001":13,"05307840487532":11,"100":[6,8],"100hz":9,"12418":11,"139":11,"200":1,"223":11,"2770":11,"360":11,"403":1,"404":1,"413":1,"480":2,"503":1,"568799001412":11,"640":2,"900":6,"906":6,"9898":13,"break":8,"class":[0,1,5,12,13],"enum":8,"float":[8,9,12],"function":[1,2,3],"import":[1,2,3,5,6,7,8,9,10,13,14],"int":[1,3,4,5,8,12],"return":[1,2,4,5,7,8,9,13],"static":[1,3,4,5,7,8,9,12],"true":[2,5,6,8,10,13],"while":[1,2,5,6,9,10,13],BUT:13,For:13,NOT:13,The:[1,2,3,13],There:1,Use:13,Using:0,Will:4,With:2,__main__:[2,14],__name__:[2,14],__stream:13,abs:9,access:[3,5],accuraci:5,act:2,activ:8,active_break:[8,9],actual:0,adjust:6,after:11,all:[1,4,5,8,9],all_off:8,allow:8,alreadi:1,alwai:1,analog:0,angl:12,api:0,arbor_length_m:11,arbor_length_mm:11,arrai:8,aruco:0,aruco_dict:2,aruco_paramet:2,automat:13,axi:9,backward:[9,14],base:2,becaus:13,been:1,beep:14,between:[3,4,5,8,9,11,12],bin:14,bit:[5,13],blue:1,bool:5,bottom:2,browser:13,buffer:13,buup:14,call:[0,3,4,5,9],cam:13,camera:13,can:[2,7,13],captur:13,cargo:1,center:2,chang:3,charact:3,check:8,chessboard:0,circumfer:11,clear:[3,4,9],clear_al:[4,9],code:1,color:1,color_bgr2grai:[2,13],color_break:6,column:3,come:13,commun:[1,7],competit:7,complib:[1,2,3,4,5,6,7,8,9,10,11,12,13,14],connect:[4,8,12,13],control:[0,8,12],convert:13,coordin:[1,2,9],copi:2,corner:[2,13],correct:1,count:1,creat:13,criteria:13,current:[1,4,5,8,9],curv:8,cv2:[2,10,13],cvtcolor:[2,13],datastructur:1,debug:7,def:[1,2,6,9,14],degre:[1,9,11],deliv:1,desiredid:2,detect:0,detectmark:2,detectorparameters_cr:2,dict:1,dict_6x6_250:2,dictionari:1,dictionary_get:2,differ:5,displai:[0,6,13],distanc:[0,11],document:[0,13],done:13,doubl:0,doubleelim:1,draw:13,drawchessboardcorn:13,drawdetectedmark:2,drive:[0,1,6,11],drive_exampl:9,drive_spe:6,driven:0,dto:9,dure:12,each:3,easi:2,ein:14,either:1,element:8,elif:[1,6],elimin:0,els:[1,2],emitt:5,encod:[0,6,9,10],error:6,exactli:8,exampl:0,faster:[4,5],field:1,find:13,findchessboardcorn:13,first:1,follow:[1,6],format:5,forward:[9,14],found:2,frame:[2,10,13],from:[1,2,3,4,5,6,7,8,9,10,13,14],game:1,gameboard:1,get:[0,2,7,8,13],get_cargo:1,get_deliveri:1,get_fram:[2,10,13],get_garbag:1,get_goal:1,get_i:9,get_item:1,get_logg:7,get_materi:1,get_meteoroid:1,get_motor_curv:8,get_odom:9,get_oppon:1,get_orient:9,get_posit:1,get_scor:1,get_x:9,getdeliveri:1,getgarbag:1,getgoal:1,getitem:1,getmateri:1,getmeteoroid:1,getnormalizedtagposit:2,getop:1,getpo:1,getscor:1,gettagcenterfromfram:2,gettagposit:2,global:8,goal:1,grab:13,grai:[2,13],grayscal:13,green:1,hallo:14,handl:[4,13],handle_wrap:4,has:1,have:1,height:2,hello:3,here:[1,13],hold:[1,9],hopefulli:1,how:[2,13],http:13,ich:14,ids:2,imag:13,includ:1,indexerror:[3,4,5,8],info:8,inform:9,infrar:0,instanc:13,integr:3,interfac:13,internet:13,irsensor:[5,6,10],item:1,json:1,judg:1,lag:13,last:1,lasterror:6,least:9,left:[2,5,9,11],left_port:11,leftspe:6,len:1,let:1,level:7,librari:7,like:[1,13],line:[0,1],linear:8,linefollow:0,list:1,list_cargo:1,listcargo:1,littl:13,load:1,log:0,log_metr:8,logger:7,logstash:7,logstashlog:7,look:[1,13],loop:9,main:[6,14],make:1,manual:7,math:9,max:[6,8,9],mayb:0,meteoroid:1,meter:[9,11],middl:5,might:13,millimet:11,min:6,mode:8,modul:0,more:8,motor:[0,4,6,9,11,14],motormod:8,movement:9,must:[8,9],need:[1,13],newest:13,next:1,none:[2,9,13],normal:2,note:13,now:1,object:[1,7],odom:9,odometri:0,off:5,offset:12,onc:[1,4,5],one:[3,4,5,11],onli:[4,5],onto:13,opencv:0,oppon:1,opponent_posit:1,organ:7,orient:9,output:13,overflow:4,own:13,packag:1,paramet:[1,2,3,4,5,8,12,13],per:11,percent:8,percentag:8,pick:1,pixel:2,point:[1,13],port:[4,8,11,12],posit:[0,2,4,9,12,13],possibl:1,power:[6,8,9,10,14],power_raw:8,print:[1,2,5,6,9,10,14],process:[12,13],program:1,proport:8,provid:13,publish:13,publish_fram:[2,10,13],put:1,pwm:8,python:7,qualiti:0,quit:2,radian:9,rais:[3,4,5,8],rang:[2,6,10],raspberri:13,raw:[4,8],raw_valu:4,read:[4,5,6,10],read_al:[4,5],read_all_raw:4,read_raw:4,realtim:13,recogn:0,record:13,red:1,rejectedimgpoint:2,request:1,reset:4,respond:1,ret:13,right:[2,5,9,11],right_port:11,rightspe:6,robot:[1,3,5,9,12,14],rotat:1,roughli:8,row:3,rtmp:13,run:[1,13],same:2,score:1,screen:2,screenshot:13,second:[1,13],see:8,seed:0,self:1,sensor:0,sensorsblack:6,server:[1,13],servo:0,set:[5,6,8,9,10,12],set_debug:7,set_motor_curv:8,set_posit:[10,12],setup:12,setup_posit:[10,12],shape:2,should:[1,7,8,9,13],show:[2,13],simpl:[0,2],sleep:[1,6,9,10,14],sleeptim:6,some:[1,13],soon:1,specif:8,specifi:[1,2,4,8],speed:[8,9],spi:[4,5],split:3,start:[1,4,9],statu:1,str:[1,3],straight:0,stream:[0,2,10],string:[1,3],system:9,tag:0,tag_id:2,take:13,taken:1,term_criteria_ep:13,term_criteria_max_it:13,test:[0,13],text:3,than:[4,5],theta:9,thi:[1,2,4,5,7,13],tick:[8,11],ticks_per_met:11,ticks_per_turn:11,time:[1,2,3,6,9,10,14],too:1,top:2,track:9,tupl:[1,4,5],turn:[0,5,8,9,11],two:[1,11],type:[1,5,7],underflow:4,until:1,updat:9,usag:0,use:[1,2,7,13],used:[1,4,7,8,9,12],uses:[4,5],using:13,valu:[4,5,8],valueerror:8,veri:2,view:13,vision:[0,2],wai:2,wait:[1,13],wait_for_start:1,want:[2,13],web:13,webserv:13,websit:13,whatev:13,wheel:11,wheel_circumference_mm:11,when:[7,9,13],which:[1,4,5,8,13],width:2,world:3,write:0,yellow:1,you:[1,2,13],your:[1,13],your_raspi_ip:13,yourself:13,zip:2,zone:1},titles:["Competition Robot Library","Api","Aruco","Display","Encoder","Infrared Sensor","Linefollower Examples","Logging","Motor","Odometry","Quality Control","Robot","Servo","Vision","Usage"],titleterms:{"class":[3,4,7,8,9,11],Using:13,actual:9,analog:5,api:1,aruco:2,call:1,chessboard:13,competit:0,content:0,control:10,detect:13,displai:3,distanc:9,document:[3,4,7,8,9,11],doubl:1,drive:8,driven:9,elimin:1,encod:4,exampl:[1,2,3,5,6,7,8,9,13],get:9,infrar:[5,10],librari:0,line:3,linefollow:6,log:7,mayb:8,modul:13,motor:[8,10],odometri:9,opencv:13,posit:1,qualiti:10,recogn:2,robot:[0,11],seed:1,sensor:5,servo:[10,12],simpl:6,straight:8,stream:13,tag:2,test:[5,10],turn:7,usag:14,vision:[10,13],write:3}}) \ No newline at end of file +Search.setIndex({docnames:["faq","gettingStarted/codeServer","gettingStarted/firstProgram","gettingStarted/index","gettingStarted/secondProgram","gettingStarted/thridProgram","gettingStarted/wifi","index","lib/classes/Motor","lib/index","other/usage","software/installation"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["faq.rst","gettingStarted/codeServer.rst","gettingStarted/firstProgram.rst","gettingStarted/index.rst","gettingStarted/secondProgram.rst","gettingStarted/thridProgram.rst","gettingStarted/wifi.rst","index.rst","lib/classes/Motor.rst","lib/index.rst","other/usage.rst","software/installation.rst"],objects:{"compLib.Motor":{Motor:[8,0,1,""]},"compLib.Motor.Motor":{multiple_power:[8,1,1,""],multiple_pulse_width:[8,1,1,""],multiple_speed:[8,1,1,""],power:[8,1,1,""],pulse_width:[8,1,1,""],speed:[8,1,1,""]}},objnames:{"0":["py","class","Python-Klasse"],"1":["py","method","Python-Methode"]},objtypes:{"0":"py:class","1":"py:method"},terms:{"075b8c":6,"100":[4,8],"2004":6,"2019":6,"2412":6,"2427":6,"2437":6,"2452":6,"2462":6,"2467":6,"393ce57f":6,"500":5,"5180":6,"5200":6,"5220":6,"5280":6,"5500":6,"8080":1,"900":5,"944980":6,"98117b165a48f25cbe36f288ddf597729a40feeea93054c19bfa8e5eab238541":6,"class":8,"finally":4,"float":8,"for":[4,6],"import":[4,5,8,10],"int":8,"m\u00fcssen":[2,4],"n\u00e4chsten":2,"static":8,"this":6,"var":6,Aber:4,Als:[1,4,11],Also:4,Bei:8,DIR:6,Dann:[2,4],Das:[1,4,11],Der:[4,5,8],Die:[4,5,6],Dies:4,Diese:[5,8,11],Dieser:[4,5],Eine:6,Hier:4,Jetzt:4,Mein:3,Mit:[4,8],NICHT:5,Nach:6,Nun:4,Oder:4,Sie:[2,4],Und:4,Was:4,Wenn:[4,5],Wie:[4,5],Wir:[4,5],Zum:4,Zur:8,__main__:10,__name__:10,aarch64:11,ablauft:4,abzules:5,achtung:4,adress:[1,6],again:4,air:4,aktion:4,aktivi:5,aktiviert:5,akzeptiert:4,all:[2,4,5,8],and:[4,5,6],aner:8,anfang:4,angebracht:5,angegeb:8,angestecht:8,angezeigt:[1,6],angibt:4,anhalt:4,anleg:4,anleit:[6,11],anoth:4,anseh:4,anstatt:4,ansteu:[3,8],ansteuer:8,anwendungsfall:4,anzeigt:2,anzusteu:8,argument:8,arm64:11,aufgab:4,aufgeruf:4,aufruf:[4,8],aufzusetz:11,ausfuhr:[2,4],ausfuhrt:4,ausgab:2,ausgangsposition:4,ausgefuhrt:5,ausgeh:4,ausgestattet:5,ausgibt:5,ausles:4,ausreicht:8,ausseh:4,auswerf:6,automat:[6,8],backward:[4,10],basis:11,beacht:8,bedeutet:5,beendet:4,beep:10,befehl:4,befind:5,befindet:5,beginn:2,beid:[4,8],beim:[4,6,8],beispiel:[2,4,7,9],bekomm:4,benot:4,benotigt:[4,8],bereit:[1,4],bereitgestellt:6,beschrieb:4,bestimmt:4,besuch:4,bewahrt:4,beweg:4,bewegt:4,bild:4,bit:11,black:5,bleibt:4,board:5,boot:6,bot:5,brauch:4,bravia:6,bringt:8,brows:1,bsd:6,bssid:6,buup:10,bzw:[6,11],ccmp:6,closed:8,cod:[1,2,4],color_break:5,comp:4,compair:[0,1,2,5],complib:[4,5,7,8,10],comput:6,conf:6,connected:6,continu:4,contributor:6,copyright:6,country:6,ctrl:6,ctrl_interfac:6,dabei:[6,8],dafur:[4,8],danach:4,daran:4,darauf:4,dass:[4,5,6,8],datei:[2,4,6],davon:4,deaktiviert:8,def:[4,10],defini:4,definiert:[4,5],definition:4,denk:4,detail:6,dev:6,diagnos:6,diagramm:5,dient:11,dieselb:4,direct:6,distributed:6,dokumentation:[4,9],dreh:8,dreht:8,drehzahl:8,drei:4,drei_h288a_24g_eky5:6,drei_h288a_5g_eky5:6,dritt:3,driv:4,drivebackward:4,driveforward:4,driving:4,dunkl:5,eig:4,einbau:[4,6],einfach:[1,4,5],einfug:6,eingeb:1,eingebaut:4,eingesetzt:[1,6],eingestellt:4,einheit:8,einsteck:6,einstell:[4,8],eintollernamefurdaswlan:6,els:5,emitt:5,enabl:5,encod:8,end:8,endlich:4,energi:4,entgegengesetzt:8,entnehm:6,entscheid:4,entsprech:[4,5],entwed:8,entwickl:8,entwicklungsumgeb:3,erfolg:8,erfolgreich:6,erkannt:5,erkenn:[4,5],erlauter:4,erled:4,ermoglicht:8,erst:[4,7],erstell:2,ess:6,eth:6,event:6,explizit:8,fahr:[3,9],fahrbefehl:4,fahrfunktion:4,fahrgeschwind:4,fahrt:4,fall:[4,5],faq:7,farb:5,farbschwellenwert:5,fehl:6,fehlerbehandl:3,fertig:4,find:11,flag:6,folgend:8,folgt:[4,5],forward:[4,10],frequency:6,from:[4,5,8,10],fuhr:4,funf:[4,5],funktion:[4,8],funktioni:4,funktioniert:4,fur:[1,2,3,4,8,11],gar:4,gebraucht:11,gedreht:8,gefahr:4,gefuhl:4,genau:[6,9,11],generi:6,generiert:6,genutzt:6,gerad:3,geradeaus:4,geschwind:[4,8],geseh:4,gesetzt:4,gespeichert:2,gespiegelt:4,getan:4,gewartet:4,gibt:[5,8],gleich:4,group:6,grund:[4,8],gut:4,halb:4,hallo:[2,10],halt:4,hardwar:8,heisst:2,hell:5,herstell:3,herstellt:6,herzustell:1,high:5,hintergrund:4,hochstgeschwind:8,hoh:[4,5],html:[4,6],https:[4,6],imm:4,importi:[4,5],importiert:4,indexerror:8,information:[3,9,11],infrarotsensor:5,insgesamt:5,installationsanweis:7,integriert:4,interactiv:6,interfac:6,irsensor:5,jed:[4,5],jedoch:11,jouni:6,kabelgebund:6,kamera:4,kannst:5,kart:6,klass:9,klein:[4,8],komm:6,kommunikation:5,kompiliert:11,komplex:4,komponent:11,konfiguration:6,konn:[2,4,5],konnt:4,kopiert:6,lang:4,langsam:4,laserjet:6,lasst:4,leicht:4,leistung:8,leistungsfah:8,les:5,lesbar:4,let:4,level:6,lib:4,licens:6,lieg:5,liegt:[4,5,8],lin:5,lini:[4,5],link:4,loop:8,loszuleg:5,low:5,m28:6,mach:4,macos:3,main:[2,10],mal:4,malin:6,manchmal:4,maximal:8,may:6,mehr:[3,8],mehre:8,meldung:5,meng:4,mitt:5,mittel:[6,8],mittl:5,mod:6,modul:[4,5],modular:4,moglich:8,moment:4,montiert:8,mor:[4,6],motor:[3,9,10],motordrehzahl:4,moving:4,multipl:9,multiple_pow:8,multiple_pulse_width:8,multiple_speed:8,nah:8,nam:[4,6],nehm:4,nenn:2,netdev:6,network:6,netzwerk:6,neu:[2,4,11],normal:[9,11],normalerweis:4,not:[4,5],notwend:[4,8,11],now:4,numm:5,oben:4,obig:[4,5],offiziell:5,offn:6,offnet:2,optimier:4,optimization:4,ordn:2,org:6,ort:6,p2p:6,pack:4,paket:4,paramet:[4,8],passiert:4,passwort:1,paus:8,pausiert:8,percent:8,percentag:8,period:8,plattform:2,platzhalt:4,port:[4,5,8],position:4,pow:[4,9,10],praktik:4,praktischerweis:2,print:[2,5,10],pro:8,progamm:8,programm:[3,8],programmier:[1,2],programmierumgeb:[0,3],prozent:8,prozentsatz:8,prozentual:8,pruf:5,pruft:5,psk:6,pulsbreit:8,pulse_width:8,pulsewidth:9,punkt:4,pwm:8,python:[2,4],rad:8,radiant:8,rais:8,raspberry:[1,6,11],read_all:5,readm:6,recht:4,reih:5,relevant:4,result:6,richtig:[4,6],richtung:[4,8],robot:[1,4,5,6,8,10,11],roboter_ip:1,rpasberry:6,ruckwart:4,ruckwartsfahr:4,ruckwartsfunktion:4,run:6,sag:4,scan:6,scan_result:6,schalt:5,schlaf:4,schlafbefehl:4,schnell:4,schreib:[2,4],schritt:[2,7],schwarz:[4,5],schwellenwert:5,second:4,see:[0,6],seh:[4,5],sekund:[4,5,8],selected:6,send:5,sensor:[4,5],sensorwert:5,serv:1,set:[4,5],setz:[4,8],setzt:4,signal:6,sleep:[4,8,10],softwar:[6,8,11],sollt:[4,5,6,8,11],sond:4,spat:[4,5],speed:[4,9],speich:6,spiegelverkehrt:8,ssh:6,ssid:6,standing:5,start:[4,6],started:6,stattdess:4,steh:4,steht:5,stell:[4,5],stellt:8,steu:[4,8],steuer:8,stillsteht:4,stop:4,stopmotor:4,studio:1,tatsach:4,technisch:4,term:6,terminal:2,test:5,the:[4,6],tim:[4,8,10],tkip:6,tool:6,tupl:8,uber:[2,4,5,8],ubergeb:4,uberhaupt:4,umgeb:1,umgedreht:4,umschreib:4,under:6,ungefahr:4,unsere:[2,4],unserem:5,unseren:[2,4],unseres:2,unt:5,unterhalb:5,unterschied:8,unterstutzt:11,update_conf:6,variabl:4,verarbeit:4,verbind:3,verbindet:6,verfahr:4,verfugt:5,vermeid:4,verschied:[4,5],versteh:4,versuch:4,vertraut:4,verwend:[4,5],verwendet:[5,6,8,11],vielleicht:4,vier:4,visual:1,voll:4,vorderseit:5,vorh:6,vorinstalliert:1,vorstell:4,vorteil:8,vorwart:[4,9],vorwartsfahrt:4,wahrend:4,wait:4,wart:4,warum:4,web:1,weit:[3,4],welch:[1,4,8],welt:2,werd:[2,4,5,6,8,11],wert:[4,5,8],wichtig:[4,5],wied:[4,6],wireshark:6,wiss:4,witt:6,wlan0:6,wlan10573403:6,wlan18792472:6,wlan:3,woll:[2,4],wpa2:6,wpa:6,wpa_cli:6,wpa_supplicant:6,wps:6,wunsch:4,www:6,zahl:4,zeigt:[4,5],zeil:[4,5],zeit:4,zeitpunkt:4,zunach:[2,4,5],zusatz:8,zwei:4,zweit:[3,8],zwisch:[4,8]},titles:["FAQ","Programmierumgebung","Mein erstes Programm","Erste Schritte","Mein zweites Programm","Mein drittes Programm","WLAN-Verbindung herstellen","Dokumentation des Roboters","Motoren","compLib","Beispiele","Installationsanweisungen"],titleterms:{Mein:[2,4,5],Was:0,Wie:0,ansteu:4,aufsetz:11,beispiel:[8,10],betriebssyst:11,complib:9,content:7,dokumentation:[7,8],dritt:5,entwicklungsumgeb:[0,1],erst:[2,3],fahr:[4,8,10],faq:0,fehlerbehandl:6,fur:[0,6],genau:8,gerad:4,herstell:[1,6],information:[6,8],installationsanweis:11,klass:8,macos:6,mehr:4,motor:[4,8],multipl:8,normal:8,passwort:0,pow:8,programm:[2,4,5],programmierumgeb:1,pulsewidth:8,robot:7,ruckwart:10,schritt:[3,6],speed:8,verbind:[0,1,6],vorwart:[8,10],weit:6,wlan:6,zweit:4}}) \ No newline at end of file diff --git a/software/installation.html b/software/installation.html new file mode 100644 index 0000000..90c3f80 --- /dev/null +++ b/software/installation.html @@ -0,0 +1,225 @@ + + + + + + + + + + Installationsanweisungen — CompLib 0.2.3 Dokumentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      + + + +
      + + + + + +
      + +
      + + + + + + + + + + + + + + + + + +
      + + + + +
      +
      +
      +
      + +
      +

      Installationsanweisungen

      +

      Diese Anleitung dient dazu die Software auf dem Roboter neu aufzusetzen. Im normalen Gebraucht sollte dies jedoch nicht notwendig sein.

      +
      +

      Betriebssystem aufsetzen

      +

      Als Basis wird für den Roboter Raspberry Pi OS (64-bit) verwendet. Das 32-Bit Betriebssystem wird nicht unterstützt, da die Software-Komponenten nur für aarch64 bzw. arm64/v8 kompiliert werden. +Genauere Informationen sind hier zu finden.

      +
      +
      + + +
      + +
      +
      + + + + +
      + +
      +

      + + © Copyright 2022, Verein zur Förderung von Wissenschaft und Technik an Schulen (F-WuTS) + +

      +
      + + + + Erstellt mit Sphinx mit einem + + theme + + bereitgestellt von Read the Docs. + +
      + +
      +
      + +
      + +
      + + + + + + + + + + + \ No newline at end of file