Smartdrive#

Einführung#

The smartdrive class controls how a robot drives and turns using motors, wheels, and a sensor. A smartdrive can use a connected Gyro Sensor or the Brain’s built-in Inertial Sensor.

A smartdrive uses the sensor to help the robot move and turn precisely. At the start of each project, the drivetrain calibrates the sensor automatically. Keep the robot still for about 2 seconds during calibration, so the robot can move and turn correctly.

Die Klasse smartdrive basiert auf der Klasse drivetrain. Sie kann die gleichen Antriebs- und Drehfunktionen wie drivetrain verwenden und fügt außerdem sensorbasierte Funktionen wie turnToHeading und turnToRotation hinzu.

Diese Seite verwendet myDrivetrain als Beispielnamen für das SmartDrive. Ersetzen Sie diesen bei Bedarf durch Ihren eigenen Namen.

Klassenkonstruktoren#

1 — Erstellt einen Smartdrive unter Verwendung von motor_group Objekten für die linke und rechte Seite sowie eines Gyrosensors oder Inertialsensors.

smartdrive(
    motor_group     &l,
    motor_group     &r,
    gyro            &g,
    double          wheelTravel = 320,
    double          trackWidth  = 320,
    double          wheelBase   = 130,
    distanceUnits   unit = mm,
    double          externalGearRatio = 1.0 );

2 — Erstellt einen Smartdrive unter Verwendung vorhandener motor Objekte für die linke und rechte Seite sowie eines Gyrosensors oder Inertialsensors.

smartdrive(
    motor           &l,
    motor           &r,
    gyro            &g,
    double          wheelTravel = 320,
    double          trackWidth  = 320,
    double          wheelBase   = 130,
    distanceUnits   unit = mm,
    double          externalGearRatio = 1.0 );

Klassendestruktor#

Destroys the smartdrive object and releases associated resources.

~smartdrive();

Parameter#

Der Sensorparameter kann ein gyro oder inertial Objekt sein.

Parameter

Typ

Beschreibung

&l / &r

motor_group / motor

The left and right motors or motor groups. Both parameters must use the same type: either two motor_group objects or two motor objects.

&g

gyro / inertial

Der vom Smartdrive verwendete Gyrosensor oder Inertialsensor.

wheelTravel

double

Der Umfang der Antriebsräder. Der Standardwert ist 320.

trackWidth

double

Der Abstand zwischen dem linken und rechten Rad. Der Standardwert ist 320.

wheelBase

double

Der Abstand zwischen Vorder- und Hinterrädern. Der Standardwert ist 130.

unit

distanceUnits

Die Einheit für wheelTravel, trackWidthund wheelBase: mm (Standard) oder inches.

externalGearRatio

double

Das Übersetzungsverhältnis, das zur Anpassung der Antriebsdistanzen verwendet wird, falls Zahnräder zum Einsatz kommen. Der Standardwert ist 1.0.

Beispiel#

/* This constructor is required when using VS Code.
Drivetrain configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */

// Create the left and right motor objects.
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the Inertial Sensor object.
inertial myInertial = inertial(PORT3);

// Create the smartdrive object.
smartdrive myDrivetrain = smartdrive(
    leftMotor,  // left motor
    rightMotor, // right motor
    myInertial, // Inertial Sensor
    259.34,     // wheelTravel
    320,        // trackWidth
    40,         // wheelBase
    mm,         // unit
    1.0 );      // externalGearRatio

Mitgliedsfunktionen#

Die Klasse smartdrive umfasst die folgenden Memberfunktionen:

Aktionen – Den Roboter durch Kursänderung oder Drehung steuern.

  • turnToHeading — Dreht den Roboter in eine bestimmte Richtung zwischen -359 und 359 Grad. Der Roboter wählt dabei den kürzesten Weg, um die Zielrichtung zu erreichen.

  • turnToRotation — Dreht den Roboter auf eine bestimmte Rotation.

  • calibrateDrivetrain — Kalibriert den mit dem Smartdrive konfigurierten Sensor.

Einstellungen – Ausrichtung und Drehung anpassen.

  • setHeading — Ändert die aktuelle Richtung des Roboters in eine neue Richtung.

  • setRotation — Ändert die aktuelle Rotation des Roboters in eine neue Rotation.

Werte – Überschrift und Drehung prüfen.

  • heading — Gibt die aktuelle Richtung des Roboters von 0 bis 359 Grad zurück.

  • rotation — Gibt die aktuelle Rotation des Roboters zurück.

Ein smartdrive kann auch die geerbten Memberfunktionen von drivetrain verwenden, wie z. B. drive, driveFor, turn, turnFor, stop, isDone, und isMoving.

