Patronen

Leer hoe patronen variatie creëren in StrokeEngine-beweging door trapeziumvormige bewegingsparameters te genereren

Patronen onderscheiden StrokeEngine van andere bewegingssystemen. Elk patroon is een klein programma dat de volgende set trapeziumvormige bewegingsparameters genereert: doelpositie, snelheid en versnelling.

Beschikbare patronen

De OSSM-firmware onthult 7 patronen (indices 0-6): Simple Stroke, Teasing or Pounding, Robo Stroke, Half'n'Half, Deeper, Stop'n'Go en Insist. Jack Hammer en Stroke Nibbler zijn beschikbaar in de StrokeEngine-bibliotheek, maar zijn momenteel niet geïmplementeerd in de OSSM-firmware.

OSSM-patronen (0-6)

Patronen die alleen in de bibliotheek beschikbaar zijn

Deze patronen zijn beschikbaar in de StrokeEngine-bibliotheek, maar zijn momenteel niet geïmplementeerd in de OSSM-firmware. Ze worden hier gedocumenteerd voor ontwikkelaars die aangepaste firmware of andere op StrokeEngine gebaseerde projecten bouwen.

Aangepaste patronen maken

U kunt uw eigen patronen maken door in het header-only bestand pattern.h een subklasse van Pattern te maken.

Maak een subklasse van Pattern

Maak een nieuwe klasse die Pattern uitbreidt. Zie SimpleStroke voor een minimale implementatie:

class SimpleStroke : public Pattern {
    public:
        SimpleStroke(const char *str) : Pattern(str) {}

De constructor slaat de tekenreeks met de weergavenaam van het patroon op.

Overschrijf set-functies indien nodig

Implementeer set-functies opnieuw wanneer u aangepaste berekeningen nodig hebt:

void setTimeOfStroke(float speed = 0) {
    // In & Out have same time, so divide by 2
    _timeOfStroke = 0.5 * speed;
}

Implementeer de nextTarget-functie

Dit is de kernfunctie die StrokeEngine na elke slag aanroept om de volgende bewegingsparameters te verkrijgen.

motionParameter nextTarget(unsigned int index) {
    // Maximum speed of the trapezoidal motion
    _nextMove.speed = int(1.5 * _stroke/_timeOfStroke);

    // Acceleration to meet the profile
    _nextMove.acceleration = int(3.0 * _nextMove.speed/_timeOfStroke);

    // Odd stroke moves out
    if (index % 2) {
        _nextMove.stroke = _depth - _stroke;

    // Even stroke moves in
    } else {
        _nextMove.stroke = _depth;
    }

    _index = index;
    return _nextMove;
}

De parameter index begint bij 0 wanneer het patroon voor het eerst wordt aangeroepen en wordt na elke slag met 1 verhoogd. Gebruik dit om patronen te creëren die in de loop van de tijd variëren.

Voeg foutopsporingsuitvoer toe

Kapsel Serial.print()-instructies in met preprocessor-richtlijnen, zodat ze kunnen worden omgeschakeld:

#ifdef DEBUG_PATTERN
    Serial.println("TimeOfInStroke: " + String(_timeOfInStroke));
    Serial.println("TimeOfOutStroke: " + String(_timeOfOutStroke));
#endif

Registreer het patroon

Voeg een exemplaar van uw patroonklasse toe aan de patternTable[]-array onderaan het bestand:

static Pattern *patternTable[] = {
    new SimpleStroke("Simple Stroke"),
    new TeasingPounding("Teasing or Pounding"),
    new YourNewPattern("Your Pattern Name")  // Add your pattern here
};

Patroonvereisten

Diepte- en slaggrenzen

Patronen moeten slagposities retourneren binnen het interval [0, stroke]. StrokeEngine bewaakt alle geretourneerde motionParameter-waarden en kapt posities buiten [depth - stroke, depth] af om letsel te voorkomen.

Diepte- en slagwaarden die zijn ingesteld in StrokeEngine zijn axiomatische grenzen. Uw patroon definieert het bewegingsbereik dat het binnen deze limieten gebruikt. Dezelfde veiligheidsbeperkingen zijn van toepassing op de snelheid via timeOfStroke.

Soepele parameterwijzigingen

Uw patroon moet parameterwijzigingen correct verwerken. Wanneer de diepte- of slagwaarden tijdens het gebruik veranderen, moet het patroon:

  • te allen tijde binnen het interval [depth, depth - stroke] blijven
  • overdrachtsbewegingen met dezelfde snelheid als normale bewegingen uitvoeren
  • grillig gedrag vermijden

Test uw patroon grondig op parameterwijzigingen, vooral op diepte- en slagwijzigingen waarvoor mogelijk extra slagafstanden nodig zijn.

Met behulp van de indexparameter

De parameter index biedt belangrijke statusinformatie:

  • Wordt teruggezet naar 0 wanneer StrokeEngine.setPattern(int) of StrokeEngine.startMotion() wordt aangeroepen
  • Wordt na elke succesvol uitgevoerde beweging verhoogd
  • Door index == _index te vergelijken wordt bepaald of dit een update van de huidige slag is en geen nieuwe slag

Sla de laatste index op in _index voordat de functie terugkeert, om de slagstatus bij te houden.

Pauzes implementeren

Patronen kunnen pauzes tussen slagen invoegen. Wanneer de doelpositie is bereikt, pollt StrokeEngine om de paar milliseconden op nieuwe bewegingsopdrachten.

Om een pauze te implementeren, retourneert u _nextMove.skip = true vanuit uw nextTarget()-functie. StrokeEngine pollt later opnieuw in plaats van een nieuwe beweging te starten.

De basisklasse Pattern biedt drie hulpfuncties voor pauzebeheer:

FunctieBeschrijving
_startDelay()Start de vertragingstimer
_updateDelay(int delayInMillis)Stelt de pauzeduur in milliseconden in (kan op elk moment worden bijgewerkt)
_isStillDelayed()Retourneert true als de geplande tijd niet is bereikt

Als een slag te laat is, wordt deze onmiddellijk uitgevoerd. Zie het Stop'n'Go-patroon voor een voorbeeldimplementatie.

Patronen bijdragen

Nadat u uw patroon grondig hebt getest, dient u een pull request in met uw bijgewerkte pattern.h-bestand.

Op deze pagina