lehrkraefte:blc:informatik:glf20:robotik:motorenkontrolle

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:glf20:robotik:motorenkontrolle [2021/04/26 09:46]
Ivo Blöchliger [Sauber anfahren und bremsen]
lehrkraefte:blc:informatik:glf20:robotik:motorenkontrolle [2021/05/03 09:15] (current)
Ivo Blöchliger [Steuerung der Motoren]
Line 25: Line 25:
 robot.exit()                  # Programm korrekt beenden robot.exit()                  # Programm korrekt beenden
 </code> </code>
 +{{:lehrkraefte:blc:informatik:glf20:robotik:pasted:20210503-091521.png?320}}
 </WRAP> </WRAP>
  
Line 144: Line 145:
 gear.setSpeed(mySpeed) gear.setSpeed(mySpeed)
 gear.forward() gear.forward()
-while gear.resetLeftMotorCount()<einMeter:+while gear.getLeftMotorCount()<einMeter:
    pass # Tu einfach nix    pass # Tu einfach nix
 gear.stop() gear.stop()
Line 152: Line 153:
   * Die Geschwindigkeit soll auf den ersten 10cm langsam auf ''myspeed'' hochgefahren werden.   * Die Geschwindigkeit soll auf den ersten 10cm langsam auf ''myspeed'' hochgefahren werden.
   * Finden Sie dazu eine lineare Funktion $v(d)=m \cdot d + q$, die zur Distanz $d$ (in Grad = ''gear.getLeftMotorCount()'') die Geschwindkeit $v$ berechnet, und zwar so dass für $d=0$ der Wert $v=5$ herauskommt und für das $d$, das der Distanz 10 cm entspricht, soll der Wert der Variablen ''mySpeed'' herauskommen.   * Finden Sie dazu eine lineare Funktion $v(d)=m \cdot d + q$, die zur Distanz $d$ (in Grad = ''gear.getLeftMotorCount()'') die Geschwindkeit $v$ berechnet, und zwar so dass für $d=0$ der Wert $v=5$ herauskommt und für das $d$, das der Distanz 10 cm entspricht, soll der Wert der Variablen ''mySpeed'' herauskommen.
-  * Setzen mit dieser Funktion in der while-Schlaufe die Geschwindigkeit, wenn ''gear.getLeftMotorCount()'' kleiner als 10 cm ist (Masseinheiten beachten).+  * Setzen mit dieser Funktion in der while-Schlaufe die Geschwindigkeit, wenn ''gear.getLeftMotorCount()'' kleiner als 40 cm ist (Masseinheiten beachten). Setzen Sie die berechnete Geschwindigkeit in die int-Funktion, z.B. ''gear.setSpeed(int(meinegeschwindigkeit))''.
   * Testen Sie Ihren Code.   * Testen Sie Ihren Code.
-  * Machen Sie das umgekehrt Gleiche am Ende auf den letzten 10 cm+  * Machen Sie das umgekehrt Gleiche am Ende auf den letzten 40 cm 
 + 
 +**Zusatz für Mathematik-Begeisterte**: Die Beschleunigung (Änderung der Geschwindigkeit pro Zeit) ist mit der obigen Methode nicht linear. Welcher Typ Funktion müsste $v(s)$ sein, damit die Beschleunigung konstant wäre ($s$ ist hier die zurückgelegte Strecke)? 
 +<hidden Lösungsansatz> 
 +Bei konstanter Beschleunigung $a$ sehen ist $v(t)=a\cdot t$ und $s(t) = \frac{1}{2}a\cdot t^2$. Wir nehmen der Einfachheit halber an, dass $v(0)=0$ und $s(0)=0$. Ansonsten verkomplizieren sich die Formeln etwas, das Ergebnis ist aber qualitativ das gleiche. 
 + 
 +Aus $s(t)=\frac{1}{2}a\cdot t^2$ erhält man $t=\sqrt{\frac{2s}{a}}$, eingesetzt in $v(t)$ erhält man $v(s) = a \cdot \sqrt{\frac{2s}{a}} = \sqrt{2s \cdot a}$. 
 + 
 +D.h. $v(s)$ müsste eine Wurzelfunktion sein (und nicht eine lineare Funktion). 
 +</hidden>
 </WRAP> </WRAP>
  
Line 167: Line 177:
   * Intervall verschieben: Bestimmen eine Verschiebung (Funktion $f_4(x)$) so, dass $f_4(0)=c$.   * Intervall verschieben: Bestimmen eine Verschiebung (Funktion $f_4(x)$) so, dass $f_4(0)=c$.
   * Die gesuchte Funktion ist $f(x) = f_4(f_3(f_2(f_1(x))))$.   * Die gesuchte Funktion ist $f(x) = f_4(f_3(f_2(f_1(x))))$.
 +
 +{{lehrkraefte:blc:informatik:glf20:robotik:2021-04-30-note-11-44.pdf|Notizen 2pG als pdf}}
 +
 +{{lehrkraefte:blc:informatik:glf20:robotik:2021-05-03-note-09-00.pdf|Notizen 2aLM als pdf}}
  
 Programmieren Sie diese Funktion nun in Python: Programmieren Sie diese Funktion nun in Python:
