# -*- coding: utf-8 -*- from simulation import Controller class FuzzyController(Controller.Controller): """Fuzzy controller.""" def __init__(self): super(FuzzyController,self).__init__() self.system = self.createSystem() def createSystem(self): import fuzzy.storage.fcl.Reader import os.path system = fuzzy.storage.fcl.Reader.Reader().load_from_file( os.path.sep.join([os.path.dirname(__file__),"container_crane.fcl"]) ) system.description = """This fuzzy system is to control the container crane.""" return system def calculate(self,input={},output={'a':0.0}): my_input = { "distance":input["X"], "angle":-(input["Phi"]-270.), } my_output = { "power": 0.0 } self.system.calculate(my_input,my_output) output['a'] = -my_output["power"]/1.0 # hold old value if no results in next calculations #self.system.variables['power'].defuzzify.failsafe = output['power'] #print input,output #print my_input,my_output return output def createDoc(self,directory): from fuzzy.doc.plot.gnuplot import doc d = doc.Doc(directory) d.createDoc(self.system) d.overscan=0 d.create3DPlot(self.system,"distance","angle","power",{}) def createDot(self,directory): import fuzzy.doc.structure.dot.dot import subprocess for name,rule in self.system.rules.items(): cmd = "dot -T png -o '%s/Rule %s.png'" % (directory,name) proc = subprocess.Popen(cmd, shell=True, bufsize=32768, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) fuzzy.doc.structure.dot.dot.print_header(proc.stdin, "XXX") fuzzy.doc.structure.dot.dot.print_dot(rule, proc.stdin, self.system, "") fuzzy.doc.structure.dot.dot.print_footer(proc.stdin) proc.communicate() cmd = "dot -T png -o '%s/System.png'" % directory proc = subprocess.Popen(cmd, shell=True, bufsize=32768, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) fuzzy.doc.structure.dot.dot.printDot(self.system, proc.stdin) proc.communicate()