All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.flash3388.flashlib.robot.systems.HolonomicDrive Maven / Gradle / Ivy

There is a newer version: 3.2.7
Show newest version
package com.flash3388.flashlib.robot.systems;

import com.beans.util.function.Suppliers;
import com.flash3388.flashlib.robot.motion.HolonomicDriveSpeed;
import com.flash3388.flashlib.scheduling.actions.Action;
import com.jmath.vectors.Vector2;

import java.util.function.DoubleSupplier;
import java.util.function.Supplier;

public interface HolonomicDrive extends Movable2d, Rotatable {

    @Override
    default Action move(DoubleSupplier speed) {
        return holonomicDrive(()-> new HolonomicDriveSpeed(new Vector2(0, speed.getAsDouble()), 0));
    }

    @Override
    default Action move(double speed) {
        return holonomicDrive(new HolonomicDriveSpeed(new Vector2(0, speed), 0));
    }

    @Override
    default Action move2d(Supplier speed) {
        return holonomicDrive(()-> new HolonomicDriveSpeed(speed.get(), 0));
    }

    @Override
    default Action move2d(Vector2 speed) {
        return holonomicDrive(new HolonomicDriveSpeed(speed, 0));
    }

    @Override
    default Action rotate(DoubleSupplier speed) {
        return holonomicDrive(()-> new HolonomicDriveSpeed(new Vector2(), speed.getAsDouble()));
    }

    @Override
    default Action rotate(double speed) {
        return holonomicDrive(new HolonomicDriveSpeed(new Vector2(), speed));
    }

    /**
     * Moves the drive system.
     *
     * @param speed supplier of speed for motors [-1, 1].
     * @return action to perform motion.
     */
    Action holonomicDrive(Supplier speed);

    /**
     * Moves the drive system.
     *
     * @param speed speed for motors [-1, 1].
     * @return action to perform motion.
     */
    default Action holonomicDrive(HolonomicDriveSpeed speed) {
        return holonomicDrive(Suppliers.of(speed));
    }

    /**
     * Moves the drive system using a 2d motion vector and a rotation value.
     *
     * @param vector supplier of 2d motion vector describing motion along y and x axes.
     * @param rotation supplier of rotation value [-1...1] describing rotation modifier
     *                 to the motion.
     * @return action to perform motion.
     */
    default Action holonomicDrive(Supplier vector, DoubleSupplier rotation) {
        return holonomicDrive(()-> new HolonomicDriveSpeed(vector.get(), rotation.getAsDouble()));
    }

    /**
     * Moves the drive system using a 2d motion vector and a rotation value.
     *
     * @param vector 2d motion vector describing motion along y and x axes.
     * @param rotation rotation value [-1...1] describing rotation modifier
     *                 to the motion.
     * @return action to perform motion.
     */
    default Action holonomicDrive(Vector2 vector, double rotation) {
        return holonomicDrive(new HolonomicDriveSpeed(vector, rotation));
    }

    /**
     * Moves the drive system using a given Cartesian vector.
     *
     * @param y the y-coordinate of the vector
     * @param x the x-coordinate of the vector
     * @param rotation the degree of rotation
     * @return action to perform motion.
     */
    default Action holonomicCartesian(double y, double x, double rotation) {
        return holonomicDrive(new HolonomicDriveSpeed(new Vector2(x, y), rotation));
    }

    /**
     * Moves the drive system using a given Polar vector.
     *
     * @param magnitude the magnitude of the vector
     * @param direction the angle of the vector from the y-axis
     * @param rotation the degree of rotation
     * @return action to perform motion.
     */
    default Action holonomicPolar(double magnitude, double direction, double rotation) {
        return holonomicDrive(new HolonomicDriveSpeed(Vector2.polar(magnitude, direction), rotation));
    }

    /**
     * {@inheritDoc}
     */
    @Override
    void stop();
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy