8 👨‍🏫 Nybble Fähigkeiten beibringen

"Gib einer Katze einen Fisch und du fütterst sie einen Tag lang. Bringt man einer Katze Fischen bei, füttert man sie ein Leben lang." 🎣

8.1. Verstehen von Fähigkeiten der Instinct.h

Ein Frame mit Gelenkwinkeln definiert eine statische Haltung, während eine Reihe von Frames eine periodische Bewegung, in der Regel eine Gangart, definiert.

Das EEPROM hat begrenzte (1.000.000) Schreibzyklen. Daher will ich die Schreiboperationen darauf minimieren.

Es gibt zwei Arten von Fähigkeiten: Instinkt und Newbility. Die Adressen von beiden werden als Nachschlagetabelle in das eingebaute EEPROM(1KB) geschrieben, die eigentlichen Daten werden an verschiedenen Speicherplätzen gespeichert:

  • I2C EEPROM (8KB) speichert Instinkte.

Die Instinkte sind bereits verfeinerte/fixierte Fähigkeiten. Man kann sie mit dem "Muskelgedächtnis" vergleichen. Multiple Instinkte werden nur einmal mit WriteInstinct.ino linear in das I2C EEPROM geschrieben. Ihre Adressen werden während der Laufzeit von WriteInstinct.ino generiert und in der Nachschlagetabelle im Onboard-EEPROM gespeichert.

  • PROGMEM (das den 32KB-Flash mit dem Sketch teilt) speichert Newbility.

Newbility ist eine neue experimentelle Fähigkeit, die viele Tests erfordert. Sie wird weder in das I2C noch in das Onboard-EEPROM geschrieben, sondern in den Flash-Speicher im Format von PROGMEM. Es muss als ein Teil des Sketch von Arduino hochgeladen werden. Seine Adresse wird während der Laufzeit des Codes zugewiesen, obwohl sich der Wert selten ändert, wenn die Gesamtzahl der Fähigkeiten (einschließlich aller Instinkte und Newbility) unverändert bleibt.

8.2. Example Instinct.h

//a short version of Instinct.h as example

#define WalkingDOF 8
#define NUM_SKILLS 6
#define I2C_EEPROM
const char cr[] PROGMEM = { 
26, 0, -5,
 35, 37,-46,-53,-23,-32, -3, 12,
 40, 28,-42,-59,-24,-28, -4, 12,
 ...
 33, 39,-47,-51,-22,-32, -3, 11,
};
const char stair[] PROGMEM = { 
54, 0, 30,
 44, 90,-39,-38, 10,-32,-10, 32,
 45, 90,-32,-46, 16,-38,-16, 38,

 43, 90,-44,-32,  6,-26, -6, 26,
};
const char pu1[] PROGMEM = { 
1, 0, 0,
  0,-30,  0,  0,  0,  0,  0,  0, 20, 20, 60, 60, 60, 60,-55,-55,};
const char pu2[] PROGMEM = { 
1, 0, 0,
  0, 10,  0,  0,  0,  0,  0,  0, 60, 60, 40, 40,-45,-45,-55,-55,};
const char rest[] PROGMEM = { 
1, 0, 0,
-30,-80,-45,  0, -3, -3,  3,  3, 60, 60,-60,-60,-45,-45, 45, 45,};
const char zero[] PROGMEM = { 
1, 0, 0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,};
#if !defined(MAIN_SKETCH) || !defined(I2C_EEPROM)
const char* skillNameWithType[] =
{"crI", "stairN", "pu1I", "pu2I", "restI", "zeroN",};
const char* progmemPointer[] = 
{cr, stair, pu1, pu2, rest, zero, };
#else
const char* progmemPointer[] = {stair, zero};
#endif

8.2.1. Definierte Konstante

define WalkingDOF 8

Bedeutet, dass die Anzahl der DoF (Grad der Freiheit) für das gehen auf Nybble 8 beträgt.

define NUM_SKILLS 6

Die Gesamtzahl der Fertigkeiten 6 beträgt. Anzahl und Listeneinträge sollten übereinstimmen.const char* skillNameWithType[].

define I2C_EEPROM

Bedeutet, dass es ein I2C EEPROM auf dem NyBoard gibt, um Instinkte zu speichern.

Wer eine eigene Platine baut, die kein I2C hat, sollte diese Zeile auskommentieren. Dann werden beide Arten von Fähigkeiten als PROGMEM im Flash gespeichert. Dadurch wird der verfügbare Flash-Speicherplatz für Funktionscodes reduziert. Wenn es zu viele Fähigkeiten gibt, kann es sogar die Größenbegrenzung für das Hochladen des Sketches überschreiten.

