예제 #1
0
def main():
    sx, sy, syaw = 10.0, 1.0, np.deg2rad(180.0)
    gx, gy, gyaw = 0.0, -3.0, np.deg2rad(-45.0)
    offset = 3.0

    path, control_points = calc_4points_bezier_path(sx, sy, syaw, gx, gy, gyaw,
                                                    offset)

    t = 0.8  # Number in [0, 1]
    x_target, y_target = bezier(t, control_points)
    derivatives_cp = bezier_derivatives_control_points(control_points, 2)
    point = bezier(t, control_points)
    dt = bezier(t, derivatives_cp[1])
    ddt = bezier(t, derivatives_cp[2])
    # Radius of curv
    radius = 1 / curvature(dt[0], dt[1], ddt[0], ddt[1])
    # Normalize derivative
    dt /= np.linalg.norm(dt, 2)
    tangent = np.array([point, point + dt])
    normal = np.array([point, point + [-dt[1], dt[0]]])
    curvature_center = point + np.array([-dt[1], dt[0]]) * radius
    circle = plt.Circle(tuple(curvature_center),
                        radius,
                        color=(0, 0.8, 0.8),
                        fill=False,
                        linewidth=1)

    assert path.T[0][0] == sx, "path is invalid"
    assert path.T[1][0] == sy, "path is invalid"
    assert path.T[0][-1] == gx, "path is invalid"
    assert path.T[1][-1] == gy, "path is invalid"

    fig, ax = plt.subplots()
    ax.plot(path.T[0], path.T[1], label="Bezier Path")
    ax.plot(control_points.T[0],
            control_points.T[1],
            '--o',
            label="Control Points")
    ax.plot(x_target, y_target)
    ax.plot(tangent[:, 0], tangent[:, 1], label="Tangent")
    ax.plot(normal[:, 0], normal[:, 1], label="Normal")
    ax.add_artist(circle)
    draw.Arrow(sx, sy, syaw, 1, "darkorange")
    draw.Arrow(gx, gy, gyaw, 1, "darkorange")
    plt.grid(True)
    plt.title("Bezier Path: from Atsushi's work")
    ax.axis("equal")
    plt.show()
예제 #2
0
def main():
    sx, sy, syaw = 10.0, 1.0, np.deg2rad(180.0)
    gx, gy, gyaw = 0.0, -3.0, np.deg2rad(-45.0)

    offset = 3.0
    dist = np.hypot(sx - gx, sy - gy) / offset
    control_points = np.array(
        [[sx, sy], [sx + dist * np.cos(syaw), sy + dist * np.sin(syaw)],
         [gx - dist * np.cos(gyaw), gy - dist * np.sin(gyaw)], [gx, gy]])

    bz = BezierCurve(control_points)
    path = bz.calc_path(100)
    t = 0.8
    point = bz.calc_deriv(t, 0)
    pdt = bz.calc_deriv(t, 1)
    pddt = bz.calc_deriv(t, 2)
    # Radius of curv
    radius = 1 / curvature(pdt[0], pdt[1], pddt[0], pddt[1])
    # Normalize derivative
    pdt /= np.linalg.norm(pdt, 2)
    tangent = np.array([point, point + pdt])
    normal = np.array([point, point + [-pdt[1], pdt[0]]])
    curvature_center = point + np.array([-pdt[1], pdt[0]]) * radius

    assert path[0, 0] == sx and path[0, 1] == sy, "path is invalid"
    assert path[-1, 0] == gx and path[-1, 1] == gy, "path is invalid"

    fig, ax = plt.subplots()
    yaw = np.linspace(-np.pi, np.pi)
    circle = curvature_center + radius * np.array([np.cos(yaw), np.sin(yaw)]).T
    ax.plot(control_points.T[0],
            control_points.T[1],
            '--o',
            label="Control Points")

    plt.plot(path[:, 0], path[:, 1], label='Bezier Curve')
    ax.plot(tangent[:, 0], tangent[:, 1], label="Tangent")
    ax.plot(normal[:, 0], normal[:, 1], label="Normal")
    ax.plot(circle[:, 0], circle[:, 1], c='cyan', label='Curvature Circle')
    draw.Arrow(sx, sy, syaw, 1, "darkorange")
    draw.Arrow(gx, gy, gyaw, 1, "darkorange")
    plt.grid(True)
    plt.title("Bezier Path")
    ax.axis("equal")
    plt.legend()
    plt.show()