Bevor smartdrive Memberfunktionen aufgerufen werden können, muss ein smartdrive Objekt erstellt werden.

/* This constructor is required when using VS Code.
Drivetrain configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */

// Create the left and right motor objects.
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the Inertial Sensor object.
inertial myInertial = inertial(PORT3);

// Create the smartdrive object.
smartdrive myDrivetrain = smartdrive(
    leftMotor,  // left motor
    rightMotor, // right motor
    myInertial, // Inertial Sensor
    259.34,     // wheelTravel
    320,        // trackWidth
    40,         // wheelBase
    mm,         // unit
    1.0 );      // externalGearRatio

turnToHeading#

Die Ausrichtung des Roboters wird in Grad gemessen. Der Befehl turnToHeading bewirkt, dass der Roboter in eine bestimmte Richtung zwischen -359 und 359 Grad ausgerichtet wird. Dabei wählt er den kürzesten Weg, um die Zielausrichtung zu erreichen.

Die Ausgangsrichtung des Roboters beträgt 0 Grad.

Das Projekt wartet, bis der Roboter seine Drehung abgeschlossen hat, bevor die nächste Codezeile ausgeführt wird.

Available Functions

1 — Dreht den Roboter mit der aktuellen Drehgeschwindigkeit in die angegebene Richtung.

bool turnToHeading(
    double        angle,
    rotationUnits units,
    bool          waitForCompletion = true );

2 — Dreht den Roboter in die angegebene Richtung mit der angegebenen Geschwindigkeit.

bool turnToHeading(
    double        angle,
    rotationUnits units,
    double        velocity,
    velocityUnits units_v,
    bool          waitForCompletion = true );

Parameters

Parameter

Typ

Beschreibung

angle

double

Die Richtung, in die der Roboter zeigen soll, in Grad. Dieser Wert kann zwischen -359 und 359 liegen, wenn deg oder degrees verwendet werden.

units

rotationUnits

Die Einheit für die Kursangabe: deg (Grad), rev (Umdrehungen) oder raw (Roheinheiten). Eine Umdrehung entspricht 360 Grad.

velocity

double

Die Drehgeschwindigkeit variiert zwischen 0 % und 100 % bei Verwendung velocityUnits::pct, zwischen 0 und 120 U/min bei Verwendung rpmoder zwischen 0 und 720 Grad pro Sekunde bei Verwendung dps. Wird keine Geschwindigkeit angegeben, dreht sich der Roboter mit der aktuellen Drehgeschwindigkeit.

units_v

velocityUnits

Die Geschwindigkeitseinheit: velocityUnits::pct (Prozent), rpm (Umdrehungen pro Minute) oder dps (Grad pro Sekunde).

waitForCompletion

bool

true (Standard) bewirkt, dass das Projekt wartet, bis der Roboter seine Drehung abgeschlossen hat, bevor die nächste Codezeile ausgeführt wird. false bewirkt, dass die nächste Codezeile sofort ausgeführt wird.

Return Values

Gibt als booleschen Wert zurück, ob der Roboter die Zielrichtung erreicht hat.

  • true — Der Roboter hat die Zielrichtung erreicht.

  • false — Der Roboter hat die Drehung nicht beendet, oder die Funktion kehrte zurück, bevor die Drehung abgeschlossen war, weil waitForCompletion auf false gesetzt war.

Notes
  • Die Ausführung einer anderen Antriebsbewegungsfunktion, während turnToHeading ausgeführt wird, unterbricht die aktuelle Bewegung.

  • turnToHeading verwendet eine Zielrichtung, daher können isDone und isMoving damit verwendet werden.

Examples
// Face the new 0 degrees.
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);

turnToRotation#

turnToRotation dreht den Roboter in eine bestimmte Rotationsrichtung.

Die Rotation gibt an, wie weit sich der Roboter gedreht hat, gemessen in Grad oder Umdrehungen. Zu Beginn eines Projekts ist der Rotationswert auf 0 Grad eingestellt. Die Rotation kann auch mit der Funktion setRotation festgelegt werden.

Die Rotationswerte sind absolut. Das bedeutet, die Drehrichtung hängt von der aktuellen Rotation des Roboters ab. Eine Rechtsdrehung erhöht die Rotation, eine Linksdrehung verringert sie.

Wenn der Roboter beispielsweise bei 0 Grad startet und Sie ihn um 720 Grad drehen, dreht er sich zweimal nach rechts. Drehen Sie ihn anschließend um 360 Grad, dreht er sich einmal nach links, da 360 kleiner als 720 ist.

