Extension Shield Kalibrierung

Hallo zusammen,
ich habe mich in der letzten Zeit mit dem Extension Shield beschäftigt. Dabei ist mir aufgefallen, dass die in der Software angegebenen Winkel nicht mit dem tatsächlichen Drehwinkel der Motoren übereinstimmt. Nach einer kurzen Recherche bin ich zum Schluss gekommen, dass die verschiedenen Motoren unterschiedliche PWM-Signale erwarten. Außerdem haben unsere Motoren jeweils eine unterschiedliche Range of Motion. Müsste man diesen Wert nicht auch anpassen, damit die Servos korrekt funktionieren?

Gibt es eine Möglichkeit, das Extension Shield auf die Bedürfnisse der verschiedenen Servos zu kalibrieren?

Viele Grüße
Stefan

Hallo Stefan,

soweit ich mich erinnere, habe ich die Frequenz für die Servoansteuerung auf einen festen Wert eingestellt. Die möglichen Pulsbreiten stellt man mit einem Byte pro Kanal zwischen 0 und 250 ein (ein paar Werte habe ich reserviert). Ich muss nochmal nachsehen, aber ich glaube, dass nur Impulse zwischen 500 und 2500us eingestellt werden können. Den entsprechenden Winkel muss man sich dann ausrechnen. Ich ziehe das in der Dokumentation auf github nach (edu_drive_ros2). Schreibe mir gerne, welche Einstellmöglichkeiten Du brauchst.

Viele Grüße

Stefan May

Hallo Herr May,

Wir haben zwei verschiedene Servotypen im Einsatz. Die einen erwarten Impulse zwischen 500 und 2500us und haben eine Range of Motion von 300° und wären auch für uns am wichtigsten. Die anderen erwarten Impulse zwischen 1000 und 2000us mit einer Range of Motion von 180°.

Viele Grüße
Stefan

Hallo Stefan,

diese beiden sollten doch betrieben werden können, wenn man den Wertebereich genau kennt. Ich rechne mal aus, welche Integerwerte Impulsen von 500us, 1000us, 2000us und 2500us entsprechen. Dann kann man die Ansteuerung auf ROS-Ebene anpassen und dort eine Konfigurationsmethode einbauen. Willst Du die Winkelstellung in Grad angeben? Wie definiert man die Endlagen? Wir sollten auch Grenzen setzen können, die nicht unter- oder überschritten werden (Kollisionsschutz).

Viele Grüße

Stefan May

Hallo Herr May,

ich würde die Winkelstellung gerne in Grad angeben. Ich denke, dass man für jeden Servo die Endlagen bzw. die Pulse Width Range und die Range of Motion definieren muss. Dadurch kann man den passenden Impuls bzw. den Integerwert berechnen. Vielleicht könnte der Kollisionsschutz als einfache if-Bedingung umgesetzt werden, die sicherstellt, dass nur Winkel innerhalb eines definierten Bereichs zugelassen werden.

Viele Grüße
Stefan

Hallo Stefan,

bist Du am Freitag Nachmittag beim Workshop dabei? Wir können das uns gerne ansehen. Ich denke, das ist keine große Sache. Die Lösung integrieren wir dann in edu_drive_ros2.

Viele Grüße

Stefan May

Hallo zusammen,

vorausgeschickt: ich habe das Extension Board bisher nur einmal kurz zum Testen in Betrieb genommen, kenne mich damit also noch nicht so richtig aus. Wir haben bei unserem Roboter gerade noch andere Baustellen :smiley:

Mir gefällt aber, was ihr euch da überlegt habt, und ich würde passend dazu folgende Konfigurationserweiterung (für YAML-Datei mit den Parametern) vorschlagen:

ros__parameters:

/* … */

servos: 2
  servo0:
    pulse_width_min_percent: 2.5
    pulse_width_max_percent: 12.5
    degree_min: 0
    degree_max: 180
    initial_pos: 90

  servo1:
    pulse_width_min_percent: 5
    pulse_width_max_percent: 10
    degree_min: 0
    degree_max: 60
    initial_pos: 0

Mit so einer Konfiguration hätte man (wie von Stefan schon vorgeschlagen) einzelne Servos wo nötig künstlich einschränken. Nicht konfigurierte Servos bleiben “aus”, erhalten also vermutlich wie bisher den ungültigen Wert 275.

Dass ich da Prozent und nicht ms genutzt habe ist Absicht, denn die 0,5-2,5ms gelten nur bei den üblichen und vermutlich aktuell benutzten 50 Hz. Das bedeutet, dass 50x pro Sekunde ein Puls gesendet wird, somit entsprechen 20ms 100%. Möchte man die Frequenz ändern (was unüblich ist, keine Sorge), sollte die Pulsweite mitwachsen. Darum ist eine Angabe in Prozent sinnvoller. Der erste Servo in dem Beispiel (servo0) würde also Werte von 2,5% (0,5ms sind 2,5% von 20ms) bis 12,5% (2,5ms) erlauben, der zweite von 5% (1ms) bis 10% (2ms).

Der Bereich für die Bandbreite an erlaubten Grad sollte für den Servo (und die Software) irrelevant sein, die Bedienung aber einfacher machen. Zu implementieren wäre ein Mapping von Bereich zu Bereich, fertig. Werte kleiner degree_min werden zu degree_min, größer degree_max wird zu degree_max. Vorsicht, negative Zahlen sollten dabei berücksichtigt werden! Dann kann sich jemand auch -90 bis 90 Grad konfigurieren, wenn er das einfacher findet.

EduDrive::joyCallback enthält aktuell Logik, welche für zwei Servos abhängig vom Joystick bestimmte Werte sendet. Falls das von irgendwem benutzt wird, müsste man sich dafür einen Migrationspfad überlegen, um betroffenen Projekten nicht ihre Logik zu zerstören.

Vielleicht sollte man EduDrive eine weitere Subscription spendieren, über die man dann eine Liste mit gewünschten Grad-Werten reinkippen kann, also z.B. [45, 10, 12, 4]. Das hätte den Vorteil, dass es Einsteigern mit relativ wenig Aufwand ermöglichen würde, bestimmte Posen zu senden.

Nachteil: die vorgeschlagene Logik widerspricht mit ziemlicher Sicherheit der Denkweise hinter ROS2 Moveit Servo. Das lässt sich vielleicht im Nachgang mit einer Komponente lösen, die an einem Movit-freundlichen velocity-getriebenen Topic “hört”, und dann übersetzte Werte ins EduDrive-“Servo-Grade”-Topic feuert. Da rate ich aber nur ins Blaue rein, habe mir das noch nicht näher angeschaut. Sollte man aber vielleicht machen, bevor wir hier eine Schnittstelle in Stein meißeln :wink:

LG
Thomas

Hallo Zusammen,

ich bin am Freitag dabei und würde mich freuen, wenn wir das ganze dann angehen würden. Ich denke, dass wir dann auch Thomas Vorschläge beachten können.

Viele Grüße
Stefan