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. Wejdź na:https://api.vexcode.cloud/v5/html/i wyszukaj np.obróćTo
w celu zapoznania 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); ... }
#define
nazywane 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.