{"id":5720,"date":"2019-02-26T11:37:03","date_gmt":"2019-02-26T10:37:03","guid":{"rendered":"https:\/\/blog.generationrobots.com\/?p=5720"},"modified":"2023-03-29T10:39:21","modified_gmt":"2023-03-29T08:39:21","slug":"cozmo-sdk-deplacement-robot-et-cubes","status":"publish","type":"post","link":"https:\/\/www.generationrobots.com\/blog\/fr\/cozmo-sdk-deplacement-robot-et-cubes\/","title":{"rendered":"Cozmo SDK : d\u00e9placement du robot et des cubes"},"content":{"rendered":"\n<html>\n <body>\n  <p>\n   Dans un pr\u00e9c\u00e9dent TP sur Cozmo SDK, vous avez appris comment Cozmo peut\n   <a href=\"\/blog\/fr\/cozmo-sdk-gestion-et-detection-des-light-cubes\/\" title=\"Cozmo SDK : gestion et d\u00e9tection des light cubes\">\n    d\u00e9tecter ses cubes et interagir avec ces objets\n   <\/a>\n   . N&rsquo;h\u00e9sitez pas \u00e0 le consulter si vous souhaitez en savoir plus sur la notion d\u2019objet pour Cozmo (\n   <em>\n    cozmo.objects\n   <\/em>\n   ).\n  <\/p>\n  \n  \n  <p>\n   Dans ce nouveau TP, vous allez apprendre \u00e0 les attraper, les d\u00e9placer, les faire rouler ou les empiler en utilisant le SDK Python de Cozmo. Vous allez apprendre ici \u00e0 :\n  <\/p>\n  \n  \n  <ol class=\"wp-block-list\">\n   \n   <li>\n    D\u00e9placer Cozmo (utilisation de la fonction\n    <em>\n     go_to_pose\n    <\/em>\n    )\n   <\/li>\n   \n   \n   <li>\n    Attraper un cube (\n    <em>\n     pickup\n    <\/em>\n    )\n   <\/li>\n   \n   \n   <li>\n    Faire rouler un cube ou empiler deux cubes\n   <\/li>\n   \n   \n   <li>\n    D\u00e9tecter les mouvements d&rsquo;un cube avec l&rsquo;acc\u00e9l\u00e9rom\u00e8tre int\u00e9gr\u00e9\n   <\/li>\n   \n  <\/ol>\n  \n  \n  <h2 class=\"wp-block-heading\" id=\"h-objectif-faire-bouger-les-cubes-notion-de-referentiel\">\n   <strong>\n    Objectif : faire bouger les cubes, notion de r\u00e9f\u00e9rentiel\n   <\/strong>\n  <\/h2>\n  \n  \n  <p>\n   <strong>\n    Dur\u00e9e : 40 minutes\n   <\/strong>\n  <\/p>\n  \n  \n  <ul class=\"wp-block-list\">\n   \n   <li>\n    <strong>\n     Niveau de difficult\u00e9 : interm\u00e9diaire\n    <\/strong>\n   <\/li>\n   \n   \n   <li>\n    <strong>\n     Comp\u00e9tence acquises :\u00a0mouvement de cubes, d\u00e9placement de Cozmo\n    <\/strong>\n   <\/li>\n   \n  <\/ul>\n  \n  \n  <h3 class=\"wp-block-heading\" id=\"h-les-prerequis\">\n   <strong>\n    Les pr\u00e9requis\n   <\/strong>\n  <\/h3>\n  \n  \n  <p>\n   Vous devez avoir acquis les notions abord\u00e9es dans les tutoriels ci-dessous\n  <\/p>\n  \n  \n  <ul class=\"wp-block-list\">\n   \n   <li>\n    <a class=\"catalogue\" href=\"\/blog\/fr\/comment-activer-le-mode-sdk-de-cozmo\/\" title=\"Cozmo SDK : comment activer le mode SDK de Cozmo\">\n     Cozmo SDK : comment activer le mode SDK de Cozmo\n    <\/a>\n   <\/li>\n   \n   \n   <li>\n    <a href=\"https:\/\/blog.generationrobots.com\/fr\/cozmo-sdk-gestion-et-detection-des-light-cubes\/\" title=\"Cozmo SDK : gestion et d\u00e9tection des light cubes\">\n     Cozmo SDK : gestion et d\u00e9tection des light cubes\n    <\/a>\n   <\/li>\n   \n  <\/ul>\n  \n  \n  <h2 class=\"wp-block-heading\" id=\"h-deplacer-le-robot-la-fonction-go-to-pose\">\n   D\u00e9placer le robot : la fonction\n   <em>\n    go_to_pose\n   <\/em>\n  <\/h2>\n  \n  \n  <p>\n   Nous allons voir comment prendre le contr\u00f4le des d\u00e9placements de Cozmo dans l&rsquo;espace avec la fonction\n   <em>\n    <a href=\"http:\/\/cozmosdk.anki.com\/docs\/generated\/cozmo.robot.html?highlight=go_to_pose#cozmo.robot.Robot.go_to_pose\" rel=\"noopener\" target=\"_blank\">\n     go_to_pose()\n    <\/a>\n   <\/em>\n   .\n  <\/p>\n  \n  <div class=\"wp-block-wab-pastacode\">\n\t<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">robot.go_to_pose(Pose(100, 50, 0, angle_z=degrees(0)), relative_to_robot=True).wait_for_completed()<\/code><\/pre> <\/div><\/div>\n\n  \n  <p>\n   La fonction\n   <em>\n    go_to_pose\n   <\/em>\n   applique une transformation au robot. La fonction prend 2 param\u00e8tres : la position destination\n   <a class=\"reference internal\" href=\"http:\/\/cozmosdk.anki.com\/docs\/generated\/cozmo.util.html#cozmo.util.Pose\" title=\"cozmo.util.Pose\">\n    <code class=\"xref py py-class docutils literal notranslate\">\n     <span class=\"pre\">\n      cozmo.util.Pose\n     <\/span>\n    <\/code>\n   <\/a>\n   et un param\u00e8tre qui indiquera si la position \u00e0 atteindre est relative \u00e0 la position actuelle du robot ou absolue dans le r\u00e9f\u00e9rentiel utilis\u00e9 par le robot dans lequel il se trouve.\n  <\/p>\n  \n  \n  <p>\n   La Pose pass\u00e9e en param\u00e8tre indique les coordonn\u00e9es \u00e0 rejoindre relativement \u00e0 la position actuelle du robot ou \u00e0 son r\u00e9f\u00e9rentiel initial\n  <\/p>\n  \n  \n  <ul class=\"wp-block-list\">\n   \n   <li>\n    <strong>\n     pose\n    <\/strong>\n    \u2013 (\n    <a class=\"reference internal\" href=\"http:\/\/cozmosdk.anki.com\/docs\/generated\/cozmo.util.html#cozmo.util.Pose\" title=\"cozmo.util.Pose\">\n     <code class=\"xref py py-class docutils literal notranslate\">\n      <span class=\"pre\">\n       cozmo.util.Pose\n      <\/span>\n     <\/code>\n    <\/a>\n    ): la pose cible.\n   <\/li>\n   \n   \n   <li>\n    <strong>\n     relative_to_robot\n    <\/strong>\n    (\n    <a class=\"reference external\" href=\"https:\/\/docs.python.org\/3.5\/library\/functions.html#bool\" title=\"(in Python v3.5)\">\n     <em>\n      bool\n     <\/em>\n    <\/a>\n    ) \u2013 information si la pose est relative ou absolue.\n   <\/li>\n   \n  <\/ul>\n  \n  \n  <p>\n   Dans l&rsquo;exemple ci-apr\u00e8s nous d\u00e9pla\u00e7ons le robot une premi\u00e8re fois relativement \u00e0 son r\u00e9f\u00e9rentiel puis une seconde fois dans le r\u00e9f\u00e9rentiel global. Pour que la position du robot soit \u00e0\n   <strong>\n    (0, 0, 0)\n   <\/strong>\n   il faut\u00a0 soulever le robot, le retourner et le remettre en place.\n  <\/p>\n  \n  \n  <p>\n   Vous pouvez ex\u00e9cuter ce programme une premi\u00e8re fois en\n   <strong>\n    r\u00e9initialisant la position avant l&rsquo;ex\u00e9cution\n   <\/strong>\n   et en observant les coordonn\u00e9es affich\u00e9es. Ex\u00e9cuter le programme une seconde fois, cette fois en\n   <strong>\n    r\u00e9initialisant la position avant et au cours de la pause de 5 secondes\n   <\/strong>\n   qui a lieu entre les 2 appels \u00e0 la fonction\n   <em>\n    go_to_pose\n   <\/em>\n   .\n  <\/p>\n  \n  <div class=\"wp-block-wab-pastacode\">\n\t<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">import cozmo<br\/>from cozmo.util import degrees, Pose<br\/>import time<br\/><br\/>def cozmo_program(robot: cozmo.robot.Robot):<br\/>\tprint(&quot;Robot position before (relative) movement&quot;   str(robot.pose.position.x_y_z))<br\/>\tprint(&quot;Robot moving (relative)...&quot;)<br\/>\trobot.go_to_pose(Pose(100, 50, 0, angle_z=degrees(0)), relative_to_robot=False).wait_for_completed()<br\/>\tprint(&quot;Robot position after (relative) movement&quot;   str(robot.pose.position.x_y_z))<br\/><br\/>\ttime.sleep(5)<br\/><br\/>\tprint(&quot;Robot position before (absolute) movement&quot;   str(robot.pose.position.x_y_z))<br\/>\tprint(&quot;Robot moving (absolute)...&quot;)<br\/>\trobot.go_to_pose(Pose(100, 50, 0, angle_z=degrees(0)), relative_to_robot=False).wait_for_completed()<br\/>\tprint(&quot;Robot position after (absolute) movement&quot;   str(robot.pose.position.x_y_z))<br\/><br\/>cozmo.run_program(cozmo_program)<\/code><\/pre> <\/div><\/div>\n\n  \n  <p>\n   L&rsquo;output ressemble \u00e0 ceci :\n  <\/p>\n  \n  \n  <figure class=\"wp-block-image\">\n   <a href=\"https:\/\/blog.generationrobots.com\/wp-content\/uploads\/2019\/01\/go_to_pose_terminal.png\">\n    <img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"206\" alt=\"\" class=\"wp-image-5749\" src=\"https:\/\/blog.generationrobots.com\/wp-content\/uploads\/2019\/01\/go_to_pose_terminal-1024x206.png\" srcset=\"https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/go_to_pose_terminal-1024x206.png 1024w, https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/go_to_pose_terminal-300x60.png 300w, https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/go_to_pose_terminal-768x154.png 768w, https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/go_to_pose_terminal.png 1395w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/>\n   <\/a>\n  <\/figure>\n  \n  \n  <p>\n   On remarquera que le deuxi\u00e8me mouvement est tr\u00e8s limit\u00e9 puisque le robot a effectu\u00e9 un d\u00e9placement de la position (0,0,0) vers la position (100, 50, 0) et il est cens\u00e9 \u00eatre \u00e0 la position (100, 50) lorsqu&rsquo;on lui demande d&rsquo;aller \u00e0 la m\u00eame position.\n  <\/p>\n  \n  \n  <p>\n   La position du robot n&rsquo;\u00e9tant pas parfaitement exacte il y a un\n   <strong>\n    l\u00e9ger d\u00e9calage entre la position demand\u00e9e et la position r\u00e9ellement atteinte\n   <\/strong>\n   .\n  <\/p>\n  \n  \n  <p>\n   Soulever le robot Cozmo a pour effet de r\u00e9initialiser ses coordonn\u00e9es..\n  <\/p>\n  \n  \n  <h2 class=\"wp-block-heading\" id=\"h-deplacer-les-cubes\">\n   D\u00e9placer les cubes\n  <\/h2>\n  \n  \n  <p>\n   Pour pouvoir d\u00e9placer un cube avec un programme en Python, il faut :\n  <\/p>\n  \n  \n  <ol class=\"wp-block-list\">\n   \n   <li>\n    Conna\u00eetre son emplacement\n   <\/li>\n   \n   \n   <li>\n    Aller le chercher et le soulever\n   <\/li>\n   \n   \n   <li>\n    Le porter jusqu&rsquo;\u00e0 son nouvel emplacement\n   <\/li>\n   \n   \n   <li>\n    Le poser\n   <\/li>\n   \n  <\/ol>\n  \n  \n  <p>\n   <strong>\n    Note :\n   <\/strong>\n   il est possible de poser un cube sur un autre cube ou un autre objet.\n  <\/p>\n  \n  \n  <p>\n   Pour en savoir plus sur la\n   <strong>\n    d\u00e9tection de cubes (1)\n   <\/strong>\n   , se r\u00e9f\u00e9rer au TP :\n   <a class=\"catalogue\" href=\"\/blog\/fr\/cozmo-sdk-gestion-et-detection-des-light-cubes\/\" title=\"Cozmo SDK : gestion et d\u00e9tection des light cubes\">\n    \u00ab\u00a0Cozmo SDK : gestion et d\u00e9tection des light cubes.\n   <\/a>\n  <\/p>\n  \n  \n  <p>\n   Pour en savoir plus sur le\n   <strong>\n    d\u00e9placement de Cozmo (2)\n   <\/strong>\n   , se r\u00e9f\u00e9rer au TP : \u00ab\u00a0Cozmo SDK : coder les d\u00e9placements de Cozmo\u00a0\u00bb (en cours de r\u00e9daction).\n  <\/p>\n  \n  \n  <p>\n   Ici, vous allez apprendre \u00e0\n   <strong>\n    soulever le cube (2)\n   <\/strong>\n   , le\n   <strong>\n    porter (3)\n   <\/strong>\n   et le\n   <strong>\n    poser (4).\n   <\/strong>\n  <\/p>\n  \n  \n  <ul class=\"wp-block-list\">\n   \n   <li>\n    <code class=\"descname\">\n     <span class=\"highlighted\">\n      pickup\n     <\/span>\n     _object\n    <\/code>\n    <span class=\"sig-paren\">\n     (\n    <\/span>\n    <em>\n     obj\n    <\/em>\n    ,\n    <em>\n     use_pre_dock_pose=True\n    <\/em>\n    ,\n    <em>\n     in_parallel=False\n    <\/em>\n    ,\n    <em>\n     num_retries=0\n    <\/em>\n    <span class=\"sig-paren\">\n     )\n    <\/span>\n   <\/li>\n   \n   \n   <li>\n    <code class=\"descname\">\n     place_object_on_ground_here\n    <\/code>\n    <span class=\"sig-paren\">\n     (\n    <\/span>\n    <em>\n     obj\n    <\/em>\n    ,\n    <em>\n     in_parallel=False\n    <\/em>\n    ,\n    <em>\n     num_retries=0\n    <\/em>\n    <span class=\"sig-paren\">\n     )\n    <\/span>\n   <\/li>\n   \n   \n   <li>\n    <code class=\"descname\">\n     place_on_object\n    <\/code>\n    <span class=\"sig-paren\">\n     (\n    <\/span>\n    <em>\n     obj\n    <\/em>\n    ,\n    <em>\n     use_pre_dock_pose=True\n    <\/em>\n    ,\n    <em>\n     in_parallel=False\n    <\/em>\n    ,\n    <em>\n     num_retries=0\n    <\/em>\n    <span class=\"sig-paren\">\n     )\n    <\/span>\n   <\/li>\n   \n  <\/ul>\n  \n  \n  <p>\n   Ces fonctions permettront de saisir un objet, de le poser au sol ou de la poser sur un autre objet.\n  <\/p>\n  \n  \n  <p>\n   <strong>\n    Dans le code ci-dessous, le robot Cozmo soul\u00e8ve le cube 1, s d\u00e9place jusqu&rsquo;\u00e0 la position location1, puis pose le cube sur le sol.\n   <\/strong>\n  <\/p>\n  \n  <div class=\"wp-block-wab-pastacode\">\n\t<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">        robot.pickup_object(cube1, num_retries=3).wait_for_completed()<br\/>        robot.go_to_pose(location1).wait_for_completed()<br\/>        robot.place_object_on_ground_here(cube1, num_retries=3).wait_for_completed()<\/code><\/pre> <\/div><\/div>\n\n  \n  <p>\n   <strong>\n    Le code ci-dessous permet d&#8217;empiler 2 cubes :\n   <\/strong>\n  <\/p>\n  \n  <div class=\"wp-block-wab-pastacode\">\n\t<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">        robot.pickup_object(cube3, num_retries=3).wait_for_completed()<br\/>        robot.place_on_object(cube2, num_retries=3).wait_for_completed()<\/code><\/pre> <\/div><\/div>\n\n  \n  <p>\n   Vous pouvez t\u00e9l\u00e9charger un exemple complet de ces codes sur le GitHub de G\u00e9n\u00e9ration Robots :\n   <a href=\"https:\/\/github.com\/generationrobots-lab\/cozmo-examples\/blob\/master\/cube_pickup_transport.py\" rel=\"noopener\" target=\"_blank\" title=\"GitHub de G\u00e9n\u00e9ration Robots - d\u00e9placement des cubes de Cozmo\">\n    cube_pickup_transport.py\n   <\/a>\n   .\n  <\/p>\n  \n  <div class=\"wp-block-wab-pastacode\">\n\t<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <a href=\"https:\/\/github.com\/generationrobots-lab\/cozmo-examples\/blob\/master\/cube_pickup_transport.py\" title=\"Afficher cube_pickup_transport.py\" target=\"_blank\" class=\"code-embed-name\">cube_pickup_transport.py<\/a> <a href=\"https:\/\/raw.github.com\/generationrobots-lab\/cozmo-examples\/master\/cube_pickup_transport.py\" title=\"Back to cube_pickup_transport.py\" class=\"code-embed-raw\" target=\"_blank\">affichage brut<\/a> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"5\" data-line-offset=\"4\"><code class=\"language-python code-embed-code\">&#039;&#039;&#039; Transporter des cubes<br\/><br\/>Ce script permet de d\u00e9tecter les 3 cubes, d\u00e9fini 1 position, d\u00e9place 1 cube \u00e0 cette position puis empiler 2 cubes<br\/><br\/>Utilisation : <br\/>- Placer les 3 cubes align\u00e9s devant Cozmo<br\/>- Executer le script<br\/>&#039;&#039;&#039;<br\/><br\/>import time<br\/>from cozmo.util import degrees, Pose<br\/><br\/>import cozmo<br\/>from cozmo.objects import LightCube1Id, LightCube2Id, LightCube3Id<br\/><br\/>def shift(l, n=0):<br\/>    &quot;&quot;&quot;<br\/>        Fonction qui d\u00e9cale la position des \u00e9l\u00e9ments d&#039;une liste de n positions<br\/>    &quot;&quot;&quot;<br\/>    return l[n:] + l[:n]<br\/><br\/><br\/>def cozmo_program(robot: cozmo.robot.Robot):<br\/>    cube1 = robot.world.get_light_cube(LightCube1Id)  # le cube trombone<br\/>    cube2 = robot.world.get_light_cube(LightCube2Id)  # le cube lampe <br\/>    cube3 = robot.world.get_light_cube(LightCube3Id)  # le cube ab sur un T<br\/><br\/>    # scan de l&#039;environnement pour trouver les cubes<br\/>    look_around = robot.start_behavior(cozmo.behavior.BehaviorTypes.LookAroundInPlace)<br\/>    try:<br\/>        _cubes = robot.world.wait_until_observe_num_objects(num=3, object_type=cozmo.objects.LightCube, timeout=60)<br\/>        print(&quot;Found %s cubes: %s&quot; % (len(_cubes), _cubes))<br\/>    except asyncio.TimeoutError:<br\/>        print(&quot;Didn&#039;t find a cube&quot;)<br\/>    finally:<br\/>        look_around.stop()<br\/>    <br\/>    # position arbitraire<br\/>    location1 =  Pose(cube1.pose.position.x-200, cube1.pose.position.y-50 , 0, angle_z=degrees(0))<br\/><br\/>    # d\u00e9placer le cube 1 \u00e0 la position location1<br\/>    if cube1 is not None:<br\/>        robot.pickup_object(cube1, num_retries=3).wait_for_completed()<br\/>        robot.go_to_pose(location1).wait_for_completed()<br\/>        robot.place_object_on_ground_here(cube1, num_retries=3).wait_for_completed()<br\/>    else:<br\/>        cozmo.logger.warning(&quot;Cozmo is not connected to a LightCube1Id cube - check the battery.&quot;)<br\/><br\/>    # placer le cube 3 sur le cube 2<br\/>    if cube2 is not None and cube3 is not None:<br\/>        robot.pickup_object(cube3, num_retries=3).wait_for_completed()<br\/>        robot.place_on_object(cube2, num_retries=3).wait_for_completed()<br\/>    else:<br\/>        cozmo.logger.warning(&quot;Cozmo is not connected to a LightCube1Id cube - check the battery.&quot;)<br\/><br\/>cozmo.run_program(cozmo_program,  use_viewer=True)<\/code><\/pre> <\/div><\/div>\n\n  \n  <h2 class=\"wp-block-heading\" id=\"h-faire-rouler-un-cube-ou-empiler-des-cubes\">\n   Faire rouler un cube ou empiler des cubes\n  <\/h2>\n  \n  \n  <p>\n   Pour faire rouler un cube ou empiler deux cubes, le robot Cozmo doit conna\u00eetre leur position. Si Cozmo connait la position d&rsquo;au moins un cube, il peut le faire rouler. S&rsquo;il connait la position de deux cubes, alors il peux les empiler.\n  <\/p>\n  \n  \n  <p>\n   Nous avons d\u00e9j\u00e0 vu ci-dessus une\n   <strong>\n    fonction d&#8217;empilement de cubes\n   <\/strong>\n   . Nous allons voir ci-dessous une autre m\u00e9thode. Cette derni\u00e8re offre moins de contr\u00f4le sur le cube s\u00e9lectionn\u00e9.\n  <\/p>\n  \n  \n  <p>\n   <strong>\n    Cette fonctionnalit\u00e9 est disponible gr\u00e2ce aux deux behaviors suivants :\n   <\/strong>\n  <\/p>\n  \n  \n  <ul class=\"wp-block-list\">\n   \n   <li>\n    <em>\n     cozmo.behavior.BehaviorTypes.RollBlock\n    <\/em>\n   <\/li>\n   \n   \n   <li>\n    <em>\n     cozmo.behavior.BehaviorTypes.StackBlocks\n    <\/em>\n   <\/li>\n   \n  <\/ul>\n  \n  \n  <p>\n   Ci-dessous,\u00a0 un exemple d&rsquo;utilisation. Placez un cube devant Cozmo et ce dernier le fera rouler. Si vous positionnez deux cubes, il les empilera.\n  <\/p>\n  \n  <div class=\"wp-block-wab-pastacode\">\n\t<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"1\" data-line-offset=\"0\"><code class=\"language-python code-embed-code\">import cozmo<br\/><br\/><br\/>def cozmo_program(robot: cozmo.robot.Robot):<br\/>    lookaround = robot.start_behavior(cozmo.behavior.BehaviorTypes.LookAroundInPlace)<br\/><br\/>    cubes = robot.world.wait_until_observe_num_objects(num=2, object_type=cozmo.objects.LightCube, timeout=10)<br\/><br\/>    print(&quot;Found %s cubes&quot; % len(cubes))<br\/><br\/>    lookaround.stop()<br\/><br\/>    if len(cubes) == 0:<br\/>        robot.play_anim_trigger(cozmo.anim.Triggers.MajorFail).wait_for_completed()<br\/>    elif len(cubes) == 1:<br\/>        robot.run_timed_behavior(cozmo.behavior.BehaviorTypes.RollBlock, active_time=60)<br\/>    else:<br\/>        robot.run_timed_behavior(cozmo.behavior.BehaviorTypes.StackBlocks, active_time=60)<br\/><br\/><br\/>cozmo.run_program(cozmo_program, use_viewer=1)<\/code><\/pre> <\/div><\/div>\n\n  \n  <p>\n   Cette m\u00e9thode est la plus simple, mais n&rsquo;offre pas de v\u00e9ritable contr\u00f4le au niveau de l&#8217;empilement des cubes. Dans autre TP, nous verrons comment cr\u00e9er un script Python qui permet de construire une pyramide avec les trois cubes.\n  <\/p>\n  \n  \n  <p>\n   <em>\n    Prochainement de nouveaux contenus\n   <\/em>\n  <\/p>\n  \n  \n  <h2 class=\"wp-block-heading\" id=\"h-detecter-le-mouvement-d-un-cube\">\n   D\u00e9tecter le mouvement d&rsquo;un cube\n  <\/h2>\n  \n  \n  <p>\n   Un autre fonctionnalit\u00e9 int\u00e9ressante des cubes est l&rsquo;acc\u00e9l\u00e9rom\u00e8tre qui est embarqu\u00e9 dedans.\u00a0Il permet de d\u00e9tecter les mouvements des cubes m\u00eame lorsqu&rsquo;il n&rsquo;ont pas \u00e9t\u00e9 vus par Cozmo !\n  <\/p>\n  \n  \n  <p>\n   Cozmo peut ainsi \u00ab\u00a0sentir\u00a0\u00bb si l&rsquo;un de ses cubes a \u00e9t\u00e9 secou\u00e9 ou simplement qu&rsquo;il a \u00e9t\u00e9 soulev\u00e9 ou repos\u00e9.\n  <\/p>\n  \n  \n  <p>\n   Pour r\u00e9aliser ce \u00ab\u00a0tour de magie\u00a0\u00bb il faut \u00e9couter l&rsquo;\u00e9v\u00e9nement\n   <em>\n    cozmo.objects.EvtObjectMoving\n   <\/em>\n   . Lorsque cet \u00e9v\u00e9nement est \u00e9mis, il faut alors ex\u00e9cuter une fonction\n   <em>\n    callback\n   <\/em>\n   et traiter l&rsquo;\u00e9v\u00e9nement. L&rsquo;exemple ci-dessous affiche un message en ligne de commande, qui contient l&rsquo;acc\u00e9l\u00e9ration enregistr\u00e9e et la dur\u00e9e du d\u00e9placement.\n  <\/p>\n  \n  \n  <p>\n   3 \u00e9v\u00e9nements peuvent \u00eatre utilis\u00e9s pour la d\u00e9tection des d\u00e9placements des cubes de Cozmo.\n  <\/p>\n  \n  \n  <ul class=\"wp-block-list\">\n   \n   <li>\n    <em>\n     cozmo.objects.EvtObjectMovingStarted\n    <\/em>\n   <\/li>\n   \n   \n   <li>\n    <em>\n     cozmo.objects.EvtObjectMoving\n    <\/em>\n   <\/li>\n   \n   \n   <li>\n    <em>\n     cozmo.objects.EvtObjectMovingStopped\n    <\/em>\n   <\/li>\n   \n  <\/ul>\n  \n  <div class=\"wp-block-wab-pastacode\">\n\t<div class=\"code-embed-wrapper\"> <div class=\"code-embed-infos\"> <a href=\"https:\/\/github.com\/generationrobots-lab\/cozmo-examples\/blob\/master\/cube_mouvements.py\" title=\"Afficher cube_mouvements.py\" target=\"_blank\" class=\"code-embed-name\">cube_mouvements.py<\/a> <a href=\"https:\/\/raw.github.com\/generationrobots-lab\/cozmo-examples\/master\/cube_mouvements.py\" title=\"Back to cube_mouvements.py\" class=\"code-embed-raw\" target=\"_blank\">affichage brut<\/a> <\/div> <pre class=\"language-python code-embed-pre line-numbers\"  data-start=\"5\" data-line-offset=\"4\"><code class=\"language-python code-embed-code\">&#039;&#039;&#039;D\u00e9monstration des \u00e9v\u00e9nements de d\u00e9tection de mouvement des cubes<br\/><br\/>Les cubes n&#039;ont pas besoin d&#039;\u00eatre vu par la cam\u00e9ra du robot<br\/><br\/>&#039;&#039;&#039;<br\/><br\/>import time<br\/><br\/>import cozmo<br\/><br\/><br\/>def cb_object_moving_started(evt, **kw):<br\/>    &quot;&quot;&quot; fonction callback appel\u00e9e \u00e0 chaque fois que l&#039;\u00e9v\u00e9nement EvtObjectMovingStarted est \u00e9mis<br\/>        Si un cube commence \u00e0 \u00eatre d\u00e9plac\u00e9 (d\u00e9tection via l&#039;acc\u00e9l\u00e9rom\u00e8tre du cube) l&#039;\u00e9v\u00e9nement est \u00e9mis <br\/>            <br\/>        On peut r\u00e9cup\u00e9rer l&#039;acc\u00e9l\u00e9ration du cube<br\/>    &quot;&quot;&quot;<br\/>    <br\/>    print(&quot;Le cube %s a commenc\u00e9 \u00e0 bouger: acc\u00e9leration=%s&quot; %<br\/>          (evt.obj.object_id, evt.acceleration))<br\/><br\/><br\/>def cb_object_moving(evt, **kw):<br\/>    &quot;&quot;&quot; fonction callback appel\u00e9e \u00e0 chaque fois que l&#039;\u00e9v\u00e9nement EvtObjectMoving est \u00e9mis<br\/>        Si un cube commence \u00e0 \u00eatre d\u00e9plac\u00e9 (d\u00e9tection via l&#039;acc\u00e9l\u00e9rom\u00e8tre du cube) l&#039;\u00e9v\u00e9nement est \u00e9mis <br\/><br\/>        On peut r\u00e9cup\u00e9rer l&#039;acc\u00e9l\u00e9ration et la dur\u00e9e du d\u00e9placement<br\/>    &quot;&quot;&quot;<br\/>    print(&quot;Le cube %s est en mouvement: acc\u00e9leration=%s, dur\u00e9e=%.1f secondes&quot; %<br\/>          (evt.obj.object_id, evt.acceleration, evt.move_duration))<br\/><br\/><br\/>def cb_object_moving_stopped(evt, **kw):<br\/>    &quot;&quot;&quot; fonction callback appel\u00e9e \u00e0 chaque fois que l&#039;\u00e9v\u00e9nement EvtObjectMovingStopped est \u00e9mis<br\/>        Si un cube arr\u00eate d&#039;\u00eatre d\u00e9plac\u00e9 (d\u00e9tection via l&#039;acc\u00e9l\u00e9rom\u00e8tre du cube) l&#039;\u00e9v\u00e9nement est \u00e9mis <br\/><br\/>        On peut r\u00e9cup\u00e9rer la dur\u00e9e du d\u00e9placement de l&#039;objet<br\/>    &quot;&quot;&quot;<br\/>    print(&quot;Le cube %s a arr\u00eat\u00e9 de bouger: dur\u00e9e=%.1f secondes&quot; %<br\/>          (evt.obj.object_id, evt.move_duration))<br\/><br\/><br\/>def cozmo_program(robot: cozmo.robot.Robot):<br\/>    # on ajoute des handlers pour chaque \u00e9v\u00e9nement<br\/>    robot.add_event_handler(cozmo.objects.EvtObjectMovingStarted, cb_object_moving_started)<br\/>    robot.add_event_handler(cozmo.objects.EvtObjectMoving, cb_object_moving)<br\/>    robot.add_event_handler(cozmo.objects.EvtObjectMovingStopped, cb_object_moving_stopped)<br\/><br\/>    # boucle infinie jusqu&#039;\u00e0 la combinaison de touches CTRL+C<br\/>    print(&quot;Presser CTRL-C pour arr\u00eater&quot;)<br\/>    while True:<br\/>        time.sleep(1.0)<\/code><\/pre> <\/div><\/div>\n\n  \n  <p>\n   <strong>\n    Voici l&rsquo;affichage sur la console :\n   <\/strong>\n  <\/p>\n  \n  \n  <figure class=\"wp-block-image\">\n   <a href=\"https:\/\/blog.generationrobots.com\/wp-content\/uploads\/2019\/01\/cube_mouvement.png\">\n    <img decoding=\"async\" width=\"1391\" height=\"223\" alt=\"\" class=\"wp-image-5759\" src=\"https:\/\/blog.generationrobots.com\/wp-content\/uploads\/2019\/01\/cube_mouvement.png\" srcset=\"https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/cube_mouvement.png 1391w, https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/cube_mouvement-300x48.png 300w, https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/cube_mouvement-768x123.png 768w, https:\/\/www.generationrobots.com\/blog\/wp-content\/uploads\/2019\/01\/cube_mouvement-1024x164.png 1024w\" sizes=\"(max-width: 1391px) 100vw, 1391px\" \/>\n   <\/a>\n  <\/figure>\n  \n  \n  <p>\n   <strong>\n    Observation :\n   <\/strong>\n   les \u00e9v\u00e9nements\n   <em>\n    cozmo.objects.EvtObjectMovingStarted\n   <\/em>\n   et\n   <em>\n    cozmo.objects.EvtObjectMovingStopped\n   <\/em>\n   sont \u00e9mis d\u00e8s qu&rsquo;un cube est soulev\u00e9 ou que le mouvement est interrompu.\n  <\/p>\n  \n  \n  <p>\n   Pour d\u00e9clencher l&rsquo;\u00e9v\u00e9nement\n   <em>\n    cozmo.objects.EvtObjectMoving\n   <\/em>\n   plusieurs fois,\u00a0 il faut secouer le cube \u00e9nergiquement,\u00a0ou bien le faire tourner sur lui m\u00eame. Un d\u00e9placement o\u00f9 une acc\u00e9l\u00e9ration peu marqu\u00e9s ne sont pas d\u00e9tect\u00e9s.\n  <\/p>\n  \n <\/body>\n<\/html>","protected":false},"excerpt":{"rendered":"<p>Dans un pr\u00e9c\u00e9dent TP sur Cozmo SDK, vous avez appris comment Cozmo peut d\u00e9tecter ses cubes et interagir avec ces objets . N&rsquo;h\u00e9sitez pas \u00e0 le consulter si vous souhaitez en savoir plus sur la notion d\u2019objet pour Cozmo ( cozmo.objects ). Dans ce nouveau TP, vous allez apprendre \u00e0 les attraper, les d\u00e9placer, les[&#8230;]<br \/> <a class=\"button\" href=\"https:\/\/www.generationrobots.com\/blog\/fr\/cozmo-sdk-deplacement-robot-et-cubes\/\" style=\"float:right;\">Read this article &gt;&gt;<\/a><\/p>\n","protected":false},"author":188,"featured_media":5845,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1128],"tags":[],"class_list":["post-5720","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-education"],"_links":{"self":[{"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/posts\/5720","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/users\/188"}],"replies":[{"embeddable":true,"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/comments?post=5720"}],"version-history":[{"count":25,"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/posts\/5720\/revisions"}],"predecessor-version":[{"id":13193,"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/posts\/5720\/revisions\/13193"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/media\/5845"}],"wp:attachment":[{"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/media?parent=5720"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/categories?post=5720"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.generationrobots.com\/blog\/wp-json\/wp\/v2\/tags?post=5720"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}