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/28 08:40]
Ivo Blöchliger [Intervall umrechnen, ein für alle mal]
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 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.1619592024.txt.gz
  • Last modified: 2021/04/28 08:40
  • by Ivo Blöchliger