예제 #3
0
def main():
    # choose states pairs: (s, y, yaw)
    # simulation-1
    # states = [(0, 0, 0), (10, 10, -90), (20, 5, 60), (30, 10, 120),
    #           (35, -5, 30), (25, -10, -120), (15, -15, 100), (0, -10, -90)]

    # simulation-2
    states = [(-3, 3, 120), (10, -7, 30), (10, 13, 30), (20, 5, -25),
              (35, 10, 180), (32, -10, 180), (5, -12, 90)]

    max_c = 0.1  # max curvature
    path_x, path_y, yaw = [], [], []

    for i in range(len(states) - 1):
        s_x = states[i][0]
        s_y = states[i][1]
        s_yaw = np.deg2rad(states[i][2])
        g_x = states[i + 1][0]
        g_y = states[i + 1][1]
        g_yaw = np.deg2rad(states[i + 1][2])

        path_i = calc_optimal_path(s_x, s_y, s_yaw,
                                   g_x, g_y, g_yaw, max_c)

        path_x += path_i.x
        path_y += path_i.y
        yaw += path_i.yaw

    # animation
    plt.ion()
    plt.figure(1)

    for i in range(len(path_x)):
        plt.clf()
        plt.plot(path_x, path_y, linewidth=1, color='gray')

        for x, y, theta in states:
            draw.Arrow(x, y, np.deg2rad(theta), 2, 'blueviolet')

        draw.Car(path_x[i], path_y[i], yaw[i], 1.5, 3)

        plt.axis("equal")
        plt.title("Simulation of Reeds-Shepp Curves")
        plt.axis([-10, 42, -20, 20])
        plt.draw()
        plt.pause(0.001)

    plt.pause(1)
예제 #4
0
def main():
    PATH = [(0, 0, 0), (10, 10, -90), (20, 5, 60), (30, 10, 120), (35, -5, 30),
            (25, -10, -120), (15, -15, 100), (0, -10, -90)]

    for i in range(len(PATH) - 1):
        sx, sy, syaw = PATH[i]
        gx, gy, gyaw = PATH[i + 1]
        syaw = math.radians(syaw)
        gyaw = math.radians(gyaw)
        rs = ReedsShepp(sx, sy, syaw, gx, gy, gyaw, 1.0 / 4, 0.1)
        paths = rs.get_all_paths()
        # for path in paths:
        #     plt.plot(path[:, 0], path[:, 1])
        opt_path = rs.get_optimal_path()
        plt.plot(opt_path[:, 0], opt_path[:, 1], linewidth=1, color='gray')

    for x, y, theta in PATH:
        draw.Arrow(x, y, np.deg2rad(theta), 2, 'blueviolet')
    plt.xlabel('X [m]')
    plt.ylabel('Y [m]')
    plt.title('Reeds Shepp curve')
    plt.axis("equal")
    plt.show()
