[PYTHON] Comment faire un jeu de tir avec toio (partie 1)

Je serai dans la Tsukuba Mini Maker Faire

Je l'ai fait avec toio! Tomo no Kai (non officiel) présidait, M. Kato a postulé pour TMMF2020 et a gagné! , Je participerai également à cause de la relation. Tokyo Maker Faire a participé en tant qu'invité à plusieurs reprises, mais c'est sur cette histoire que je voulais exposer un jour! (Vers la fin janvier 2020), cela doit sauter.

Cliquez ici pour la deuxième partie

Hors de matière

Bien que nous ayons pu exposer, nous n'avions pas décidé quoi publier. Quant au matériel que j'ai, je l'ai fait avec toio! Tomo no Kai (Unofficial) annoncé lors de la réunion LT "toio de Bundodo »,« Passer àio 3 fois plus vite », mais je souhaite quand même créer du nouveau matériel. Cependant, puisque c'est la première fois que nous exposons, il n'y a rien de mal à essayer trop techniquement et à échouer, ou si ce n'est pas terminé à la journée. J'ai donc décidé de penser avec le concept suivant.

En particulier, la commande de contrôle du moteur pour spécifier les coordonnées de la valeur cible de la nouvelle fonction ne nécessite pas le contrôle de la rotation du moteur tout en surveillant en permanence la position du tapis côté hôte comme par le passé, donc la quantité de communication BLE entre le cube core toio et l'hôte On peut s'attendre à ce qu'il soit réduit. Dans un environnement tel que Maker Faire, où la communication sans fil sur la bande 2,4 GHz est susceptible d'être encombrée, cela contribue à un fonctionnement stable et, surtout, améliore la durée de vie de la batterie.

Je voulais que cela ressemble à un jeu pour les enfants, j'ai donc décidé de le rendre aussi simple que de tirer sur un cube de base toio en mouvement avec quelque chose comme une arme à feu et de le vaincre. Mettez quelque chose comme -like (</ rp> Mato </ rt> ) </ rp> </ ruby> sur le cube core toio. Doit être abattu.

Configuration de l'équipement

Étant donné que la configuration de l'appareil est BLE intégrée en tant que machine hôte, Raspberry Pi 3B (ci-après abrégé en RasPi) est utilisé, RasPi et le PC portable sont directement connectés par LAN câblé, une adresse IP fixe est attribuée et tera du côté du PC portable. On suppose que le programme est démarré et terminé en se connectant avec ssh à partir de term etc. J'aurais pu attacher quelque chose comme un bouton de démarrage au RasPi pour l'exécuter, mais comme il y aurait divers problèmes, je me suis simplement connecté et j'ai laissé un humain exécuter le programme. De plus, RasPi est équipé d'un haut-parleur pHat pour la sortie d'effet sonore et d'un module LCD2USB pour afficher le score et l'état.

system.png

Enquête, mise en œuvre

Commande de contrôle du moteur pour spécifier les coordonnées de la valeur cible

Quoi qu'il en soit, [[Commande de contrôle du moteur pour spécifier les coordonnées de la valeur cible](https://toio.github.io/toio-spec/docs/ble_motor#%E7%9B] ajouté dans le firmware de toio core cube ver.2 % 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 Regardons% E3% 83% BC% E5% 88% B6% E5% BE% A1). Selon les spécifications, il existe les deux types suivants.

