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:24] administratorprojekty:symulacjarakiety [2025/05/16 17:30] (aktualna) administrator
Linia 1: Linia 1:
-======= Sumulacja Rakiety w programie SimStructure =======+~~NOTOC~~
  
-{{:projekty:rocket.gif?1000|}}+======= Symulacja: kontrolera PID w programie SimStructure ======= 
 + 
 +{{:projekty:rocket.gif|}}
  
 pliki: pliki:
Linia 8: Linia 10:
   * {{ :projekty:ardugeek_rocket1.zip |}}   * {{ :projekty:ardugeek_rocket1.zip |}}
  
-===== 1. Deklaracja zmiennych =====+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ątowegoSymulacja 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> <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).+desired_y – zadana wartość wysokości (initialnie 10).
  
-    error_y – różnica między wartością zadaną a aktualną.+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).+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.+s_y, thrust, t1_angle – sygnały służące do dalszego przetwarzania i wizualizacji.
  
-    i_y – wewnętrzny akumulator (całkujący) regulatora.+i_y – wewnętrzny akumulator (całkujący) regulatora.
  
-===== 2. Regulator PID dla osi _Y =====+===== 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> <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).+Linia <code>desired_y = 15 + 5 * t;</code> powoduje zmianę zadanej wysokości liniowo w czasie (t to czas symulacji).
  
-    Obliczenie błędu: +Obliczenie błędu: 
-    ;error_y: Różnica między wysokością zadaną a bieżącą (p1.y).+;error_y: Różnica między wysokością zadaną a bieżącą (p1.y).
  
-    Całkowanie błędu: +Całkowanie błędu: 
-    ;i_y: Proste całkowanie przez przypisanie błędu (może być rozszerzone o sumowanie w pętli).+;i_y: Proste całkowanie przez przypisanie błędu (może być rozszerzone o sumowanie w pętli).
  
-    Wyjście regulatora: +Wyjście regulatora: 
-    ;t1.thrust = faktor_saturacji × (P · error – D · prędkość + I · całka).+;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.+Skalowanie sygnału siły ciągu (thrust) dzieleniem przez 100 000, by uzyskać odpowiednie jednostki/zakres.
  
-===== 3. Regulator PID dla kąta =====+===== 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; <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;
  
Linia 46: Linia 60:
 </code> </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").+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.+kp_a, kd_a, ki_a – współczynniki PID dla kąta.
  
-    angle_err – skalowany błąd kąta do wizualizacji.+angle_err – skalowany błąd kąta do wizualizacji.
  
-    i_a – całka błędu kąta (tu zaledwie a/10, nie sumująca).+i_a – całka błędu kąta (tu zaledwie a/10, nie sumująca).
  
-    Obliczenie wyjścia regulatora kąta: +Obliczenie wyjścia regulatora kąta: 
-    ;t1.angle = P · a – D · obrót + I · i_a+;t1.angle = P · a – D · obrót + I · i_a
  
-    t1_angle – dodatkowe skalowanie sygnału kąta.+t1_angle – dodatkowe skalowanie sygnału kąta.
  
-===== 4. Wizualizacja i wykresy =====+===== 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> <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. +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),+Kilka wywołań <code>text()</code> wyświetla na ekranie:
  
-        aktualny ką(b1.heading),+wartość siły ciągu (t1.thrust),
  
-        błąd ta (a),+aktualny (b1.heading),
  
-        wartość całki ędu osi y (i_y).+ąd kąta (a),
  
-    <code>plot()</code> generuje wykresy kolejnych sygnałów:+wartość całki błędu osi y (i_y).
  
-        s_y – sygnał błędu wysokości,+<code>plot()</code> generuje wykresy kolejnych sygnałów:
  
-        thrust – siłciągu,+s_y – sygnał błędu wysokości,
  
-        angle_err – błąd kąta (skala),+thrust – siła ciągu,
  
-        t1_angle – sygnał wyjściowy regulatora kąta.+angle_err – błąd kąta (skala),
  
 +t1_angle – sygnał wyjściowy regulatora kąta.
  
  
 +===== Pełen kod sterowania =====
  
 Kod: Kod:
projekty/symulacjarakiety.1746656659.txt.gz · ostatnio zmienione: przez administrator