1. Einführung

Eine Reihe von Kinematikmodulen unterstützt die Umschaltung von Kinematikberechnungen. Diese Module unterstützen eine Standard-Kinematikmethode (Typ0), eine zweite eingebaute Methode (Typ1) und (optional) eine vom Benutzer bereitgestellte Kinematikmethode (Typ2). Für die Typ1-Methode wird in der Regel die Identitätskinematik verwendet.

Die Switchkins-Funktionalität kann für Maschinen verwendet werden, bei denen eine Steuerung der Gelenke nach der Referenzfahrt während des Einrichtens erforderlich ist oder um Bewegungen in der Nähe von Singularitäten aus dem G-Code zu vermeiden. Solche Maschinen verwenden für die meisten Vorgänge spezifische Kinematikberechnungen, können aber für die Steuerung einzelner Gelenke nach der Referenzfahrt auf Identitätskinematik umgestellt werden.

Die Auswahl des Kinematik-Typs erfolgt über einen Motion-Modul-HAL-Pin, der über ein G-Code-Programm oder über interaktive MDI-Befehle aktualisiert werden kann. Die halui-Bestimmungen für die Aktivierung von MDI-Befehlen können verwendet werden, um die Auswahl des Kinematik-Typs über Hardware-Steuerungen oder ein virtuelles Panel (PyVCP, GladeVCP, etc.) zu ermöglichen.

Wenn eine Kinematik Typ geändert wird, muss der G-Code auch Befehle zu zwingen Synchronisation des Interpreters und Bewegung Teile von LinuxCNC. Typischerweise wird ein HAL-Pin read Befehl (M66 E0 L0) unmittelbar nach der Änderung des steuernden HAL-Pins verwendet, um die Synchronisation zu erzwingen.

2. Schaltbare Kinematik-Module

Die folgenden Kinematikmodule unterstützen umschaltbare Kinematiken:

  1. xyzac-trt-kins (type0:xyzac-trt-kins type1:identity)

  2. xyzbc-trt-kins (type0:xyzbc-trt-kins type1:identity)

  3. genhexkins (type0:genhexkins type1:identity)

  4. genserkins (type0:genserkins type1:identity) (puma560 example)

  5. pumakins (type0:pumakins type1:identity)

  6. scarakins (type0:scarakins type1:identity)

  7. 5axiskins (type0:5axiskins type1:identity) (bridgemill)

Die xyz[ab]c-trt-kins-Module verwenden aus Gründen der Abwärtskompatibilität standardmäßig type0==xyz[ab]c-trt-kins. Die mitgelieferten sim-Konfigurationen ändern die Typ0/Typ1-Konvention, indem sie Typ0==Identitätskinematik erzwingen, indem sie den Modul-String-Parameter "sparm" mit einer INI-Datei-Einstellung wie folgt verwenden:

[KINS]
KINEMATICS = xyzac-trt-kins sparm=identityfirst
...

2.1. Identitätsbrief-Zuweisungen

Bei Verwendung eines identischen Kinematiktyps kann der Modulparameter Koordinaten verwendet werden, um den Gelenken Buchstaben in beliebiger Reihenfolge aus der Menge der zulässigen Koordinatenbuchstaben zuzuweisen. Beispiele:

[KINS]
JOINTS = 6

# konventionelle Identitätsanordnung: joint0==x, joint1==y, ...
KINEMATICS = genhexkins coordinates=xyzabc

# custom identity ordering: joint0==c, joint1==b, ...
KINEMATICS = genhexkins coordinates=cbazyx
Anmerkung
Wenn der Parameter coordinates= weggelassen wird, lauten die Standard-Zuordnungen der Gelenkbuchstaben joint0==x,joint1=y,….

Die Gelenkzuweisungen für Identitäts-Kinematiken bei Verwendung des Koordinatenparameters sind identisch mit denen für das Modul trivkins. Die Duplizierung von Achsenbuchstaben zur Zuweisung mehrerer Gelenke für einen Koordinatenbuchstaben ist jedoch im Allgemeinen nicht für serielle oder parallele Kinematiken (wie genserkins, pumakins, genhexkins usw.) geeignet, bei denen es keine einfache Beziehung zwischen Gelenken und Koordinaten gibt.

Die Duplizierung von Achskoordinatenbuchstaben wird in den Kinematikmodulen xyzac-trt-kins, xyzbc-trt-kins und 5axiskins (bridgemill) unterstützt. Typische Anwendungen für doppelte Koordinaten sind Gantry-Maschinen, bei denen zwei Motoren (Gelenke) für die Querachse verwendet werden.