Cette fois, le cube principal de toio cible est un mouvement fugitif (en tant que mouvement, [Galaga](https://ja.wikipedia.org/wiki/%E3%82%AE%E3%83%A3%E3%83%] 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) Je voulais faire le mouvement jusqu'à la formation de la formation immédiatement après le début du jeu), donc le deuxième "[Spécifiez plusieurs coordonnées cibles Type de contrôle moteur 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) "est plus adapté à l'utilisation Cela semble convenir. Il semble se déplacer en cousant plusieurs coordonnées cibles dans l'ordre.

Essayez de bouger

"[Plusieurs coordonnées cibles ont spécifié le type de commande de moteur 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% Afin de confirmer le mouvement réel de "83% BC% E5% 88% B6% E5% BE% A1)", je l'ai fait avec toio! Tomo no Kai (non officiel) bibliothèque python tomotoio utilisée dans la démo de la réunion LT (tomotoio / tree / master / tomotoio) est légèrement modifié pour pouvoir sortir des paquets de contrôle moteur de type 0x04.

tomotoio/cube.Ajouter une méthode comme celle-ci à la classe Cube de py
def setMotor4(self, ctrlid: int, goals, writemode:int, timeout: int = 0, movingtype: int = 0, maxspeed: int = 0, speedtype: int =0):

Le nom est "setMotor4 ()" sans aucune torsion. Eh bien, tout ce que vous avez à faire est de spécifier plusieurs positions de destination (x, y, Θ) pour les objectifs et de les encoder dans un paquet de contrôle moteur 0x04 et de l'envoyer. "[Plusieurs coordonnées cibles ont spécifié le type de commande de moteur 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% Selon "83% BC% E5% 88% B6% E5% BE% A1)", il est possible de spécifier jusqu'à 29 positions cibles, donc si vous pouvez spécifier autant de positions, vous pouvez le déplacer dans une trajectoire compliquée. est.

Création de mouvement

Puisqu'il est possible de spécifier plusieurs positions, il est nécessaire de créer un tableau de positions pour se déplacer le long de cette position. Cependant, il n'y a pas de moyen élégant de calculer mathématiquement toutes les positions d'une orbite compliquée (j'ai sauté les mathématiques ...), donc les humains spécifient les positions à la main. J'ai écrit un script qui lit les coordonnées lorsque le cube core toio est fermement appuyé sur le tapis et que le bouton du bas est allumé, l'envoie du côté hôte, enregistre les coordonnées dans l'ordre du côté hôte, puis le vide dans le texte. Utilisez-le pour prendre quelques coordonnées des points sur l'orbite que vous souhaitez déplacer. Cette fois, je prévois de déplacer les deux cubes core toio en même temps pour m'échapper, mais je vais créer manuellement une trajectoire où les deux cubes core toio sont susceptibles de se heurter et de ne pas entrer en collision.

座標を拾う Répartissez quelques coordonnées en fonction de la trajectoire que vous souhaitez déplacer. Si vous spécifiez de déplacer tout en changeant de direction au lieu de passer à la suivante après avoir changé de direction, la trajectoire ne sera pas linéaire mais sera courbée dans une certaine mesure.

La désignation de destinations multiples ne fonctionne pas

J'ai mis le tableau de coordonnées créé dans setMotor4 () et j'ai essayé de le déplacer, mais cela ne fonctionne pas. Je me suis demandé pourquoi, et quand il s'agissait d'une communication RasPi (raspbian) BLE, la taille standard de MTU était de 23 octets et la charge utile réelle n'était que de 20 octets. Il s'est avéré que la cause ne semble pas être faite. Selon le système, il semble que la taille MTU de BLE puisse être augmentée pour communiquer avec une longueur dépassant 23 octets, mais même si j'ai essayé diverses choses avec RasPi, c'était complètement inutile. Nous n'avons pas beaucoup de temps pour la mise en ligne, nous allons donc renoncer à augmenter la taille de MTU et passer à quelque chose que nous pouvons faire avec 20 octets. Dans la plage de 20 octets, seuls 2 ensembles de coordonnées de destination peuvent être saisis. Heureusement, notifier les mouches lorsque le cube principal toio atteint les coordonnées cibles, et c'était une spécification que des coordonnées de destination supplémentaires peuvent être empilées même en se déplaçant.

  1. Tout d'abord, empilez les coordonnées pour 2 pièces
  2. Lorsqu'une notification arrive que le cube principal toio a atteint la première coordonnée, ajoutez une troisième coordonnée.
  3. Répétez 2. 複数目的位置指定.png

Je l'ai implémenté de cette manière. Avec cela, nous avons pu réaliser le mouvement de couture de plusieurs coordonnées successives. Après cela, tout en plaçant le tableau de coordonnées collectées plus tôt et en déplaçant réellement le cube de base toio, ajustez les paramètres de la valeur de vitesse et du type de vitesse (comme l'augmentation progressive de la vitesse) afin qu'il se déplace comme ça.

Frapper le jugement et quoi tirer

Je tire sur le cube cible toio core, mais je pensais que les trois suivants pourraient être utilisés comme jugement de frappe.

En premier lieu, je n'ai pas décidé pourquoi tirer sur le cube core toio (la cible ci-dessus), mais en quelque sorte nerf, [Rubber gun](https: / /www.amazon.co.jp/gp/product/B07PJPBGDL/), Pistolet à air Je pensais vaguement Cependant, le dessin de l'espace d'exposition a été divulgué (2020/1/24), et quand je l'ai regardé, c'était une table d'une largeur de 180 cm et d'une profondeur de 45 cm. Il est très petit car d'autres personnes seront également exposées. Il s'avère qu'il n'y a presque aucune distance à tirer. Puisque vous tirerez de près, le nerf est trop puissant et si vous le touchez, la cible faite avec Lego sera disjointe, donc inutile. Le pistolet à air de type cylindre est plus difficile à viser que ce à quoi je m'attendais et il est très gênant car il s'agit d'un seul coup. En conséquence, j'ai décidé d'utiliser un pistolet en caoutchouc à anneau continu. 輪ゴム鉄砲1輪ゴム鉄砲2

