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:18] 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),
  
-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 (Angle).+błąkąta (a),
  
-===== Parametry PID dla osi Y ===== +wartość całki błędu osi y (i_y).
-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 (integratorużywana w członie całkującym+
  
-===== Sterowanie siłą ciągu (thrust===== +<code>plot()</code> generuje wykresy kolejnych sygnałów:
-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ły ciągu do jednostek siły w Newtonach: +s_y – sygnał błędu wysokości,
-  ''thrust = t1.thrust / 100000;''+
  
-===== Regulacja kąta nachylenia ===== +thrust – siłciągu,
-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_akd_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 ===== +angle_err – błąd kąta (skala),
-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 ===== +t1_angle – sygnał wyjściowy regulatora ta.
-Kod ten realizuje dwuwymiarowe sterowanie pojazdem: +
-  * Stabilizacja położenia w osi Y z wykorzystaniem PID +
-  * Sterowanie 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.1746656323.txt.gz · ostatnio zmienione: przez administrator