2.2. Rückwärtskompatibilität

Schaltbare Kinematiken werden mit motion.switchkins-type==0 initialisiert und implementieren ihre gleichnamige Kinematikmethode. Wenn der motion.switchkins-type-Pin nicht angeschlossen ist - wie in Legacy-Konfigurationen - ist nur der Standard-Kinematik-Typ verfügbar.

3. HAL-Pins

Die Umschaltung der Kinematik wird durch den Motion-Modul-Eingang HAL pin motion.switchkins-type gesteuert. Der Fließkommawert des Pins wird in eine Ganzzahl umgewandelt und zur Auswahl eines der angebotenen Kinematik-Typen verwendet. Der Startwert Null wählt den Standard-Kinematiktyp Typ0.

Anmerkung
Der Eingangspin motion.switchkins-type ist ein Fließkomma-Eingangspin, um den Anschluss an die Ausgangspins des Motion-Moduls wie motion.analog-out-0n zu erleichtern, die von Standard M-Codes (typischerweise M68EnL0) gesteuert werden können.

Es sind Ausgangs-HAL-Pins vorgesehen, um GUIs über den aktuellen Kinematik-Typ zu informieren. Diese Pins können auch mit digitalen Eingängen verbunden werden, die von G-Code-Programmen gelesen werden, um das Programmverhalten entsprechend dem aktiven Kinematik-Typ zu aktivieren oder zu deaktivieren.

3.1. HAL Pin Zusammenfassung

  1. motion.switchkins-type Input (float)

  2. kinstype.is-0 Output (bit)

  3. kinstype.is-1 Output (bit)

  4. kinstype.is-2 Output (bit)

4. Anwendung

4.1. HAL-Verbindungen

Die Switchkins-Funktionalität wird durch den Pin motion.switchkins-type aktiviert. Normalerweise wird dieser Pin von einem analogen Ausgangspin wie motion.analog-out-03 gespeist, so dass er durch M68-Befehle gesetzt werden kann. Beispiel:

net :kinstype-select <= motion.analog-out-03
net :kinstype-select => motion.switchkins-type

4.2. G-/M-Code-Befehle

Die Auswahl des Kinstype wird verwaltet über G-Code-Sequenzen wie:

...
M68 E3 Q1 ;analog-out-03 aktualisieren, um Kinstype 1 auszuwählen
M66 E0 L0 ;Sync Interp-Bewegung
...
... ;Benutzer G-Code
...
M68 E3 Q0 ;analog-out-03 aktualisieren, um Kinstype 0 zu wählen
M66 E0 L0 ;Sync Interp-Bewegung
...
Anmerkung
Ein M66-Befehl wait-on-input aktualisiert die Variable #5399. Wenn der aktuelle Wert dieser Variablen für spätere Zwecke benötigt wird, sollte er vor dem Aufruf von M66 in eine zusätzliche Variable kopiert werden.

Diese G-Code-Befehlssequenzen werden in der Regel in G-Code-Unterprogrammen als remapped M-codes oder mit herkömmlichen M-code-Skripten implementiert.

Vorgeschlagene Codes (wie in den Sim-Konfigurationen verwendet) sind:

Herkömmliche Benutzer-M-Codes:

  1. M128 Kintyp 0 auswählen (Standardkinematik beim Start)

  2. M129 Kintyp 1 auswählen (typischerweise Identitätskinematik)

  3. M130 Kinstype 2 auswählen (benutzerdefinierte Kinematik)

Neu zugeordnete M-Codes:

  1. M428 Kintyp 0 auswählen (Standardkinematik beim Start)

  2. M429 Kinstype 1 auswählen (typischerweise Identitätskinematik)

  3. M430 Kinstype 2 auswählen (benutzerdefinierte Kinematik)

Anmerkung
Herkömmliche Benutzer-M-Codes (im Bereich M100-M199) gehören zur Modalgruppe 10. Neu zugeordnete M-Codes (im Bereich M200 bis M999) können eine Modalgruppe angeben. Weitere Informationen finden Sie in der Remap-Dokumentation.

4.3. INI-Datei Limit Einstellungen

LinuxCNC Bahnplanung verwendet Grenzen für die Position (min, max), Geschwindigkeit und Beschleunigung für jede anwendbare Koordinaten-Buchstaben in der Konfiguration INI-Datei angegeben. Beispiel für den Buchstaben L (im Satz XYZABCUVW):

[AXIS_L]
MIN_LIMIT =
MAX_LIMIT =
MAX_VELOCITY =
MIN_ACCELERATION =

