[PYTHON] Wie man ein Schießspiel mit toio macht (Teil 1)

Ich werde auf dem Tsukuba Mini Maker Faire sein

Ich habe es mit toio geschafft! Tomo no Kai (inoffiziell) präsidierte, Herr Kato bewarb sich um TMMF2020 und gewann! Ich werde auch wegen der Beziehung teilnehmen. Tokyo Maker Faire hat mehrmals als Gast teilgenommen, aber in dieser Geschichte wollte ich eines Tages ausstellen! (Gegen Ende Januar 2020) muss dies springen.

Klicken Sie hier für den zweiten Teil

Kein Material mehr

Obwohl wir ausstellen konnten, hatten wir uns nicht entschieden, was wir herausbringen sollten. Was das Material betrifft, das ich habe, habe ich es mit toio gemacht! Tomo no Kai (inoffiziell) kündigte auf dem LT-Treffen "[toio de Bundodo](https://drive.google.com/open?id=1WtYxdY3I7hE6E7Z5tO8CB8ilkmFBkLVX" an ) ”,“ Dreimal schneller drehen ”, aber ich möchte trotzdem neues Material erstellen. Da dies jedoch das erste Mal ist, dass wir ausstellen, ist es nichts Falsches, wenn wir zu viel technisch versuchen und versagen oder wenn es nicht täglich fertiggestellt wird. Also habe ich beschlossen, mit dem folgenden Konzept zu denken.

Insbesondere erfordert der Motorsteuerungsbefehl zum Festlegen der Zielwertkoordinaten der neuen Funktion keine Rotationssteuerung des Motors, während die Position der Matte auf der Hostseite wie in der Vergangenheit ständig überwacht wird, so dass der Umfang der BLE-Kommunikation zwischen dem Toio-Kernwürfel und dem Host Kann erwartet werden, reduziert zu werden. In einer Umgebung wie Maker Faire, in der die drahtlose Kommunikation im 2,4-GHz-Band wahrscheinlich überfüllt ist, trägt sie zu einem stabilen Betrieb bei und verbessert vor allem die Batterielebensdauer.

Ich wollte, dass es wie ein Spiel für Kinder aussieht, also beschloss ich, es so einfach wie das Schießen eines beweglichen Toio-Kernwürfels mit so etwas wie einer Waffe und das Besiegen zu machen. Legen Sie etwas wie -ähnliches (</ rp> Mato </ rt> ) </ rp> </ ruby> auf den toio core cube. Ist zu erschießen.

Gerätekonfiguration

Da die Gerätekonfiguration als Host-Computer in BLE integriert ist, wird Raspberry Pi 3B (im Folgenden als RasPi abgekürzt) verwendet, RasPi und Notebook-PC werden direkt über ein kabelgebundenes LAN verbunden, eine feste IP-Adresse wird zugewiesen und Tera von der Notebook-PC-Seite. Es wird davon ausgegangen, dass das Programm durch Anmelden mit ssh von term etc. gestartet und beendet wird. Es wäre schön gewesen, so etwas wie einen Startknopf an das RasPi anzuhängen, um es auszuführen, aber da es verschiedene Probleme geben würde, habe ich mich zuerst einfach angemeldet und einen Menschen das Programm ausführen lassen. Darüber hinaus ist RasPi mit einem Lautsprecher-pH-Wert für die Ausgabe von Soundeffekten und einem LCD2USB-Modul zur Anzeige von Partitur und Status ausgestattet.

system.png

Untersuchung, Umsetzung

Motorsteuerungsbefehl zum Festlegen von Zielwertkoordinaten

