Der "ct-Bot-Weihnachtskalender" - Programmieren lernen am Beispiel ohne Vorkenntnisse

Die Programmierung des c't-Bot
Antworten
anonybot
Friends of Sonny
Friends of Sonny
Beiträge: 180
Registriert: 07 Okt 2015, 00:14

Der "ct-Bot-Weihnachtskalender" - Programmieren lernen am Beispiel ohne Vorkenntnisse

Beitrag von anonybot » 09 Jun 2019, 23:29

Hallo zusammen,

wie im Chat heute kurz besprochen, folgende Idee: Ich habe einen ct-Bot funktionstüchtig aufgebaut, kann aber nicht prgrammieren, finde die entsprechendne heise-Artikel dazu nicht genügend aufschlussreich, um mir selbst zu helfen, will aber nun mit dem Bot auch etwas machen, was dem eigentlichen Sinn des ct-Bot-Projekts näher kommt.

Daher folgende Idee: Ich beschreibe hier sehr kleinteilig, was ich dem Bot "beibringen" will, hoffe auf Antworten, die mir sagen, wie ich die "Schrittchen" zum gewünschten Ziel erreichen kann. Dies selbstverständlich nicht in der Form, dass mir jemand etwas "vorprogrammiert", sondern dahingehend, dass ihr mir helft, punktuell am vorhanden Bot-Code zu verstehen, wie ich ein bestimmtes kleines Planziel umsetzen kann, ohne zwingend dafür das "große Ganze" verstehen zu müssen, also im Sinne kleinkindlichen Spracherwerbs von "einfach" zu "komplex", aber ohne dem "Kleinkind" eine "Grammatik" vorzulegen :wink: - ob das im Sinne des Erfinders ist, mag zweifelhaft sein, aber einen Programmierkurs besuchen werde ich auf absehbare Zeit nicht schaffen und das wird für min. zwei weitere Personen in meinem Freundeskreis auch ein "show stopper", daher dies auch als Experiment, ob wir den klassischen Code niedrigschwelliger einem breiteren Publikum erschließen können.

Aus den (wahrscheinlich sehr) vielen Fragen und Antworten werde ich nach Fertigstellung des Bot-Verhaltens ein Tutorial schreiben, das in die Doku fließt.

Also:

1. Ziele
  • Ein Bot-Verhalten, das einen (eigenwilligen) Adventskalender darstellt. Der Bot fährt dazu in der "Basisversion" auf einer schneckenförmigen schwarzen Linie, die auf ein Tablett, das als Untergrund dient, gezeichnet wird, von einer definierten Startposition aus so lange in eine Richtung, bis er eine von vierundzwanzig Foto-Doses (die "Kalender-Türchen") eingefangen hat, dreht sich um und bringt die Dose zurück zum Startpunkt.
  • In einer zweiten Ausbaustufe könnte man dem Bot über eine Display-Abfrage sagen, wie oft er das Verhalten wiederholen soll, falls man mal einen Tag vergessen hat, eine Kalender-Tür zu öffnen, sodass er am nächsten Tag nacheinander 2 Foto-Dosen zum Ziel bringen soll.
  • In einer komplexeren Ausbaustufe könnte der Bot versuchen, auf die schwarze Leitlinie zu verzichten und die Dosen auf dem Tablett, das durch Wände begrenzt ist, mit Hilfe der Distanzsensoren suchen.
  • Das Verhalten sollte bis Ende November 2019 fertig sein, damit der Weihnachtskalender pünklich einsatzbereit ist. Klingt viel, ist aber wenig Zeit, da ich in den Abschlussprüfen bin und vielleicht auch mal ein paar Wochen nichts machen kann. Dies nur als Vorwarnung und Entschuldigung dafür, dass ich evtl. eine längere Zeit nicht antworte - ich verspreche aber dran zu bleiben. ;)
  • Um meinen guten Willen "dran zu bleiben" zu untermauern, habe ich für die Erstellung der virtuellen Testumgebung bereits (mit eax umfangreicher Hilfe) fehlende Kartenbauelemente ergänzt, die sich zusammen mit allen verfügbaren Elementen übersichtlich geordnet in einem Karten-Template im Develop-Code befindet.