Line 179: Line 193:
 <code python> <code python>
 if gear.getLeftMotorCount()<zehncm: if gear.getLeftMotorCount()<zehncm:
-    gear.setSpeed(linear(0,zehncm, 5, myspeed, gear.getLeftMotorCount()))+    gear.setSpeed(int(linear(0,zehncm, 5, myspeed, gear.getLeftMotorCount())))
 </code> </code>
-  * Bauen Sie die Funktion ''linear(a,b,c,d,x)'' in Ihr Programm ein, so dass der Roboter auf den ersten 10 cm sauber anfährt und auf den letzten 10 cm wieder bremst.+ 
 +<hidden Lösungsvorschlag> 
 +<code python> 
 +def linear(a,b,c,d,x): 
 +    return (x-a)/(b-a)*(d-c)+c   
 + 
 + 
 +einMeter = 100/0.048  # Die korrekte Anzahl Grad für 1 m  ausrechnen und eintragen! 
 +anfahren = 0.4*einMeter  # Strecke bis wohin beschleunigt wird 
 +bremsen = 0.6*einMeter   # Strecke ab der gebremst wird 
 +gear.resetLeftMotorCount()   # Strecke auf 0 Grad setzen 
 +mySpeed = 60   # Egal welche Geschwindigkeit 
 + 
 +while gear.getLeftMotorCount()<einMeter: 
 +    if gear.getLeftMotorCount()<anfahren: 
 +        v = linear(0,anfahren, 5, mySpeed, gear.getLeftMotorCount()) # Formel mit gear.getLeftMotorCount() 
 +        print(int(v)) 
 +        gear.setSpeed(int(v)) 
 +        gear.forward() 
 + 
 +</code> 
 +</hidden> 
 +  * Bauen Sie die Funktion ''linear(a,b,c,d,x)'' in Ihr Programm ein, so dass der Roboter auf den ersten 40 cm sauber anfährt und auf den letzten 40 cm wieder bremst.
   * Programieren Sie eine Funktion ''fahrgut(distanz)'', die den Roboter die ''distanz'' geradeaus fahren lässt, wobei auf den ersten 10 cm sauber anfahren und auf den lezten 10 cm wieder sauber bremst.   * Programieren Sie eine Funktion ''fahrgut(distanz)'', die den Roboter die ''distanz'' geradeaus fahren lässt, wobei auf den ersten 10 cm sauber anfahren und auf den lezten 10 cm wieder sauber bremst.
 <code python> <code python>
Line 191: Line 227:
 fahrgut(50)  # 0.5 m sauber fahren. fahrgut(50)  # 0.5 m sauber fahren.
 </code> </code>
 +
 +**Zusatz für Mathematik-Begeisterte**
 +  * Bestimmen Sie $v(s)$ für die gleichmässig beschleunigte Bewegung mit $v(t)=at+v_0$ ($v_0>0$ ist die Anfangsgeschwindigkeit) und $s(t)=\frac{1}{2}at^2+v_0t$, wobei $a$ so gewählt werden soll, dass $v(s_1)=v_1$, wobei $s_1$ die Strecke sein soll, auf der die Beschleunigung stattfindet und $v_1$ die Geschwindigkeit am Ende der Strecke.
 +
 +<hidden Lösung>
 +$$ 
 +s(t)=\frac{1}{2}at^2+v_0t \quad \Leftrightarrow \quad t = \frac{-v_0 + \sqrt{v_0^2+2as}}{a}
 +$$
 +Die negative Lösung wird hier verworfen, weil wir nur an der positiven Zeit interessiert sind.
 +Eingesetzt in $v(t)$ erhält man
 +$$
 +v(s) = \sqrt{v_0^2+2as}
 +$$
 +Löst man $v(s_1)=v_1$ nach $a$ auf erhält man
 +$$
 +a = \frac{v_1^2-v_0^2}{2s_1}
 +$$
 +und damit die gesuchte Funktion
 +$$
 +v(s) = \sqrt{v_0^2 + \frac{v_1^2-v_0^2}{s_1} \cdot s}
 +$$
 +
 +Diese kann nun in Python programmiert werden:
 +<code python>
 +# Anfangsgeschwindigkeit, Endgeschwindigkeit, Gesamtstrecke, aktuelle Strecke
 +def vs(v0, v1, s1, s):
 +  return (v0*v0 + (v1*v1-v0*v0)/s1*s)**0.5
 +</code>
 +</hidden>
 </WRAP> </WRAP>
  • lehrkraefte/blc/informatik/glf20/robotik/motorenkontrolle.1619423162.txt.gz
  • Last modified: 2021/04/26 09:46
  • by Ivo Blöchliger