Wie auch immer, [[Motorsteuerungsbefehl zum Festlegen von Zielwertkoordinaten](https://toio.github.io/toio-spec/docs/ble_motor#%E7%9B] in toio core cube firmware ver.2 hinzugefügt % AE% E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB% 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF Schauen wir uns% E3% 83% BC% E5% 88% B6% E5% BE% A1 an. Entsprechend den Spezifikationen gibt es die folgenden zwei Typen.

Diesmal ist der Ziel-Toio-Kernwürfel eine außer Kontrolle geratene Bewegung (als Bewegung Galaga A9% E3% 82% AC), [GAPLUS](https://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%A3%E3%83%97%E3%83%A9% E3% 82% B9) Ich wollte die Bewegung bis zur Bildung der Formation unmittelbar nach Spielbeginn machen), also die zweite "[Mehrere Zielkoordinaten angeben Motorsteuerungstyp 0x04](https: //toio.github. io / toio-spec / docs / ble_motor #% E8% A4% 87% E6% 95% B0% E7% 9B% AE% E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB % 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF% E3% 83% BC% E5% 88% B6% E5% BE% A1) "ist besser für die Verwendung geeignet Es scheint zu passen. Es scheint sich zu bewegen, indem mehrere Zielkoordinaten der Reihe nach genäht werden.

Versuche dich zu bewegen

"[Mehrere Zielkoordinaten angegeben Motorsteuerungstyp 0x04](https://toio.github.io/toio-spec/docs/ble_motor#%E8%A4%87%E6%95%B0%E7%9B%AE%" E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB% 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF% E3% Um die tatsächliche Bewegung von "83% BC% E5% 88% B6% E5% BE% A1)" zu bestätigen, habe ich es mit toio gemacht! Tomo no Kai (inoffiziell) Python-Bibliothek tomotoio, die in der LT-Meeting-Demo verwendet wird (tomotoio / tree / master / tomotoio) wurde geringfügig geändert, um Motorsteuerungspakete vom Typ 0x04 ausgeben zu können.

tomotoio/cube.Fügen Sie der Cube-Klasse von py eine solche Methode hinzu
def setMotor4(self, ctrlid: int, goals, writemode:int, timeout: int = 0, movingtype: int = 0, maxspeed: int = 0, speedtype: int =0):

Der Name ist "setMotor4 ()" ohne Verdrehung. Nun, alles, was Sie tun müssen, ist, mehrere Zielpositionen (x, y, Θ) für Ziele anzugeben und diese in ein 0x04-Motorsteuerungspaket zu codieren und zu senden. "[Mehrere Zielkoordinaten angegeben Motorsteuerungstyp 0x04](https://toio.github.io/toio-spec/docs/ble_motor#%E8%A4%87%E6%95%B0%E7%9B%AE%" E6% A8% 99% E6% 8C% 87% E5% AE% 9A% E4% BB% 98% E3% 81% 8D% E3% 83% A2% E3% 83% BC% E3% 82% BF% E3% Gemäß "83% BC% E5% 88% B6% E5% BE% A1)" können bis zu 29 Zielpositionen angegeben werden. Wenn Sie also so viele Positionen angeben können, können Sie diese in einer komplizierten Flugbahn verschieben. ist.

Bewegungserstellung

Da es möglich ist, mehrere Positionen anzugeben, muss ein Array von Positionen erstellt werden, um sich entlang dieser Position zu bewegen. Es gibt jedoch keine elegante Möglichkeit, alle Positionen einer komplizierten Umlaufbahn mathematisch zu berechnen (ich habe die Mathematik übersprungen ...), daher spezifizieren Menschen die Positionen von Hand. Ich habe ein Skript geschrieben, das die Koordinaten liest, wenn der Toio-Kernwürfel fest auf die Matte gedrückt wird und die untere Taste gedrückt ist, sie an die Host-Seite sendet, die Koordinaten in der Reihenfolge auf der Host-Seite aufzeichnet und sie dann in Text ausgibt. Verwenden Sie diese Option, um einige Koordinaten der Punkte auf der Umlaufbahn zu erfassen, die Sie verschieben möchten. Dieses Mal habe ich vor, die beiden Toio-Kernwürfel gleichzeitig zu bewegen, um zu entkommen, aber ich werde manuell eine Flugbahn erstellen, in der die beiden Toio-Kernwürfel wahrscheinlich kollidieren und nicht kollidieren.

座標を拾う Verteilen Sie einige Koordinaten entsprechend der Flugbahn, die Sie bewegen möchten. Wenn Sie angeben, dass Sie sich bewegen möchten, während Sie die Richtung ändern, anstatt nach dem Ändern der Richtung zur nächsten zu wechseln, ist die Flugbahn nicht linear, sondern bis zu einem gewissen Grad gekrümmt.

Die Bezeichnung mehrerer Ziele funktioniert nicht

Ich habe das erstellte Koordinatenarray in setMotor4 () eingefügt und versucht, es zu verschieben, aber es funktioniert nicht. Ich fragte mich, warum und als es sich um RasPi (raspbian) BLE-Kommunikation handelte, betrug die Standardgröße der MTU 23 Oktette und die tatsächliche Nutzlast nur 20 Oktette. Sie wurde gesendet, wenn viele Zielkoordinaten eingegeben wurden, um ein langes Paket zu erstellen. Es stellte sich heraus, dass die Ursache nicht getan zu sein scheint. Je nach System scheint es, dass die MTU-Größe von BLE erhöht werden kann, um mit einer Länge von mehr als 23 Oktetten zu kommunizieren, aber selbst wenn ich verschiedene Dinge mit RasPi ausprobiert habe, war es völlig nutzlos. Wir haben nicht viel Zeit, um live zu gehen, also werden wir die Erweiterung der MTU-Größe aufgeben und zu etwas wechseln, das wir mit 20 Oktetten machen können. Im Bereich von 20 Oktetten können nur 2 Sätze von Zielkoordinaten eingegeben werden. Glücklicherweise benachrichtigen Sie Fliegen, wenn der Toio-Kernwürfel die Zielkoordinaten erreicht, und es war eine Spezifikation, dass zusätzliche Zielkoordinaten auch während der Bewegung gestapelt werden können.

  1. Stapeln Sie zuerst die Koordinaten für 2 Teile
  2. Wenn die Benachrichtigung eintrifft, dass der Toio-Kernwürfel die erste Koordinate erreicht hat, fügen Sie eine dritte Koordinate hinzu.
  3. Wiederholen Sie Schritt 2. 複数目的位置指定.png

Ich habe es so implementiert. Auf diese Weise konnten wir die Bewegung des Nähens mehrerer Koordinaten nacheinander realisieren. Passen Sie danach, während Sie das zuvor gesammelte Koordinatenarray platzieren und den Toio-Kernwürfel tatsächlich bewegen, die Parameter des Geschwindigkeitswertes und des Geschwindigkeitstyps an (z. B. schrittweise Erhöhung der Geschwindigkeit), sodass er sich so bewegt.

Treffen Sie das Urteil und was zu schießen

Ich schieße auf den Ziel-Toio-Kernwürfel, aber ich dachte, dass die folgenden drei als Trefferurteil verwendet werden könnten.

Erstens habe ich mich nicht entschieden, warum ich den Toio-Kernwürfel (das Ziel oben) abschießen soll, aber irgendwie nerf, [Rubber gun](https: / Ich dachte vage nach Die Zeichnung des Ausstellungsraums wurde jedoch veröffentlicht (2020/1/24), und als ich sie betrachtete, war es ein Tisch mit einer Breite von 180 cm und einer Tiefe von 45 cm. Es ist sehr klein, weil auch andere Personen ausgestellt werden. Es stellt sich heraus, dass es fast keine Entfernung zum Schießen gibt. Da Sie aus nächster Nähe schießen, ist Nerf zu mächtig. Wenn Sie ihn treffen, wird das mit Lego erstellte Ziel getrennt, sodass es unbrauchbar ist. Die Luftpistole vom Zylindertyp ist schwieriger zu zielen als ich erwartet hatte und es ist sehr mühsam, weil es sich um einen einzelnen Schuss handelt. Aus diesem Grund habe ich mich für eine Gummipistole mit durchgehendem Ring entschieden. 輪ゴム鉄砲1輪ゴム鉄砲2

Als ich die Kollisionserkennung, Horizontalerkennung und Haltungserkennung des Bewegungssensors versuchte, während ich tatsächlich mit der Ringgummipistole schoss, fiel der Toio-Kernwürfel nicht in dem Maße herunter, in dem der Ringgummi traf. Daher wird die Haltungserkennung nicht übernommen. Testen Sie, ob die Vibration um den Gummiring durch Kollisionserkennung und horizontale Erkennung unterschieden werden kann. Wir haben die Winkelschwelle für die horizontale Erkennung und die Schwelle für die Kollisionserkennung auf verschiedene Weise angepasst und uns letztendlich entschieden, nur die Kollisionserkennung zu verwenden. Es wurde jedoch festgestellt, dass sich dieser Schwellenwert in Abhängigkeit vom Gewicht des auf dem Toio-Kernwürfel platzierten Werts ändert. Daher musste ein Wert festgelegt werden, der dem Ziel entspricht. Bei dieser Methode gibt es auch das Problem, dass selbst wenn die Toio-Kernwürfel miteinander kollidieren, dies als Treffer gewertet wird. Es ist jedoch schwierig, die Flugbahn so zu steuern, dass sie nicht kollidieren. Diesmal schließe ich meine Augen. Ich habe es gemacht.

Ziel und Richtung

Ich wollte mit LEGO ein Ziel machen, aber ich konnte es nicht zu groß machen, also aufgrund meiner Gedanken LEGO Minecraft % B4-LEGO-30393-% E3% 83% 9E% E3% 82% A4% E3% 83% B3% E3% 82% AF% E3% 83% A9% E3% 83% 95% E3% 83% 88- % E3% 82% B9% E3% 83% 86% E3% 82% A3% E3% 83% BC% E3% 83% 96% E3% 81% A8% E3% 82% AF% E3% 83% AA% E3 % 83% 83% E3% 83% 91% E3% 83% BC / dp / B07NDXJNPH / ref = pd_aw_sbs_21_1 / 356-7905405-7675543? _Encoding = UTF8 & pd_rd_i = B07NDXJNPH & pd_rd_r = bff3a3a6-0f6e-4187-bd60-25e75d4c1c8f & pf_rd_r = BSHJKFDE63WHGZ46HVZM & psc = 1 & refRID = BSHJKFDE63WHGZ46HVZM]) wurde übernommen. Sie können eine Geschichte hinzufügen, um die herumlaufenden Kriechpflanzen zu besiegen, und die Idee ist, dass sie bei Grundschülern beliebt sein wird. LEGO MINECRAFTの的

Da das Ziel festgelegt wurde, passen Sie die Aufprallerkennungsschwelle entsprechend dem Gewicht und die Geschwindigkeit so an, dass sie beschleunigt oder verlangsamt, während Sie sich entlang der Flugbahn gemäß der Koordinatenanordnung bewegen. Wenn Sie zu plötzlich anhalten oder die Richtung ändern, wird dies als Schock behandelt und es wird ein "Treffer". Stellen Sie ihn daher auf eine moderate Geschwindigkeit ein. Wenn es "getroffen" wird, drückt es aus, dass es trifft, indem es sich einige Sekunden lang dreht. In dieser Zeit haben wir Ad-hoc-Maßnahmen hinzugefügt, z. B. zu verhindern, dass es als "Treffer" behandelt wird, selbst wenn es erneut trifft.

Ich wollte einen Soundeffekt machen, wenn ich "traf", also hatte ich Pimoronis Speaker pHat zur Hand, also habe ich ihn in RasPi integriert. Ich habe versucht, es anzurufen. Wählen Sie die Tonquelle auf der kostenlosen Materialseite "Soundeffektlabor" und wählen Sie den Ton "Boyoyon". Ich habe Pygame für die Wiedergabe auf Python verwendet. ("Sound mit Pygame lesen und abspielen")

Ergebnisanzeige

Als es ein "Hit" wurde, wollte ich die Partitur hinzufügen und irgendwo anzeigen, aber ich dachte, es wäre langweilig, ein HDMI-Display normal anzuschließen, also bekam ich es auf der Tokyo Maker Faire PIXOO Ich habe versucht, es anzuzeigen, aber ich habe aufgegeben, weil ich die Kontrolle über RasPi mit Bluetooth nicht erreichen konnte. Ich hatte zufällig ein Zeichenanzeige-LCD-Modul mit LCD2USB Spezifikationen, also habe ich es geändert, um es stattdessen anzuzeigen. Nun, in der Produktion hat sich der Spieler die Partitur überhaupt nicht angesehen, aber es war praktisch für mich, das Skript zu starten / zu stoppen und den Status zu sehen. Speaker pHatとLCD2USB

USB port 1602 LCD Module for Pi (LCD2USB) Python-Bibliothek für LCD2USB https://pypi.org/project/lcd2usb/

Spielinhalt

Hinzufügen eines einfachen Modus

Obwohl es nahe daran ist, auf das Ziel zu zielen, um sich zu bewegen, dachte ich, dass es für kleine Kinder schwierig sein würde, und entschied mich daher auch für einen einfachen Modus. Das Ziel soll stationär sein, und wenn es trifft, drückt es "Treffer" aus und bewegt sich dann schnell an einen anderen Ort und stoppt.

[Der einfache Modus stoppt und bewegt sich bei einem Treffer an eine andere Position](http://www.youtube.com/watch v = OX2hYu_99j0)

Es endet, wenn Sie es mehrmals treffen.

Ein wenig chaotisch

Das Ziel bewegt sich, sobald das Spiel beginnt. Es bewegt sich entlang einer festen Flugbahn, aber auf den ersten Blick fühlt es sich an, als würde es zufällig davonlaufen. Punkte werden hinzugefügt, wenn der Gummiring trifft, und er endet, wenn alle vorgegebenen Bewegungsmuster ausgeführt wurden.

[Ein wenig chaotischer Modus bewegt sich](http://www.youtube.com/watch?v=Su- xKABGDyg)

Ich wollte die Position und Geschwindigkeit der Umlaufbahnen der beiden Toio-Core-Würfel so einstellen, dass sie nicht miteinander kollidieren. Wenn jedoch einer von ihnen im Trefferzustand stoppt, verschiebt sich der Laufzeitpunkt und es kommt irgendwo zu einer Kollision. Es gibt Zeiten, aber ich habe beschlossen, mich nicht darum zu kümmern.

Jedes Spiel startet das Skript jedes Mal neu. Wählen Sie beim Betrachten des Alters des Kunden aus, ob der Start einfach oder etwas chaotisch ist.

Ich habe es geschafft, es in Form zu bringen

Ich habe verschiedene Anpassungen vorgenommen und es geschafft, es am 14. Februar am Tag vor der Produktion zum Laufen zu bringen. kouji_tokkankouji.png

Fortsetzung von Teil 2

Recommended Posts

Wie man ein Schießspiel mit toio macht (Teil 1)
Wie man ein einfaches Flappy Bird-Spiel mit Pygame macht
So erstellen Sie ein Wörterbuch mit einer hierarchischen Struktur.
Ich möchte ein Spiel mit Python machen
Wie erstelle ich eine japanisch-englische Übersetzung?
Wie erstelle ich einen Crawler?
So erstellen Sie eine rekursive Funktion
[Blender] So erstellen Sie ein Blender-Plug-In
Wie erstelle ich einen Crawler?
So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams
Wie erstelle ich ein Multiplayer-Online-Actionspiel mit Slack?
So erstellen Sie ein Hacking-Labor - Kali Linux (2020.1) VirtualBox 64-Bit Teil 2-
Lassen Sie uns mit Python ein Shiritori-Spiel machen
So fügen Sie ein Paket mit PyCharm hinzu
[Python] Wie man eine Klasse iterierbar macht
So erstellen Sie einen Befehl zum Lesen der Einstellungsdatei mit Pyramide
So erstellen Sie eine Überwachungskamera (Überwachungskamera) mit Opencv und Python
[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 2)
So führen Sie einen Komponententest durch Teil 1 Entwurfsmuster zur Einführung
So erstellen Sie einen benutzerdefinierten Backtrader-Indikator
Wie erstelle ich eine Pelican Site Map?
[Cocos2d-x] So erstellen Sie eine Skriptbindung (Teil 1)
Wie man ein Dialogsystem für Anfänger erstellt
Lesen einer CSV-Datei mit Python 2/3
So senden Sie eine Nachricht mit Curl an LINE
Ein Memorandum, um WebDAV nur mit Nginx zu erstellen
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
So entwickeln Sie eine Cart-App mit Django
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
So erstellen Sie ein QGIS-Plug-In (Paketerzeugung)
So messen Sie die Ausführungszeit mit Python Teil 1
Ich las "Wie man ein Hacking Lab macht"
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Verfahren zur Erstellung plattformübergreifender Apps mit kivy
Ich habe ein ○ ✕ Spiel mit TensorFlow gemacht
So messen Sie die Ausführungszeit mit Python Part 2
Lass uns ein Squashspiel machen
Mach ein Spiel im Tetris-Stil!
Eine neue Form der App, die mit GitHub funktioniert: So erstellen Sie GitHub-Apps
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Erklären Sie ausführlich, wie Sie mit Python einen Sound erzeugen
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
So erhalten Sie einen angemeldeten Benutzer mit Djangos forms.py
So konvertieren Sie ein Klassenobjekt mit SQLAlchemy in ein Wörterbuch
Versuchen Sie, ein einfaches Spiel mit Python 3 und iPhone zu erstellen
So führen Sie einen Komponententest durch Teil 2 Klassendesign zum Testen
Erstellen Sie mit OpenCV eine Funktion zum Beschreiben japanischer Schriftarten
Hochladen mit Heroku, Flask, Python, Git (Teil 1)
So erstellen Sie ein Python-Paket mit VS Code
So erstellen Sie einen HTTPS-Server mit Go / Gin
Hochladen mit Heroku, Flask, Python, Git (Teil 2)
Grundlagen von PyTorch (2) - Wie erstelle ich ein neuronales Netzwerk?
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm