Thymio, Python et Asebamedulla

, par Pierre

Le robot Thymio-II est un robot très facile à utiliser en enseignement de l’informatique. Grâce aux développeurs de Aseba, il est même possible de le contrôler en Python à partir d’une machine GNU/Linux, via D-Bus et l’outil en ligne de commande Asebamedulla. Mais la documentation est pour le moment très succincte au sujet de la gestion des événements. Voici en 50 lignes une démo simple pour qui voudrait s’éviter quelques longues heures de débuggage avec D-Bus.

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import dbus
  5. import dbus.mainloop.glib
  6. import tempfile
  7.  
  8. thymio = "thymio-II"
  9.  
  10. # first we need the network access to Thymio through DBus
  11. dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  12. bus = dbus.SessionBus() # we use session bus (alternative: system bus)
  13. network = dbus.Interface(bus.get_object('ch.epfl.mobots.Aseba', '/'),
  14. dbus_interface='ch.epfl.mobots.AsebaNetwork')
  15.  
  16. """
  17. Event listening
  18.  
  19. the Thymio has to run a code forwarding interesting local events.
  20. Lets write our own aesl source file for that purpose.
  21. """
  22.  
  23. with tempfile.NamedTemporaryFile(suffix='.aesl', delete=False) as aesl:
  24. aesl.write('<!DOCTYPE aesl-source>\n<network>\n')
  25. #declare global events and ...
  26. aesl.write('<event size="0" name="fwd.button.backward"/>\n')
  27. aesl.write('<event size="0" name="become.yellow"/>\n')
  28. aesl.write('<event size="0" name="fwd.timer0"/>\n')
  29. aesl.write('<node nodeId="1" name="'+thymio+'">\n')
  30. #...forward some local events as outgoing global ones
  31. aesl.write('onevent button.backward\n emit fwd.button.backward\n')
  32. aesl.write('onevent timer0\n emit fwd.timer0\n')
  33. # add code to handle incoming events
  34. aesl.write('onevent become.yellow\n call leds.top(31,31,0)\n')
  35. aesl.write('</node>\n')
  36. aesl.write('</network>\n')
  37.  
  38. #load the aesl code into Thymio
  39. network.LoadScripts(aesl.name)
  40. print "%s loaded into Thymio"% aesl.name
  41.  
  42. #Create an event filter and catch events
  43. eventfilter = network.CreateEventFilter()
  44. events = dbus.Interface(
  45. bus.get_object('ch.epfl.mobots.Aseba', eventfilter),
  46. dbus_interface='ch.epfl.mobots.EventFilter')
  47.  
  48. # pushing or releasing the backward button will turn Thymio into yellow
  49. def evt_callback(*args):
  50. if args[1] == "fwd.button.backward":
  51. print "** backward button pressed or released **"
  52. network.SendEventName('become.yellow', [])
  53. elif args[1] == "fwd.timer0":
  54. print 'tick'
  55. else:
  56. print [args]
  57.  
  58. network.SetVariable(thymio, "timer.period", [1000,0])
  59. events.ListenEventName('fwd.timer0') # not required for the first event in aesl file!
  60. events.ListenEventName('fwd.button.backward')
  61. events.connect_to_signal('Event', evt_callback)
  62.  
  63. # Run an event loop
  64. import gobject
  65. loop = gobject.MainLoop()
  66. loop.run()

Télécharger

Revenu et logement, Je livre ici quelques éléments de comparaison concernant mon niveau de vie, pour couper court à quelques idées reçues, et un condensé de nombreuses (...)
Revenu et travail d’un enseignant-chercheur, Cet article complète l'article Revenu et logement, en détaillant un peu le budget de mon ménage, mon parcours d'enseignant-chercheur en terme de (...)
Cybersyn (el systemo synco), Au café, mardi 5 avril 2011, j'ai bien vu que, mis à part Antoine Allombert, personne ne connaissait l'histoire de l'extraordinaire projet chilien (...) [jpg, jpg, png]