예제 #5
0
    from myterial import pink

    import draw

    f, ax = plt.subplots(figsize=(7, 10))

    # load and draw tracking data
    from fcutils.path import files

    for fp in files(
            "/Users/federicoclaudi/Dropbox (UCL)/Rotation_vte/Locomotion/analysis/control/",
            "*.h5",
    ):
        tracking = pd.read_hdf(fp, key="hdf")
        tracking.x = 20 - tracking.x + 20
        # draw.Tracking.scatter(tracking.x, tracking.y, c=tracking.theta, vmin=0, vmax=360, cmap='bwr', lw=1, ec='k')
        draw.Tracking(tracking.x, tracking.y, alpha=0.7)

    # draw hairpin arena
    draw.Hairpin(ax)

    # draw waypoints
    wps = Waypoints()
    for wp in wps:
        draw.Arrow(wp.x, wp.y, wp.theta, 2, width=4, color=pink, outline=True)

    # fit dubin path
    dubin = DubinPath(wps).fit()
    draw.Tracking(dubin.x, dubin.y, lw=2, color="k")
    plt.show()
예제 #6
0
def animate_one(ROI: str, crossing_id: int, FPS: int):
    scale = 1 / 30  # to scale velocity vectors
    save_folder = (paths.analysis_folder / "behavior" /
                   "roi_crossings_animations")

    # ----------------------------------- prep ----------------------------------- #
    # load tracking
    bouts = pd.read_hdf(paths.analysis_folder / "behavior" / "roi_crossings" /
                        f"{ROI}_crossings.h5")
    bout = bouts.sort_values("duration").iloc[crossing_id]
    logger.info(f"Animating bout {crossing_id} - {round(bout.duration, 2)}s")
    # tracking: dict = ROICrossing.get_crossing_tracking(bout.crossing_id)

    # generate a path from tracking
    path = Path(bout.x, bout.y)

    # create fig and start camera
    if ROI == "T4":
        f = plt.figure(figsize=(12, 12))
    elif "S" in ROI:
        f = plt.figure(figsize=(8, 14))
    else:
        f = plt.figure(figsize=(5, 14))

    axes = f.subplot_mosaic("""
            AA
            AA
            BB
        """)
    camera = Camera(f)

    # ----------------------------------- plot ----------------------------------- #
    n_interpolated_frames = int(60 / FPS)
    n_frames = len(bout.x) - 1
    trajectory = GrowingPath()
    for frame in track(range(n_frames), total=n_frames):
        # repeat each frame N times interpolating between frames
        for interpol in np.linspace(0, 1, n_interpolated_frames):
            # get interpolated quantities
            x = interpolate_at_frame(path.x, frame, interpol)
            y = interpolate_at_frame(path.y, frame, interpol)
            speed = interpolate_at_frame(path.speed, frame, interpol)

            trajectory.update(x, y, speed=speed)

            # time elapsed
            _time = (np.arange(len(trajectory.speed)) / n_interpolated_frames /
                     60)

            # plot the arena
            draw.ROI(ROI, set_ax=True, shade=False, ax=axes["A"])

            # plot tracking so far
            draw.Tracking(trajectory.x, trajectory.y, lw=3, ax=axes["A"])
            draw.Dot(x, y, s=50, ax=axes["A"])

            # plot speed and velocity vectors
            draw.Arrow(
                x,
                y,
                interpolate_at_frame(path.velocity.angle,
                                     frame,
                                     interpol,
                                     method="step"),
                L=scale *
                interpolate_at_frame(path.velocity.magnitude, frame, interpol),
                color=colors.velocity,
                outline=True,
                width=2,
                ax=axes["A"],
            )
            draw.Arrow(
                x,
                y,
                path.acceleration.angle[frame],
                L=4 * scale * path.acceleration.magnitude[frame],
                color=colors.acceleration,
                outline=True,
                width=2,
                ax=axes["A"],
                zorder=200,
            )

            # plot speed trace
            axes["B"].fill_between(_time,
                                   0,
                                   trajectory.speed,
                                   alpha=0.5,
                                   color=colors.speed)
            axes["B"].plot(_time, trajectory.speed, lw=4, color=colors.speed)

            axes["A"].set(title=f"{ROI} - crossing: {crossing_id}")
            axes["B"].set(xlabel="time (s)", ylabel="speed (cm/s)")
            camera.snap()

    # ------------------------------- video creation ------------------------------- #
    save_path = save_folder / f"{ROI}_{bout.crossing_id}.mp4"
    logger.info(f"Saving animation @: '{save_path}'")
    animation = camera.animate(interval=1000 / FPS)
    animation.save(save_path, fps=FPS)
    logger.info("Done!")

    plt.cla()
    plt.close(f)
    del camera
    del animation

    # ----------------------------------- plot ----------------------------------- #
    f = plot_roi_crossing(bout, step=4)
    recorder.add_figures(svg=False)
    plt.close(f)
