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:19] 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: +
-  * <code>desired_y</code> – zadana pozycja w osi Y. Początkowo ustawiona na 10, następnie dynamicznie zmieniana: +
-    <pre> +
-desired_y = 15 + 5 * t; +
-    </pre> +
-  * <code>error_y</code> – błąd położenia: +
-    <pre> +
-error_y = desired_y - p1.y; +
-    </pre> +
-  * Współczynniki regulatora PID: +
-    **Proporcjonalny**: <code>kp_y = 1</code>   +
-    **Różniczkujący**: <code>kd_y = 1</code>   +
-    **Całkujący**: <code>ki_y = 0.3</code>   +
-  * <code>i_y</code> – wartość całki błędu.+
  
-===== Sterowanie siłą ciągu (thrust) ===== +<code>plot()</codegeneruje 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    = t1.thrust / 100000; +
-</pre>+
  
-===== Regulacja kąta nachylenia ===== +s_y – sygnał błędu wysokości,
-Sterowanie kątem nachylenia realizowane jest osobnym PID-em: +
-  * <code>a</code> – żądany kąt: +
-    <pre> +
-[]a = pi +
-     - (pi/180) * b1.heading +
-     + 10 * (key2("1") - key2("2")); +
-    </pre> +
-  * Współczynniki PID: +
-    **Proporcjonalny**: <code>kp_a = 1.0</code>   +
-    **Różniczkujący**: <code>kd_a = 0.01</code>   +
-    **Całkujący**: <code>ki_a = 0.001</code>   +
-  * <code>angle_err</code> – przeskalowany ąd kąta: +
-    <pre> +
-angle_err = 50 * a; +
-    </pre> +
-  * <code>i_a</code> – integrator kąta: +
-    <pre> +
-i_a = a / 10; +
-    </pre> +
-  * Obliczenie sygnału sterującego: +
-    <pre> +
-t1.angle   = kp_a * a +
-             - kd_a * b1.spin +
-             + ki_a * i_a; +
-t1_angle   = 50 * t1.angle; +
-    </pre>+
  
-===== Część wizualizacyjna ===== +thrust – siłciągu,
-W bloku graficznym rysowane są: +
-  * Pozioma linia w pozycji <code>desired_y</code>   +
-    <pre> +
-line(p1.x-1000, desired_y, p1.x+1000, desired_y, blue, #3) +
-    </pre> +
-  * Dynamiczne teksty: +
-    <pre> +
-text(#10,#50,"Thrust:   %12.6f N",   t1.thrust+
-text(#10,#10,"Heading:  %12.6f°",   b1.heading) +
-text(#10,#30,"Angle:    %12.6f rad", a+
-text(#10,#70,"Integrator: %12.6f",    i_y) +
-    </pre> +
-  * Wykresy zmiennych: +
-    <pre> +
-plot s_y, thrust, angle_errt1_angle +
-    </pre>+
  
-===== Podsumowanie ===== +angle_err – błąd kąta (skala),
-  * Sterowanie położeniem w osi Y realizowane przez PID (proporcjonalny, różniczkujący, całkujący).   +
-  * Sterowanie kątem nachylenia za pomocą oddzielnego PID.   +
-  * Wizualizacja parametrów sterowania i stanu pojazdu.+
  
 +t1_angle – sygnał wyjściowy regulatora kąta.
  
  
-{{:projekty:rocket.gif?1000|}}+===== Pełen kod sterowania =====
  
 Kod: Kod:
projekty/symulacjarakiety.1746656376.txt.gz · ostatnio zmienione: przez administrator