8.2.2. Datenstruktur des Fähigkeitsarrays

Betrachtet die folgenden beiden Fähigkeiten:

const char rest[] PROGMEM = { 
1, 0, 0,
-30,-80,-45,  0, -3, -3,  3,  3, 60, 60,-60,-60,-45,-45, 45, 45,};
const char cr[] PROGMEM = { 
26, 0, -5,
 35, 37,-46,-53,-23,-32, -3, 12,
 40, 28,-42,-59,-24,-28, -4, 12,
 ...
 33, 39,-47,-51,-22,-32, -3, 11,
};

Sie werden formatiert als:

Eine Körperhaltung hat nur einen Frame, und ein Gang hat mehr als einen Frame.

8.2.3. Suffix zur Angabe von Instinkt und Newbility

Sie müssen WriteConst.ino hochladen, um die Fähigkeiten zum ersten Mal in das EEPROM zu schreiben. Die folgenden Informationen werden verwendet:

const char* skillNameWithType[] =
{"crI", "stairN", "pu1I", "pu2I", "restI", "zeroN",};
const char* progmemPointer[] = 
{cr, stair, pu1, pu2, rest, zero, };

Man beachte das Suffix I oder N in den Namensketten der Fähigkeiten. Sie teilen dem Programm mit, wo die Skill-Daten gespeichert werden sollen und wann ihre Adressen zugeordnet werden.

Wenn es sich bei dem hochgeladenen Sketch um den Hauptsketch Nybble.ino handelt und Sie ein NyBoard mit I2C-EEPROM verwenden, benötigt das Programm später nur den Verweis auf die Newbility-Liste

const char* progmemPointer[] = {stair, zero};

um das volle können der vordefinierten Fähigkeiten zu extrahieren.

8.3. Neue Fähigkeiten und Verhaltensweisen definieren

8.3.1 Die vorhandene Fähigkeitsvorlage modifizieren

Es gibt bereits eine Fähigkeit Namens "zeroN" in Instinct.h. Es ist eine Haltung im Null-Zustand, die auf eine neue Definition wartet.

Zuerst kann der Befehl mIndex Offset verwendet werden, um einzelne Gelenke an die Zielposition zu bewegen, anschließend können die Gelenkwinkel ( Fettschrift) im Feld auf einmal ersetzt werden:

const char zero[] PROGMEM = { 
1, 0, 0,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,};

Da es als Newbility deklariert ist und nicht in das I2C EEPROM geschrieben werden muss, kann man Nybble.ino jedes Mal hochladen, wenn das Arry verändert wurde (ohne WriteInstinct.ino hochzuladen). Man kann die neue Haltung auslösen, indem 7 auf der IR-Fernbedienung gedrückt wird oder gibt kzero in den seriellen Monitor ein.

Sie können diese Fähigkeit umbenennen, aber nicht vergessen, die Tastaturbelegung der IR-Fernbedienung zu aktualisieren.

8.3.2. Entdecke mehr verborgene Fähigkeiten in Instinct.h

In Instinct.h sind weitere Fähigkeiten versteckt. Sie können vom seriellen Monitor aus mit dem Befehl 'k' aufgerufen werden. Zum Beispiel wird kcd1 Nybble in die Stellung "cd1" bringen, was "check down" bedeutet.

Außerdem können kurze Programme geschrieben werden, um mehrere Fähigkeiten nacheinander auszuführen, wie das "Liegestütz"-Verhalten in Nybble.ino. Wenn man beispielsweise die Körperhaltung "cd1" und "cd2" als Schleifenfolge verbindet, kann man Nybble dazu bringen, sich nach vorne zu lehnen, von links nach rechts und dann von rechts nach links zu schauen.

8.3.3 Automatisierung

Bislang wurde Nybble mit der Infrarot-Fernbedienung gesteuert. Sie treffen Entscheidungen für Nybbles Verhalten.

Nybble kann mit dem Computer oder dem Smartphone verbunden werden, um Anweisungen automatisch zu senden. Nybble wird sein bestes geben, um diese Anweisungen zu befolgen.

Durch das hinzufügen einiger Sensoren (z.B. eines Berührungssensors) oder Kommunikationsmoduls (z.B. eines Sprachsteuerungsmodul) kann Nybble neue Wahrnehmungs- und Entscheidungsfähigkeiten erhalten. Sie können diese automatischen Fähigkeiten zusammenfassen und dafür sorgen, dass Nybble schließlich von alleine lebt!

Last updated