Das Projekt wartet, bis der Roboter seine Drehung abgeschlossen hat, bevor die nächste Codezeile ausgeführt wird.

Available Functions

1 — Dreht den Roboter mit der aktuellen Drehgeschwindigkeit in die angegebene Richtung.

bool turnToRotation(
    double        angle,
    rotationUnits units,
    bool          waitForCompletion = true );

2 — Dreht den Roboter in die angegebene Rotation mit der angegebenen Geschwindigkeit.

bool turnToRotation(
    double        angle,
    rotationUnits units,
    double        velocity,
    velocityUnits units_v,
    bool          waitForCompletion = true );

Parameters

Parameter

Typ

Beschreibung

angle

double

Der Rotationswert, auf den sich der Roboter drehen wird.

units

rotationUnits

Die Rotationseinheit: deg ), rev ) oder raw ). Eine Umdrehung entspricht 360 Grad.

velocity

double

Die Drehgeschwindigkeit variiert zwischen 0 % und 100 % bei Verwendung velocityUnits::pct, zwischen 0 und 120 U/min bei Verwendung rpmoder zwischen 0 und 720 Grad pro Sekunde bei Verwendung dps. Wird keine Geschwindigkeit angegeben, dreht sich der Roboter mit der aktuellen Drehgeschwindigkeit.

units_v

velocityUnits

Die Geschwindigkeitseinheit: velocityUnits::pct (Prozent), rpm (Umdrehungen pro Minute) oder dps (Grad pro Sekunde).

waitForCompletion

bool

true (Standard) bewirkt, dass das Projekt wartet, bis der Roboter seine Drehung abgeschlossen hat, bevor die nächste Codezeile ausgeführt wird. false bewirkt, dass die nächste Codezeile sofort ausgeführt wird.

Return Values

Gibt als booleschen Wert zurück, ob der Roboter die Zielrotation erreicht hat.

  • true — Der Roboter hat die Zielrotation erreicht.

  • false — Der Roboter hat die Drehung nicht beendet, oder die Funktion kehrte zurück, bevor die Drehung abgeschlossen war, weil waitForCompletion auf false gesetzt war.

Notes
  • Wenn eine andere Antriebsbewegungsfunktion ausgeführt wird, während turnToRotation läuft, wird die aktuelle Bewegung unterbrochen.

  • turnToRotation verwendet eine Zielrotation, daher können isDone und isMoving damit verwendet werden.

Examples
// Spin counterclockwise for 2 turns, then face forward.
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);

calibrateDrivetrain#

calibrateDrivetrain kalibriert den angeschlossenen Gyrosensor oder den im Gehirn eingebauten Trägheitssensor, der mit dem Smartdrive konfiguriert ist.

Die Kalibrierung hilft dem Sensor, Bewegungen korrekt zu messen. Halten Sie den Roboter während der Kalibrierung etwa 2 Sekunden lang ruhig. Bewegt sich der Roboter während der Kalibrierung, misst der Sensor die Bewegung möglicherweise nicht korrekt.

Das Projekt wartet, bis die Kalibrierung abgeschlossen ist, bevor die nächste Codezeile ausgeführt wird.

Hinweis: calibrateDrivetrain wird von VEXcode automatisch generiert, wenn ein Antriebsstrang mit einem Gyrosensor oder Inertialsensor konfiguriert wird. Sie ist Teil des Projektquellcodes und nicht Bestandteil der VEX IQ C++ API.

Available Functions
void calibrateDrivetrain();

Parameters

Diese Funktion akzeptiert keine Parameter.

Return Values

Diese Funktion gibt keinen Wert zurück.

Notes
  • Der Roboter kalibriert sich automatisch zu Beginn jedes Projekts, wenn ein Smartdrive in VEXcode konfiguriert wird.

  • Halten Sie den Roboter während der Kalibrierung etwa 2 Sekunden lang still.

Function Implementation

Nachfolgend ein Beispiel für die automatisch generierte Implementierung von calibrateDrivetrain , erstellt von VEXcode:

bool vexcode_initial_drivetrain_calibration_completed = false;
void calibrateDrivetrain() {
  wait(200, msec);
  Brain.Screen.print("Calibrating");
  Brain.Screen.newLine();
  Brain.Screen.print("Inertial");
  DrivetrainInertial.calibrate();
  while (DrivetrainInertial.isCalibrating()) {
    wait(25, msec);
  }
  vexcode_initial_drivetrain_calibration_completed = true;
  // Clears the screen and returns the cursor to row 1, column 1.
  Brain.Screen.clearScreen();
  Brain.Screen.setCursor(1, 1);
}