Lorsque j'ai essayé la détection de collision, la détection horizontale et la détection de posture du capteur de mouvement tout en tirant avec le pistolet en caoutchouc à anneau, le cube de noyau toio n'est pas tombé au point que le caoutchouc de l'anneau a frappé. Par conséquent, la détection de la posture n'est pas adoptée. Testez si la vibration autour de l'anneau en caoutchouc peut être discriminée par détection de collision et détection horizontale. Nous avons ajusté le seuil d'angle pour la détection horizontale et le seuil pour la détection de collision de diverses manières, et finalement nous avons décidé de n'utiliser que la détection de collision. Cependant, il a été constaté que cette valeur de seuil change en fonction du poids de ce qui est placé sur le cube core toio, il était donc nécessaire de définir une valeur correspondant à la cible. De plus, avec cette méthode, il y a un problème: même si les cubes de base toio entrent en collision les uns avec les autres, cela sera jugé comme un coup, mais il est difficile de contrôler la trajectoire pour qu'ils ne se heurtent pas, donc cette fois je vais fermer les yeux. Je l'ai fait.

Cible et direction

J'avais l'intention de faire une cible avec LEGO, mais il est inutile de la rendre trop grande, donc à cause de mes pensées, 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_rd2_r2-b07NDXJNPH & pd_rd2_r2-5c44-bb-44-bb-7 = bff3a3a6-0f6e-4187-bd60-25e75d4c1c8f & pf_rd_r = BSHJKFDE63WHGZ46HVZM & psc = 1 & refRID = BSHJKFDE63WHGZ46HVZM]) a été adopté. Vous pouvez ajouter une histoire pour vaincre les plantes grimpantes qui courent, et l'idée est qu'elle sera populaire auprès des élèves du primaire. LEGO MINECRAFTの的

Puisque la cible a été décidée, ajustez le seuil de détection d'impact en fonction du poids et ajustez la vitesse pour qu'elle accélère ou décélère en se déplaçant le long de la trajectoire selon l'agencement des coordonnées. Si vous vous arrêtez ou changez de direction trop brusquement, cela sera traité comme un choc et ce sera un «coup», alors ajustez-le à une vitesse modérée. Aussi, quand il est "frappé", il exprime qu'il frappe en tournant pendant quelques secondes. Pendant ce temps, nous avons ajouté des mesures ad hoc telles que l'empêcher d'être traité comme un «coup» même s'il frappe à nouveau.

Je voulais créer un effet sonore en frappant, donc j'avais à portée de main [Speaker pHat] de Pimoroni (https://www.switch-science.com/catalog/3219/), donc je l'ai incorporé dans RasPi J'ai essayé de le faire sonner. Sélectionnez la source sonore sur le site de matériel gratuit "Sound effect lab" et sélectionnez le son sonore "Boyoyon". J'ai utilisé pygame pour la lecture sur python. ("Lire et lire du son avec Pygame")

Affichage du score

Quand c'est devenu un "hit", je voulais ajouter la partition et afficher la partition quelque part, mais je pensais que ce serait ennuyeux de connecter un écran HDMI normalement, alors je l'ai eu à Tokyo Maker Faire PIXOO J'ai essayé de l'afficher, mais j'ai abandonné car je ne pouvais pas accéder au contrôle de RasPi avec Bluetooth. Il m'est arrivé d'avoir un module LCD d'affichage de caractères avec des spécifications LCD2USB, donc je l'ai changé pour l'afficher à la place. Eh bien, en production, le joueur n'a pas du tout vu le score, mais c'était pratique pour moi de commencer / terminer le script et de voir le statut. Speaker pHatとLCD2USB

USB port 1602 LCD Module for Pi (LCD2USB) Bibliothèque Python pour LCD2USB https://pypi.org/project/lcd2usb/

Contenu du jeu

Ajout du mode facile

Bien qu'il soit proche de viser la cible pour se déplacer, j'ai pensé que ce serait difficile pour les jeunes enfants, j'ai donc décidé de créer un mode simple. La cible doit être stationnaire, et quand elle frappe, elle exprime "frappé" puis se déplace rapidement vers un autre endroit et s'arrête.

