{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Activité : déplacer un objet à l'aide d'un bras robotisé"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"#####Compétences visées par cette activité :\n",
"*Résoudre un problème par **l'expérimentation**. Comparer l'approche par l'expérimentation avec avec l'approche par **le calcul**.\n",
"Aborder la robotique et la notion de **mouvements dans l'espace**.\n",
"Utiliser des théorèmes de **géométrie** et calculer des **angles**.*\n",
"\n",
"------\n",
"\n",
"#####Lien avec les programmes scolaires, voir : \n",
"Pour le collège : http://www.poppy-prof.fr/?page_id=4&id=63
\n",
"Pour ICN en classe de seconde : http://www.poppy-prof.fr/?page_id=4&id=62"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Instancier le bras que l'on appellera mini_dof :"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from poppy.creatures import Poppy4dofArmMini"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"mini_dof = Poppy4dofArmMini(simulator='vrep')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ajouter un cube a coté du mini_dof :"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [],
"source": [
"io = mini_dof._controllers[0].io\n",
"name = 'cube'\n",
"position = [0, 0, 0] # X, Y, Z\n",
"sizes = [0.07, 0.07, 0.07] # in meters\n",
"mass = 0.01 # in kg\n",
"io.add_cube(name, position, sizes, mass)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"L'objectif est d'éloigner le cube le long de l'axe y.\n",
"L'équipe qui déplace le cube le plus loin gagne !"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Première methode, par tatonnement (essais - erreurs) :"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La liste des moteurs :"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"[,\n",
" ,\n",
" ,\n",
" ]"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mini_dof.motors"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La méthode goto_position qui permet de donner un angle entre 0 et 150 à un moteur :\n",
"\n",
" nom_du_robot.nom_du_moteur.goto_position(angle,durée en seconde)\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Le code ci-dessous devrait être écrit par les élèves\n",
"# la correction est donnée à titre indicatif\n",
"\n",
"\n",
"mini_dof.m3.goto_position(90,2,wait='True')\n",
"\n",
"mini_dof.m1.goto_position(90,3,wait='True')\n",
"\n",
"mini_dof.m1.goto_position(-90,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(125,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(20,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(30,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(-30,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(-40,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(-60,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(30,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(40,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(110,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(50,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(90,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(60,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(70,3,wait='True')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pour obtenir votre score, regardons les coordonnées du cube sur l'axe y :"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"La déplacement du cube sur l'axe y a été de 4.52 cm\n"
]
}
],
"source": [
"d = io.get_object_position('cube')\n",
"dy = d[1]*100\n",
"print \"La déplacement du cube sur l'axe y a été de %.2f cm\" % dy"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"recommencer la simulation :"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"mini_dof.close()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"mini_dof = Poppy4dofArmMini(simulator='vrep')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Seconde méthode, par le calcul :"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Replacer le cube :"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"name = 'cube'\n",
"position = [0, 0, 0] # X, Y, Z\n",
"sizes = [0.07, 0.07, 0.07] # in meters\n",
"mass = 0.001 # in kg\n",
"io.add_cube(name, position, sizes, mass)"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"Analyser la figure suivante pour trouver directement les angles de départ des moteurs (notez bien que les bras du robot forment un triangle équilatéral) :"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
""
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Le code ci-dessous devrait être écrit par les élèves\n",
"# la correction est donnée à titre indicatif\n",
"\n",
"mini_dof.m1.goto_position(-90,4)\n",
"\n",
"mini_dof.m2.goto_position(30,3,)\n",
"mini_dof.m3.goto_position(120,3,)\n",
"mini_dof.m4.goto_position(-60,3,wait='True')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Calculer les angles finaux pour éloigner au maximum le cube :"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# Le code ci-dessous devrait être écrit par les élèves\n",
"# la correction est donnée à titre indicatif\n",
"\n",
"mini_dof.m2.goto_position(90,3,)\n",
"mini_dof.m3.goto_position(0,3,)\n",
"mini_dof.m4.goto_position(0,3,wait='True')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Pour obtenir votre score, regardons les coordonnées du cube sur l'axe y :"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"La déplacement du cube sur l'axe y a été de 8.16 cm\n"
]
}
],
"source": [
"d = io.get_object_position('cube')\n",
"dy = (d[1])*100\n",
"print \"La déplacement du cube sur l'axe y a été de %.2f cm\" % dy"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"mini_dof.close()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"##Expérimentations appliquées sur le robot réel"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Maintenant, vous pouvez mettre en oeuvre vos programmes sur un véritable mini_dof. Attention, il faut placer le cube à 10cm du bord du support."
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"mini_dof=Poppy4dofArmMini()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Positionner le robot dans la position de départ, tous les moteurs à zéro."
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"for m in mini_dof.motors :\n",
" m.compliant=False\n",
" m.goto_position(0,2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Veillez à bien placer le robot par rapport au cube. C'est à dire dans le même sens que dans le simulateur, avec le cube à 10 cm du bord du support du robot. Il faut également veiller à ce que le support soit immobilisé pour ne pas basculer."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Vous pouvez ensuite recopier le code qui fonctionné dans le simulateur pour le tester avec le vrai robot."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Le code de la méthode par tatonnement :"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Le code ci-dessous devrait être écrit par les élèves\n",
"# la correction est donnée à titre indicatif\n",
"\n",
"\n",
"mini_dof.m3.goto_position(90,2,wait='True')\n",
"\n",
"mini_dof.m1.goto_position(90,3,wait='True')\n",
"\n",
"mini_dof.m1.goto_position(-90,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(125,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(20,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(30,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(-30,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(-40,3,wait='True')\n",
"\n",
"mini_dof.m4.goto_position(-60,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(30,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(40,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(110,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(50,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(90,3,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(60,3,wait='True')\n",
"\n",
"mini_dof.m3.goto_position(70,3,wait='True')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Mesurer le déplacement du cube et comparez-le avec l'éloignement obtenu lors de la simulation."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Remettez le robot en position de départ :"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"for m in mini_dof.motors :\n",
" m.goto_position(0,2)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"N'oubliez pas de replacer le cube !"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Maintenant avec les angles calculés :"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"# Le code ci-dessous devrait être écrit par les élèves\n",
"# la correction est donnée à titre indicatif\n",
"\n",
"\n",
"\n",
"mini_dof.m2.goto_position(30,3,)\n",
"mini_dof.m3.goto_position(120,3,)\n",
"mini_dof.m4.goto_position(-60,3)\n",
"mini_dof.m1.goto_position(-90,4,wait='True')\n",
"\n",
"mini_dof.m2.goto_position(90,3,)\n",
"mini_dof.m3.goto_position(0,3,)\n",
"mini_dof.m4.goto_position(0,3,wait='True')"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"mini_dof.close()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.9"
}
},
"nbformat": 4,
"nbformat_minor": 0
}