2. Die virtuelle Testumgebung
advent-calendar.png

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE collection SYSTEM "parcours.dtd">

<world>
	<description>
	Teststrecke fuer ctBot/bot-logic/behaviour_advent-calendar.c - ein Parcours, auf dem der Bot 24 Positionen entlang einer Linien-Schnecke abfahren und, stellvertretend fuer die Tuerchen eines Advents- bzw. Weihnachtskalenders, 24 Transportfach-Objekte einsammeln kann.
	</description>

<!-- Autor: anonybotATriseupDOTnet 2018-12-08 CC-BY-SA -->

	<parcours>
		<line>*===*</line>
		<line>#p_q#</line>
		<line>#(T(#</line>
		<line>#(((#</line>
		<line>#(((#</line>
		<line>#(((#</line>
		<line>#(((#</line>
		<line>#(((#</line>
		<line>#(bd#</line>
		<line>#(  #</line>
		<line>#$  #</line>
		<line>*]==*</line>
	</parcours>

<!-- Liste akt. verwendbarer Kartenbauelemente

Alle nachfolgenden Elemente, die mit der Beschreibung "Bodenplatte" beginnen, sind fuer den Bot (je nach eingestelltem Verhalten) passierbar.

ASCII-Zeichen | Beschreibung (Hex-Code des ASCII-Zeichens)
L | Abgrund (4c)
X | Wandblock (58)
= | Wand horizontal (3d)
# | Wand vertikal (23)
* | Saeule mit Lichtquelle (2a)
  | Bodenplatte normal (20)
