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.
Głównym celem jest pokazanie, jak enkapsulować niektóre podstawowe kody ruchu w funkcje, a nie na potrzeby obliczeń enkodera i manipulacji ruchem.
Poniższe przykładowe funkcje ruchu pomogą w stworzeniu podstawowego kodu ruchu:
- Bardziej zorganizowane
- Bardziej czytelne
- Mniej podatna na błędy
Przede wszystkim musisz zdefiniować następujące podstawowe zmienne:
koło pływakowe = 10,16; pływak WB = 36,75; //w oparciu o konfigurację Clawbot V5
Uwaga: Jeśli zmienisz przełożenie skrzyni biegów, poniższe obliczenia mogą się nieznacznie zmienić w zależności od przełożenia skrzyni biegów.
Zostanie to omówione w innym artykule poświęconym enkoderowi silnika:
float EncPerCm = 360/(koło* M_PI); float EncPerDeg = WB/Koło;
Ta próbka dotyczy wyłącznie obrotu obrotowego. Np prawy silnik = 100, lewy silnik = -100 itd.
Po drugie, przeglądając poniższe próbki, zachęcamy do zapoznania się z dokumentacją API online w celu uzyskania parametrów i ich specyfikacji. Odwiedź:https://api.vexcode.cloud/v5/html/i wyszukaj np.rotateTo, aby zapoznać się z parametrami.
Próbka 1: Enkapsuluj ruch prosty w oparciu o różne odległości
koło pływakowe = 10,16;
pływak WB = 36,75;
pływak EncPerCm = 360,0 / (Koło* M_PI);
void reportMotionValues(motor m, int line){
Brain.Screen.printAt(5,line, "%8.2lf%8.2lf%8.2f",
m.position (obr.),
m.position (stopnie));
}
// odległość w centymetrach
void goStraight( odległość pływająca ){
LeftMotor.resetPosition();
LewySilnik.resetRotation();
PrawySilnik.resetPosition();
PrawySilnik.resetRotation();
float totalEnc = odległość * EncPerCm;
// uwaga: „deg” pochodzi z przestrzeni nazw vex::. Dlatego nie powinieneś
// tworzyć kolejnej zmiennej zwanej także „deg”.
LeftMotor.setVelocity(50,0, procent);
LeftMotor.spinToPosition(totalEnc, stopnie, fałsz);
RightMotor.setVelocity(50,0, procent);
RightMotor.spinToPosition(totalEnc, stopnie, fałsz);
póki (LeftMotor.isSpinning() || RightMotor.isSpinning() )
wait(50, ms);
powrót;
}
int main() {
vexcodeInit();
goStraight(100,0);
Brain.Screen.printAt(5,60, „Gotowe”);
reportMotionValues (Lewy Silnik, 30);
raportówMotionValues (RightMotor, 60);
}
Próbka 2: Enkapsuluj skręty w lewo w oparciu o różne stopnie
koło pływakowe = 10,16;
pływak WB = 36,75;
pływak EncPerCm = 360,0 / (Koło* M_PI);
pływaki EncPerDeg = WB / Koło;
void turnRight(stopnie pływakowe){
LeftMotor.resetPosition();
LewySilnik.resetRotation();
PrawySilnik.resetPosition();
PrawySilnik.resetRotation();
float totalEnc = stopnie * EncPerDeg;
// uwaga: ten „stopień” pochodzi z przestrzeni nazw vex
LeftMotor.setVelocity(100.0, percent);
LeftMotor.spinToPosition(totalEnc, stopnie, fałsz);
RightMotor.setVelocity(-100,0, procent);
RightMotor.spinToPosition(-totalEnc, stopnie, fałsz);
while(LeftMotor.isSpinning() || RightMotor.isSpinning() )
wait(50, ms);
powrót;
}
int main(){
...
skręć w prawo (90,0);
...
}
Próbka 3: Hermetyzuj lewą i prawą stronę w jednej funkcji
void doTurning( float stopni ) {
// dokładnie ten sam kod, co w przypadku turnRight powyżej
}
int main() {
...
doToczenie(90,0); // Obrót obrotu w prawo
...
doToczenie(-90,0); // Obrót w lewo
}
W przypadku bardziej zaawansowanego programowania, jeśli chcesz, aby Twój kod był znacznie bardziej czytelny, możesz spróbować wykonać następujące czynności:
#define doLeftTurn(d) doTurning(d)
#define doRigtTurn(d) doTurning(-d)
int main() {
...
doSkręt w lewo(90.0);
doRightTurning(90,0);
...
}
#definenazywane jest makrowyrażeniem preprocesora. Potraktuj to wyrażenie jako symbol. Gdziekolwiek w kodzie ten symbol wystąpi, zostanie onzastąpionywyrażeniemdoTurning(określona wartość).
Makro preprocesora to inny obszerny temat i nie będzie omawiany w tym artykule.