Пример #1
0
    def setUp(self):
        ds = pandas.DataFrame.from_records([
            {
                "c": "A",
                "n": 10,
                "b": True,
                "s": 1,
                "w": 1
            },
            {
                "c": "B",
                "n": 11,
                "b": False,
                "s": 1,
                "w": 10
            },
            {
                "c": "C",
                "n": 20,
                "b": 0.5,
                "s": 1,
                "w": 5
            },
            {
                "c": "A",
                "n": 42,
                "b": 0.3,
                "s": 1,
                "w": 6
            },
        ])
        if hasattr(ds, "to_dense"):
            ds = ds.to_dense()
        ds.loc[:, "c"] = pandas.Series(pandas.Categorical(ds.loc[:, "c"]))

        self.schema = {
            "c": "categorical",
            "n": "numerical",
            "b": "binary",
            "w": "weight",
            "s": "stop",  #this won't appear in the dmat
        }
        self.chs = Chassis(self.schema, ds)
        b = ds.loc[:, "b"]
        n = ds.loc[:, "n"]
        abc = pandas.concat(
            [
                ds.loc[:, "c"] == "A", ds.loc[:, "c"] == "B", ds.loc[:, "c"]
                == "C"
            ],
            axis=1,
        ).astype(int)
        abc.columns = ("c_A", "c_B", "c_C")

        self.expected = {
            'c': (ds.loc[:, ["b", "n"]], ds["c"]),
            'n': (pandas.concat([abc, b], axis=1), n),
            'b': (pandas.concat([abc, n], axis=1), b)
        }
        self.ds = ds
Пример #2
0
    def __init__(self, initialState: State = State.GET_HEALTHY_HIVE):
        self.__pos = None
        self.__dir = None

        self.speedRight = 0
        self.speedLeft = 0

        self.speedRightOld = 0
        self.speedLeftOld = 0

        self.target = Point(0, 0)

        self.robotDirTargetHist = deque([180.0] * HIST_QUEUE_LENGTH)
        self.robotDistTargetHist = deque([math.inf] * HIST_QUEUE_LENGTH)

        self.targetDistance = 9999
        self.targetAngle = 9999

        self.state = initialState
        self.stateOld = initialState

        self.gameData = None

        self.stateChanged = False

        self.pidController = PidController()
        self.chassis = Chassis()
Пример #3
0
	def testChassisSchemaCorrecttness(self):
		for dsName, ds in self.datasets.items():
			with self.subTest(dsName=dsName):
				if ds.spec:
					Chassis(ds.spec, ds.pds)
				else:
					print(repr(dsName), ":", Chassis.specFromPandas(ds.pds))
Пример #4
0
class SimpleTests(unittest.TestCase):
    def setUp(self):
        ds = pandas.DataFrame.from_records([
            {
                "c": "A",
                "n": 10,
                "b": True,
                "s": 1,
                "w": 1
            },
            {
                "c": "B",
                "n": 11,
                "b": False,
                "s": 1,
                "w": 10
            },
            {
                "c": "C",
                "n": 20,
                "b": 0.5,
                "s": 1,
                "w": 5
            },
            {
                "c": "A",
                "n": 42,
                "b": 0.3,
                "s": 1,
                "w": 6
            },
        ])
        if hasattr(ds, "to_dense"):
            ds = ds.to_dense()
        ds.loc[:, "c"] = pandas.Series(pandas.Categorical(ds.loc[:, "c"]))

        self.schema = {
            "c": "categorical",
            "n": "numerical",
            "b": "binary",
            "w": "weight",
            "s": "stop",  #this won't appear in the dmat
        }
        self.chs = Chassis(self.schema, ds)
        b = ds.loc[:, "b"]
        n = ds.loc[:, "n"]
        abc = pandas.concat(
            [
                ds.loc[:, "c"] == "A", ds.loc[:, "c"] == "B", ds.loc[:, "c"]
                == "C"
            ],
            axis=1,
        ).astype(int)
        abc.columns = ("c_A", "c_B", "c_C")

        self.expected = {
            'c': (ds.loc[:, ["b", "n"]], ds["c"]),
            'n': (pandas.concat([abc, b], axis=1), n),
            'b': (pandas.concat([abc, n], axis=1), b)
        }
        self.ds = ds

    def shouldColumnBePresent(self, cn):
        return self.schema[cn] not in {"stop", "weight"}

    def checkCovariates(self, cn):
        if self.shouldColumnBePresent(cn):
            assert_frame_equal(self.chs.prepareCovariates(cn),
                               self.expected[cn][0],
                               check_like=True,
                               check_dtype=False)

    def checkResult(self, cn):
        if self.shouldColumnBePresent(cn):
            assert_series_equal(self.chs.prepareResults(cn),
                                self.expected[cn][1],
                                check_dtype=False,
                                check_categorical=False)
        else:
            with self.assertRaises(Exception):
                self.chs.prepareResults(cn)

    def testCovariates(self):
        for cn in self.schema:
            self.checkCovariates(cn)

    def testResult(self):
        for cn in self.schema:
            self.checkResult(cn)
