Having calibrated the sensor once in its current position, it would be inconvenient to have to calibrate it each and every time that you ran the robot. Therefore, you can add the following code to your library to automatically save your calibration and read it from a file the next time you run your robot. To create a new calibration, either delete or rename mag.cal (which is created in the same folder as your script), or create your compass object compass(newCal=True).
Add the following code near the top of the file (after the imports statements):
FILENAME="mag.cal"
Change __init__(self) to __init__(self,newCal=False).
Also, consider the following line:
self.offset,self.scaling=self.calibrateCompass()
Change the previous line to the following line:
self.offset,self.scaling=self.readCal(newCal)
Add readCal() to the compass class, as follows:
def readCal(self,newCal=False,filename=FILENAME): if newCal==False: try: with open(FILENAME,'r') as magCalFile: line=magCalFile.readline() offset=line.split() line=magCalFile.readline() scaling=line.split() if len(offset)==0 or len(scaling)==0: raise ValueError() else: offset=list(map(float, offset)) scaling=list(map(float, scaling)) except (OSError,IOError,TypeError,ValueError) as e: print("No Cal Data") newCal=True pass if newCal==True: print("Perform New Calibration") offset,scaling=self.calibrateCompass() self.writeCal(offset,scaling) return offset,scaling
Add writeCal() to the compass class, as follows:
def writeCal(self,offset,scaling): if DEBUG:print("Write Calibration") if DEBUG:print("offset:"+str(offset)) if DEBUG:print("scaling:"+str(scaling)) with open(FILENAME,'w') as magCalFile: for value in offset: magCalFile.write(str(value)+" ") magCalFile.write("n") for value in scaling: magCalFile.write(str(value)+" ") magCalFile.write("n")