[ev3dev × Python] Capteur gyroscopique

Cet article s'adresse à tous ceux qui souhaitent travailler avec ev3 en Python. Cette fois, je souhaite effectuer diverses opérations à l'aide du capteur gyroscopique.

table des matières

  1. Quoi préparer
  2. Programme de capteur gyroscopique

0. Quoi préparer

◯ ev3 (réservoir) et capteur gyroscopique ◯ PC (code VS) ◯ bluetooth ◯ microSD ◯ Material (Il est recommandé de continuer en regardant ceci.)

1. Programme du capteur gyroscopique (Document p.36)

1-0. Programme qui change de direction d'un angle spécifié ①

gyrosensor00.py


#!/usr/bin/env python3
from ev3dev2.sensor.lego import GyroSensor
from ev3dev2.display import Display
from time import sleep

#Génération d'instance
dsp = Display()
gy = GyroSensor()

#Répéter 4 fois
for i in range(4):
    #Allez tout droit deux tours
    tank_drive.on_for_rotations(10,10,2)
    #Réglez la valeur du capteur gyroscopique sur 0
    gy.reset()
    #Continuez à changer de direction jusqu'à ce que la valeur du capteur gyroscopique change de 90 degrés.
    tank_drive.on(5,0)
    gy.wait_until_angle_changed_by(90)
exit()

** Point **: Un programme qui répète aller tout droit et tourner quatre fois de 90 degrés.

Point : wait_until_angle_changed_by(delta,direction_sensitive=False)

Une fonction qui attend jusqu'à ce qu'elle change de l'angle spécifié. Entrez la largeur du changement (déplacement) dans le premier argument. direction_sensitive peut déterminer s'il faut distinguer le sens de rotation.

Par exemple, si delta = -90 Si direction_sensitive = True, attendez que la valeur du capteur gyroscopique atteigne -90. (Distinguer le sens de rotation) Si direction_sensitive = False, attendez que la valeur du capteur gyroscopique atteigne 90 ou -90. (Ne pas distinguer le sens de rotation)

1-1. Programme qui change de direction d'un angle spécifié ②

gyrosensor01.py


#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A, OUTPUT_B, MoveTank, SpeedPercent
from ev3dev2.sensor.lego import GyroSensor

#Génération d'instance
tank = MoveTank(OUTPUT_A, OUTPUT_B)
#Attribuer une instance du capteur gyroscopique au gyroscope variable dans la classe MoveTank
tank.gyro = GyroSensor()
#Réglez la valeur actuelle du capteur gyroscopique sur 0
tank.gyro.calibrate()

#Rotation de 30 degrés
tank.turn_degrees(
speed=SpeedPercent(5),
target_angle=30
)

** Point **: programme qui tourne à 30 degrés

Point : turn_degrees(speed, target_angle, brake=True, error_margin=2, sleep_time=0.01) → Il s'agit d'une fonction spécifique au réservoir qui utilise un capteur gyroscopique pour attendre que la direction de l'angle soit modifiée comme spécifié sur place. error_margin peut déterminer le niveau d'erreur autorisé entre le target_angle et le virage réel.

1-2. Programme d'affichage de l'angle

gyrosensor02.py


#!/usr/bin/env python3
from ev3dev2.display import Display
from ev3dev2.sensor.lego import GyroSensor
from time import sleep

dsp = Display()
gy = GyroSensor()

#boucle infinie
while True:
    dsp.update()
    #Parce que je veux toujours obtenir la valeur du capteur gyroscopique
    #La variable ang est créée dans une boucle.
    ang = gy.angle
    #Convertissez l'angle du capteur gyroscopique en caractères et affichez-le avec l'appareil
    dsp.text_pixels(str(ang) + 'cm',True,0,52,font = 'helvB' + '24')
    #Obtenez des caractères à intervalles pour alléger le traitement
    sleep(0.1)

** Point **: Un programme qui affiche la valeur du capteur gyroscopique

Point : angle Une variable qui stocke la valeur numérique du capteur gyroscopique.

1-3. Programme de traitement parallèle

gyrosensor03.py


