import typing
from ._pathfinder import Segment, pathfinder_modify_swerve, pathfinder_modify_tank
__all__ = ["SwerveModifier", "TankModifier"]
[docs]class SwerveModifier:
"""
The Swerve Modifier will take in a Source Trajectory and spit out 4 trajectories, 1 for each wheel on the drive.
This is commonly used in robotics for robots with 4 individual wheels in a 'swerve' configuration, where each wheel
can rotate to a specified heading while still being powered.
The Source Trajectory is measured from the centre of the drive base. The modification will not modify the central
trajectory
"""
def __init__(self, source: typing.List[Segment]) -> None:
"""Create an instance of the modifier
:param source: The source (center) trajectory
"""
self.source = source
self.fl = None
self.fr = None
self.bl = None
self.br = None
[docs] def modify(
self, wheelbase_width: float, wheelbase_depth: float
) -> "SwerveModifier":
"""Generate the Trajectory Modification
:param wheelbase_width: The width (in meters) between the individual left-right sides of the drivebase
:param wheelbase_depth: The width (in meters) between the individual front-back sides of the drivebase
:returns: self
"""
self.fl, self.fr, self.bl, self.br = pathfinder_modify_swerve(
self.source, wheelbase_width, wheelbase_depth
)
return self
[docs] def getSourceTrajectory(self) -> typing.List[Segment]:
"""Get the initial source trajectory"""
return self.source
[docs] def getFrontLeftTrajectory(self) -> typing.List[Segment]:
"""Get the trajectory for the front-left wheel of the drive base"""
return self.fl
[docs] def getFrontRightTrajectory(self) -> typing.List[Segment]:
"""Get the trajectory for the front-right wheel of the drive base"""
return self.fr
[docs] def getBackLeftTrajectory(self) -> typing.List[Segment]:
"""Get the trajectory for the back-left wheel of the drive base"""
return self.bl
[docs] def getBackRightTrajectory(self) -> typing.List[Segment]:
"""Get the trajectory for the back-right wheel of the drive base"""
return self.br
[docs]class TankModifier:
"""
The Tank Modifier will take in a Source Trajectory and a Wheelbase Width and spit out a Trajectory for each
side of the wheelbase. This is commonly used in robotics for robots which have a drive system similar
to a 'tank', where individual parallel sides are driven independently
The Source Trajectory is measured from the centre of the drive base. The modification will not modify the central
trajectory
"""
def __init__(self, source: typing.List[Segment]) -> None:
"""Create an instance of the modifier
:param source: The source (center) trajectory
"""
self.source = source
self.left = None
self.right = None
[docs] def modify(self, wheelbase_width: float) -> "TankModifier":
"""Generate the Trajectory Modification
:param wheelbase_width: The width (in meters) between the individual sides of the drivebase
:returns: self
"""
self.left, self.right = pathfinder_modify_tank(self.source, wheelbase_width)
return self
[docs] def getSourceTrajectory(self) -> typing.List[Segment]:
"""Get the initial source trajectory"""
return self.source
[docs] def getLeftTrajectory(self) -> typing.List[Segment]:
"""Get the trajectory for the left side of the drive base"""
return self.left
[docs] def getRightTrajectory(self) -> typing.List[Segment]:
"""Get the trajectory for the right side of the drive base"""
return self.right