The VEX Visual Studio Code Extension has replaced VEXcode Pro V5, which is now end-of-life.
VEXcode Blocks and VEXcode Text remain actively developed and supported for all VEX platforms.
L'obiettivo principale è mostrare come incapsulare alcuni dei codici di movimento fondamentali in funzioni, non per il calcolo dell'encoder e le manipolazioni del movimento.
Le seguenti funzioni di movimento di esempio ti aiuteranno a creare il codice dei movimenti di base:
- Più organizzato
- Più leggibile
- Meno soggetto a errori
Prima di tutto, dovrai definire le seguenti variabili di base:
Ruota galleggiante = 10,16; float WB = 36,75; //basato sulla configurazione V5 Clawbot
Nota: se si modifica il rapporto di trasmissione, il seguente calcolo potrebbe cambiare leggermente in base al rapporto di trasmissione.
Questo sarà discusso in un altro articolo incentrato sull'encoder del motore:
float EncPerCm = 360/(ruota* M_PI); float EncPerDeg = WB/Rotella;
Questo esempio è solo per la rotazione con perno. Per esempio motore destro = 100, motore sinistro = -100, ecc.
In secondo luogo, quando esamini i seguenti esempi, ti invitiamo a cercare il riferimento API online per i parametri e le relative specifiche. Visita:https://api.vexcode.cloud/v5/html/e cerca, ad esempio,rotateToper familiarizzare con i parametri.
Esempio 1: incapsulare il movimento rettilineo in base a varie distanze
Ruota galleggiante = 10,16;
float WB = 36,75;
float EncPerCm = 360,0 / (Ruota* M_PI);
void reportMotionValues(motor m, int line){
Brain.Screen.printAt(5,line, "%8.2lf%8.2lf%8.2f",
m.position(rev),
m.position(deg));
}
// la distanza è in centimetri
void goStraight( float distance ){
LeftMotor.resetPosition();
LeftMotor.resetRotation();
RightMotor.resetPosition();
RightMotor.resetRotation();
float totalEnc = distanza * EncPerCm;
// nota: "deg" deriva dallo spazio dei nomi vex::. Pertanto, non dovresti
// creare un'altra variabile denominata anche "deg".
LeftMotor.setVelocity(50,0, percentuale);
LeftMotor.spinToPosition(totalEnc, deg, false);
RightMotor.setVelocity(50,0, percentuale);
RightMotor.spinToPosition(totalEnc, deg, false);
while (LeftMotor.isSpinning() || RightMotor.isSpinning() )
wait(50, msec);
ritorno;
}
int main() {
vexcodeInit();
vaiDritto(100,0);
Brain.Screen.printAt(5,60, "Fatto");
reportValoriMovimento(MotoreSinistro, 30);
reportValoriMovimento(MotoreDestra, 60);
}
Esempio 2: incapsulare le svolte a sinistra in base a vari gradi
Ruota galleggiante = 10,16;
float WB = 36,75;
float EncPerCm = 360,0 / (Ruota* M_PI);
float EncPerDeg = WB / Ruota;
void turnRight( float gradi){
LeftMotor.resetPosition();
LeftMotor.resetRotation();
RightMotor.resetPosition();
RightMotor.resetRotation();
float totalEnc = gradi * EncPerDeg;
// nota: questo "gradi" proviene dal namespace vex
LeftMotor.setVelocity(100.0, percent);
LeftMotor.spinToPosition(totalEnc, deg, false);
RightMotor.setVelocity(-100,0, percentuale);
RightMotor.spinToPosition(-totalEnc, deg, false);
while(LeftMotor.isSpinning() || RightMotor.isSpinning() )
wait(50, msec);
ritorno;
}
int principale(){
...
gira a destra(90.0);
...
}
Esempio 3: incapsulare sia la sinistra che la destra in un'unica funzione
void doTurning( float Degrees ) {
// esattamente lo stesso codice di turnRight sopra
}
int main() {
...
fareTornitura(90.0); // Perno a destra: rotazione
...
doTornitura(-90.0); // Gira il perno a sinistra
}
Per una programmazione più avanzata, se vuoi rendere il tuo codice molto più leggibile, puoi provare quanto segue:
#define doLeftTurn(d) doTurning(d)
#define doRigtTurn(d) doTurning(-d)
int main() {
...
faiGirareSinistra(90.0);
fareTornitura a destra(90.0);
...
}
#defineè chiamata espressione macro del preprocessore. Considera questa espressione come un simbolo. Ovunque sia presente questo simbolo nel codice,verrà sostituitocon l'espressionedoTurning(il valore specificato).
La macro del preprocessore è un argomento ampio e diverso e non verrà discusso in questo articolo.