#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.display import Display
from ev3dev2.sensor.lego import GyroSensor
from time import sleep
from threading import Thread

#Génération d'instance
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
dsp = Display()
gy = GyroSensor()

#Créez votre propre fonction(Définir)
def angle_display():
    # loop =Répété tant que vrai
    #Programme pour afficher l'angle
    while loop:
        dsp.update()
        gy = gy.angle
        dsp.text_pixels(str(angle) + 'cm',True,0,52,font = 'helvB' + '24')
        sleep(0.1)

#Gardez la boucle vraie
loop = True
#Créer une instance t de la classe Thread
#Sélectionnez le fil de discussion à démarrer
t = Thread(target = angle_display)
#Démarrer un fil avec une instance
t.start()

#Répéter 4 fois
for i in range(4):
    #Allez tout droit deux tours
    tank_drive.on_for_rotations(10,10,2)
    #Réglez la valeur du capteur gyroscopique sur 0
    gy.reset()
    #Continuez à changer de direction jusqu'à ce que la valeur du capteur gyroscopique change de 90 degrés.
    tank_drive.on(5,0)
    gy.wait_until_angle_changed_by(90)
tank_drive.stop()
#Terminez le thread en définissant la boucle sur False
loop = False

Point : Un programme qui se répète en allant tout droit et en tournant quatre fois de 90 degrés Ensuite, la valeur du capteur gyroscopique s'affiche en même temps que la course.

