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:22] 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.
  
-Ten dokument opisuje fragment 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).+angle_err – skalowany błąkąta do wizualizacji.
  
-## Parametry PID dla osi Y+i_a – całka błędu kąta (tu zaledwie a/10, nie sumująca).
  
-Kod definiuje następujące zmienne sterujące ruchem w osi pionowej:+Obliczenie wyjścia regulatora kąta: 
 +;t1.angle = P · a – D · obrót + I · i_a
  
-- **desired_y** – zadana pozycja w osi Y. Początkowo ustawiona na 10, następnie dynamicznie zmieniana:   +t1_angle – dodatkowe skalowanie sygnału kąta.
-  <code>desired_y = 15 + 5 * t;</code> +
-- **error_y** – błąd położenia:   +
-  <code>error_y = desired_y - p1.y;</code> +
-- 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>   +
-- **i_y** – wartość całki błędu (integrator)+
  
-## Sterowanie siłą ciągu (thrust)+===== 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>
  
-Siła ciągu obliczana jest jako:   +Funkcja <code>line()</code> rysuje poziomą linię na wysokości zadanej w odniesieniu do pozycji p1.x.
-<code>t1.thrust = t1.saturation *   +
-  kp_y * error_y   +
-  – kd_y * p1.dy   +
-  + ki_y * i_y   +
-);   +
-thrust = t1.thrust / 100000;</code>+
  
-<code>t1.saturation</code> to limit sygnału wyjściowego silnika.   +Kilka wywołań <code>text()</code> wyświetla na ekranie:
-- Wynik dzielony jest przez 100 000, aby uzyskać wartość w [N].+
  
-## Regulacja kąta nachylenia+wartość siły ciągu (t1.thrust),
  
-Sterowanie tem realizowane jest osobnym regulatorem PID:+aktualny t (b1.heading),
  
-- **a** – żądany kąt:   +błąd kąta (a),
-  <code>[]a = pi   +
-  - (pi/180) * b1.heading   +
-  + 10 * (key2("1") - key2("2"));</code> +
-- 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>   +
-- **angle_err** – przeskalowany błąd kąta:   +
-  <code>angle_err = 50 * a;</code> +
-- **i_a** – integrator kąta:   +
-  <code>i_a = a / 10;</code> +
-- Obliczenie sygnału sterującego kątem:   +
-  <code>t1.angle = kp_a * a   +
-  - kd_a * b1.spin   +
-  + ki_a * i_a;   +
-t1_angle = 50 * t1.angle;</code>+
  
-## Część wizualizacyjna+wartość całki błędu osi y (i_y).
  
-W bloku graficznym rysowane są:+<code>plot()</code> generuje wykresy kolejnych sygnałów:
  
-- Pozioma linia w pozycji **desired_y**:   +s_y – sygnał błędu wysokości,
-  <code>line(p1.x-1000, desired_y,   +
-   p1.x+1000, desired_y,   +
-   blue, #3)</code> +
-- Dynamiczne teksty:   +
-  <code>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)</code> +
-- Wykresy sygnałów:   +
-  <code>plot s_y, thrust, angle_errt1_angle</code>+
  
-## Podsumowanie+thrust – siła ciągu,
  
-- Sterowanie położeniem w osi Y realizowane jest przez regulator PID (P, I, D).   +angle_err – błąd ta (skala),
-- Sterowanie tem nachylenia realizowane jest przez osobny regulator PID.   +
-- Blok wizualizacyjny umożliwia monitorowanie kluczowych parametrów w czasie rzeczywistym.  +
  
 +t1_angle – sygnał wyjściowy regulatora kąta.
  
  
-{{:projekty:rocket.gif?1000|}}+===== Pełen kod sterowania =====
  
 Kod: Kod:
projekty/symulacjarakiety.1746656534.txt.gz · ostatnio zmienione: przez administrator