cozmo-sdk-deplacement-robot-et-cubes

Cozmo SDK : déplacement du robot et des cubes

This entry was posted in Cozmo, Education, Tutoriels en robotique and tagged , , , , , , on by .

Dans un précédent TP sur Cozmo SDK, vous avez appris comment Cozmo peut détecter ses cubes et interagir avec ces objets. N’hésitez pas à le consulter si vous souhaitez en savoir plus sur la notion d’objet pour Cozmo (cozmo.objects).

Dans ce nouveau TP, vous allez apprendre à les attraper, les déplacer, les faire rouler ou les empiler en utilisant le SDK Python de Cozmo. Vous allez apprendre ici à :

  1. Déplacer Cozmo (utilisation de la fonction go_to_pose)
  2. Attraper un cube (pickup)
  3. Faire rouler un cube ou empiler deux cubes
  4. Détecter les mouvements d’un cube avec l’accéléromètre intégré

Objectif : faire bouger les cubes, notion de référentiel

Durée : 40 minutes

  • Niveau de difficulté : intermédiaire
  • Compétence acquises : mouvement de cubes, déplacement de Cozmo

Les prérequis

Vous devez avoir acquis les notions abordées dans les tutoriels ci-dessous

Déplacer le robot : la fonction go_to_pose

Nous allons voir comment prendre le contrôle des déplacements de Cozmo dans l’espace avec la fonction go_to_pose().

[pastacode lang= »python » manual= »robot.go_to_pose(Pose(100%2C%2050%2C%200%2C%20angle_z%3Ddegrees(0))%2C%20relative_to_robot%3DTrue).wait_for_completed()%0A » message= » » highlight= » » provider= »manual »/]

La fonction go_to_pose applique une transformation au robot. La fonction prend 2 paramètres : la position destination cozmo.util.Pose et un paramètre qui indiquera si la position à atteindre est relative à la position actuelle du robot ou absolue dans le référentiel utilisé par le robot dans lequel il se trouve.

La Pose passée en paramètre indique les coordonnées à rejoindre relativement à la position actuelle du robot ou à son référentiel initial

  • pose – (cozmo.util.Pose): la pose cible.
  • relative_to_robot (bool) – information si la pose est relative ou absolue.

Dans l’exemple ci-après nous déplaçons le robot une première fois relativement à son référentiel puis une seconde fois dans le référentiel global. Pour que la position du robot soit à (0, 0, 0) il faut  soulever le robot, le retourner et le remettre en place.

Vous pouvez exécuter ce programme une première fois en réinitialisant la position avant l’exécution et en observant les coordonnées affichées. Exécuter le programme une seconde fois, cette fois en réinitialisant la position avant et au cours de la pause de 5 secondes qui a lieu entre les 2 appels à la fonction go_to_pose.

[pastacode lang= »python » manual= »import%20cozmo%0Afrom%20cozmo.util%20import%20degrees%2C%20Pose%0Aimport%20time%0A%0Adef%20cozmo_program(robot%3A%20cozmo.robot.Robot)%3A%0A%09print(%22Robot%20position%20before%20(relative)%20movement%22%20%2B%20str(robot.pose.position.x_y_z))%0A%09print(%22Robot%20moving%20(relative)…%22)%0A%09robot.go_to_pose(Pose(100%2C%2050%2C%200%2C%20angle_z%3Ddegrees(0))%2C%20relative_to_robot%3DFalse).wait_for_completed()%0A%09print(%22Robot%20position%20after%20(relative)%20movement%22%20%2B%20str(robot.pose.position.x_y_z))%0A%0A%09time.sleep(5)%0A%0A%09print(%22Robot%20position%20before%20(absolute)%20movement%22%20%2B%20str(robot.pose.position.x_y_z))%0A%09print(%22Robot%20moving%20(absolute)…%22)%0A%09robot.go_to_pose(Pose(100%2C%2050%2C%200%2C%20angle_z%3Ddegrees(0))%2C%20relative_to_robot%3DFalse).wait_for_completed()%0A%09print(%22Robot%20position%20after%20(absolute)%20movement%22%20%2B%20str(robot.pose.position.x_y_z))%0A%0Acozmo.run_program(cozmo_program) » message= » » highlight= » » provider= »manual »/]

L’output ressemble à ceci :

On remarquera que le deuxième mouvement est très limité puisque le robot a effectué un déplacement de la position (0,0,0) vers la position (100, 50, 0) et il est censé être à la position (100, 50) lorsqu’on lui demande d’aller à la même position.

La position du robot n’étant pas parfaitement exacte il y a un léger décalage entre la position demandée et la position réellement atteinte.

Soulever le robot Cozmo a pour effet de réinitialiser ses coordonnées..

Déplacer les cubes

Pour pouvoir déplacer un cube avec un programme en Python, il faut :

  1. Connaître son emplacement
  2. Aller le chercher et le soulever
  3. Le porter jusqu’à son nouvel emplacement
  4. Le poser

Note : il est possible de poser un cube sur un autre cube ou un autre objet.

Pour en savoir plus sur la détection de cubes (1), se référer au TP : « Cozmo SDK : gestion et détection des light cubes.

Pour en savoir plus sur le déplacement de Cozmo (2), se référer au TP : « Cozmo SDK : coder les déplacements de Cozmo » (en cours de rédaction).

Ici, vous allez apprendre à soulever le cube (2), le porter (3) et le poser (4).

  • pickup_object(objuse_pre_dock_pose=Truein_parallel=Falsenum_retries=0)
  • place_object_on_ground_here(objin_parallel=Falsenum_retries=0)
  • place_on_object(objuse_pre_dock_pose=Truein_parallel=Falsenum_retries=0)