** Point **: article de référence sur le traitement parallèle Multithreading [Implémenter dans le fil](https://qiita.com/tchnkmr/items/b05f321fa315bbce4f77#:~:text=%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89 % E3% 81% A8% E3% 81% FA,% E3% 82% 92% E8% A1% 8C% E3% 81% 86% E3% 81% 93% E3% 81% A8% E3% 81% 8C% E3% 81% A7% E3% 81% 8D% E3% 81% BE% E3% 81% 9B% E3% 82% 93% E3% 80% 82 & texte =% E3% 81% 9D% E3% 81% AE% E4 % B8% A6% E5% 88% 97% E5% 87% A6% E7% 90% 86% E3% 82% 92% E8% A1% 8C% E3% 81% 86,% E3% 81% AE% E4% BD% BF% E7% 94% A8% E3% 81% AB% E3% 81% AA% E3% 82% 8A% E3% 81% BE% E3% 81% 99% E3% 80% 82)

** Point **: article de référence sur les fonctions Définir et appeler une fonction en Python (def, return)

1-4. Programme de traitement parallèle

main.py


#!/usr/bin/env python3
from ev3dev2.motor import OUTPUT_A,OUTPUT_B,MoveTank
from ev3dev2.sensor.lego import GyroSensor
import subprocess

#Génération d'instance
tank_drive = MoveTank(OUTPUT_A,OUTPUT_B)
gy = GyroSensor()

#Exécutez le programme enfant dans un nouveau processus
subprocess.Popen(['python3','sub.py'])

for i in range(4):
    #Allez tout droit deux tours
    tank_drive.on_for_rotations(10,10,2)
    #Réglez la valeur du capteur gyroscopique sur 0
    gy.reset()
    #Continuez à changer de direction jusqu'à ce que la valeur du capteur gyroscopique change de 90 degrés.
    tank_drive.on(5,0)
    gy.wait_until_angle_changed_by(90)
#Créer une instance proc de la classe Popen
proc = subprocess.Popen(['python3','sub.py'])
#Utilisez proc pour tuer un processus enfant
proc.kill()
exit()

sub.py


from ev3dev2.sensor.lego import GyroSensor
from ev3dev2.display import Display
from time import sleep

dsp = Display()
us = GyroSensor()

#boucle infinie
while True:
    dsp.update()
    #Parce que je veux toujours obtenir la valeur du capteur gyroscopique
    #La variable ang est créée dans une boucle.
    ang = gy.angle
    #Convertissez l'angle du capteur gyroscopique en caractères et affichez-le avec l'appareil
    dsp.text_pixels(str(ang) + 'cm',True,0,52,font = 'helvB' + '24')
    #Obtenez des caractères à intervalles pour alléger le traitement
    sleep(0.1)

** Point **: Un programme qui répète aller tout droit et tourner quatre fois de 90 degrés. Ensuite, la valeur du capteur gyroscopique s'affiche en même temps que la course.

** Point **: un programme qui appelle sub.py depuis main.py pour un traitement parallèle. (Le traitement est lourd) Point : subprocess.Popen() Lancez juste un processus, n'attendez pas qu'il se termine → Démarrer et partir Popen.terminate() Arrêtez le processus enfant. Popen.kill() Tuez le processus enfant.

** Point **: article de référence sur le traitement parallèle Introduction à la programmation de traitement parallèle en Python [En savoir plus sur le sous-processus (série 3, version mise à jour)] (https://qiita.com/HidKamiya/items/e192a55371a2961ca8a4#subprocesspopen%E3%81%AB%E3%82%88%E3%82%8B%E8%87%AA%E7%94%B1%E5%BA%A6%E3%81%AE%E9%AB%98%E3%81%84%E5%87%A6%E7%90%86) [17.5. Sous-processus - Gestion des sous-processus (officiel)] (https://docs.python.org/ja/3.5/library/subprocess.html)

1-5. Un programme qui s'exécute à l'aide du contrôle PID

gyrosensor05.py


from ev3dev2.motor import OUTPUT_A, OUTPUT_B, MoveTank, SpeedPercent, follow_for_ms
from ev3dev2.sensor.lego import GyroSensor

#Génération d'instance
tank = MoveTank(OUTPUT_A, OUTPUT_B)
#Attribuer une instance de la classe GyroSensor à la variable gyro dans la classe MoveTank
tank.gyro = GyroSensor()
#Réglez la valeur actuelle du capteur gyroscopique sur 0
tank.gyro.calibrate()

try:
#4500ms(4.5 secondes)Seulement pendant
#La valeur du capteur gyroscopique est toujours la valeur cible(0 dans ce cas)Commencez à courir pour que
    tank.follow_gyro_angle(
    kp=11.3, ki=0.05, kd=3.2,
    speed=SpeedPercent(30),
    target_angle=0,
    follow_for=follow_for_ms,
    ms=4500
    )
#Décidez quoi faire si une exception se produit
except FollowGyroAngleErrorTooFast:
    tank.stop()
    raise

** Point **: Un programme qui s'exécute en essayant de garder l'angle à 0 quoi qu'il arrive Utilisez le contrôle PID pour essayer de rapprocher la valeur du capteur gyroscopique de la valeur cible.

Point : follow_gyro_angle(kp, ki, kd, speed, target_angle=0, sleep_time=0.01, follow_for=, **kwargs)

kp, ki, kd sont des constantes PID. la vitesse est la vitesse du robot target_angle est l'angle que vous souhaitez conserver

** Point **: article de référence sur le contrôle PID

Contrôle PID de la voiture de trace de ligne

** Point **: article de référence sur la gestion des exceptions python

Gestion des exceptions Python (essayez, sauf, sinon, enfin)

finalement

Merci pour la lecture! !! La prochaine fois, j'aimerais écrire sur le contrôle ssh!

Je veux faire un meilleur article ◯ C'est plus facile à comprendre ◯ C'est difficile à comprendre ◯ C'est faux ◯ Je veux que vous expliquiez plus ici Nous apprécions vos opinions et suggestions.

Recommended Posts

[ev3dev × Python] Capteur gyroscopique
[ev3dev × Python] Capteur à ultrasons
[ev3dev × Python] Capteur tactile
[ev3dev × Python] Capteur de couleur
[ev3dev × Python] Bouton de blocage intelligent
[ev3dev × Python] Construction de l'environnement de développement ev3dev
[ev3dev × Python] Commande de moteur unique
[ev3dev × Python] Contrôle de plusieurs moteurs
Python
[ev3dev × Python] Affichage, voix, contrôle LED
Récupérer les frappes de / dev / input (python evdev)
[ev3dev × Python] Contrôle SSH (opération à distance avec clavier)