Różnice między wybraną wersją a wersją aktualną.
Poprzednia rewizja po obu stronachPoprzednia wersjaNowa wersja | Poprzednia wersja | ||
projekty:symulacjarakiety [2025/05/08 00:19] – administrator | projekty:symulacjarakiety [2025/05/16 17:30] (aktualna) – administrator | ||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | ======= | + | ~~NOTOC~~ |
+ | |||
+ | ======= | ||
+ | |||
+ | {{: | ||
pliki: | pliki: | ||
Linia 5: | Linia 10: | ||
* {{ : | * {{ : | ||
- | ====== | + | Fajny symulator do nauki zasad działania kontrolera PID: https:// |
+ | |||
+ | Autor programu SimStructure: | ||
+ | |||
+ | Źródło: | ||
+ | |||
+ | {{youtube> | ||
+ | |||
+ | ===== Założenie | ||
+ | |||
+ | Symulacja ma pokazać zastosowanie kontrolera PID w rakiecie która ma mieć kompensację zmian przyspieszenia oraz ustawienia kątowego. Symulacja jest wykonana w dwóch wymiarach i obliczenia są wykonywane w dwóch wymiarach. | ||
+ | |||
+ | ===== Deklaracja zmiennych ===== | ||
+ | < | ||
+ | |||
+ | desired_y – zadana wartość wysokości (initialnie 10). | ||
+ | |||
+ | error_y – różnica między wartością zadaną a aktualną. | ||
+ | |||
+ | kp_y, kd_y, ki_y – współczynniki regulatora PID dla osi y (proporcjonalny, | ||
+ | |||
+ | s_y, thrust, t1_angle – sygnały służące do dalszego przetwarzania i wizualizacji. | ||
+ | |||
+ | i_y – wewnętrzny akumulator (całkujący) regulatora. | ||
+ | |||
+ | ===== Regulator PID dla osi _Y ===== | ||
+ | < | ||
+ | |||
+ | Linia < | ||
+ | |||
+ | Obliczenie błędu: | ||
+ | ;error_y: Różnica między wysokością zadaną a bieżącą (p1.y). | ||
+ | |||
+ | Całkowanie błędu: | ||
+ | ;i_y: Proste całkowanie przez przypisanie błędu (może być rozszerzone o sumowanie w pętli). | ||
+ | |||
+ | Wyjście regulatora: | ||
+ | ;t1.thrust = faktor_saturacji × (P · error – D · prędkość + I · całka). | ||
+ | |||
+ | Skalowanie sygnału siły ciągu (thrust) dzieleniem przez 100 000, by uzyskać odpowiednie jednostki/ | ||
+ | |||
+ | ===== Regulator PID dla kąta ===== | ||
+ | < | ||
+ | |||
+ | t1.angle = kp_a * a | ||
+ | - kd_a * b1.spin | ||
+ | + ki_a * i_a; | ||
+ | t1_angle = 50 * t1.angle; | ||
+ | </ | ||
+ | |||
+ | a – błąd kąta: różnica między kątem referencyjnym (pi) a aktualnym (b1.heading w radianach), plus korekta z klawiatury (przyciski " | ||
+ | |||
+ | kp_a, kd_a, ki_a – współczynniki PID dla kąta. | ||
+ | |||
+ | angle_err – skalowany błąd kąta do wizualizacji. | ||
+ | |||
+ | i_a – całka błędu kąta (tu zaledwie a/10, nie sumująca). | ||
+ | |||
+ | Obliczenie wyjścia regulatora kąta: | ||
+ | ;t1.angle = P · a – D · obrót + I · i_a | ||
+ | |||
+ | t1_angle – dodatkowe skalowanie sygnału kąta. | ||
+ | |||
+ | ===== Wizualizacja i wykresy ===== | ||
+ | < | ||
+ | |||
+ | Funkcja < | ||
+ | |||
+ | Kilka wywołań < | ||
+ | |||
+ | wartość siły ciągu (t1.thrust), | ||
+ | |||
+ | aktualny kąt (b1.heading), | ||
- | Ten dokument opisuje działanie fragmentu kodu sterującego dla pojazdu (np. drona lub rakiety) z wykorzystaniem regulatorów PID w dwóch osiach: pionowej (Y) oraz kąta nachylenia | + | błąd kąta (a), |
- | ===== Parametry PID dla osi Y ===== | + | wartość całki błędu |
- | Kod definiuje następujące zmienne sterujące ruchem w osi pionowej: | + | |
- | * < | + | |
- | < | + | |
- | desired_y = 15 + 5 * t; | + | |
- | </ | + | |
- | * < | + | |
- | < | + | |
- | error_y = desired_y - p1.y; | + | |
- | </ | + | |
- | * Współczynniki regulatora PID: | + | |
- | **Proporcjonalny**: | + | |
- | **Różniczkujący**: | + | |
- | **Całkujący**: | + | |
- | * < | + | |
- | ===== Sterowanie siłą ciągu (thrust) ===== | + | <code>plot()</code> generuje wykresy kolejnych sygnałów: |
- | Siła ciągu liczona jest jako: | + | |
- | <pre> | + | |
- | t1.thrust = t1.saturation * (kp_y * error_y | + | |
- | - kd_y * p1.dy | + | |
- | + ki_y * i_y); | + | |
- | thrust | + | |
- | </pre> | + | |
- | ===== Regulacja kąta nachylenia ===== | + | s_y – sygnał błędu wysokości, |
- | Sterowanie kątem nachylenia realizowane jest osobnym PID-em: | + | |
- | * < | + | |
- | < | + | |
- | []a = pi | + | |
- | - (pi/180) * b1.heading | + | |
- | + 10 * (key2(" | + | |
- | </ | + | |
- | * Współczynniki PID: | + | |
- | **Proporcjonalny**: | + | |
- | **Różniczkujący**: | + | |
- | **Całkujący**: | + | |
- | * < | + | |
- | < | + | |
- | angle_err = 50 * a; | + | |
- | </ | + | |
- | * < | + | |
- | < | + | |
- | i_a = a / 10; | + | |
- | </ | + | |
- | * Obliczenie sygnału sterującego: | + | |
- | < | + | |
- | t1.angle | + | |
- | - kd_a * b1.spin | + | |
- | + ki_a * i_a; | + | |
- | t1_angle | + | |
- | </ | + | |
- | ===== Część wizualizacyjna ===== | + | thrust |
- | W bloku graficznym rysowane są: | + | |
- | * Pozioma linia w pozycji < | + | |
- | < | + | |
- | line(p1.x-1000, | + | |
- | </ | + | |
- | * Dynamiczne teksty: | + | |
- | < | + | |
- | text(# | + | |
- | text(# | + | |
- | text(# | + | |
- | text(# | + | |
- | </ | + | |
- | * Wykresy zmiennych: | + | |
- | < | + | |
- | plot s_y, thrust, angle_err, t1_angle | + | |
- | </ | + | |
- | ===== Podsumowanie ===== | + | angle_err – błąd kąta (skala), |
- | * Sterowanie położeniem w osi Y realizowane przez PID (proporcjonalny, | + | |
- | * Sterowanie kątem nachylenia za pomocą oddzielnego PID. | + | |
- | * Wizualizacja parametrów sterowania i stanu pojazdu. | + | |
+ | t1_angle – sygnał wyjściowy regulatora kąta. | ||
- | {{: | + | ===== Pełen kod sterowania ===== |
Kod: | Kod: |