. | Bodenplatte weisz; definiert, sofern direkt an "Bodenplatte Startfeld ..." angrenzend, die Blickrichtung eines auf die Karte gerufenen Bots (e3)
O | Bodenplatte Startpunkt Default; eigentlich sollte hier jeder aufgerufene Bot starten, sofern keine anderen Startpunkte verwendet werden, akt. jedoch startet hier, wahrscheinlich aufgrund eines Bugs, der dritte (und jeder weitere) aufgerufene Bot (30)
1 | Bodenplatte Startpunkt Bot1; wenn verwendet, startet der erste aufgerufene Bot hier (31)
2 | Bodenplatte Startpunkt Bot2; wenn verwendet, startet der zweite aufgerufene Bot (32)
Z | Bodenplatte Bot-Zielpunkt (5a)
o | Bodenplatte mit Transportfach-Objekt (6f)
l | Bodenplatte mit Bot Positioning System (BPS)-Landmarke (6c)
| | Bodenplatte mit Linie vertikal (7C)
$ | Bodenplatte mit Linie vertikal als Startpunkt Bot1; aktuell leider optisch nicht von "Linie vertikal" zu unterscheiden, weil andere Farb-Definitionen dazu führen, dass die Linie nicht mehr vom Bot erkannt wird (24)
! | Bodenplatte mit Linie vertikal unterbrochen (21)
- | Bodenplatte mit Linie horizontal (2d)
% | Bodenplatte mit Linie horizontal unterbrochen (25)
/ | Bodenplatte mit Linie Ecke NW (2f)
\ | Bodenplatte mit Linie Ecke NE (5c)
+ | Bodenplatte mit Linie Ecke SW (2b)
~ | Bodenplatte mit Linie Ecke SE (7e)
[ | Bodenplatte mit Linie Kreuzung +-Form (5b)
T | Bodenplatte mit Linie Kreuzung T-Form (54)
} | Bodenplatte mit Linie Kreuzung T-Form 90° gegen UZS (7d)
{ | Bodenplatte mit Linie Kreuzung T-Form 90° mit UZS (7b)
] | Bodenplatte mit Linie Kreuzung T-Form kopfstehend (5d)
( | Bodenplatte mit Linie vertikal und Transportfach-Objekt (28)
_ | Bodenplatte mit Linie horizontal und Transportfach-Objekt (5f)
p | Bodenplatte mit Linie Ecke NW und Transportfach-Objekt (70)
q | Bodenplatte mit Linie Ecke NE und Transportfach-Objekt (71)
b | Bodenplatte mit Linie Ecke SW und Transportfach-Objekt (62)
d | Bodenplatte mit Linie Ecke SE und Transportfach-Objekt (64)

ACHTUNG: Die Liste bei Änderungen/Erweiterung in ctSim/model/ParcoursLoader.java und ctSim/develop/documentation/map-parts.md bitte ebenfalls aktualisieren!

Die nachfolgenden optics-Definitionen der Kartenbauelemente folgen der Listen-Reihenfolge. 

Hinweise aus https://www.heise.de/ct/artikel/Genesis-290480.html zu den Farb-Angaben der optics-Definitionen:

Java3D unterscheidet 4 Typen von Farben, laut Artikel:
- type="ambient": Farbe eines indirekt beleuchteten Objekts
- type="diffuse": Farbe von gerichteten Lichtquellen
- type="specular": Farbe von glaenzenden Reflexionen
- type="emmissive": Farbe einer Lichtquelle, bspw. bei "Saeule mit Lichtquelle"

Definiert werden die Farben in HTML-Notation, also bspw. #FFFFFF fuer "weisz".

Wird keine Farbe definiert, verwendet der ParcoursLoader die Java3D-Standards:
- type="ambient": grau
- type="diffuse": weisz
- type="specular": weisz
- type="emmissive": schwarz

Bei bestimmten Kartenbauelementen wie den Bodenplatten mit Linien erzeugen diese Default-Werte ein Glaenzen und sollten daher angepasste Werte (wie unten angegeben) verwenden. -->

	<optics>
		<appearance type="L"> 
			<description>Abgrund</description>
			<color type="ambient">#000000</color>
			<color type="diffuse">#000000</color>
		</appearance>
		<appearance type="X">
			<description>Wandblock</description>
			<texture>textures/rock_wall.jpg</texture>
		</appearance>
		<appearance type="=">
			<description>Wand horizontal</description>
			<clone>X</clone>
		</appearance>
		<appearance type="#">
			<description>Wand vertikal</description>
			<clone>X</clone> 
		</appearance>
		<appearance type="*">
			<description>Saeule mit Lichtquelle</description>
			<color type="emmissive">#FFFF90</color>
		</appearance>
		<appearance type=" "> 
			<description>Bodenplatte normal</description>
			<color type="ambient">#606060</color>
			<color type="diffuse">#606060</color>
		</appearance>
		<appearance type="."> 
			<description>Bodenplatte weisz</description>
			<color type="ambient">#FFFFFF</color>
			<color type="diffuse">#FFFFFF</color>
		</appearance>
		<appearance type="0">
			<description>Startpunkt Default</description>
			<clone>.</clone>
		</appearance>
		<appearance type="1">
			<description>Bodenplatte Start Bot1</description>
			<color type="ambient">#993030</color>
			<color type="diffuse">#993030</color>
		</appearance>
		<appearance type="2">
			<description>Bodenplatte Start Bot2</description>
			<color type="ambient">#000099</color>
			<color type="diffuse">#000099</color>
		</appearance>
		<appearance type="Z"> 
			<description>Bodenplatte Bot-Zielpunkt</description>
			<color type="ambient">#66FF00</color>
			<color type="diffuse">#66FF00</color>
		</appearance>
		<appearance type="o">
			<description>Bodenplatte mit Transportfach-Objekt</description>
			<texture>textures/object.jpg</texture>
			<color>#999999</color>
		</appearance>
		<appearance type="l"> 
			<description>Bodenplatte mit Bot Positioning System (BPS)-Landmarke</description>
			<color type="emmissive">#990000</color>
		</appearance>
		<appearance type="|"> 
			<description>Bodenplatte mit Linie vertikal</description>
			<color type="ambient">#000000</color>
			<color type="diffuse">#000000</color>
			<color type="specular">#000000</color>
			<color type="emmissive">#000000</color>
		</appearance>
		<appearance type="$"> 
			<description>Bodenplatte mit Linie vertikal als Startpunkt Bot1</description>
			<clone>|</clone>
		</appearance>
		<appearance type="!"> 
			<description>Bodenplatte mit Linie vertikal unterbrochen</description>
			<clone>|</clone>
		</appearance>
		<appearance type="-">
			<description>Bodenplatte mit Linie horizontal</description>
			<clone>|</clone>
		</appearance>
		<appearance type="%"> 
			<description>Bodenplatte mit Linie horizontal unterbrochen</description>
			<clone>|</clone>
		</appearance>
		<appearance type="\"> 
			<description>Bodenplatte mit Linie Ecke NE</description>
			<clone>|</clone>
		</appearance>
		<appearance type="/"> 
			<description>Bodenplatte mit Linie Ecke NW</description>
			<clone>|</clone>
		</appearance>
		<appearance type="~"> 
			<description>Bodenplatte mit Linie Ecke SE</description>
			<clone>|</clone>
		</appearance>
		<appearance type="+"> 
			<description>Bodenplatte mit Linie Ecke SW</description>
			<clone>|</clone>
		</appearance>
		<appearance type="["> 
			<description>Bodenplatte mit Linie Kreuzung +-Form</description>
			<clone>|</clone>
		</appearance>
		<appearance type="T"> 
			<description>Bodenplatte mit Linie T-Form</description>
			<clone>|</clone>
		</appearance>
		<appearance type="}"> 
			<description>Bodenplatte mit Linie Kreuzung T-Form 90° gegen UZS</description>
			<clone>|</clone>
		</appearance>
		<appearance type="{"> 
			<description>Bodenplatte mit Linie Kreuzung T-Form 90° mit UZS</description>
			<clone>|</clone>
		</appearance>
		<appearance type="]"> 
			<description>Bodenplatte mit Linie Kreuzung T-Form kopfstehend</description>
			<clone>|</clone>
		</appearance>
		<appearance type="("> 
			<description>Bodenplatte mit Linie vertikal und Transportfach-Objekt</description>
			<clone>|</clone>
		</appearance>
		<appearance type="_"> 
			<description>Bodenplatte mit Linie horizontal und Transportfach-Objekt</description>
			<clone>|</clone>
		</appearance>
		<appearance type="q"> 
			<description>Bodenplatte mit Linie Ecke NE und Transportfach-Objekt</description>
			<clone>|</clone>
		</appearance>
		<appearance type="p"> 
			<description>Bodenplatte mit Linie Ecke NW und Transportfach-Objekt</description>
			<clone>|</clone>
		</appearance>
		<appearance type="d"> 
			<description>Bodenplatte mit Linie Ecke SW und Transportfach-Objekt</description>
			<clone>|</clone>
		</appearance>
		<appearance type="b"> 
			<description>Bodenplatte mit Linie Ecke SE und Transportfach-Objekt</description>
			<clone>|</clone>
		</appearance>
	</optics>
</world>
3. Gedankenskizze zum Code
  • Der Bot startet auf einen kopfstehenden "T", damit die Startposition über Kanten-Sensoren für den Bot erkennbar bleibt (Startposition erreicht = Bot stoppt). Ebenso wird das Ende der "Schnecke" durch ein "T" definiert (das er im Idealfall aber nie erreichen sollte). Mögliches Problem: Ausschließen, dass der Bot mit einem Kanten-Sensor auf dem T-Flügel und der schwarzen Linie gleichzeitig steht und dies fälschlich als Erreichen der Startposition erkennt.
  • Nach dem Aufrufen des Programms dreht der Bot sich um 180°.
  • Der Bot fährt nun so lange auf der schwarzen Linie entlang, bis das Transportfach ein Objekt registriert, woraufhin er stoppt und das Transportfach schließt.
  • Der Bot dreht sich mit der Foto-Dose abermals 180°.
  • Der Bot fährt entlang der schwarzen Linie, bis beide Kanten-Sensoren die Startposition anhand des kopfstehenden "T" erkennen, woraufhin der Bot stoppt und das Transportfach öffnet.
  • Ist beim Programm aufruf etwas im Transportfach, öffnet der Bot die Klappe, fährt ein Stück nach hinten, bis das Transportfach als "leer" erkannt wird, schließt die Klappe und fährt wieder bis zur Startposition vor. Ziel: Im Transportfach vergessene Foto-Dose wird aus dem Startbereich geschoben.
Danke im Voraus für eure Hilfe, nachfolgend formuliere ich separat die erste Fragen.
Zuletzt geändert von anonybot am 15 Jun 2019, 01:13, insgesamt 4-mal geändert.
Von mir selbst verfasste (daher nicht zitierte) Inhalte dieses Beitrags sind zur Weiternutzung unter CC-BY-SA freigegeben +++ ct-Bot -> Libre-Bot? - Diskussion zur Zukunft des ct-Bots +++ anonybot sagt hello!

anonybot
Friends of Sonny
Friends of Sonny
Beiträge: 180
Registriert: 07 Okt 2015, 00:14

Re: Der "ct-Bot-Weihnachtskalender" - Programmieren lernen am Beispiel ohne Vorkenntnisse

Beitrag von anonybot » 09 Jun 2019, 23:31

1. Übersehe ich in der "Gedankenskizze" etwas oder sollte der Ablauf so klappen?

2. Welches Verhalten sollte ich als Vorlage nehmen? Das "fahre im Viereck"-Verhalten (simple) scheint mir wenig Anknüpfungspunkte zu geben, da es, soweit ich verstanden habe, einer "Schleife" folgt. Das von mir geplante Verhalten ist aber in der Grundversion keine, sondern läuft einmal durch und fertig.
Von mir selbst verfasste (daher nicht zitierte) Inhalte dieses Beitrags sind zur Weiternutzung unter CC-BY-SA freigegeben +++ ct-Bot -> Libre-Bot? - Diskussion zur Zukunft des ct-Bots +++ anonybot sagt hello!

eax
Friends of Robby
Friends of Robby
Beiträge: 763
Registriert: 18 Jan 2006, 16:16
Wohnort: Karlsruhe

Re: Der "ct-Bot-Weihnachtskalender" - Programmieren lernen am Beispiel ohne Vorkenntnisse

Beitrag von eax » 15 Jun 2019, 00:59

Zur "Gedankenskizze": Nach dem Stopp und Öffnen des Fachs könnte der Bot noch ein Stück zurück fahren, um die Dose "freizugeben". Hierzu könnte das bot_unload_pillar() Verhalten verwendet werden.
Ansonsten passt das schon mal sehr gut so denke ich.

Zu 2.: Meinst du als "Vorlage" zum Verständnis, wie man ein Verhalten aufbaut, oder als "Template" für den Code des neuen Verhaltens? Für letzteres gibt es behaviour_prototype.c.
Inhaltlich ist das Simple-Verhalten schon geeignet (wenn auch extrem simpel...), die "Schleife" wird ja nur dadurch erzeugt, dass die Zustände alternieren.
Da ergibt sich doch gleich mal eine Einstiegsfrage zum Aufwärmen: was müsste man denn ändern, damit das Verhalten nicht ewig im Quadrat fährt, sondern die vier Seite des Quadrats nur jeweils einmal abfährt und dann abbricht? ;-)

Das was du bauen willst, ähnelt zumindest zum Teil dem Verhalten behaviour_follow_line_enhanced.c, insbesondere, weil dort auch andere Verhalten gestartet werden, bis eine Bedingung erfüllt ist (über den bot_cancel_behaviour() Mechanismus). Das ist sicher auch mal einen Blick wert.
Timo -- Meine Beiträge sind unter CC-BY-SA freigegeben

Antworten