Home / LinuxUser / 2003 / 09 / Linux Robotics

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

Agent 00L – Liebesgrüße aus Helsinki

Linux Robotics

Im Vorwärtsmarsch zurück

Nachdem ich mein Programm vor_u_zurueck.nqc in den Spybot geladen und gestartet hatte fuhr dieser zunächst einmal rückwärts (statt vorwärts) und änderte dann nach drei Sekunden seine Richtung. Dieses ist kein Fehler im Programm, sondern einfach konstruktionsbedingt. Das Zahnrad setzt direkt am Motor einmal um auf die großen Zahnräder meines Gigamesh G60 (Agentenfoto 6), weswegen in allen Programmen vorwärts und rückwärts vertauscht programmiert werden müssten, wenn NQC dafür nicht den Befehl SetGlobalDirection() hätte. Mit dem Parameter OUT_REV werden alle Kommandos umgekehrt. Weitere Bewegungsbefehle für den Spybot finden Sie in Kasten 2.

Abbildung 5

Abbildung 5: Umsetzung in Richtung rückwärts

Kasten 2: NQC-Bewegungsbefehle

OUT_A     // rechter Motor
OUT_B     // linker Motor
OUT_V     // Laser
outputs   // ein +-Kombination aus
          // OUT_A, OUT_B und OUT_C (soweit sinnvoll)
On(outputs)          // An
Off(outputs)         // Aus
Fload(outputs)       // Auslaufen lassen
Fwd(outputs)         // Vorwärts
Rev(outputs)         // Rückwärts
Toggle(outputs)      // Richtungswechsel
OnFwd(outputs)       // = On()+Fwd()
OnRev(outputs)       // = On()+Rev()
OnFor(outputs, time) // 100time = 1Sekunde
SetOutput(outputs, mode)
  // mode aus OUT_OFF, OUT_ON, OUT_FLOAT
SetDirection(outputs, direction)
  // direction aus OUT_FWD, OUT_REV, OUT_TOGGLE
SetPower(outputs, power)
  // power aus 0 bis 7 setzt die Geschwindigkeit
x=OutputStatus(n)
  // gibt den Status zurück
SetGlobalOutput(outputs, mode)
  // mode aus OUT_ON, OUT_OFF   Schaltet die generelle
  // Kontrollmöglichkeit von Befehlen der Ausgänge ein oder aus.
SetGlobalDirection(outputs, direction)
  // direction aus OUT_FWD, OUT_REV, OUT_TOGGLE
  // Kehrt alle Befehle um oder setzt wieder auf norm oder wechselt
  // Wichtiger Befehl für den Gigamesh G60
SetMaxPower(outputs, max_power)
  // max_power aus OUT_LOW, OUT_HALF, OUT_FULL
  // Setzt die generelle Höchstgeschwindigkeit der Motoren
x=GlobalOutputStatus(n)
  // gibt generellen Status zurück

Hierarchie

Neben den Tasks gibt es noch Unterprogramme (sub()) und Inline-Funktionen (void()). Der Vorteil von Inline-Funktionen ist, dass man ihnen Parameter übergeben kann – sowohl über call by value als auch über call by reference. NQC-Programme kennen nur integer-Variablen. Agenten-Listing 2 zeigt eine typische Inline-Funktion: Sie wird mit ihrem Namen aufgerufen (zwei_drei();) und darf mit dem Befehl return; vorzeitig beendet und wieder verlassen werden. Als Alternative bietet NQC Unterprogramme, von denen insgesamt 32 pro Programm definiert werden dürfen. Auch wenn an diese keine Parameter übergeben werden können, haben sie den Vorteil, dass sie nur einmal im Speicher vorhanden sind und von mehreren Aufrufern geteilt werden dürfen. Unterprogramme können keine weiteren Unterprogramme aufrufen.

Es dürfen 32 globale und vier lokale Variablen deklariert werden, weshalb diese so lokal wie möglich deklariert werden sollten. Variablen können mit den gleichen Operatoren verknüpft werden, wie man dies von integer-Variablen aus C-Programmen kennt: +, -, *, /, % (mod), abs(), sign(), ++, --, ~ (bitweise Negation), ! (Negation), >>, <<, ==, !=, & (bitweises und), ^ (bitweises XOR), (bitweises oder), && (AND), (OR), >, <, >= und <=.

Die Anzahl der Tasks ist bei einem Spybotics-Programm auf acht begrenzt. Die Tasks laufen parallel, d. h. im Gegensatz zum Aufruf eines Unterprogramms wartet der Aufrufer nicht bis auf dessen Ende, sondern läuft weiter. Auf diese Weise lassen sich mit NQC echte Multitasking-Programme schreiben. Kasten 3 zeigt die einzelnen Task-Befehle.

Agenten-

: Eine NQC-Inline-Funktion

void zwei_drei(int value_var, int &reference_var)
{
  value_var=2;      // value_var behält ihren Wert nur bis zum Ende
  reference_var=3;  // der Wert 3 ist auch nach Aufruf noch vorhanden
}

Kasten 3: Task-Befehle

start taskname;     // startet einen Task
stop taskname;      // stop einen Task
StopAllTasks();     // stoppt alle Tasks

Für meinen Auftrag mit dem Spybot ist natürlich besonders interessant, dass er mit Sensoren ausgestattet ist. Mein Agentenprogramm soll je nach Status des Sensors bestimmte Aktionen koordinieren. Da ist zunächst einmal der Drucksensor, der in NQC über SENSOR_1 angesprochen wird. er Drucksensor wird normalerweise so eingestellt, dass er boolsche Werte, also 0 (Zustand "nicht gedrückt" und 1 (Zustand "gedrückt"), zurückgibt. NQC bezeichnet dies als SENSOR_MODE_BOOL. Ein Lichtsensor () SENSOR_2 gibt prozentuale Werte zurück (0 bis 100) und wird in NQC als SENSOR_MODE_PERCENT beschrieben. Außerdem kennt NQC noch SENSOR_MODE_RAW für den Spybot – es handelt sich um die interne Darstellung im Robotor für den Sensor (zurückgegeben wird ein Wert zwischen 0 und 1024). Die Statusabfrage eines Sensors erfolgt über eine Variablenzuweisung, z. B. x=SENSOR_1, aber auch eine Abfrage, wie z. B. if(SENSOR_1==1), gibt Auskunft darüber, ob der Sensor gedrückt ist. Kasten 4 enthält eine Liste aller Sensorbefehle.

Kasten 4: Sensorbefehle

sensor  // SENSOR_1 oder SENSOR_2n       // 0,1 für SENSOR_1 oder SENSOR_2mode    // SENSOR_MODE_BOOL, SENSOR_MODE_PERCENT, SENSOR_MODE_RAW
SetSensorMode(sensor,mode) // Setzt den Modus für Sensoren
ClearSensor(sensor)        // Nur sinnvoll bei Sensoren, die Impulse oder
  // Umdrehungen zählen und wieder zurückgesetzt werden sollen
SensorValue(n)             // x=SensorValue(0) entspricht x=SENSOR_1
SensorMode(n)              // gibt den Modus zurück
SensorValueRaw(n)          // gibt den internen Sensorwert zurück
Tip a friend    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 102 Punkte (9 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...