Thymio amplitude angle non constante Beebot


#1

Bonjour à tout le monde,

J’essaie de réutiliser le code de @cbarraud pour utiliser Thymio comme un beebot (autrement dit, pouvoir lui donner une série d’instructions de déplacement à suivre comme par exemple “forward”, “left”, …) en m’inspirant du code donné ici : https://www.thymio.org/creations-fr:calibration-en-position-et-en-orientation

Pourtant, après calibration, quand le nombre d’instructions dépasse 3, l’amplitude des angles augmente…

Par exemple, si je fais FORWARD, LEFT, FORWARD, je vais avec un beau L avec un angle de 90°.
Si je fais un carré par contre (FORWARD, LEFT, FORWARD, LEFT, FORWARD, LEFT, FORWARD), j’ai plutôt des angles de 60°.

Ma question est : à quoi est-ce du ?

J’ai pourtant réussi à faire un exemple simplifié qui fonctionne bien.

Merci,

Olivier


#2

Bonjour,
Je vais tester le problème, mais déjà, en utilisant les états n’est-il pas possible de réinitialiser le premier L du robot, en lui faisant faire le second en changeant d’état ?
A tester ?


#3

Bonjour,

Vous avez utilisez le code qui se trouve sur cette page ?
https://www.thymio.org/creations-fr:comportement-type-bee-bot

Ou vous l’avez fait vous-même en partant de la calibration sur cette page ?
https://www.thymio.org/creations-fr:calibration-en-position-et-en-orientation

Si vous me donnez votre code ici, je pourrai jeter un oeil et voir si je trouve un petit soucis.

Christophe


#4

Bonjour,

En fait initialement j’avais essayé avec un fichier Thool_code_Thymio_labyrinthe.aesl (dont le commentaire de début parle du 29 juin 2015).

J’ai essayé avec beebot-like.aesl mais le code semble similaire et le même défaut a été observé.

Voici un code qui fonctionne pour stocker plus de trois mouvements (pas via les boutons flèches à la beebot mais directement dans le fichier).

var instructions[7]
var index
var counter


index = 0
instructions[0] = 0 # FORWARD
instructions[1] = 1 # LEFT
instructions[2] = 0
instructions[3] = 1
instructions[4] = 0
instructions[5] = 1
instructions[6] = 0
timer.period[0] = 1
counter = 0



sub next_instruction
	if index < 7 then
		if instructions[index] == 0 then
			callsub forward
		else
			callsub turn_left
		end
		index = index + 1
	else
		motor.left.target = 0
		motor.right.target = 0
	end

sub forward
	motor.left.target = 200
	motor.right.target = 200


sub turn_left
	motor.left.target = -200
	motor.right.target = 200


onevent timer0
	if counter >= 1210 then # valeur de calibration hardcodée
		motor.left.target = 0
		motor.right.target = 0
		counter = 0
		callsub next_instruction
	end
	counter = counter + 1

#5

Mais donc pour répondre, il code est bien beebot-like.aesl.
steps to reproduce :

  • Faire la calibration
  • entrer en mode TYPING (bouton central)
  • Donner plus que trois instructions par exemple (FORWARD, LEFT, FORWARD, LEFT, FORWARD, LEFT, FORWARD)
  • Passer en mode START (bouton central)

Thymio ne tourne pas de 90° comme attendu mais de plus.

Olivier


#6

Bonjour @ogoletti et @Albidochon

Nous avons trouvé l’origine de ce petit soucis. J’avais écrit le bout de code suivant dans le timer qui tourne à 1ms:

if i==0 then
	call leds.circle(0,0,0,0,0,0,0,0)
end
if i > 0 then
	call leds.circle((i*256)/TABLE_SIZE,0,0,0,0,0,0,0)
end
if i > TABLE_SIZE/8 then
	call leds.circle(31,(i*256)/TABLE_SIZE,0,0,0,0,0,0)
end
if i > TABLE_SIZE/4 then
	call leds.circle(31,31,(i*256)/TABLE_SIZE,0,0,0,0,0)
end
if i > (3*TABLE_SIZE)/8 then
	call leds.circle(31,31,31,(i*256)/TABLE_SIZE,0,0,0,0)
end	
if i > TABLE_SIZE/2 then
	call leds.circle(31,31,31,31,(i*256)/TABLE_SIZE,0,0,0)
end	
if i > (5*TABLE_SIZE)/8 then
	call leds.circle(31,31,31,31,31,(i*256)/TABLE_SIZE,0,0)
end	
if i > (6*TABLE_SIZE)/8 then
	call leds.circle(31,31,31,31,31,31,(i*256)/TABLE_SIZE,0)
end	
if i > (7*TABLE_SIZE)/8 then
	call leds.circle(31,31,31,31,31,31,31,(i*256)/TABLE_SIZE)
end	

or les opérations suivantes:
(i*256)/TABLE_SIZE
ou encore celles qui ressemblent à
(7*TABLE_SIZE)/8

prennent beaucoup de temps. J’aurais dû:

  1. Utiliser des fonctions math d’Aseba typiquement call multdiv( … )
  2. Ne pas mettre ce truc dans la boucle du timer à 1ms car il calcul donc ça tout le temps alors que le calculer une seule fois suffit largement

J’ai donc réécrit ce code pour faire ça. Voilà le nouveau programme qui du coup ne fait pas cet effet de décalage dès qu’on saisit plus de 3 commandes. J’en ai profité pour enlever des calculs redondants en créant quelques variables de plus (notamment time_straight_25cm et time_turn_90)

https://aseba.wdfiles.com/local--files/file:beebot-like-2018/beebot-like-2018.zip

En espérant que ça serve !

Bon week-end.


#7

Super!

Un tout grand merci pour avoir trouvé l’origine du problème. Je suis certain que ça reviendra en textuel.
Merci pour l’explication et la nouvelle version.

Olivier