コード例 #1
0
ファイル: mpc_lti.py プロジェクト: simutisernestas/fsd
    def define_path(self):
        self.path.reset()
        max_length = self.waypoints.path_length
        self.define_margin_dist()

        # Find start index that corresponds to the desired smooth distance
        temp_ds = 0
        for i in range(0, max_length):
            if not ((i + 1) > max_length - 1):
                temp_ds += np.sqrt(
                    np.square(self.waypoints.x[i + 1] - self.waypoints.x[i]) +
                    np.square(self.waypoints.y[i + 1] - self.waypoints.y[i]))
                if temp_ds > self.margin_dist:
                    self.margin_idx = i + 1
                    break
            else:
                pass

        temp_waypoints_x = self.waypoints.x[:] + self.waypoints.x[:self.
                                                                  margin_idx]
        temp_waypoints_y = self.waypoints.y[:] + self.waypoints.y[:self.
                                                                  margin_idx]

        # Interpolate the waypoints
        spline = sp.Spline2D(temp_waypoints_x, temp_waypoints_y)

        # Arrange the waypoints with a defined distance interval self.ds_step
        s = np.arange(0, spline.s[-1], self.ds_step)

        # Cut parts of interpolation to smooth interpolation for start area with curvature
        found_start_waypoint = False
        temp_first = [[], []]
        for i_s in s:
            if i_s < self.margin_dist / 2.:
                pass
            else:
                i_x, i_y = spline.calc_position(i_s)
                i_k = spline.calc_curvature(i_s)
                if not found_start_waypoint:
                    temp_first[0] = i_x
                    temp_first[1] = i_y
                    found_start_waypoint = True

                if (s[-1] - i_s) < self.margin_dist / 2:

                    temp_ds = np.sqrt(
                        np.square(i_x - temp_first[0]) +
                        np.square(i_y - temp_first[1]))
                    if temp_ds < self.margin_connect_dist:
                        break
                self.path.append(i_x, i_y, i_s, i_k)
        self.idx_max = len(self.path.x)
コード例 #2
0
def cubic_spline(points):
    x_pts = [x[0] for x in points]
    y_pts = [x[1] for x in points]
    ds = 0.01
    sp = spline.Spline2D(x_pts, y_pts)
    s = np.arange(0, sp.s[-1], ds)
    rx, ry, ryaw, rk = [], [], [], []
    for i_s in s:
        ix, iy = sp.calc_position(i_s)
        rx.append(ix)
        ry.append(iy)
        ryaw.append(sp.calc_yaw(i_s))
        rk.append(sp.calc_curvature(i_s))
    plt.plot(x_pts, y_pts, "xb", label="input")
    plt.plot(rx, ry, "-r", label="spline")
    spline_pts = tuple(zip(rx, ry))
    return spline_pts
コード例 #3
0
import spline as sp
import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 2 * np.pi, 20)
kx = 2
ky = 3
x = np.cos(kx * t)
y = np.sin(ky * t)

curve = sp.Spline2D(t, x, y)
t_range = np.linspace(0.01, 2 * np.pi - 0.01, 100)
points = [curve.interpolate(t) for t in t_range]
px = [p[0] for p in points]
py = [p[1] for p in points]
plt.figure()
plt.plot(px, py, marker='.', label='interpolation')
plt.scatter(x, y, c='red', marker='X', label='real')
plt.legend()
plt.show()


コード例 #4
0
import spline as sp
import numpy as np
import matplotlib.pyplot as plt

coordinates = [(0, 0), (0.42, 0.46), (1.04, 1.33), (2, 3), (3.2, 4.8),
               (5.12, 6.2), (7.25, 6.14), (8.8, 5.18), (10, 4), (10.1, 2.6),
               (9.16, 2), (7.85, 2.5), (6.4, 2.7), (5.8, 1.4), (5.2, 0.2),
               (4.5, -0.8), (3.4, -1.5), (2.4, -0.5), (1, -0.9), (0.14, -0.6),
               (0, 0)]
c = [list(c) for c in zip(*coordinates)]

t = np.linspace(0, 10, len(coordinates))
t_range = np.arange(0, t[-1], 0.1)
curve = sp.Spline2D(t, c[0], c[1])
points = [curve.interpolate(t) for t in t_range]
px = [p[0] for p in points]
py = [p[1] for p in points]
plt.figure()
plt.scatter(px, py, marker='.', label='interpolation')
plt.scatter(c[0], c[1], c='red', marker='X', label='real')
plt.legend()
plt.show()