Ces fonctions permettront de saisir un objet, de le poser au sol ou de la poser sur un autre objet.

Dans le code ci-dessous, le robot Cozmo soulève le cube 1, s déplace jusqu’à la position location1, puis pose le cube sur le sol.

[pastacode lang= »python » manual= »%20%20%20%20%20%20%20%20robot.pickup_object(cube1%2C%20num_retries%3D3).wait_for_completed()%0A%20%20%20%20%20%20%20%20robot.go_to_pose(location1).wait_for_completed()%0A%20%20%20%20%20%20%20%20robot.place_object_on_ground_here(cube1%2C%20num_retries%3D3).wait_for_completed() » message= » » highlight= » » provider= »manual »/]

Le code ci-dessous permet d’empiler 2 cubes :

[pastacode lang= »python » manual= »%20%20%20%20%20%20%20%20robot.pickup_object(cube3%2C%20num_retries%3D3).wait_for_completed()%0A%20%20%20%20%20%20%20%20robot.place_on_object(cube2%2C%20num_retries%3D3).wait_for_completed() » message= » » highlight= » » provider= »manual »/]

Vous pouvez télécharger un exemple complet de ces codes sur le GitHub de Génération Robots : cube_pickup_transport.py.

[pastacode lang= »python » user= »generationrobots-lab » repos= »cozmo-examples » path_id= »cube_pickup_transport.py » revision= » » highlight= » » lines= »5-100″ provider= »github »/]

Faire rouler un cube ou empiler des cubes

Pour faire rouler un cube ou empiler deux cubes, le robot Cozmo doit connaître leur position. Si Cozmo connait la position d’au moins un cube, il peut le faire rouler. S’il connait la position de deux cubes, alors il peux les empiler.

Nous avons déjà vu ci-dessus une fonction d’empilement de cubes. Nous allons voir ci-dessous une autre méthode. Cette dernière offre moins de contrôle sur le cube sélectionné.

Cette fonctionnalité est disponible grâce aux deux behaviors suivants :

  • cozmo.behavior.BehaviorTypes.RollBlock
  • cozmo.behavior.BehaviorTypes.StackBlocks

Ci-dessous,  un exemple d’utilisation. Placez un cube devant Cozmo et ce dernier le fera rouler. Si vous positionnez deux cubes, il les empilera.

[pastacode lang= »python » manual= »import%20cozmo%0A%0A%0Adef%20cozmo_program(robot%3A%20cozmo.robot.Robot)%3A%0A%20%20%20%20lookaround%20%3D%20robot.start_behavior(cozmo.behavior.BehaviorTypes.LookAroundInPlace)%0A%0A%20%20%20%20cubes%20%3D%20robot.world.wait_until_observe_num_objects(num%3D2%2C%20object_type%3Dcozmo.objects.LightCube%2C%20timeout%3D10)%0A%0A%20%20%20%20print(%22Found%20%25s%20cubes%22%20%25%20len(cubes))%0A%0A%20%20%20%20lookaround.stop()%0A%0A%20%20%20%20if%20len(cubes)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20robot.play_anim_trigger(cozmo.anim.Triggers.MajorFail).wait_for_completed()%0A%20%20%20%20elif%20len(cubes)%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20robot.run_timed_behavior(cozmo.behavior.BehaviorTypes.RollBlock%2C%20active_time%3D60)%0A%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20robot.run_timed_behavior(cozmo.behavior.BehaviorTypes.StackBlocks%2C%20active_time%3D60)%0A%0A%0Acozmo.run_program(cozmo_program%2C%20use_viewer%3D1) » message= » » highlight= » » provider= »manual »/]

Cette méthode est la plus simple, mais n’offre pas de véritable contrôle au niveau de l’empilement des cubes. Dans autre TP, nous verrons comment créer un script Python qui permet de construire une pyramide avec les trois cubes.

Prochainement de nouveaux contenus

Détecter le mouvement d’un cube

Un autre fonctionnalité intéressante des cubes est l’accéléromètre qui est embarqué dedans. Il permet de détecter les mouvements des cubes même lorsqu’il n’ont pas été vus par Cozmo !

Cozmo peut ainsi « sentir » si l’un de ses cubes a été secoué ou simplement qu’il a été soulevé ou reposé.

Pour réaliser ce « tour de magie » il faut écouter l’événement cozmo.objects.EvtObjectMoving. Lorsque cet événement est émis, il faut alors exécuter une fonction callback et traiter l’événement. L’exemple ci-dessous affiche un message en ligne de commande, qui contient l’accélération enregistrée et la durée du déplacement.

3 événements peuvent être utilisés pour la détection des déplacements des cubes de Cozmo.

  • cozmo.objects.EvtObjectMovingStarted
  • cozmo.objects.EvtObjectMoving
  • cozmo.objects.EvtObjectMovingStopped

[pastacode lang= »python » user= »generationrobots-lab » repos= »cozmo-examples » path_id= »cube_mouvements.py » revision= » » highlight= » » lines= »5- » provider= »github »/]

Voici l’affichage sur la console :

Observation : les événements cozmo.objects.EvtObjectMovingStarted et cozmo.objects.EvtObjectMovingStopped sont émis dès qu’un cube est soulevé ou que le mouvement est interrompu.

Pour déclencher l’événement cozmo.objects.EvtObjectMoving plusieurs fois,  il faut secouer le cube énergiquement, ou bien le faire tourner sur lui même. Un déplacement où une accélération peu marqués ne sont pas détectés.