Fuzzy Logic Controller of 3D Pole Balancing

Опубликовано: 01 Октябрь 2024
на канале: FuzzyLite
13,737
22

A simulation of a Fuzzy Logic Controller on a 3D Pole Balancing.
The virtual world was created using Bullet Physics Engine.
The Fuzzy Logic library used was fuzzylite (http://www.fuzzylite.com/).

This work was supported by Foundation for the Advancement of Soft Computing

FUNCTION_BLOCK pole-balancing-3d

VAR_INPUT
AngleX: REAL;
AngleZ: REAL;
END_VAR

FUZZIFY AngleX
TERM NEAR_0 := Shoulder left(0 60);
TERM NEAR_45 := Triangular (30 60 90);
TERM NEAR_90 := Triangular (60 90 120);
TERM NEAR_135 := Triangular (90 120 150);
TERM NEAR_180 := Shoulder right(120 180);
END_FUZZIFY

FUZZIFY AngleZ
TERM NEAR_0 := Shoulder left(0 60);
TERM NEAR_45 := Triangular (30 60 90);
TERM NEAR_90 := Triangular (60 90 120);
TERM NEAR_135 := Triangular (90 120 150);
TERM NEAR_180 := Shoulder right(120 180);
END_FUZZIFY

VAR_OUTPUT
ForceX: REAL
ForceZ: REAL
END_VAR

DEFUZZIFY ForceX
TERM NL := Triangular (-1 -0.666667 -0.333333);
TERM NS := Triangular (-0.666667 -0.333333 5.96046e-08);
TERM ZR := Triangular (-0.333333 5.96046e-08 0.333333);
TERM PS := Triangular (5.96046e-08 0.333333 0.666667);
TERM PL := Triangular (0.333333 0.666667 1);
END_DEFUZZIFY

DEFUZZIFY ForceZ
TERM NL := Triangular (-1 -0.666667 -0.333333);
TERM NS := Triangular (-0.666667 -0.333333 5.96046e-08);
TERM ZR := Triangular (-0.333333 5.96046e-08 0.333333);
TERM PS := Triangular (5.96046e-08 0.333333 0.666667);
TERM PL := Triangular (0.333333 0.666667 1);
END_DEFUZZIFY

RULEBLOCK Rules
RULE 1: if AngleX is NEAR_180 then ForceX is NL;
RULE 2: if AngleX is NEAR_135 then ForceX is NS;
RULE 3: if AngleX is NEAR_90 then ForceX is ZR;
RULE 4: if AngleX is NEAR_45 then ForceX is PS;
RULE 5: if AngleX is NEAR_0 then ForceX is PL;
RULE 6: if AngleZ is NEAR_180 then ForceZ is NL;
RULE 7: if AngleZ is NEAR_135 then ForceZ is NS;
RULE 8: if AngleZ is NEAR_90 then ForceZ is ZR;
RULE 9: if AngleZ is NEAR_45 then ForceZ is PS;
RULE 10: if AngleZ is NEAR_0 then ForceZ is PL;
END_RULEBLOCK

END_FUNCTION_BLOCK