예제 #7
0
        tracking = pd.read_hdf(fp, key="hdf")
        tracking.x = 20 - tracking.x + 20
        # draw.Tracking.scatter(tracking.x, tracking.y, c=tracking.speed, vmin=0, vmax=100, cmap='bwr', lw=1, ec='k')
        draw.Tracking(tracking.x, tracking.y, alpha=0.7)

        if n == 5:
            wps = Waypoints.from_tracking(
                tracking.x, tracking.y, tracking.speed, tracking.theta,
            )

    # draw hairpin arena
    draw.Hairpin(ax)

    # draw waypoints
    for wp in wps:
        draw.Arrow(wp.x, wp.y, wp.theta, 2, width=4, color="g")

    # fit and animate quintic polinomial
    # wps = [
    #     Waypoint(20, 40, 270, 1, .2, 5),
    #     Waypoint(20, 30, 270, 3, 0, 5),
    #     Waypoint(15, 5, 180, 3, 0, 5),
    # ]
    # wps = [
    #     Waypoint(x=20.682933975843298, y=36.4433300139396, theta=241.34371213247948, speed=3.4675332536458368, accel=3.4675332536458368, segment_duration=1),
    #     Waypoint(x=20.09675309568283, y=21.35347306956288, theta=274.07352782608245, speed=62.565652699469716, accel=0.7206048508470744, segment_duration=1)
    # ]
    qp = QuinticPolinomial(wps).fit()

    # draw path and iitial/final positoin
    draw.Tracking(qp.x, qp.y, alpha=1, lw=1, color="k")
예제 #8
0
    for (x, y), vecs in xy_vectors.items():

        x = x + 0.5
        y = y + 0.5

        vectors = Vector.from_list(vecs)
        mean_vector = vectors_mean(*vecs)

        ax.scatter(x, y, s=10, color="k", zorder=500)
        # draw.Arrows(x, y, vectors.angle, L=0.5, width=0.75, alpha=0.5, color='k', ax=ax)
        draw.Arrow(
            x,
            y,
            mean_vector.angle,
            L=mean_vector.magnitude * scale_factor[vec_name],
            width=2,
            ax=ax,
            color=colors.variables[vec_name],
            zorder=1000,
            alpha=1,
        )
    ax.set(title=vec_name)


# %%

f = plt.figure(figsize=(16, 6))
ax = f.add_subplot(111, projection="polar")
cross = bouts.iloc[7]
path = Path(cross.x, cross.y)
            MODEL.vehicle.x,
            MODEL.vehicle.y,
            MODEL.vehicle.theta,
            -MODEL.vehicle.steer,
        )

        # draw car velocity and acceleration vectors
        if len(MODEL.trajectory.x) > 5:
            velocity, _, _, acceleration, _, _ = va.compute_vectors(
                MODEL.trajectory.x[:-3], MODEL.trajectory.y[:-3]
            )

            draw.Arrow(
                MODEL.vehicle.x,
                MODEL.vehicle.y,
                velocity.angle[-1],
                L=10 * velocity.magnitude[-1],
                color=indigo_dark,
            )
            draw.Arrow(
                MODEL.vehicle.x,
                MODEL.vehicle.y,
                acceleration.angle[-1],
                L=15 * acceleration.magnitude[-1] * 10,
                color=purple,
            )

        # draw currently considered trajectory:
        draw.Tracking(
            path.x[
                MODEL.target_trajectory.ind_old : MODEL.target_trajectory.horizon