setHeading#

Die Ausrichtung des Roboters wird in Grad gemessen. setHeading ändert die aktuelle Ausrichtung des Roboters auf einen neuen Wert.

Wenn sich der Roboter beispielsweise nach rechts gedreht hat, wird durch Einstellen der Ausrichtung auf 0 Grad diese Position nach rechts zum neuen 0-Grad-Wert. Anschließend kann der Roboter basierend auf dieser neuen Ausrichtung andere Positionen anfahren.

Available Functions
void setHeading(
  double value,
  rotationUnits units);

Parameters

Parameter

Typ

Beschreibung

value

double

Der für den Roboter einzustellende Kurswert. Dieser kann zwischen -359 und 359 liegen, wenn deg oder degrees verwendet werden.

units

rotationUnits

Die Einheit für die Kursangabe: deg (Grad), rev (Umdrehungen) oder raw (Roheinheiten). Eine Umdrehung entspricht 360 Grad.

Return Values

Diese Funktion gibt keinen Wert zurück.

Examples
// Face the new 0 degrees.
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);

setRotation#

Die Rotation gibt an, um wie viel sich der Roboter gedreht hat, gemessen in Grad oder Umdrehungen. Zu Beginn eines Projekts ist der Rotationswert auf 0 Grad eingestellt. Der Befehl setRotation ändert die aktuelle Rotation des Roboters auf einen neuen Wert.

Hat der Roboter beispielsweise zwei volle Drehungen nach rechts ausgeführt, beträgt sein Rotationswert 720 Grad. Durch Setzen der Rotation auf 0 Grad wird dieser Wert von 720 auf 0 Grad zurückgesetzt. Anschließend kann der Roboter Drehungen basierend auf diesem neuen Wert ausführen.

Available Functions
void setRotation(
  double value,
  rotationUnits units);

Parameters

Parameter

Typ

Beschreibung

value

double

Der für den Roboter einzustellende Rotationswert.

units

rotationUnits

Die Rotationseinheit: deg ), rev ) oder raw ). Eine Umdrehung entspricht 360 Grad.

Return Values

Diese Funktion gibt keinen Wert zurück.

Examples
// Spin counterclockwise for 2 turns, then face forward.
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);

heading#

Die Ausrichtung (in Grad) gibt die Blickrichtung des Roboters an. Der Befehl heading liefert die aktuelle Ausrichtung des Roboters zwischen 0 und 359 Grad.

Die Ausgangsrichtung des Roboters beträgt 0 Grad.

Available Functions
double heading( rotationUnits units = rotationUnits::deg );

Parameters

Parameter

Typ

Beschreibung

units

rotationUnits

Optional. Die Einheit für die Rückkehr der Kursrichtung: degrees, deg (Standard), revoder raw. Eine Umdrehung entspricht 360 Grad.

Return Values

Gibt die aktuelle Ausrichtung des Roboters als double in der ausgewählten Einheit zurück.

Examples
// Show heading before and after turning.
Brain.Screen.print("Before: %f", myDrivetrain.heading(degrees));
myDrivetrain.turnFor(right, 90, degrees);
wait(1, seconds);
Brain.Screen.newLine();
Brain.Screen.print("After: %f", myDrivetrain.heading(degrees));
myDrivetrain.stop();

rotation#

Die Rotation gibt an, wie weit sich der Roboter gedreht hat, gemessen in Grad oder Umdrehungen. Zu Beginn eines Projekts ist der Rotationswert auf 0 Grad eingestellt. Die Eingabe rotation gibt die aktuelle Rotation des Roboters zurück.

Eine Rechtsdrehung erhöht die Rotation, eine Linksdrehung verringert sie. Beispielsweise ergibt eine zweifache Rechtsdrehung eine Rotation von 720 Grad.

Available Functions
double rotation( rotationUnits units = rotationUnits::deg );

Parameters

Parameter

Typ

Beschreibung

units

rotationUnits

Optional. Die Einheit für die Rückdrehung: degrees, deg (Standard), revoder raw. Eine Umdrehung entspricht 360 Grad.

Return Values

Gibt die aktuelle Rotation des Roboters als double in der ausgewählten Einheit zurück.

Examples
// Show rotation before and after turning.
Brain.Screen.print("Before: %f", myDrivetrain.rotation(degrees));
myDrivetrain.turnFor(right, 90, degrees);
wait(1, seconds);
Brain.Screen.newLine();
Brain.Screen.print("After: %f", myDrivetrain.rotation(degrees));
myDrivetrain.stop();