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