Die angegebenen INI-Datei-Grenzwerte gelten für die Standardkinematik vom Typ 0, die beim Start aktiviert wird. Beim Umschalten auf eine andere Kinematik sind diese Grenzen möglicherweise nicht anwendbar. Da jedoch beim Umschalten der Kinematik eine Synchronisierung zwischen Interpreter und Bewegung erforderlich ist, können INI-HAL-Pins verwendet werden, um Grenzwerte für einen anstehenden Kinematik-Typ festzulegen.

Anmerkung
INI-HAL-Pins werden während eines G-Code-Programms normalerweise nicht erkannt, es sei denn, es wird einw Synchronisations (der sogenannte Queue-Buster, engl. für "wartende Befehle Zerstörer") ausgegeben. Weitere Informationen hierzu finden Sie in der milltask-Manpage ($ man milltask)

Die für eine gemeinsame Nummer (N) relevanten INI-HAL-Pins sind:

ini.N.min_limit
ini.N.max_limit
ini.N.max_acceleration
ini.N.max_velocity

Die für eine Achsenkoordinate (L) relevanten INI-HAL Pins sind:

ini.L.min_limit
ini.L.max_limit
ini.L.max_velocity
ini.L.max_acceleration
Anmerkung
Im Allgemeinen gibt es keine festen Zuordnungen zwischen Gelenknummern und Achsenkoordinatenbuchstaben. Für einige Kinematikmodule, insbesondere solche, die Identitätskinematik implementieren (trivkins), kann es spezifische Zuordnungen geben. Weitere Informationen finden Sie in der kins man page ($ man kins)

Ein vom Benutzer bereitgestellter M-code kann eine oder alle der Achsenkoordinaten Grenzen vor der Änderung der motion.switchkins-type Pin und die Synchronisierung der Interpreter und Motion-Teile von LinuxCNC ändern. Als Beispiel kann ein Bash-Skript, das halcmd aufruft, "hardcoded" werden, um eine beliebige Anzahl von HAL-Pins zu setzen:

#!/bin/bash
halcmd -f <<EOF
setp ini.x.min_limit -100
setp ini.x.max_limit  100
# ... repeat for other limit parameters
EOF

Skripte wie dieses können als Benutzer-M-Code aufgerufen und vor dem Kinstype-Switching-Mcode verwendet werden, der den motion.switchkins-type HAL Pin aktualisiert und einen Interp-Motion-Sync erzwingt. Normalerweise würden für jeden Kinstype (0,1,2) separate Skripte verwendet werden.

Wenn Identitätskinematiken als Mittel zur Steuerung einzelner Gelenke vorgesehen sind, kann es sinnvoll sein, die in der System-INI-Datei angegebenen Grenzwerte festzulegen oder wiederherzustellen. Ein Beispiel: Ein Roboter startet nach der Referenzfahrt mit einer komplexen (nicht identischen) Kinematik (Typ 0). Das System ist so konfiguriert, dass es auf eine Identitätskinematik (Typ1) umgeschaltet werden kann, um einzelne Gelenke mit den herkömmlichen Buchstaben aus dem Satz XYZABCUVW zu manipulieren. Die Einstellungen in der INI-Datei ([AXIS_L]) sind beim Betrieb mit Identitätskinematik (Typ1) nicht anwendbar. Um diesem Anwendungsfall gerecht zu werden, können die Benutzer-M-code-Skripte wie folgt gestaltet werden:

M129 (Umschalten auf Identitätstyp1)

  1. INI-Datei lesen und auswerten ("parsen")

  2. hal: setzt die INI-HAL Grenzstifte für jeden Achsenbuchstaben ([AXIS_L]) entsprechend der identitätsbezogenen Gelenknummer INI-Datei ([JOINT_N])

  3. HAL: setp motion.switchkins-type 1

  4. MDI: Ausführen eines Synchronisations-G-Codes (M66E0L0)

M128 (Wiederherstellung der Standardkinematik des Roboters, Typ 0)

  1. INI-Datei lesen und auswerten ("parsen")

  2. HAl: Setzen der INI-HAL Limit Pins für jeden Achsenbuchstaben ([AXIS_L]) entsprechend der entsprechenden INI-Datei Einstellung ([AXIS_L])

  3. HAL: setp motion.switchkins-type 0

  4. MDI: Ausführen eines Synchronisations-G-Codes (M66E0L0)

Anmerkung
Die Vismach-Simulationskonfigurationen für einen Puma-Roboter demonstrieren die M-Code-Skripte (M128, M129, M130) für diesen Beispielanwendungsfall.

4.4. Überlegungen zum Offset

