Narzędzia użytkownika

Narzędzia witryny


projekty:symulacjarakiety

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Poprzednia rewizja po obu stronachPoprzednia wersja
Nowa wersja
Poprzednia wersja
projekty:symulacjarakiety [2025/05/08 00:14] administratorprojekty:symulacjarakiety [2025/05/16 17:30] (aktualna) administrator
Linia 1: Linia 1:
-======= Sumulacja Rakiety w programie SimStructure =======+~~NOTOC~~ 
 + 
 +======= Symulacja: kontrolera PID w programie SimStructure ======= 
 + 
 +{{:projekty:rocket.gif|}} 
 pliki: pliki:
  
Linia 5: Linia 10:
   * {{ :projekty:ardugeek_rocket1.zip |}}   * {{ :projekty:ardugeek_rocket1.zip |}}
  
-====== Opis działania kodu sterującego ======+Fajny symulator do nauki zasad działania kontrolera PID: https://tools.softinery.com/PIDSIM/ 
 + 
 +Autor programu SimStructure: [[https://en.wikipedia.org/wiki/Terry_A._Davis|Terry A. Davis]] 
 + 
 +Źródło: 
 + 
 +{{youtube>25hLohVZdME?}}\\ 
 + 
 +===== 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 ===== 
 +<code> double desired_y = 10, error_y, kd_y = 1, kp_y = 1, ki_y = 0.3; signal s_y; signal thrust; signal t1_angle; integrator i_y; </code> 
 + 
 +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, różniczkujący, całkujący). 
 + 
 +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 ===== 
 +<code> desired_y = 15 + 5 * t; error_y = desired_y - p1.y; s_y = error_y; i_y = error_y; t1.thrust = t1.saturation * ( kp_y * error_y - kd_y * p1.dy + ki_y * i_y ); thrust = t1.thrust / 100000; </code> 
 + 
 +Linia <code>desired_y = 15 + 5 * t;</code> powoduje zmianę zadanej wysokości liniowo w czasie (t to czas symulacji). 
 + 
 +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/zakres. 
 + 
 +===== Regulator PID dla kąta ===== 
 +<code> double a, kp_a = 1.0, kd_a = 0.01, ki_a = 0.001, a_err; []a = pi - pi/180 * b1.heading + 10 * ( key2("1") - key2("2") ); signal angle_err; angle_err = 50 * a; integrator i_a; i_a = a / 10; 
 + 
 +t1.angle = kp_a * a 
 +- kd_a * b1.spin 
 ++ ki_a * i_a; 
 +t1_angle = 50 * t1.angle; 
 +</code> 
 + 
 +a – błąd kąta: różnica między kątem referencyjnym (pi) a aktualnym (b1.heading w radianach), plus korekta z klawiatury (przyciski "1" i "2"). 
 + 
 +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 ===== 
 +<code> @{ line(p1.x-1000, desired_y, p1.x+1000, desired_y, blue, #3); text(#10, #50, "Thrust: %12.6f N", t1.thrust); text(#10, #10, "Heading:%12.6f degree", b1.heading); text(#10, #30, "Angle: %12.6f rad", a); text(#10, #70, "Integrator: %12.6f", i_y); plot s_y, thrust, angle_err, t1_angle; } </code> 
 + 
 +Funkcja <code>line()</code> rysuje poziomą linię na wysokości zadanej w odniesieniu do pozycji p1.x. 
 + 
 +Kilka wywołań <code>text()</code> wyświetla na ekranie: 
 + 
 +wartość siły ciągu (t1.thrust), 
 + 
 +aktualny kąt (b1.heading), 
 + 
 +błąd kąta (a),
  
-Ten dokument opisuje działanie fragmentu kodu sterującego dla rakiety z wykorzystaniem regulatorów PID w dwóch osiach: pionowej (Y) oraz kąta nachylenia (Angle).+wartość całki błędu osi y (i_y).
  
-===== Parametry PID dla osi Y ===== +<code>plot()</code> generuje wykresy kolejnych sygnałów:
-Kod definiuje następujące zmienne sterujące ruchem w osi pionowej: +
-  * **desired_y** – zadana pozycja w osi Y. Na początku ustawiona na 10, ale potem dynamicznie zmieniana: +
-    `desired_y = 15 + 5 * t;` – pozycja zależy od czasu t. +
-  * **error_y** – błąd położenia: `error_y = desired_y - p1.y;` +
-  * **kp_y, kd_y, ki_y** – współczynniki regulatora PID: +
-    * kp_y = 1 (proporcjonalny) +
-    * kd_y = 1 (różniczkujący) +
-    * ki_y = 0.3 (całkujący) +
-  * **i_y** – całka błędu (integrator) używana w członie całkującym+
  
-===== Sterowanie siłą ciągu (thrust) ===== +s_y – sygnał błędu wysokości,
-Wyznaczana jest siła ciągu na podstawie błędu+
-  `t1.thrust = t1.saturation * (kp_y * error_y - kd_y * p1.dy + ki_y * i_y);`+
  
-Następnie przeliczana jest wartość siłciągu do jednostek siły w Newtonach: +thrust – siłciągu,
-  `thrust = t1.thrust / 100000;`+
  
-===== Regulacja kąta nachylenia ===== +angle_err – błąd kąta (skala),
-Sterowanie kątem odbywa się przy użyciu osobnego zestawu PID: +
-  * **a** – żądany kąt: +
-    `[ ]a = pi - pi/180 * b1.heading + 10 * (key2("1") - key2("2"));+
-    Żądany kąt jest zależny od kierunku (heading) oraz naciśnięcia klawiszy. +
-  * **kp_a, kd_a, ki_a** – współczynniki PID dla kąta +
-  * **angle_err** – przeskalowany błąd kąta do celów wizualizacji: +
-    `angle_err = 50 * a;` +
-  * **i_a** – całka z kąta: `i_a = a / 10;` +
-  * **t1.angle** – wynik działania regulatora: +
-    `t1.angle = kp_a * a - kd_a * b1.spin + ki_a * i_a;` +
-  * **t1_angle** – przeskalowany sygnał sterujący kątem do wizualizacji: +
-    `t1_angle = 50 * t1.angle;`+
  
-===== Część wizualizacyjna ===== +t1_angle – sygnał wyjściowy regulatora kąta.
-Na końcu kodu znajduje się blok graficzny służący do wyświetlania wyników: +
-  * Rysowanie linii poziomej w pozycji desired_y (linia niebieska) +
-  * Wyświetlanie tekstów: +
-    * Aktualna siła ciągu +
-    * Kierunek (heading) +
-    * Żądany kąt +
-    * Wartość całki z błędu w osi Y +
-  * Wykresy (plot) dla: +
-    * s_y – błąd w osi Y +
-    * thrust – siła ciągu +
-    * angle_err – błąd kąta +
-    * t1_angle – sterowanie kątem+
  
-===== Podsumowanie ===== 
-Kod ten realizuje dwuwymiarowe sterowanie pojazdem: 
-  * Stabilizacja położenia w osi Y z wykorzystaniem PID 
-  * Sterowanie kątem nachylenia w celu orientacji 
-  * Wizualizacja parametrów dla celów debugowania lub analizy 
  
-{{:projekty:rocket.gif?1000|}}+===== Pełen kod sterowania =====
  
 Kod: Kod:
projekty/symulacjarakiety.1746656097.txt.gz · ostatnio zmienione: przez administrator