.. note::
Bonjour, bienvenue dans la communauté des passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Plongez plus profondément dans l'univers du Raspberry Pi, Arduino et ESP32 avec d'autres passionnés.
**Pourquoi rejoindre ?**
- **Support d'experts** : Résolvez vos problèmes après-vente et défis techniques grâce à 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** : Accédez en avant-première aux annonces de nouveaux produits et obtenez des aperçus exclusifs.
- **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
- **Promotions et concours festifs** : Participez à des concours et à des promotions spéciales pendant les fêtes.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez-nous dès aujourd'hui !
.. _py_emotional:
13. Robot Émotionnel
====================
Cet exemple montre plusieurs actions personnalisées intéressantes du PiCrawler.
**Exécuter le code**
.. raw:: html
.. code-block::
cd ~/picrawler/examples
sudo python3 13_emotional_robot.py
Après avoir lancé le programme, le robot se met d’abord debout lentement afin d’atteindre une posture stable.
Il exécute ensuite une série de mouvements, notamment des mouvements semblables à la nage, des pompes, des gestes de salut avec les pattes avant et une danse de torsion. Ces actions sont exécutées successivement, créant un comportement dynamique et expressif.
Si **Ctrl+C** est pressé, le programme se termine en toute sécurité et le robot revient à une position assise.
**Code**
.. note::
Vous pouvez **modifier/réinitialiser/copier/exécuter/arrêter** le code ci-dessous. Mais avant cela, vous devez vous rendre dans le répertoire contenant le code source, tel que ``picrawler\examples``. Après avoir modifié le code, vous pouvez l'exécuter directement pour voir l'effet.
.. raw:: html
.. code-block:: python
from picrawler import Picrawler
from time import sleep
crawler = Picrawler()
def get_sit_step():
# Get a valid sit step used as the base pose for hand actions
try:
return crawler.move_list['sit'][0]
except Exception:
return None
def handwork(speed):
base = get_sit_step()
# If a valid sit step cannot be retrieved, just perform a sit action
if not base or len(base) < 4:
crawler.do_step('sit', speed)
sleep(0.6)
return
# Generate hand poses by modifying the sit step
left_hand = crawler.mix_step(base, 0, [0, 50, 80])
right_hand = crawler.mix_step(base, 1, [0, 50, 80])
two_hand = crawler.mix_step(left_hand, 1, [0, 50, 80])
crawler.do_step('sit', speed)
sleep(0.6)
crawler.do_step(left_hand, speed)
sleep(0.6)
crawler.do_step(two_hand, speed)
sleep(0.6)
crawler.do_step(right_hand, speed)
sleep(0.6)
crawler.do_step('sit', speed)
sleep(0.6)
def twist(speed):
# Initialize the base position for all four legs
new_step = [[50, 50, -80], [50, 50, -80], [50, 50, -80], [50, 50, -80]]
# Create a twisting motion by alternating rise and drop movements
for i in range(4):
for inc in range(30, 60, 5):
rise = [50, 50, (-80 + inc * 0.5)]
drop = [50, 50, (-80 - inc)]
new_step[i] = rise
new_step[(i + 2) % 4] = drop
new_step[(i + 1) % 4] = rise
new_step[(i - 1) % 4] = drop
crawler.do_step(new_step, speed)
sleep(0.02)
def pushup(speed):
# Two poses used to simulate a push-up motion
up = [[80, 0, -100], [80, 0, -100], [0, 120, -60], [0, 120, -60]]
down = [[80, 0, -30], [80, 0, -30], [0, 120, -60], [0, 120, -60]]
crawler.do_step(up, speed)
sleep(0.6)
crawler.do_step(down, speed)
sleep(0.6)
def swimming(speed, loops=100):
# Simulate a swimming-like motion by gradually adjusting leg coordinates
for i in range(loops):
crawler.do_step(
[
[100 - i, i, 0],
[100 - i, i, 0],
[0, 120, -60 + i / 5],
[0, 100, -40 - i / 5]
],
speed
)
sleep(0.01)
def main():
speed = 100
try:
# Stand up slowly before performing actions
crawler.do_step('stand', 40)
sleep(1.0)
swimming(speed)
pushup(speed)
handwork(speed)
twist(speed)
except KeyboardInterrupt:
print("\nCtrl+C detected, exiting...")
finally:
# Return to a sitting posture before exiting
try:
crawler.do_step('sit', 40)
sleep(1.0)
except Exception:
pass
if __name__ == "__main__":
main()
**Comment cela fonctionne ?**
#. Lorsque le programme démarre, le robot se met d’abord debout lentement afin d’atteindre une posture stable.
.. code-block:: python
crawler.do_step('stand', 40)
sleep(1.0)
Après s’être levé, le programme exécute ensuite plusieurs mouvements prédéfinis en séquence.
#. Mouvement de nage
Le robot effectue un mouvement semblable à la nage en ajustant progressivement les coordonnées des pattes.
.. code-block:: python
for i in range(loops):
crawler.do_step([
[100-i, i, 0],
[100-i, i, 0],
[0,120,-60+i/5],
[0,100,-40-i/5]
], speed)
#. Mouvement de pompes
Deux postures sont définies pour simuler un mouvement de pompes.
.. code-block:: python
up = [[80,0,-100],[80,0,-100],[0,120,-60],[0,120,-60]]
down = [[80,0,-30],[80,0,-30],[0,120,-60],[0,120,-60]]
crawler.do_step(up, speed)
crawler.do_step(down, speed)
#. Mouvement de salut (handwork)
Le programme modifie les coordonnées des pattes avant en utilisant ``mix_step()`` afin de créer un geste de salut.
.. code-block:: python
left_hand = crawler.mix_step(base,0,[0,50,80])
right_hand = crawler.mix_step(base,1,[0,50,80])
#. Mouvement de torsion
Le robot effectue une torsion du corps en levant et en abaissant les pattes diagonales.
.. code-block:: python
rise = [50,50,(-80+inc*0.5)]
drop = [50,50,(-80-inc)]
crawler.do_step(new_step, speed)
#. Si **Ctrl+C** est pressé, le programme se termine en toute sécurité et le robot revient à une position assise.
.. code-block:: python
crawler.do_step('sit', 40)