Пример #5
0
class Controller:
    def __init__(self, initialState: State = State.GET_HEALTHY_HIVE):
        self.__pos = None
        self.__dir = None

        self.speedRight = 0
        self.speedLeft = 0

        self.speedRightOld = 0
        self.speedLeftOld = 0

        self.target = Point(0, 0)

        self.robotDirTargetHist = deque([180.0] * HIST_QUEUE_LENGTH)
        self.robotDistTargetHist = deque([math.inf] * HIST_QUEUE_LENGTH)

        self.targetDistance = 9999
        self.targetAngle = 9999

        self.state = initialState
        self.stateOld = initialState

        self.gameData = None

        self.stateChanged = False

        self.pidController = PidController()
        self.chassis = Chassis()

    def update(self, gameData: GameData, target: Point):

        if self.state != self.stateOld:
            self.stateChanged = True
        else:
            self.stateChanged = False
        self.stateOld = self.state

        self.gameData = gameData
        self.target = target

        if gameData.homeRobot is not None:
            self.__pos = gameData.homeRobot.pos
            self.__dir = gameData.homeRobot.dir

            if self.target is not None:
                self.targetDistance = self.distance(self.target)
                self.targetAngle = self.angle(self.target)

                self.robotDirTargetHist.popleft()
                self.robotDirTargetHist.append(self.targetAngle)
                self.robotDistTargetHist.popleft()
                self.robotDistTargetHist.append(self.targetDistance)

    def distance(self, point: Point) -> float:
        return self.__pos.distance(point)

    def angle(self, point: Point) -> float:
        """
        Izračunaj kot, za katerega se mora zavrteti robot, da bo obrnjen proti točki p2.
        Robot se nahaja v točki p1 in ima smer (kot) a1.
        """
        a = math.degrees(math.atan2(point.y - self.__pos.y, point.x - self.__pos.x))
        a_rel = a - self.__dir
        if abs(a_rel) > 180:
            if a_rel > 0:
                a_rel = a_rel - 360
            else:
                a_rel = a_rel + 360

        return a_rel

    def getClosestHive(self, hiveType: HiveTypeEnum) -> Hive:
        if hiveType == HiveTypeEnum.HIVE_HEALTHY:
            return min(self.gameData.healthyHives, key=lambda hive: hive.pos.distance(self.__pos))
        elif hiveType == HiveTypeEnum.HIVE_DISEASED:
            return min(self.gameData.diseasedHives, key=lambda hive: hive.pos.distance(self.__pos))

    def atTargetEPS(self) -> bool:
        return self.targetDistance < DIST_EPS

    def atTargetNEAR(self) -> bool:
        return self.targetDistance < DIST_NEAR

    def atTargetHIST(self) -> bool:
        err = [d > DIST_EPS for d in self.robotDistTargetHist]
        return sum(err) == 0

    def isTurned(self) -> bool:
        err = [abs(a) > DIR_EPS for a in self.robotDirTargetHist]

        if sum(err) == 0:
            self.speedRight = 0
            self.speedLeft = 0
            return True

        return False

    def hasStateChanged(self) -> bool:
        return self.state != self.stateOld

    def setStates(self, new: State, old: State) -> None:
        self.state = new
        self.stateOld = old

    def setSpeedToZero(self) -> None:
        self.chassis.runMotors(0, 0)

    def runMotors(self) -> None:
        self.speedRight = round(min(max(self.speedRight, -SPEED_MAX), SPEED_MAX))
        self.speedLeft = round(min(max(self.speedLeft, -SPEED_MAX), SPEED_MAX))

        self.chassis.runMotors(self.speedRight, self.speedLeft)

        self.speedRightOld = self.speedRight
        self.speedLeftOld = self.speedLeft

    def breakMotors(self) -> None:
        self.chassis.breakMotors()

    def robotDie(self) -> None:
        self.chassis.robotDie()

    def isRobotAlive(self) -> bool:
        return (self.__pos is not None) and (self.__dir is not None)

    def updatePIDTurn(self) -> None:
        u = self.pidController.PIDTurn.update(self.targetAngle)
        self.speedRight = -u
        self.speedLeft = u

    def resetPIDTurn(self) -> None:
        self.pidController.PIDTurn.reset()

    def updatePIDStraight(self) -> None:

        base = self.pidController.PIDForwardBase.update(self.targetDistance)
        turn = self.pidController.PIDForwardTurn.update(self.targetAngle)

        base = min(max(base, -SPEED_BASE_MAX), SPEED_BASE_MAX)
        self.speedRight = -base - turn
        self.speedLeft = -base + turn

    def resetPIDStraight(self) -> None:
        self.pidController.PIDForwardBase.reset()
        self.pidController.PIDForwardTurn.reset()
Пример #6
0
 def __init__(self):
     Chassis.__init__(self, RunningGearAudi(), TransmissionAudi(), ControlSystemAudi)
Пример #7
0
 def __init__(self):
     Chassis.__init__(self, RunningGearFord(), TransmissionFord(), ControlSystemFord)
def main():
    chassis = Chassis()
    chassis.build()
    chassis.run()