Cozmo SDK : les custom objects ou comment créer des murs virtuels

Cette entrée a été publiée dans Cozmo, Education, Tutoriels en robotique, et marquée avec , , , , , , , le par .

Le robot Cozmo est aussi un bâtisseur. On a vu que Cozmo peut construire ses propres objets ou encore empiler des cubes comme expliqué dans le tutoriel déplacement du robot et des cubes. Cozmo peut faire encore mieux. Il peut créer des objets virtuels et notamment des murs. Il peut ensuite les utiliser pour interagir avec. C’est ce que nous allons voir dans le tutoriel.

Vous allez apprendre à  :

  1. Utiliser les Poses
  2. Créer des murs virtuels
  3. Déplacer Cozmo dans cet environnement

 

Objectif : ajouter des objets virtuels dans le monde de Cozmo

Durée : 1 heure

  • Niveau de difficulté : intermédiaire
  • Compétence acquises : création d’objets virtuels

Les prérequis

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

Le matériel nécessaire

Afin d’illustrer ces fonctionnalités pour ce tutoriel  nous avons créé un circuit sur lequel des murs virtuels sont placés et dans lequel le robot va circuler.

Ce circuit peut être représenté comme un repère de 40cm x 40 cm tel qu’indiqué sur la figure ci-dessous. Sur le schéma vous pouvez visualiser la carte de cet environnement.  L’origine est située en 0,0, c’est là que le robot sera positionné au départ.  Les traits gras en bleu représentent les murs virtuels. Les points A, B et C seront les points que le robot va rejoindre successivement.

 

Les Poses

Pour créer des murs virtuels nous allons au préalable découvrir l’objet Pose. Par exemple dans notre repère nous pouvons créer un objet Pose comme ci-dessous :

center_wall3 	= Pose(200, 250, 0,  angle_z=degrees(0))

Cette ligne de code déclare en réalité un point situé à 20 cm de l’origine dans l’axe x et 25 cm dans l’axe y (ici c’est le centre de la barre bleu située sous la lettre A)

A l’initialisation de l’application ou lorsque Cozmo est soulevé, Cozmo créé une nouvelle Pose en 0,0,0 correspondant au point au sol situé au milieu devant les deux roues avant du robot. A noter que cette Pose dispose d’un paramètre origin_id qui est incrémenté à chaque fois que le robot perd sa localisation (lorsqu’il est soulevé par exemple) pour qu’il n’y ait pas de conflit avec de précédentes Pose.

Lorsque Cozmo se déplace, sa pose et la pose des objets qu’il détecte (visages, cubes, etc.) sont en position relative par rapport à la Pose initiale du robot.

L’axe X est orienté vers l’avant du robot et l’axe Y est orienté vers la gauche du robot.

A partir de ce point nous pourrons créer un mur comme ci-après.

Créer des objets virtuels : la fonction custom_fixed_object

Dans l’exemple mis à disposition sur notre repository github nous déclarons autant de « Pose » que de sections de murs que nous allons créé (3 sections autour du point A et 3 autour du point C).

A partir de ce point central on déclare un objet en forme de parallélépipède rectangle en indiquant la longueur, l’épaisseur et la hauteur de cet objet.

Par exemple ici nous déclarons un mur de 10 mm de large sur 100 mm de long avec une hauteur WALL_HEIGHT (c’est une variable personnalisée définie dans le programme).

robot.world.create_custom_fixed_object(center_wall3, 10, 100, WALL_HEIGHT, relative_to_robot=True)

La fonction  custom_fixed_object défini un parallélépipède de dimension personnalisée et le place dans le monde de Cozmo. Il n’est pas visible à l’oeil nu on pourra le voir sur la vue 3d du robot.

Voici le prototype de la fonction avec ses paramètres :

create_custom_fixed_object(posex_size_mmy_size_mmz_size_mmrelative_to_robot=Falseuse_robot_origin=True)

Paramètres:

  • pose (cozmo.util.Pose) – L’emplacement de l’objet créé
  • x_size_mm (float) – taille de l’objet (en millimètres) sur l’axe X.
  • y_size_mm (float) – taille de l’objet (en millimètres) sur l’axe Y.
  • z_size_mm (float) – taille de l’objet (en millimètres) sur l’axe Z.
  • relative_to_robot (bool) – indication si la pose est relative à l’origine ou non

 

	center_wall1 	= Pose(300, 0, 0,  angle_z=degrees(0))
	wall1 			= robot.world.create_custom_fixed_object(center_wall1, 400, 10, WALL_HEIGHT, relative_to_robot=True)

	center_wall2	= Pose(250, 200, 0,  angle_z=degrees(0))
	wall2 			= robot.world.create_custom_fixed_object(center_wall2, 100, 10, WALL_HEIGHT, relative_to_robot=True)

	center_wall3 	= Pose(200, 250, 0,  angle_z=degrees(0))
	wall3 			= robot.world.create_custom_fixed_object(center_wall3, 10, 100, WALL_HEIGHT, relative_to_robot=True)

	center_wall4 	= Pose(300, 250, 0,  angle_z=degrees(0))
	wall4 			= robot.world.create_custom_fixed_object(center_wall4, 10, 100, WALL_HEIGHT, relative_to_robot=True)

	center_wall5 	= Pose(200, 50, 0,  angle_z=degrees(0))
	wall5 			= robot.world.create_custom_fixed_object(center_wall5, 10, 100, WALL_HEIGHT, relative_to_robot=True)

	center_wall6 	= Pose(250, 100, 0,  angle_z=degrees(0))
	wall6 			= robot.world.create_custom_fixed_object(center_wall6, 100, 10, WALL_HEIGHT, relative_to_robot=True)

	# soulever et reposer le robot à la position (0,0) de votre repère.

 

Une fois tous les murs crées nous allons circuler entre les points A, B et C.

 

Navigation dans l’environnement peuplé de murs virtuels

Une fois les objects déclarés il est très simple de faire circuler le robot Cozmo dans cet environnement avec la fonction go_to_pose  vue dans le tutoriel précédent.

On indique en paramètre le point à rejoindre. Afin d’orienter le robot correctement il faut utiliser le paramètre angle_z afin que le robot approche le point selon l’angle souhaité.

	# go to position A 
	action = robot.go_to_pose(Pose(250, 250, 0, angle_z=degrees(-90)), relative_to_robot=False)
	action.wait_for_completed()

 

Le déplacement en action

Voici la vidéo de l’exécution du programme  objects_custom_fixed_demo.py qui a servi à créer ce tutoriel.

En ligne de commande on peut afficher les logs comme ceux ci.

Visualisation des murs

Pour visualiser les murs créés vous devrez ajouter le paramètre use_3d_viewer=True à l’éxécution de run_program

cozmo.run_program(cozmo_program, use_3d_viewer=True)

 

Ce qui vous permettra d’afficher la vue ci-dessous où on peut voir les murs en rouge/jaune, les zones vues par le robot en vert et les traces du parcours de Cozmo. Impressionnant non ?

 

 

A vous de jouer ! Bonne exploration !