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_groupexistentes 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
motorpara 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 |
|---|---|---|
|
|
Referências a instâncias existentes de |
|
|
A reference to an existing |
|
|
A circunferência das rodas da transmissão. O valor predefinido é |
|
|
A distância entre as rodas esquerda e direita. O valor predefinido é |
|
|
A distância entre as rodas dianteiras e traseiras. O valor predefinido é |
|
|
A unidade para |
|
|
A relação de transmissão utilizada para ajustar as distâncias de acionamento, caso sejam utilizadas engrenagens. O predefinido é |
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.
turnToHeading— Roda o robô para enfrentar uma direção específica de -359 a 359 graus. O robô irá rodar na direção mais curta para alcançar a direção alvo.turnToRotation— Roda o robô para uma rotação específica.calibrateDrivetrain— Calibra o Sensor Inercial ou o Sensor Giroscópio configurado do grupo motopropulsor.
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 Functions1 — 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 );
Parameters2 — 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 );
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
A direção para a qual o robô deve estar virado, em graus. Pode variar de -359 a 359 quando se utiliza |
|
|
A unidade de rotação: |
|
|
A velocidade de rotação varia de 0% a 100% quando se utiliza |
|
|
A unidade de velocidade: |
|
|
|
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 porquewaitForCompletionfoi definido comofalse.
A execução de outra função de movimento do grupo motopropulsor (como
turnoudrive) enquantoturnToHeadingestá em curso irá interromper o movimento atual.Como
turnToHeadingé baseado no alvo (utiliza um parâmetro de ânguloangle), funções comoisDoneeisMovingfuncionam comturnToHeading.
// 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 Functions1 — 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 );
Parameters2 — 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 );
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
O valor de rotação para o qual o robô irá rodar. |
|
|
A unidade de rotação: |
|
|
A velocidade de rotação varia de 0% a 100% quando se utiliza |
|
|
A unidade de velocidade: |
|
|
|
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 porquewaitForCompletionfoi definido comofalse.
A execução de outra função de movimento do grupo motopropulsor (como
turnoudrive) enquantoturnToRotationestá em curso irá interromper o movimento atual.Como
turnToRotationé baseado no alvo (utiliza um parâmetro de ânguloangle), funções comoisDoneeisMovingfuncionam comturnToRotation.
// 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++.
void calibrateDrivetrain();
Esta função não aceita qualquer parâmetro.
Return ValuesEsta função não devolve qualquer valor.
NotesO 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.
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 Functionsvoid setHeading(
double value,
rotationUnits units);
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
O valor de direção a definir para o robô. Pode ser de -359 a 359 quando se utiliza |
|
|
A unidade de medida: |
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 Functionsvoid setRotation(
double value,
rotationUnits units);
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
O valor de rotação a definir para o robô. |
|
|
A unidade de rotação: |
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 Functionsdouble heading( rotationUnits units = rotationUnits::deg );
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
Opcional. A unidade para devolver o rumo: |
Retorna a direção atual do robô como um duplo double na unidade selecionada.
// 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 Functionsdouble rotation( rotationUnits units = rotationUnits::deg );
Parâmetro |
Tipo |
Descrição |
|---|---|---|
|
|
Opcional. A unidade para devolver o rumo: |
Retorna a rotação atual do robô como um valor double na unidade selecionada.
// 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();