Source code for pyrobopath.toolpath.path.path_core
from abc import ABC, abstractmethod
from typing import List
import numpy as np
from pyrobopath.tools.types import ArrayLike3, NDArray
from pyrobopath.tools.linalg import unit_vector
from pyrobopath.toolpath.path.transform import Transform, Rotation
from pyrobopath.toolpath.path.spline import CubicBSpline, CubicBSpline2
[docs]
class Path(ABC):
@abstractmethod
def sample(self, s: float) -> Transform:
pass
@abstractmethod
def length(self) -> float:
pass
[docs]
class LinearSegment(Path):
def __init__(self, start: Transform, end: Transform):
self.start = start
self.end = end
def sample(self, s: float) -> Transform:
return self.start.interp(self.end, s)
def length(self) -> float:
return float(np.linalg.norm(self.start.t - self.end.t))
def vec(self) -> NDArray:
return self.end.t - self.start.t
def unit_vec(self) -> NDArray:
return unit_vector(self.vec())
[docs]
class CubicBSplineSegment(Path):
"""
A uniform cubic B-spline defined on the knot interval [0,1]
"""
def __init__(
self,
control_points: List[ArrayLike3],
orient_s: Rotation,
orient_e: Rotation,
):
self.spline = CubicBSpline2(control_points)
self.orient_s = orient_s
self.orient_e = orient_e
def sample(self, s: float) -> Transform:
return Transform(self.spline(s), self.orient_s.interp(self.orient_e, s).quat)
def length(self) -> float:
raise NotImplementedError