.. note::
Bonjour, bienvenue dans la communauté des passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Explorez plus en profondeur l'univers de Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.
**Pourquoi rejoindre ?**
- **Support d'experts** : Résolvez les problèmes post-vente et les défis techniques avec l'aide de notre communauté et de notre équipe.
- **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
- **Aperçus exclusifs** : Bénéficiez d'un accès anticipé aux annonces de nouveaux produits et d'aperçus exclusifs.
- **Réductions spéciales** : Profitez de remises exclusives sur nos produits les plus récents.
- **Promotions festives et concours** : Participez à des concours et à des promotions spéciales.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
.. _py_record:
11. Enregistrer un Nouveau Pas
================================
Nous utilisons le clavier pour contrôler le PiCrawler afin de réaliser plusieurs poses successivement et d'enregistrer ces poses pour les rejouer ensuite.
**Exécuter le Code**
.. raw:: html
.. code-block::
cd ~/picrawler/examples
sudo python3 11_record_new_step.py
Une fois le code exécuté, veuillez suivre les instructions affichées dans le terminal.
* Appuyez sur ``1234`` pour sélectionner les pieds séparément : ``1`` : pied avant droit, ``2`` : pied avant gauche, ``3`` : pied arrière gauche, ``4`` : pied arrière droit.
* Appuyez sur ``w``, ``a``, ``s``, ``d``, ``r`` et ``f`` pour contrôler lentement les valeurs de coordonnées du PiCrawler.
* Appuyez sur ``espace`` pour afficher toutes les valeurs des coordonnées.
* Appuyez sur ``p`` pour faire rejouer l'action enregistrée.
* Appuyez sur ``esc`` pour quitter.
**Code**
.. code-block:: python
from picrawler import Picrawler
from time import sleep
import sys
import tty
import termios
import copy
crawler = Picrawler()
speed = 80
def readchar():
fd = sys.stdin.fileno()
old_settings = termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
return ch
manual = '''
Press keys on keyboard to control!
w: Y++
a: X--
s: Y--
d: X++
r: Z++
f: Z--
1: Select right front leg
2: Select left front leg
3: Select left rear leg
4: Select right rear leg
Space: Print all leg coodinate & Save this step
p: Play all saved step
esc: Quit
'''
new_step=[]
def save_new_step():
new_step.append(copy.deepcopy(crawler.current_step_all_leg_value()))
print(new_step)
def play_all_new_step():
for step in new_step:
crawler.do_step(step,speed)
sleep(0.6)
def main():
speed = 80
print(manual)
crawler.do_step('sit',speed)
leg = 0
coodinate=crawler.current_step_leg_value(leg)
while True:
key = readchar()
key = key.lower()
# print(key)
if 'w' == key:
coodinate[1]=coodinate[1]+2
elif 's' == key:
coodinate[1]=coodinate[1]-2
elif 'a' == key:
coodinate[0]=coodinate[0]-2
elif 'd' == key:
coodinate[0]=coodinate[0]+2
elif 'r' == key:
coodinate[2]=coodinate[2]+2
elif 'f' == key:
coodinate[2]=coodinate[2]-2
elif '1' == key:
leg=0
coodinate=crawler.current_step_leg_value(leg)
elif '2' == key:
leg=1
coodinate=crawler.current_step_leg_value(leg)
elif '3' == key:
leg=2
coodinate=crawler.current_step_leg_value(leg)
elif '4' == key:
leg=3
coodinate=crawler.current_step_leg_value(leg)
elif chr(32) == key:
print("[[right front],[left front],[left rear],[right rear]]")
print("saved new step")
print(crawler.current_step_all_leg_value())
save_new_step()
elif 'p' == key:
play_all_new_step()
elif chr(27) == key: # 27 pour ESC
break
sleep(0.05)
crawler.do_single_leg(leg,coodinate,speed)
print("\n q Quit")
if __name__ == "__main__":
main()
**Comment ça fonctionne ?**
Ce projet est né du :ref:`py_posture`. Il a ajouté des fonctions d'enregistrement et de lecture.
La fonction d'enregistrement est implémentée par le code suivant.
.. code-block:: python
new_step=[]
def save_new_step():
new_step.append(copy.deepcopy(crawler.current_step_all_leg_value()))
print(new_step)
.. note::
L'assignation ici doit utiliser la fonction `Deep Copy `_ , sinon ``new_step`` ne recevra pas un nouvel objet de type tableau lors de l'ajout.
La fonction de lecture est implémentée par le code suivant.
.. code-block:: python
def play_all_new_step():
for step in new_step:
crawler.do_step(step,speed)
sleep(0.6)