Wie die Limit Einstellungen in der INI-Datei gelten auch die Koordinatensystem-Offsets (G92, G10L2, G10L20, G43 usw.) im Allgemeinen nur für die Standard-Startkinematik vom Typ 0. Beim Wechsel des Kinematik-Typs kann es wichtig sein, entweder alle Offsets vor dem Wechsel zurückzusetzen oder die Offsets entsprechend den systemspezifischen Anforderungen zu aktualisieren.

5. Simulationskonfigurationen

Simulationskonfigurationen (die keine Hardware erfordern) werden mit illustrativen Vismach-Anzeigen in Unterverzeichnissen von configs/sim/axis/vismach/ bereitgestellt.

  1. 5axis/table-rotary-tilting/xyzac-trt.ini (xyzac-trt-kins)

  2. 5axis/table-rotary-tilting/xyzbc-trt.ini (xyzac-trt-kins)

  3. 5axis/bridgemill/5axis.ini (5axiskins)

  4. scara/scara.ini (scarakins)

  5. puma/puma560.ini (genserkins)

  6. puma/puma.ini (pumakins)

  7. hexapod-sim/hexapod.ini (genhexkins)

6. Kinematische Bestimmungen des Benutzers

Benutzerdefinierte Kinematiken können auf Run-In-Place ("RIP") Builds kodiert und getestet werden. Eine Vorlagendatei src/emc/kinematics/userkfuncs.c ist in der Distribution enthalten. Diese Datei kann in ein Benutzerverzeichnis kopiert/umbenannt und bearbeitet werden, um benutzerdefinierte Kinematik mit kinstype==2 bereitzustellen.

Die benutzerdefinierte Kinematikdatei kann bei rt-preempt-Implementierungen aus den Out-of-Tree-Quellen kompiliert werden oder bei rtai-Systemen durch Ersetzen der In-Tree-Vorlagendatei (src/emc/kinematics/userkfuncs.c).

Preempt-rt make Beispiel:

$ userkfuncs=/home/myname/kins/mykins.c make && sudo make setuid

7. Warnungen

Unerwartetes Verhalten kann auftreten, wenn ein G-Code-Programm versehentlich mit einem inkompatiblen Kinematik-Typ gestartet wird. Unerwünschtes Verhalten kann in G-Code-Programmen umgangen werden, indem:

  1. Anschluss geeigneter kinstype.is.N HAL-Pins an digitale Eingangspins (wie motion.digital-in-0m).

  2. Auslesen des digitalen Eingangspins (M66 E0 Pm) beim Start des G-Code-Programms

  3. Abbruch (M2) des G-Code-Programms mit einer Meldung (DEBUG, problem_message), wenn der Kintyp nicht geeignet ist.

Bei der interaktiven Verwendung von Jogging-Einrichtungen oder MDI-Befehlen ist Vorsicht geboten. Leitfäden sollten Anzeigen enthalten, die den aktuellen Kinematik-Typ anzeigen.

Anmerkung
Die Umstellung auf eine andere Kinematik kann erhebliche betriebliche Veränderungen mit sich bringen, die eine sorgfältige Planung, Prüfung und Schulung für den Einsatz erfordern. Die Verwaltung von Koordinatenversatz, Werkzeugkompensation und INI-Datei Limits kann komplizierte und nicht standardisierte Betriebsprotokolle erfordern.

8. Code Anmerkungen

Kinematikmodule, die switchkins-Funktionen bereitstellen, sind mit dem Objekt switchkins.o (switchkins.c) verknüpft, welches das Hauptprogramm des Moduls (rtapi_app_main()) und zugehörige Funktionen bereitstellt. Dieses Hauptprogramm liest die (optionalen) Kommandozeilenparameter des Moduls (Koordinaten, sparm) und übergibt sie an die vom Modul bereitgestellte Funktion switchkinsSetup().

Die Funktion switchkinsSetup() identifiziert die kinstype-spezifischen Setup-Routinen und die Funktionen für die Vorwärts- und Rückwärtsberechnung für jeden Kinstype (0,1,2) und setzt eine Reihe von Konfigurationseinstellungen.

Nach dem Aufruf von switchkinsSetup() prüft rtapi_app_main() die übergebenen Parameter, erstellt eine HAL Komponente und ruft dann die für jeden Kinstype (0,1,2) identifizierte Setup-Routine auf.

Jede Kinstype (0,1,2) Setup-Routine kann (optional) HAL Pins erzeugen und auf Standardwerte setzen. Wenn alle Setup-Routinen abgeschlossen sind, gibt rtapi_app_main() hal_ready() für die Komponente aus, um die Erstellung des Moduls abzuschließen.