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
Last revision Both sides next revision
lehrkraefte:blc:informatik:glf20:robotik:motorenkontrolle [2021/04/28 08:40]
Ivo Blöchliger [Intervall umrechnen, ein für alle mal]
lehrkraefte:blc:informatik:glf20:robotik:motorenkontrolle [2021/05/03 09:15]
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}}
 </WRAP> </WRAP>
  
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)? **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)?
Line 160: Line 161:
 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. 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}$.+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). D.h. $v(s)$ müsste eine Wurzelfunktion sein (und nicht eine lineare Funktion).
Line 176: 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 188: 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 204: Line 231:
   * 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.   * 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.txt
  • Last modified: 2021/05/03 09:15
  • by Ivo Blöchliger