@lib.api_call
    def move(self, speed, angle=0):
        """Move holonomically without rotation.

        :param speed: Magnitude of robot's translation speed (% of max).
        :type speed: float
        :param angle: Angle of translation in degrees (90=left, 270=right).
        :type angle: float
        """
        # TODO(Vijay): Test this functionality
        # Validate params
        self.logger.debug("speed: {}, angle: {}".format(speed, angle))
        try:
            assert OmniDriver.min_speed <= speed <= OmniDriver.max_speed
        except AssertionError:
            raise AssertionError("Speed is out of bounds")

        # Angle bounds may be unnecessary

        try:
            assert OmniDriver.min_angle <= angle <= OmniDriver.max_angle
        except __HOLE__:
            raise AssertionError("Angle is out of bounds")

        # Handle zero speed, prevent divide-by-zero error
        if speed == 0:  # TODO deadband (epsilon) check?
            self.logger.debug("Special case for speed == 0")
            self.set_motor("north", 0)
            self.set_motor("south", 0)
            self.set_motor("east", 0)
            self.set_motor("west", 0)
            return

        # Calculate motor speeds
        north = speed * -sin(angle * pi / 180)
        south = speed * -sin(angle * pi / 180)
        west = speed * cos(angle * pi / 180)
        east = speed * cos(angle * pi / 180)
        self.logger.debug((
            "pre-scale : north: {:6.2f}, south: {:6.2f},"
            " east: {:6.2f}, west: {:6.2f}").format(
                north, south, east, west))

        # Find largest motor speed,
        # use that to normalize multipliers and maintain maximum efficiency
        max_wheel_speed = max(
            [fabs(north), fabs(south),
                fabs(east), fabs(west)]
        )
        north = north * speed / max_wheel_speed
        south = south * speed / max_wheel_speed
        west = west * speed / max_wheel_speed
        east = east * speed / max_wheel_speed
        self.logger.debug(
            ("post-scale: north: {:6.2f}, south: {:6.2f},"
                " west: {:6.2f}, east: {:6.2f}").format(
                    north, south, west, east))

        # Set motor speeds
        self.set_motor("north", north)
        self.set_motor("south", south)
        self.set_motor("west", west)
        self.set_motor("east", east)

    # @lib.api_call
    # NOTE(Vijay): Not yet implemented
dataset/ETHPy150Open IEEERobotics/bot/bot/driver/omni_driver.py/OmniDriver.move