Analog Devices
Ein Framework für moderne Roboteranwendungen
Der ROS1-Treiber für Trinamic-Motorcontroller von Analog Devices ermöglicht die nahtlose Integration intelligenter Aktoren in ROS-gestützte Robotersysteme. Dieser Artikel beschreibt Features, Konfigurationsoptionen und Anwendungsszenarien für den robusten Einsatz in Industrie und Forschung.
Der Artikel stellt einen neuen Treiber für Trinamic Motor Controller (TMC) vor und beschreibt die Integration der Komponenten in ein ROS-Ökosystem (Robot Operating System). Der TMC-ROS1-Treiber ermöglicht eine nahtlose Kommunikation zwischen der Treiberschicht des TMC und der Anwendungsschicht innerhalb des ROS-Frameworks. Diese gilt für die gesamte Palette der vom Treiber unterstützten TMC-Boards. Nachfolgend werden die Fähigkeiten des TMC-ROS1-Treibers eingehend beschrieben, nämlich die Motorsteuerung, das Auslesen von Informationen, die Befehlsausführung, das Auslesen von Parametern und die Unterstützung für unterschiedliche Konfigurationen. Zusätzlich wird ein Überblick darüber gegeben, wie sich die Motorcontroller unter Ausnutzung der vom ROS-Framework gebotenen Vorteile in eingebettete Systeme und Applikationen integrieren lassen.
Der TMC-ROS1-Treiber
ROS ist eine Robotik-Middleware, die aus verschiedenen Software-Bibliotheken und Entwicklertools – von Treibern bis zu Algorithmen – besteht und sich als Basis für die Entwicklung von Robotiksystemen und -applikationen eignet. Die Trinamic Motor Controller von Analog Devices ermöglichen eine neue Klasse intelligenter Aktoren. Der TMC-ROS1-Treiber ‚adi_tmcl‘ ähnelt in seiner Funktionalität der ‚Trinamic Motor Control Language Integrated Development Environment‘ (TMCL-IDE), allerdings mit dem Unterschied, dass er den Knoten eines ROS-fähigen Systems die Möglichkeit zur Nutzung von TMC bietet, ohne dass zusätzliche Treiber installiert werden müssen. Darüber hinaus enthält adi_tmcl einen eigenen TMCL-Protokollinterpreter und kann daher benutzerseitig geforderte Befehle interpretieren, solange diese dem TMCL-Standard entsprechen. Die finale Schicht ‚tmcl_ros_node‘ schließlich richtet eine direkte Schnittstelle zum ROS-System ein und bietet Features wie etwa Publisher, Subscriber und Services. Jede dieser Funktionalitäten kann mit verschiedenen Parametern, auf die in den folgenden Abschnitten detailliert eingegangen wird, individuell angepasst werden.
Unterstützung für unterschiedliche TMC-Boards
Der TMC-ROS-Treiber wurde für die Unterstützung aller kommerziell verfügbaren TMCs konzipiert, die dem TMCL-Protokoll entsprechen. Bei Redaktionsschluss dieses Artikels unterstützt der Treiber nur das CAN-Interface (nämlich SocketCAN), in Zukunft sollen auch andere Schnittstellen unterstützt werden. Bei den besagten TMCs handelt es sich um die ‚ADI Trinamic PANdrive Smart Motors und Module‘, die in Lösungen für Schrittmotoren und BLDC-Motoren (kollektorlose Gleichstrommotoren) unterteilt werden können. Mithilfe von ROS-Parametern kann adi_tmcl nahtlos verschiedene TMC-Boards unterstützen, was die Konfiguration von tmcl_ros_node gestattet, ohne dass das gesamte Paket neu aufgebaut werden muss (Bild 1).
Im Ordner adi_tmcl/config ist jedes ‚ADI Trinamic Motor Controller Module‘ (TMCM) mit zwei Files verknüpft. Diese Dateien sind in der für Menschen lesbaren Datenserialisierungs-Sprache ‚YAML‘ abgefasst, enthalten ROS-Parameter und sollten während der Ausführung geladen werden:
- adi_tmcl/config/autogenerated/TMCM-XXXX.yaml – Diese automatisch generierte YAML-Datei enthält modulspezifische Parameter und sollte nicht verändert werden, da dies Einfluss auf das Verhalten des Knotens haben könnte.
- adi_tmcl/config/TMCM-XXXX_Ext.yaml – In dieser YAML-Datei sind alle Parameter enthalten, die anwenderseitig modifiziert werden können, um mit dem Board zu kommunizieren (z. B. der Schnittstellenname), die Ansteuerung von Motoren zu ermöglichen oder ROS-Topicnamen zu ändern.
Um beispielsweise das ‚TMCM-1636‘ (Bild 2) zu nutzen, muss lediglich mithilfe von $ roslaunch adi_tmcl tmcm_1636.launch gestartet werden. Dabei werden mit adi_tmcl/launch/tmcm_1636.launch die YAML-Files für das TMCM-1636 geladen.
Einmalige Konfiguration von TMC-Modulen mithilfe der TMCL-IDE
Bevor das TMC-Board per ROS verwendet wird, muss es mit den jeweils verwendeten Motoren kalibriert werden. Die gesamte Kalibrierung sollte mit dem TMCL-IDE erfolgen und im EEPROM hinterlegt werden, da die Motoren sonst unter Umständen nicht korrekt angesteuert werden.
Ist die Kalibrierung und Abstimmung erledigt, müssen sämtliche Parameter unbedingt im EEPROM des Boards abgespeichert werden. Dies kann entweder mit dem Store-Parameter, dem STAP-Befehl oder durch Hochladen eines TMCL-Programms und Aktivieren des Autostart-Modus erfolgen. Einige Boards unterstützen nicht alle dieser drei Optionen.
Nachdem TMC und Motor konfiguriert und abgestimmt sind, wurde das Design des TMC-ROS-Treibers vereinfacht, um die Ansteuerung der Motoren auf Basis der Einmal-Konfiguration mit der TMCL-IDE zu ermöglichen.
Bewegen und Anhalten des Motors
Der TMC-ROS-Treiber bewegt bzw. stoppt den Motor durch Publizieren in einem der folgenden Topics:
- /cmd_vel (geometry_msgs/Twist) – Vorgabe der Motorgeschwindigkeit
- /cmd_abspos (std_msgs/Int32) – Vorgabe der absoluten Position des Motors
- /cmd_relpos (std_msgs/Int32) – Vorgabe der relativen Position des Motors
- /cmd_trq (std_msgs/Int32) – Vorgabe des Motordrehmoments
Es sei darauf hinzuweisen, dass in einer TMC-Konfiguration mit mehreren Achsen separate Topics für die einzelnen Motoren existieren.
Anwender können ihre ROS-Systeme zum Publizieren in diesen spezifischen Topics verbinden, um die Bewegung der Motoren zu steuern. Die Wahl der Topics hängt dabei von der Applikation, den TMC-Einstellungen und den verwendeten Motortypen ab. Bei einem fahrbaren Roboter etwa kann anwenderseitig das Einstellen der Geschwindigkeit gewählt werden, während bei einem Greifer das Vorgeben der Position sinnvoller wäre.
Verdeutlichen lässt sich dies am nachfolgend dargestellten Skript adi_tmcl/scripts/fake_cmd_vel.sh, welches das Drehen eines Motors im bzw. gegen den Uhrzeigersinn koordiniert und die Geschwindigkeit schrittweise erhöht. Zur Ausführung dienen die in Bild 3 dargestellten Befehle.
Auslesen von Informationen aus TMC und Motor
Das System kann durch Abonnieren des Topics /tmc_info (adi_tmcl/TmcInfo) Informationen aus dem TMC-ROS-Treiber auslesen. Dabei werden Daten zu Spannung, TMC-Status, Ist-Geschwindigkeit, Ist-Position und Ist-Drehmoment bereitgestellt.
Anwender können ihre ROS-Systeme zum Abonnieren dieser spezifischen Topics verbinden, um die Vorgänge zu überwachen und anhand der Parameterwerte ggf. einzugreifen. In bestimmten Anwendungsszenarien etwa kann das System angehalten werden, wenn Fehler im TMC-Status erkannt werden, oder es kann eine vorprogrammierte Aktion gestartet werden, sobald der Motor eine bestimmte Position erreicht hat. In einer TMC-Konfiguration mit mehreren Achsen existieren für die einzelnen Motoren separate Topics. Exemplarisch zeigt Bild 4 das Auslesen der Ist-Position und der Ist-Geschwindigkeit aus dem TMC (/tmc_info_0).
Ausführung anwenderspezifischer TMC-Befehle
Mit dem Feature tmcl_custom_cmd (adi_tmcl/TmcCustomCmd) besteht die Möglichkeit, auf TMC-Parameter zuzugreifen und diese anzupassen. Damit lassen sich sowohl Werte aus den Achsenparametern (APs) als auch den globalen Parametern (GPs) des TMC gezielt auslesen und einstellen.
Anwender können diesen Service in ihre ROS-Systeme integrieren, um bestimmten Anforderungen der jeweiligen Anwendung gerecht zu werden. Mit dieser Funktionalität lässt sich das TMC-Board direkt aus dem ROS-Treiber heraus konfigurieren. Zum Beispiel kann ein Anwender den Befehl Set Axis Parameter (SAP) für den maximalen Strom verwenden, um den höchstzulässigen Strom festzulegen. Allerdings sollten Anwender die Parameter, die sie mithilfe dieses Features modifizieren, genau kennen, da falsche Werte einen Ausfall des TMC-ROS-Treibers zur Folge haben können.
Zugriff auf die Werte sämtlicher Achsenparameter
Das System kann mit dem Befehl tmcl_gap (adi_tmcl/TmcGapGgpAll) auf die Werte der Achsenparameter (APs) aller TMCs zugreifen. Dabei ist das gezielte Auslesen für bestimmte Motoren bzw. Achsen möglich.
Anwender können ihre ROS-Systeme mit dieser Funktionalität integrieren, um die individuellen Anforderungen ihrer Applikation zu erfüllen. Unter anderem kann dieser Service die aktuellen Einstellungen und den Status des TMC-Boards erfassen, darunter APs wie die Encoderschritte, die PI-Abstimmung, den Kommutierungsmodus usw. (Bild 5).
Zugriff auf alle Global-Parameter-Werte
Der Befehl tmcl_ggp (adi_tmcl/TmcGapGgpAll) ermöglicht den Zugriff auf sämtliche Global-Parameter-Werte (GPs) des TMC, wodurch eine umfassende Abfrage der globalen Konfigurationen realisierbar ist. Diese Funktion erlaubt das Auslesen der aktuellen Konfigurationen und Statuswerte des TMC-Boards. Zu den GPs, die auf diese Weise zugänglich sind, gehören die CAN-Bitrate, die serielle Baudrate, der Autostart-Modus usw.
Konfigurationen mit mehreren TMC-Boards
Für größere Systeme wie zum Beispiel Roboterarme, die mehrere TMC-Boards erfordern, ermöglicht der TMC-ROS-Treiber mehrere Konfigurationen.
- Mehrere TMC-Boards in mehreren CAN-Kanälen: Wenn ein Anwender über ein CAN-USB für jedes TMC-Board verfügt, werden Namespaces hinzugefügt (Bild 6), um die Instanz eines jeden Knotens zu unterscheiden. In diesem besonderen Anwendungsfall muss der Parameter comm_interface_name entsprechend aktualisiert werden, um die korrekte Kommunikation mit dem Board zu gewährleisten.
- Mehrere TMC-Boards in ein und demselben CAN-Kanal: Wie Bild 7 zeigt, wird der Betrieb mehrerer TMC-Boards in ein und demselben CAN-Kanal ebenfalls vom TMC-ROS-Treiber unterstützt. Ebenso wie bei dem beschriebenen Support für mehrere TMC-Boards, wurden auch hier Namespaces eingeführt, um zwischen den verschiedenen Knoteninstanzen unterscheiden zu können. Während comm_interface_name für alle Boards beibehalten wird, werden comm_tx_id und comm_rx_id angepasst, damit die ordnungsgemäße Kommunikation mit jedem Board sichergestellt ist.
In diesen beiden Konfigurationen kann Motor A durch Publizieren an /tmcm1/cmd_abspos angesteuert werden, Motor B durch Publizieren an /tmcm2/cmd_abspos und Motor C durch Publizieren an /tmcm3/cmd_abspos.
Einfache Integration in ROS-Systeme und -Applikationen
Mithilfe des von ROS gebotenen Nachrichtenübertragungssystems ist in größeren Systemen ein problemloser Austausch von Knoten, zum Beispiel Treibern oder Algorithmen, möglich. Mit der Entwicklung des TMC-ROS-Treibers wird dieser Vorteil auch auf TMC-Boards ausgedehnt, sodass eine nahtlose Integration in ROS-Systeme und -Anwendungen möglich ist.
- Integration in AGVs und AMRs: Bild 8 verdeutlicht, wie ein navigation_node einen mobilen Roboter durch Senden von /cmd_vel im Format geometry_msg/Twist steuern kann. Der motor_controller gibt daraufhin eine Rückmeldung über /wheel_velocity im Format geometry_msg/Twist, woraufhin der navigation_node eine entsprechende Neukalibrierung vornehmen kann. Aufgrund der Kenntnis, wo der navigation_node publiziert und abonniert, kann der motor_controller vom tmcl_ros_node problemlos geändert werden. Ähnlich der Funktion zum Auslesen von Informationen aus dem TMC, publiziert adi_tmcl Echtzeitinformationen über die Raddrehzahl, und der wheel_velocity_node transformiert die Raddrehzahl-Information von adi_tmcl/TmcInfo in geometry_msg/Twist. Da sich die neue Architektur und das in sie integrierte TMC-Board an die korrekten Datenformate halten, dürfte der mobile Roboter unverändert funktionieren.
- Integration in Roboterarme: Für die Integration von TMC-Boards in eine Pick-and-Place-Anwendung mit einem Roboterarm illustriert Bild 9, wie mehrere Motoren zum Bewegen des Arms erforderlich sind. Ähnlich wie im zuvor beschriebenen Anwendungsfall, muss anwenderseitig dafür gesorgt werden, dass pick_and_place_node das erwartete Datenformat abonniert bzw. publiziert.
Eine schrittweise Anleitung, wie TMC-Boards in ROS-Systeme integriert werden und wie sich die soeben beschriebenen Features nutzen lassen, finden Sie hier. Weitere Informationen finden Sie ebenfalls im Originalartikel, der mehr Codeabschnitte und ein Beispiel für die Verwendung von Schrittmotor-Modulen enthält.
Der TMC-ROS-Treiber von ADI ermöglicht in einem per ROS gemanagten System die reibungslose Kommunikation zwischen der zugrundeliegenden TMC-Treiberschicht und der Anwendungsschicht. Dieser Vorteil kommt bei einer ganzen Palette unterstützter TMC-Boards zum Tragen.
Die Autorinnen
Krizelle Paulene Apostol ist Software-Systemingenieurin und arbeitet im Philippine Development Center, das zur Sensing, Motion, and Robotics Group von Analog Devices gehört.
Jamila Aria Macagba ist leitende Software-Systemingenieurin im Philippine Development Center, das zur Sensing, Motion, and Robotics Group von Analog Devices gehört.
Maggie Maralit ist als Software Systems Design Engineering Manager im Philippine Development Center, das zur Sensing, Motion, and Robotics Group von Analog Devices gehört.






