[Le mode simplifié s'arrête et se déplace vers une autre position lorsque vous appuyez sur](http://www.youtube.com/watch ? v = OX2hYu_99j0)

Il se termine lorsque vous le frappez plusieurs fois.

Un peu de mode désordonné

La cible se déplace dès que le jeu commence. Il suit une trajectoire fixe, mais à première vue, on a l'impression de s'enfuir au hasard. Des points seront ajoutés lorsque l'anneau en caoutchouc frappera, et cela se terminera lorsque tous les modèles de mouvement prédéterminés auront été exécutés.

[Un petit mode désordonné se déplace](http://www.youtube.com/watch?v=Su- xKABGDyg)

J'avais l'intention d'ajuster la position et la vitesse des orbites de chacun des deux cubes core toio afin qu'ils ne se heurtent pas, mais si l'un d'eux s'arrêtait en état de frappe, le timing de fonctionnement changerait et une collision se produirait quelque part. Il y a des moments, mais j'ai décidé de ne pas m'en soucier.

Chaque jeu relancera le script à chaque fois. Tout en regardant l'âge du client, choisissez s'il est facile ou un peu compliqué de commencer.

J'ai réussi à le mettre en forme

J'ai fait divers ajustements et j'ai réussi à le faire fonctionner le 2/14 la veille de la production. kouji_tokkankouji.png

Continuation vers Partie 2

Recommended Posts

Comment faire un jeu de tir avec toio (partie 1)
Comment faire un simple jeu Flappy Bird avec Pygame
Comment créer un dictionnaire avec une structure hiérarchique.
Je veux faire un jeu avec Python
Comment faire une traduction japonais-anglais
Comment créer un robot - Avancé
Comment créer une fonction récursive
[Blender] Comment créer un plug-in Blender
Comment créer un robot - Basic
Comment créer un BOT Cisco Webex Teams à l'aide de Flask
Comment créer un jeu d'action multijoueur en ligne avec Slack
Comment créer un laboratoire de piratage - Kali Linux (2020.1) VirtualBox 64 bits Partie 2-
Faisons un jeu de shiritori avec Python
Comment ajouter un package avec PyCharm
[Python] Comment rendre une classe itérable
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
[Cocos2d-x] Comment créer une liaison de script (partie 2)
Comment faire un test unitaire Part.1 Modèle de conception pour l'introduction
Comment créer un indicateur personnalisé Backtrader
Comment créer un plan de site Pelican
[Cocos2d-x] Comment créer une liaison de script (partie 1)
Comment créer un système de dialogue dédié aux débutants
Comment lire un fichier CSV avec Python 2/3
Comment envoyer un message à LINE avec curl
Un mémorandum pour faire WebDAV uniquement avec nginx
Comment dessiner un graphique à 2 axes avec pyplot
Comment développer une application de panier avec Django
Essayez de créer un code de "décryptage" en Python
Comment créer un plug-in QGIS (génération de package)
Comment mesurer le temps d'exécution avec Python Partie 1
J'ai lu "Comment créer un laboratoire de piratage"
Essayez de créer un groupe de dièdre avec Python
Procédure de création d'application multi-plateforme avec kivy
J'ai créé un jeu ○ ✕ avec TensorFlow
Comment mesurer le temps d'exécution avec Python, partie 2
Faisons un jeu de squash
Créez un jeu à la Tetris!
Une nouvelle forme d'application qui fonctionne avec GitHub: Comment créer des applications GitHub
Comment convertir / restaurer une chaîne avec [] en python
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Faisons un outil de veille de commande avec python
Expliquez en détail comment créer un son avec python
Comment créer un sous-menu avec le plug-in [Blender]
Comment obtenir un utilisateur connecté avec les forms.py de Django
Comment convertir un objet de classe en dictionnaire avec SQLAlchemy
Essayez de créer un jeu simple avec Python 3 et iPhone
Comment faire un test unitaire Part.2 Conception de classe pour les tests
Créer une fonction pour décrire les polices japonaises avec OpenCV
Comment télécharger avec Heroku, Flask, Python, Git (Partie 1)
Comment créer un package Python à l'aide de VS Code
Comment créer un serveur HTTPS avec Go / Gin
Comment télécharger avec Heroku, Flask, Python, Git (Partie 2)
Bases de PyTorch (2) -Comment créer un réseau de neurones-
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib