smartdrive#

Introdução#

A classe smartdrive controla a forma como um robô se move e gira utilizando motores, rodas e um sensor. Um smartdrive pode utilizar um Sensor Inercial ou Sensor Giroscópio para rastrear a direção e a rotação.

O sistema smartdrive utiliza o sensor para auxiliar o robô a mover-se e a rodar com precisão. No início de cada projeto, o sistema de transmissão calibra o sensor automaticamente. Mantenha o robô imóvel durante cerca de 2 segundos durante a calibração, para que se possa mover e rodar corretamente.

A classe smartdrive baseia-se na classe drivetrain. Pode utilizar as mesmas funções de direção e rotação que o drivetrain, e também adiciona funções baseadas em sensores como turnToHeading e turnToRotation.

Construtores de Classes#

1 — Cria um smartdrive utilizando motor_group existentes para os lados esquerdo (&l) e direito (&r), juntamente com um sensor inercial ou sensor giroscópio.

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

2 — Cria um smartdrive utilizando os objectos existentes motor para os lados esquerdo (&l) e direito (&r), juntamente com um sensor inercial ou sensor giroscópio.

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

Destrutor de classes#

Destrói o objeto smartdrive e liberta os recursos associados.

~smartdrive();

Parâmetros#

O parâmetro do sensor pode ser inertial ou gyro objeto.

Parâmetro

Tipo

Descrição

&l / &r

motor_group / motor

Referências a instâncias existentes de motor ou motor_group Ambos os parâmetros devem ser do mesmo tipo: ou duas instâncias de motor_group ou duas instâncias de motor O parâmetro &l refere-se ao motor ou grupo de motores esquerdo, e &r refere-se ao motor ou grupo de motores direito.

&g

gyro&

A reference to an existing gyro or inertial instance.

wheelTravel

double

A circunferência das rodas da transmissão. O valor predefinido é 320.

trackWidth

double

A distância entre as rodas esquerda e direita. O valor predefinido é 320.

wheelBase

double

A distância entre as rodas dianteiras e traseiras. O valor predefinido é 130.

unit

distanceUnits

A unidade para wheelTravel, trackWidthe wheelBase: mm (milímetros, standard) ou inches.

externalGearRatio

double

A relação de transmissão utilizada para ajustar as distâncias de acionamento, caso sejam utilizadas engrenagens. O predefinido é 1.0.

Exemplo#

/* 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 instances
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the inertial instance
inertial myInertial = inertial(PORT3);

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

Funções de membro#

A classe smartdrive inclui as seguintes funções membro:

Ações — Rode o robô utilizando a direção ou a rotação.

Definições — Ajuste os valores de direção e rotação.

  • setHeading — Altera a direção atual do robô para uma nova direção.

  • setRotation — Altera a rotação atual do robô para uma nova rotação.

Valores — Verificar cabeçalho e rotação.

  • heading — Devolve a direção atual do robô de 0 a 359 graus.

  • rotation — Retorna a rotação atual do robô.

Um smartdrive pode também utilizar as funções de membro herdadas de drivetrain, como drive, driveFor, turn, turnFor, stop, isDone, e isMoving.

Antes de chamar qualquer função membro do smartdrive , deve ser criada uma instância do smartdrive , como se mostra abaixo:

/* 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 instances
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the inertial instance
inertial myInertial = inertial(PORT3);

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

turnToHeading#

A direção é a direção para a qual o robô está virado, medida em graus. turnToHeading roda o robô para uma direção específica entre -359 e 359 graus. O robô seguirá o caminho mais curto para alcançar a direção desejada.

A direção inicial do robô é de 0 graus.

O projeto aguardará até que o robô termine de rodar antes de executar a próxima linha de código.

Available Functions

1 — Roda o grupo motopropulsor para a direção especificada utilizando a velocidade de rotação configurada.

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

2 — Roda a transmissão para a direção especificada à velocidade especificada.

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

Parameters

Parâmetro

Tipo

Descrição

angle

double

A direção para a qual o robô deve estar virado, em graus. Pode variar de -359 a 359 quando se utiliza deg ou degrees.

units

rotationUnits

A unidade de rotação: deg (graus), rev (revoluções) ou raw (unidades brutas). Uma rotação é igual a 360 graus.

velocity

double

A velocidade de rotação varia de 0% a 100% quando se utiliza velocityUnits::pct, de 0 a 600 rpm quando se utilizam rpm, ou de 0 a 3600 graus por segundo quando se utilizam dpsSe não for fornecida qualquer velocidade, o robô roda à velocidade de rotação atual.

units_v

velocityUnits

A unidade de velocidade: velocityUnits::pct (por cento), rpm (rotações por minuto) ou dps (graus por segundo).

waitForCompletion

bool

true (padrão) faz com que o projeto aguarde até que o robô termine de rodar antes de executar a linha de código seguinte. false faz com que a próxima linha de código seja executada imediatamente.

Return Values

Retorna um valor booleano indicando se o robô atingiu a direção desejada.

  • true — O robô atingiu a direção alvo.

  • false — O robô não terminou o turno, ou a função regressou antes da conclusão do turno porque waitForCompletion foi definido como false.

Notes
  • A execução de outra função de movimento do grupo motopropulsor (como turn ou drive) enquanto turnToHeading está em curso irá interromper o movimento atual.

  • Como turnToHeading é baseado no alvo (utiliza um parâmetro de ângulo angle ), funções como isDone e isMoving funcionam com turnToHeading.

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

turnToRotation#

turnToRotation roda o robô para uma rotação específica.

A rotação é o quanto o robô rodou, medida em graus ou revoluções. No início de um projeto, o valor de rotação é definido como 0 graus. A rotação também pode ser definida através da função setRotation.

Os valores de rotação são absolutos. Isto significa que a direção da viragem depende da rotação atual do robô. Virar para a direita aumenta a rotação, e virar para a esquerda diminui a rotação.

Por exemplo, se o robô começar a 0 graus e rodar 720 graus, este irá virar para a direita duas vezes. Se depois rodar 360 graus, virará para a esquerda uma vez, porque 360 ​​é inferior a 720.

O projeto aguardará até que o robô termine de rodar antes de executar a próxima linha de código.

Available Functions

1 — Roda a transmissão para a rotação especificada utilizando a velocidade de rotação configurada.

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

2 — Roda a transmissão para a rotação especificada à velocidade especificada.

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

Parameters

Parâmetro

Tipo

Descrição

angle

double

O valor de rotação para o qual o robô irá rodar.

units

rotationUnits

A unidade de rotação: deg (graus), rev (revoluções) ou raw (unidades brutas). Uma rotação é igual a 360 graus.

velocity

double

A velocidade de rotação varia de 0% a 100% quando se utiliza velocityUnits::pct, de 0 a 600 rpm quando se utilizam rpm, ou de 0 a 3600 graus por segundo quando se utilizam dpsSe não for fornecida qualquer velocidade, o robô roda à velocidade de rotação atual.

units_v

velocityUnits

A unidade de velocidade: velocityUnits::pct (por cento), rpm (rotações por minuto) ou dps (graus por segundo).

waitForCompletion

bool

true (padrão) faz com que o projeto aguarde até que o robô termine de rodar antes de executar a linha de código seguinte. false faz com que a próxima linha de código seja executada imediatamente.

Return Values

Retorna um valor booleano indicando se o robô atingiu a rotação desejada.

  • true — O robô atingiu a rotação alvo.

  • false — O robô não terminou o turno, ou a função regressou antes da conclusão do turno porque waitForCompletion foi definido como false.

Notes
  • A execução de outra função de movimento do grupo motopropulsor (como turn ou drive) enquanto turnToRotation está em curso irá interromper o movimento atual.

  • Como turnToRotation é baseado no alvo (utiliza um parâmetro de ângulo angle ), funções como isDone e isMoving funcionam com turnToRotation.

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

calibrateDrivetrain#

calibrateDrivetrain calibra o sensor inercial ou o sensor giroscópio configurado com o smartdrive.

A calibração ajuda o sensor a medir o movimento corretamente. Mantenha o robô imóvel durante cerca de 2 segundos durante a calibração. Se o robô se mover durante este período, o sensor poderá não medir o movimento corretamente.

O projeto aguardará a conclusão da calibração antes de executar a linha de código seguinte.

O comando calibrateDrivetrain é gerado automaticamente pelo VEXcode quando um sistema de transmissão é configurado com um sensor inercial ou giroscópio. É fornecido como parte do código-fonte do projeto e não faz parte da API VEX EXP C++.

Available Functions
void calibrateDrivetrain();

Parameters

Esta função não aceita qualquer parâmetro.

Return Values

Esta função não devolve qualquer valor.

Notes
  • O robô realiza a calibração automaticamente no início de cada projeto.

  • Mantenha o robô imóvel durante cerca de 2 segundos durante a calibração.

Function Implementation

De seguida, apresentamos a implementação gerada automaticamente de calibrateDrivetrain criada pelo 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#

A direção é a direção para a qual o robô está virado, medida em graus. setHeading altera a direção atual do robô para um novo valor de direção.

Por exemplo, se o robô se virou para a direita, definir a direção para 0 graus faz com que essa posição virada para a direita se torne os novos 0 graus. De seguida, o robô pode rodar para outras posições com base nessa nova direção.

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

Parameters

Parâmetro

Tipo

Descrição

value

double

O valor de direção a definir para o robô. Pode ser de -359 a 359 quando se utiliza deg ou degrees.

units

rotationUnits

A unidade de medida: deg (graus), rev (revoluções) ou raw (unidades brutas). Uma rotação é igual a 360 graus.

Return Values

Esta função não devolve qualquer valor.

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

setRotation#

A rotação indica o quanto o robô rodou, medida em graus ou revoluções. No início de um projeto, o valor de rotação é definido como 0 graus. O comando setRotation altera a rotação actual do robô para um novo valor.

Por exemplo, se o robô tiver dado duas voltas completas para a direita, o seu valor de rotação será de 720 graus. Definir a rotação para 0 graus irá repor essa rotação de 720 para 0 graus. De seguida, o robô poderá rodar para rotações baseadas nesse novo valor.

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

Parameters

Parâmetro

Tipo

Descrição

value

double

O valor de rotação a definir para o robô.

units

rotationUnits

A unidade de rotação: deg (graus), rev (revoluções) ou raw (unidades brutas). Uma rotação é igual a 360 graus.

Return Values

Esta função não devolve qualquer valor.

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

heading#

A direção indica para onde o robô está virado, medida em graus. O comando heading devolve a direção atual do robô, de 0 a 359 graus.

A direção inicial do robô é de 0 graus.

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

Parameters

Parâmetro

Tipo

Descrição

units

rotationUnits

Opcional. A unidade para devolver o rumo: degrees, deg (padrão), revou rawUma rotação é igual a 360 graus.

Return Values

Retorna a direção atual do robô como um duplo double na unidade selecionada.

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#

A rotação indica o quanto o robô rodou, medida em graus ou revoluções. No início de um projeto, o valor de rotação é definido como 0 graus. O comando rotation devolve a rotação actual do robô.

Virar para a direita aumenta a rotação, e virar para a esquerda diminui a rotação. Por exemplo, duas voltas completas para a direita resultarão numa rotação de 720 graus.

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

Parameters

Parâmetro

Tipo

Descrição

units

rotationUnits

Opcional. A unidade para devolver o rumo: degrees, deg (padrão), revou rawUma rotação é igual a 360 graus.

Return Values

Retorna a rotação atual do robô como um valor double na unidade selecionada.

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();