-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathTrajectoryWaypoint.py
58 lines (48 loc) · 1.93 KB
/
TrajectoryWaypoint.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
from OptimalSplineGen import Waypoint
import OptimalSplineGen
import numpy as np
import itertools
import scipy.optimize
from math import factorial
class TrajectoryWaypoint:
def __init__(self, ndim):
self.time = None
self.pos = None
if isinstance(ndim, int):
self.ndim = ndim
self.spline_pins = [Waypoint(None) for i in range(self.ndim)]
elif isinstance(ndim, tuple):
self.ndim = len(ndim)
self.spline_pins = [Waypoint(None) for i in range(self.ndim)]
self.add_hard_constraints(0, ndim)
else:
raise ValueError("no")
self.soft_directional_constraints = []
def add_hard_constraints(self, order, values):
assert len(values) == self.ndim
for i, v in enumerate(values):
self.spline_pins[i].add_hard_constraint(order, v)
if order == 0:
self.pos = values
def add_soft_constraints(self, order, values, radii):
assert len(values) == self.ndim
for i, v in enumerate(values):
self.spline_pins[i].add_soft_constraint(order, v, radii[i])
def add_hard_constraint(self, order, dim, value):
self.spline_pins[dim].add_hard_constraint(order, value)
def add_soft_constraint(self, order, dim, value, radius):
self.spline_pins[dim].add_soft_constraint(order, value, radius)
# TODO: support directional constraints that only use *some* of the dimensions
def add_soft_directional_constraint(self, order, values, radius):
self.soft_directional_constraints.append((order, values, radius))
def add_hard_directional_constraint(self, order, values):
self.add_soft_directional_constraint(order, values, 0)
def set_time(self, t):
self.time = t
for sp in self.spline_pins:
sp.time = t
def get_pos(self):
if self.pos is None:
return None
else:
return self.pos