コード例 #1
0
def compare_episode(past, ani=True):
    dir_save = list(Path('log').glob("*"))[past]
    epi_list = [x for x in dir_save.glob("*")]
    env_data_list = [
        logging.load(Path(epi_dir, "env_data.h5")) for epi_dir in epi_list
    ]
    agent_data_list = [
        logging.load(Path(epi_dir, "agent_data.h5")) for epi_dir in epi_list
    ]
    _, info = logging.load(Path(epi_list[0], "env_data.h5"), with_info=True)
    cfg = info['cfg']
    if ani == True:
        data_num = len(env_data_list)
        fig_shape = split_int(data_num)
        simple = False
        if fig_shape[0] >= 3:
            simple=True

        fig, _ = plt.subplots(
            fig_shape[0],
            fig_shape[1],
            subplot_kw=dict(projection="3d"),
        )

        ani = Animator(fig, env_data_list, cfg, simple=simple)
        ani.animate()
        ani.save(Path(dir_save, "compare-animation.mp4"))
        plt.close('all')

    return_list = []
    for i, data in enumerate(agent_data_list):
        G = 0
        for r in data['reward'][::-1]:
            G = r.item() + cfg.ddpg.discount*G
        return_list.append([(i+1)*cfg.epi_eval, G])
    return_list = np.array(return_list)

    fig, ax = plt.subplots(nrows=1, ncols=1)
    ax.plot(return_list[:,0], return_list[:,1], "*")
    ax.set_title("Return")
    ax.set_ylabel("Return")
    ax.set_xlabel("Episode")
    ax.grid(True)
    fig.savefig(
        Path(dir_save, "return.png"),
        bbox_inches='tight'
    )
    plt.close('all')
コード例 #2
0
def plot():
    data = logging.load("data/tmp.h5")
    time = data["time"]
    state = data["state"]

    plt.subplot(221)
    plt.plot(time, state["system"].squeeze())
    plt.legend([r"$x_1$", r"$x_2$"])

    plt.subplot(222)
    Y = state["memory"]["Y"]
    Xi = state["memory"]["Xi"]
    Dast = state["memory"]["Dast"]
    wast = main.Env.wast
    X = np.einsum("bij,jk->bik", Xi, wast) - Dast
    # plt.plot(time, state["filter"]["dast"].squeeze(), label=r"$d^\ast$")
    plt.plot(time, Y.squeeze(), "k", label=r"$Y$")
    plt.plot(time, X.squeeze(), "k--", label=r"$\Xi w^\ast - D^\ast$")
    plt.legend()

    plt.subplot(223)
    plt.plot(time, state["actor_critic"]["wa"].squeeze())

    plt.subplot(224)
    plt.plot(time, state["actor_critic"]["wc"].squeeze())

    plt.show()
コード例 #3
0
def plot_single(path, canvas=[], name=None, **kwargs):
    data = logging.load(path)

    def create_canvas():
        fig, axes = plt.subplots(2, 2, sharex=True, num="states")
        for ax in axes.flat:
            ax.mod = 1
        axes[0, 0].set_ylabel(r"$V_T$ [m/s]")
        axes[0, 1].set_ylabel(r"$\alpha$ [deg]")
        axes[0, 1].mod = np.rad2deg(1)
        axes[1, 0].set_ylabel(r"$q$ [deg/s]")
        axes[1, 0].mod = np.rad2deg(1)
        axes[1, 1].set_ylabel(r"$\gamma$ [deg]")
        axes[1, 1].mod = np.rad2deg(1)
        axes[1, 0].set_xlabel("time [s]")
        axes[1, 1].set_xlabel("time [s]")
        canvas.append((fig, axes))

        fig, axes = plt.subplots(2, 2, sharex=True, num="control")
        for ax in axes.flat:
            ax.mod = 1
        axes[0, 0].set_ylabel(r"$\delta_t$")
        axes[0, 1].set_ylabel(r"$\delta_e$ [deg]")
        axes[0, 1].mod = np.rad2deg(1)
        axes[1, 0].set_ylabel(r"$\eta_1$")
        axes[1, 1].set_ylabel(r"$\eta_2$")
        axes[1, 0].set_xlabel("time [s]")
        axes[1, 1].set_xlabel("time [s]")
        canvas.append((fig, axes))

        return canvas

    if not canvas:
        canvas = create_canvas()

    time = data["time"]

    legend_line = []

    fig, axes = canvas[0]
    for ax, x in zip(axes.flat, data["state"].T):
        ln, = ax.plot(time, x * ax.mod, **kwargs)
    fig.tight_layout()
    legend_line.append(ln)

    fig, axes = canvas[1]
    for ax, u in zip(axes.flat, data["action"].T):
        ln, = ax.plot(time, u * ax.mod, **kwargs)
    fig.tight_layout()
    legend_line.append(ln)

    if name is not None:
        for ln in legend_line:
            ln.set_label(name)

        for window in canvas:
            fig, axes = window
            axes[0, 0].legend(*axes[-1, -1].get_legend_handles_labels())

    return canvas
コード例 #4
0
def plot_hist(path):
    # path = os.path.join(
    #     obj.gan_dir,
    #     os.path.relpath(os.path.dirname(testfile), obj.test_dir),
    #     "train_history.h5"
    # )

    histdata = logging.load(path)

    canvas = []

    fig, axes = plt.subplots(1, 2, sharey=True, squeeze=False, num="loss")
    axes[0, 0].set_ylabel(r"Loss")

    axes[0, 0].set_xlabel(r"Epoch")
    axes[0, 1].set_xlabel(r"Epoch")

    axes[0, 0].set_title("Generator")
    axes[0, 1].set_title("Discrimator")

    canvas.append((fig, axes))

    fig, axes = canvas[0]
    ax = axes[0, 0]
    ax.plot(histdata["epoch"], histdata["loss_g"])
    ax = axes[0, 1]
    ax.plot(histdata["epoch"], histdata["loss_d"])
    fig.tight_layout()
コード例 #5
0
ファイル: main.py プロジェクト: seong-hun/ct-dpg
def _case3(skip_sample):
    # Case 3 - Inaccurate basis function
    print("Case 3")
    print("======")
    casedir = os.path.join("data", "case3")

    def phia(x):
        return x

    paramvar, noisescale = np.random.rand(2)
    env = Env(paramvar, noisescale * 0, phia=phia)
    env.set_envdir(casedir)
    if not skip_sample:
        _sample(env, 10, tqdm=True)

    samplelist = sorted(glob(os.path.join(env.envdir, "sample-*.h5")))
    datalist = [logging.load(path) for path in samplelist]

    Tlist = [0.02, 0.5, 2]
    agentlist = [IFRADP(2, 1, env, phia=phia)]
    agentlist += [RADP(2, 1, T, env, phia=phia) for T in Tlist]

    for agent in tqdm(agentlist):
        agent.set_datalist(datalist)
        agent.set_trainpath(env.envdir)
        _train(agent)
コード例 #6
0
ファイル: main.py プロジェクト: seong-hun/ct-dpg
def _plot_case1():
    import matplotlib.pyplot as plt

    # Case 1
    casedir = os.path.join("data", "case1")
    trainlist = glob(os.path.join(casedir, "*", "train-*.h5"))

    fig, axes = plt.subplots(2, 1, sharex=True)
    draw_true(axes)

    for trainpath in trainlist:
        data = logging.load(trainpath)
        epoch = data["epoch"]
        wa = data["params"]["wa"].squeeze()
        wc = data["params"]["wc"].squeeze()

        axes[0].plot(epoch, wc)
        axes[1].plot(epoch, wa)

        axes[0].set_ylabel(r"$w_c$")
        axes[0].set_xlim(left=0)
        axes[1].set_ylabel(r"$w_a$")
        axes[1].set_xlabel("Iteration")

    set_axes(fig, axes)
コード例 #7
0
def plot_gan(path):
    data = logging.load(path)

    xlabels = (
        r"$V_T$ [m/s]", r"$\alpha$ [deg]", r"$q$ [deg/s]", r"$\theta$ [deg]"
    )
    xmod = [1, np.rad2deg(1), np.rad2deg(1), np.rad2deg(1)]
    ulabels = (
        r"$\delta_t$", r"$\delta_e$", r"$\eta_1$", r"$\eta_2$"
    )
    umod = [1, np.rad2deg(1), 1, 1]

    def plot_xu(canvas, i, j, data):
        x, u, fake_u = (data[k] for k in ["state", "action", "fake_action"])

        x = x[:, j] * xmod[j]
        u = u[:, i] * umod[i]
        fake_u = fake_u[:, i] * xmod[i]

        xmin, xmax = x.min(), x.max()
        umin, umax = u.min(), u.max()

        fig, axes = canvas[0]

        axes[i, 0].set_ylabel(ulabels[i])
        axes[-1, 2 * j].set_xlabel(xlabels[j])
        axes[-1, 2 * j + 1].set_xlabel(xlabels[j])

        axes[i, 2 * j].set_xlim([xmin, xmax])
        axes[i, 2 * j + 1].set_xlim([xmin, xmax])
        axes[i, 2 * j].set_ylim([umin, umax])

        axes[0, 2 * j].set_title("Real")
        axes[0, 2 * j + 1].set_title("Fake")

        ax = axes[i, 2 * j]
        ax.plot(x, u, '.', markersize=2, mew=0, mfc=(0, 0, 0, 1))

        ax = axes[i, 2 * j + 1]
        ax.plot(x, fake_u, '.', markersize=2, mew=0, mfc=(0, 0, 0, 1))

    canvas = []

    fig, axes = plt.subplots(
        4, 8, sharex=True, sharey=True, squeeze=False, num="real"
    )
    canvas.append((fig, axes))

    for i in range(4):
        for j in range(4):
            plot_xu(canvas, i, j, data)

    fig.tight_layout()
コード例 #8
0
ファイル: gan.py プロジェクト: seong-hun/bc-dpg
    def __init__(self, file_names, keys):
        if isinstance(file_names, str):
            file_names = (file_names, )

        data_all = [logging.load(name) for name in file_names]
        self.keys = keys if not isinstance(keys, str) else (keys, )

        _data = {
            k: torch.cat([torch.tensor(data[k]).float() for data in data_all])
            for k in self.keys
        }

        self.data = _data
        self.len = len(self.data[self.keys[0]])
コード例 #9
0
ファイル: main.py プロジェクト: seong-hun/ct-dpg
def _plot_case3():
    import matplotlib.pyplot as plt
    from cycler import cycler

    # Case 3
    casedir = os.path.join("data", "case3")
    trainlist = sorted(glob(os.path.join(casedir, "*", "train-*.h5")))

    custom_cycler = (cycler(color=["k"]) * cycler(ls=["-", "--", "-.", ":"]))

    def draw_true(axes):
        # Draw true parameters
        for i in (1, 0.5, 0):
            axes[0].axhline(i, c="r", ls="--")

        for i in (0, -3):
            axes[1].axhline(i, c="r", ls="--")

    fig, axes = plt.subplots(2, 1, sharex=True)
    draw_true(axes)

    legendlines = []
    for trainpath, cc in zip(trainlist, custom_cycler):
        data, info = logging.load(trainpath, with_info=True)
        if info["classname"] == "RADP":
            label = rf"RADP ($T = {info['T']}$)"
        else:
            label = r"IFRADP"
            cc = dict(color="b", ls="-", zorder=10)
        epoch = data["epoch"]
        wa = data["params"]["wa"].squeeze()
        wc = data["params"]["wc"].squeeze()

        lines = axes[0].plot(epoch, wc, **cc, label=label)
        legendlines.append(lines[0])
        axes[1].plot(epoch, wa, **cc)

    axes[0].set_ylabel(r"$w_c$")
    axes[0].set_xlim(left=0)
    axes[1].set_ylabel(r"$w_a$")
    axes[1].set_xlabel("Iteration")

    fig.legend(handles=legendlines,
               bbox_to_anchor=(0.1, 0.92, 0.87, .05),
               loc='lower center',
               ncol=4,
               mode="expand",
               borderaxespad=0.)
    set_axes(fig, axes)
コード例 #10
0
ファイル: toy_main.py プロジェクト: seong-hun/bc-dpg
def _plot(obj, testfile):
    data = logging.load(testfile)

    real_x, real_u, mask, fake_x, fake_u = (data[k].ravel()
                                            for k in ("real_x", "real_u",
                                                      "mask", "fake_x",
                                                      "fake_u"))

    xmin, xmax = real_x.min(), real_x.max()
    umin, umax = real_u.min(), real_u.max()
    canvas = []

    fig, axes = plt.subplots(1, 2, sharey=True, squeeze=False, num="real")
    axes[0, 0].set_ylabel(r"$u$")

    axes[0, 0].set_xlabel(r"$x$")
    axes[0, 1].set_xlabel(r"$x$")

    axes[0, 0].set_xlim([xmin, xmax])
    axes[0, 1].set_xlim([xmin, xmax])
    axes[0, 0].set_ylim([umin, umax])

    axes[0, 0].set_title("Real")
    axes[0, 1].set_title("Fake")

    canvas.append((fig, axes))

    fig, axes = canvas[0]
    ax = axes[0, 0]
    mask = mask.astype(bool)
    ax.plot(real_x[mask],
            real_u[mask],
            '.',
            markersize=2,
            mew=0,
            mfc=(0, 0, 0, 1))
    ax.plot(real_x[~mask],
            real_u[~mask],
            '.',
            markersize=2,
            mew=0,
            mfc=(1, 0, 0, 0.1))

    ax = axes[0, 1]
    ax.plot(fake_x, fake_u, '.', markersize=2, mew=0, mfc=(0, 0, 0, 1))
    fig.tight_layout()
コード例 #11
0
def train_plot(savepath, **kwargs):
    data = logging.load(savepath)
    epoch = data["i"]

    canvas = []
    fig, axes = plt.subplots(2, 2, sharex=True, num="hist")
    axes[0, 0].set_ylabel(r"$\delta$")
    axes[0, 1].set_ylabel(r"G Loss")
    axes[1, 0].set_ylabel(r"$w, v$")
    axes[1, 1].set_ylabel(r"$\theta$")
    axes[1, 0].set_xlabel("Epoch")
    axes[1, 1].set_xlabel("Epoch")
    canvas.append((fig, axes))

    fig, axes = canvas[0]
    epoch = data["i"]
    axes[0, 0].plot(
        epoch,
        data["loss"]["delta"].reshape(-1, data["loss"]["delta"][0].size),
        **kwargs
    )
    axes[0, 1].plot(
        epoch,
        data["loss"]["gan"].reshape(-1, data["loss"]["gan"][0].size),
        **kwargs
    )
    axes[1, 0].plot(
        epoch,
        data["w"].reshape(-1, data["w"][0].size),
        **kwargs
    )
    axes[1, 0].plot(
        epoch,
        data["v"].reshape(-1, data["v"][0].size),
        **kwargs
    )
    ln, *_ = axes[1, 1].plot(
        epoch,
        data["theta"].reshape(
            -1, np.multiply(*data["theta"][0].shape)),
        **kwargs
    )
    fig.tight_layout()
コード例 #12
0
ファイル: toy_main.py プロジェクト: seong-hun/bc-dpg
def test(obj, **kwargs):
    agent = gan.GAN(lr=1e-3, x_size=1, u_size=1, z_size=30)

    for weightfile in tqdm.tqdm(sorted(kwargs["weightfiles"])):
        tqdm.tqdm.write(f"Using {weightfile} ...")

        agent.load(weightfile)
        agent.eval()

        gandir = os.path.dirname(weightfile)
        testpath = os.path.join(
            obj.test_dir,
            os.path.splitext(os.path.relpath(weightfile, obj.gan_dir))[0] +
            ".h5")
        samplefiles = torch.load(os.path.join(gandir, "sample_path.h5"))

        if isinstance(samplefiles, str):
            samplefiles = [samplefiles]

        data_all = [logging.load(name) for name in samplefiles]
        real_x, real_u, mask = [
            np.vstack([data[k] for data in data_all])
            for k in ("state", "action", "mask")
        ]
        data_gen = DataGen(mode="even")
        fake_x = np.zeros_like(real_x)
        fake_u = np.zeros_like(real_u)
        for i in range(fake_x.size):
            fake_x[i] = data_gen()[0]
        fake_u = agent.get_action(fake_x)

        logging.save(
            testpath,
            dict(real_x=real_x,
                 real_u=real_u,
                 mask=mask,
                 fake_x=fake_x,
                 fake_u=fake_u))
        tqdm.tqdm.write(f"Test data is saved in {testpath}.")

        _plot(obj, testpath)
        plt.show()
コード例 #13
0
ファイル: main.py プロジェクト: seong-hun/ct-dpg
def _case1(skip_sample):
    # Case 1 : Different exploration data (different behavior)
    print("Case 1")
    print("======")
    casedir = os.path.join("data", "case1")

    envargs = np.random.rand(10, 2)

    for paramvar, noisescale in tqdm(envargs):
        env = Env(paramvar, noisescale)
        env.set_envdir(casedir)
        if not skip_sample:
            _sample(env, 20)

        # Train
        samplelist = sorted(glob(os.path.join(env.envdir, "sample-*.h5")))
        datalist = [logging.load(path) for path in samplelist]

        agent = RADP(2, 1, 0.05, env)
        agent.set_datalist(datalist)
        agent.set_trainpath(env.envdir)
        _train(agent)
コード例 #14
0
ファイル: toy_main.py プロジェクト: seong-hun/bc-dpg
def _plot_sample(testfile):
    data = logging.load(testfile)

    real_x, real_u, mask = (data[k].ravel()
                            for k in ("state", "action", "mask"))

    xmin, xmax = real_x.min(), real_x.max()
    umin, umax = real_u.min(), real_u.max()
    canvas = []

    fig, axes = plt.subplots(1, 1, squeeze=False, num=testfile)
    axes[0, 0].set_ylabel(r"$u$")

    axes[0, 0].set_xlabel(r"$x$")

    axes[0, 0].set_xlim([xmin, xmax])
    axes[0, 0].set_ylim([umin, umax])

    canvas.append((fig, axes))

    fig, axes = canvas[0]
    ax = axes[0, 0]
    mask = mask.astype(bool)
    ax.plot(real_x[mask],
            real_u[mask],
            '.',
            markersize=2,
            mew=0,
            mfc=(0, 0, 0, 1))
    ax.plot(real_x[~mask],
            real_u[~mask],
            '.',
            markersize=2,
            mew=0,
            mfc=(1, 0, 0, 0.1))

    fig.tight_layout()
    return fig
コード例 #15
0
def run(path, **kwargs):
    logger = logging.Logger(log_dir=".", file_name=kwargs["out"], max_len=100)
    data = logging.load(path)
    expname = os.path.basename(path)
    envname, agentname, *_ = expname.split("-")
    env = getattr(envs, envname)(initial_perturb=[1, 0.0, 0,
                                                  np.deg2rad(10)],
                                 dt=0.01,
                                 max_t=40,
                                 solver="rk4",
                                 ode_step_len=1)
    agent = getattr(agents, agentname)(env,
                                       lrw=1e-2,
                                       lrv=1e-2,
                                       lrtheta=1e-2,
                                       w_init=0.03,
                                       v_init=0.03,
                                       theta_init=0,
                                       maxlen=100,
                                       batch_size=16)
    agent.load_weights(data)

    print(f"Runnning {expname} ...")
    _run(env, agent, logger, expname, **kwargs)

    logger.close()

    if kwargs["with_plot"]:
        import figures

        files = utils.parse_file(kwargs["out"])
        canvas = []
        for file in tqdm.tqdm(files):
            canvas = figures.plot_single(file, canvas=canvas)

        figures.show()
コード例 #16
0
ファイル: main.py プロジェクト: seong-hun/ct-dpg
def _case2(skip_sample):
    # Case 2 - Different integral time step
    print("Case 2")
    print("======")
    casedir = os.path.join("data", "case2")

    paramvar, noisescale = np.random.rand(2)
    env = Env(paramvar, noisescale * 0)
    env.set_envdir(casedir)
    if not skip_sample:
        _sample(env, 10, tqdm=True)

    samplelist = sorted(glob(os.path.join(env.envdir, "sample-*.h5")))
    datalist = [logging.load(path) for path in samplelist]

    Tlist = [0.02, 0.5, 2]
    agentlist = [NDRADP(2, 1, env)]
    agentlist += [IFRADP(2, 1, env)]
    agentlist += [RADP(2, 1, T, env) for T in Tlist]

    for agent in tqdm(agentlist):
        agent.set_datalist(datalist)
        agent.set_trainpath(env.envdir)
        _train(agent)
コード例 #17
0
ファイル: cmrac.py プロジェクト: seong-hun/fym
 def close(self):
     super().close()
     if self.data_callback is not None:
         data = logging.load(self.logger.path)
         self.data_callback(self, data)
コード例 #18
0
        if done:
            break

    env.close()
    logger.close()
    return logger.path


T = 0.5
env = Env(T=T, dt=0.1, max_t=10, ode_step_len=4)
savepath = run(env)

import matplotlib.pyplot as plt

data = logging.load(savepath)

canvas = []
fig, axes = plt.subplots(3, 1, sharex=True)
axes[0].set_ylabel(r"$x_1$")
axes[1].set_ylabel(r"$x_2$")
axes[2].set_ylabel(r"$x_3$")
axes[2].set_xlabel("Time [sec]")
canvas.append((fig, axes))

fig, ax = plt.subplots(1, 1)
ax.set_ylabel(r"$u$")
ax.set_xlabel("Time [sec]")
canvas.append((fig, ax))

time = data["time"]
コード例 #19
0
def draw_plot(dir_env_data, dir_agent_data, dir_save):
    env_data, info = logging.load(dir_env_data, with_info=True)
    agent_data = logging.load(dir_agent_data)
    cfg = info['cfg']

    time = env_data['time']
    load_pos = env_data['load']['pos']
    load_vel = env_data['load']['vel']
    # load_dcm = data['load']['dcm']
    load_att = np.unwrap(env_data['load_att'], axis=0) * 180/np.pi
    load_omega = np.unwrap(env_data['load']['omega'], axis=0) * 180/np.pi
    quad_moment = env_data['quad_moment']
    quad_pos = env_data['quad_pos']
    quad_vel = env_data['quad_vel']
    quad_att = np.unwrap(env_data['quad_att'], axis=0) * 180/np.pi
    quad_att_des = np.unwrap(env_data['quad_att_des'], axis=0) * 180/np.pi
    distance_btw_quads = env_data['distance_btw_quads']
    distance_btw_quad2anchor = env_data['distance_btw_quad2anchor']

    time_agent = agent_data['time']
    action = agent_data['action']
    reward = agent_data['reward']
    # anchor_pos = env_data['anchor_pos']
    # check_dynamics = env_data['check_dynamics']
    # breakpoint()

    for i in range(cfg.quad.num):
        fig, ax = plt.subplots(nrows=3, ncols=1)
        ax[0].plot(time, quad_pos[:,i,0])
        ax[1].plot(time, quad_pos[:,i,1])
        ax[2].plot(time, quad_pos[:,i,2])
        ax[0].set_title(f"Position of Quadrotor {i}")
        ax[0].axes.xaxis.set_ticklabels([])
        ax[1].axes.xaxis.set_ticklabels([])
        ax[0].set_ylabel("X [m]")
        ax[1].set_ylabel("Y [m]")
        ax[2].set_ylabel("Z [m]")
        ax[2].set_xlabel("time [s]")
        [ax[i].grid(True) for i in range(3)]
        fig.align_ylabels(ax)
        fig.savefig(
            Path(dir_save, f"quad_{i}_pos.png"),
            bbox_inches='tight'
        )
        plt.close('all')

        fig, ax = plt.subplots(nrows=3, ncols=1)
        ax[0].plot(time, quad_vel[:,i,0])
        ax[1].plot(time, quad_vel[:,i,1])
        ax[2].plot(time, quad_vel[:,i,2])
        ax[0].set_title(f"Velocity of Quadrotor {i}")
        ax[0].axes.xaxis.set_ticklabels([])
        ax[1].axes.xaxis.set_ticklabels([])
        ax[0].set_ylabel("$V_x$ [m/s]")
        ax[1].set_ylabel("$V_y$ [m/s]")
        ax[2].set_ylabel("$V_z$ [m/s]")
        ax[2].set_xlabel("time [s]")
        [ax[i].grid(True) for i in range(3)]
        fig.align_ylabels(ax)
        fig.savefig(
            Path(dir_save, f"quad_{i}_vel.png"),
            bbox_inches='tight'
        )
        plt.close('all')

        fig, ax = plt.subplots(nrows=3, ncols=1)
        ax[0].plot(time, quad_moment[:,i,0])
        ax[1].plot(time, quad_moment[:,i,1])
        ax[2].plot(time, quad_moment[:,i,2])
        ax[0].set_title(f"Moment of Quadrotor {i}")
        ax[0].axes.xaxis.set_ticklabels([])
        ax[1].axes.xaxis.set_ticklabels([])
        ax[0].set_ylabel("$M_x$ [Nm]")
        ax[1].set_ylabel("$M_y$ [Nm]")
        ax[2].set_ylabel("$M_z$ [Nm]")
        ax[2].set_xlabel("time [s]")
        [ax[i].grid(True) for i in range(3)]
        fig.align_ylabels(ax)
        fig.savefig(
            Path(dir_save, f"quad_{i}_moment.png"),
            bbox_inches='tight'
        )
        plt.close('all')

        fig, ax = plt.subplots(nrows=3, ncols=1)
        line1, = ax[0].plot(time, quad_att[:,i,0], 'r')
        line2, = ax[0].plot(time, quad_att_des[:,i,0], 'b--')
        ax[0].legend(handles=(line1, line2), labels=('true', 'des.'))
        ax[1].plot(time, quad_att[:,i,1], 'r',
                   time, quad_att_des[:,i,1], 'b--')
        ax[2].plot(time, quad_att[:,i,2], 'r',
                   time, quad_att_des[:,i,2], 'b--')
        ax[0].set_title(f"Euler angle of Quadrotor {i}")
        ax[0].axes.xaxis.set_ticklabels([])
        ax[1].axes.xaxis.set_ticklabels([])
        ax[0].set_ylabel("$\phi$ [deg]")
        ax[1].set_ylabel("$\\theta$ [deg]")
        ax[2].set_ylabel("$\psi$ [deg]")
        ax[2].set_xlabel("time [s]")
        [ax[i].grid(True) for i in range(3)]
        fig.align_ylabels(ax)
        fig.savefig(
            Path(dir_save, f"quad_{i}_att.png"),
            bbox_inches='tight'
        )
        plt.close('all')

        fig, ax = plt.subplots(nrows=3, ncols=1)
        ax[0].plot(time, env_data['quads'][f'quad{i:02d}']['omega'][:,0,:])
        ax[1].plot(time, env_data['quads'][f'quad{i:02d}']['omega'][:,1,:])
        ax[2].plot(time, env_data['quads'][f'quad{i:02d}']['omega'][:,2,:])
        ax[0].set_title(f"Angular velocity of Quadrotor {i}")
        ax[0].axes.xaxis.set_ticklabels([])
        ax[1].axes.xaxis.set_ticklabels([])
        ax[0].set_ylabel("$\omega_x$ [deg/s]")
        ax[1].set_ylabel("$\omega_y$ [deg/s]")
        ax[2].set_ylabel("$\omega_z$ [deg/s]")
        ax[2].set_xlabel("time [s]")
        [ax[i].grid(True) for i in range(3)]
        fig.align_ylabels(ax)
        fig.savefig(
            Path(dir_save, f"quad_{i}_omega.png"),
            bbox_inches='tight'
        )
        plt.close('all')

        fig, ax = plt.subplots(nrows=3, ncols=1)
        ax[0].plot(time_agent, action[:,cfg.quad.num*i])
        ax[1].plot(time_agent, action[:,cfg.quad.num*i+1]*180/np.pi)
        ax[2].plot(time_agent, action[:,cfg.quad.num*i+2]*180/np.pi)
        ax[0].set_title(f"Action of Quadrotor {i}")
        ax[0].axes.xaxis.set_ticklabels([])
        ax[1].axes.xaxis.set_ticklabels([])
        ax[0].set_ylabel("Total thrust [N]")
        ax[1].set_ylabel("$chi$ [deg]")
        ax[2].set_ylabel("$gamma$ [deg]")
        ax[2].set_xlabel("time [s]")
        [ax[i].grid(True) for i in range(3)]
        fig.align_ylabels(ax)
        fig.savefig(
            Path(dir_save, f"quad_{i}_action.png"),
            bbox_inches='tight'
        )
        plt.close('all')

    fig, ax = plt.subplots(nrows=3, ncols=1)
    ax[0].plot(time, load_pos[:,0])
    ax[1].plot(time, load_pos[:,1])
    ax[2].plot(time, load_pos[:,2])
    ax[0].set_title("Position of Load")
    ax[0].axes.xaxis.set_ticklabels([])
    ax[1].axes.xaxis.set_ticklabels([])
    ax[0].set_ylabel("X [m]")
    ax[1].set_ylabel("Y [m]")
    ax[2].set_ylabel("Z [m]")
    ax[2].set_xlabel("time [s]")
    [ax[i].grid(True) for i in range(3)]
    fig.align_ylabels(ax)
    fig.savefig(
        Path(dir_save, "load_pos.png"),
        bbox_inches='tight'
    )
    plt.close('all')

    fig, ax = plt.subplots(nrows=3, ncols=1)
    ax[0].plot(time, load_vel[:,0])
    ax[1].plot(time, load_vel[:,1])
    ax[2].plot(time, load_vel[:,2])
    ax[0].set_title("Velocity of Load")
    ax[0].axes.xaxis.set_ticklabels([])
    ax[1].axes.xaxis.set_ticklabels([])
    ax[0].set_ylabel("$V_x$ [m/s]")
    ax[1].set_ylabel("$V_y$ [m/s]")
    ax[2].set_ylabel("$V_z$ [m/s]")
    ax[2].set_xlabel("time [s]")
    [ax[i].grid(True) for i in range(3)]
    fig.align_ylabels(ax)
    fig.savefig(
        Path(dir_save, "load_vel.png"),
        bbox_inches='tight'
    )
    plt.close('all')

    fig, ax = plt.subplots(nrows=3, ncols=1)
    ax[0].plot(time, load_att[:,0])
    ax[1].plot(time, load_att[:,1])
    ax[2].plot(time, load_att[:,2])
    ax[0].set_title("Euler angle of Load")
    ax[0].set_ylabel("$\phi$ [deg]")
    ax[0].axes.xaxis.set_ticklabels([])
    ax[1].axes.xaxis.set_ticklabels([])
    ax[1].set_ylabel("$\\theta$ [deg]")
    ax[2].set_ylabel("$\psi$ [deg]")
    ax[2].set_xlabel("time [s]")
    [ax[i].grid(True) for i in range(3)]
    fig.align_ylabels(ax)
    fig.savefig(
        Path(dir_save, "load_att.png"),
        bbox_inches='tight'
    )
    plt.close('all')

    fig, ax = plt.subplots(nrows=3, ncols=1)
    ax[0].plot(time, load_omega[:,0])
    ax[1].plot(time, load_omega[:,1])
    ax[2].plot(time, load_omega[:,2])
    ax[0].set_title("Angular rate of Load")
    ax[0].axes.xaxis.set_ticklabels([])
    ax[1].axes.xaxis.set_ticklabels([])
    ax[0].set_ylabel("$\omega_x$ [deg/s]")
    ax[1].set_ylabel("$\omega_y$ [deg/s]")
    ax[2].set_ylabel("$\omega_z$ [deg/s]")
    ax[2].set_xlabel("time [s]")
    [ax[i].grid(True) for i in range(3)]
    fig.align_ylabels(ax)
    fig.savefig(
        Path(dir_save, "load_omega.png"),
        bbox_inches='tight'
    )
    plt.close('all')

    fig, ax = plt.subplots(nrows=3, ncols=1)
    ax[0].plot(time, distance_btw_quad2anchor[:,0])
    ax[1].plot(time, distance_btw_quad2anchor[:,1])
    ax[2].plot(time, distance_btw_quad2anchor[:,2])
    ax[0].set_title("Distance between quadrotor and anchor")
    ax[0].axes.xaxis.set_ticklabels([])
    ax[1].axes.xaxis.set_ticklabels([])
    ax[0].set_ylabel("Quad 0 [m]")
    ax[1].set_ylabel("Quad 1 [m]")
    ax[2].set_ylabel("Quad 2 [m]")
    ax[2].set_xlabel("time [s]")
    [ax[i].grid(True) for i in range(3)]
    [ax[i].set_ylim(cfg.link.len[i]-0.1, cfg.link.len[i]+0.1)
     for i in range(cfg.quad.num)]
    fig.align_ylabels(ax)
    fig.savefig(
        Path(dir_save, "distance_btw_quad2anchor.png"),
        bbox_inches='tight'
    )
    plt.close('all')

    fig, ax = plt.subplots(nrows=1, ncols=1)
    line1, = ax.plot(time, distance_btw_quads[:,1], 'r')
    line2, = ax.plot(time, distance_btw_quads[:,2], 'g')
    line3, = ax.plot(time, distance_btw_quads[:,0], 'b')
    line4, = ax.plot(time, cfg.quad.iscollision*np.ones(len(time)), 'k--')
    ax.legend(handles=(line1, line2, line3, line4),
              labels=(
                  'quad0<->quad1',
                  'quad1<->quad2',
                  'quad2<->quad0',
                  'collision criteria'
              ))
    ax.set_title("Distance between quadrotors")
    ax.set_ylabel('distance [m]')
    ax.set_xlabel("time [s]")
    ax.grid(True)
    fig.savefig(
        Path(dir_save, "distance_btw_quads.png"),
        bbox_inches='tight'
    )
    plt.close('all')

    fig, _ = plt.subplots(1, 1, subplot_kw=dict(projection="3d"))
    ani = Animator(fig, [env_data], cfg)
    ani.animate()
    ani.save(Path(dir_save, "animation.mp4"))
コード例 #20
0
ファイル: scene1.py プロジェクト: seong-hun/morphing-adp
            color="g",
            ls="-.",
            label="Fixed trim 2, gain 2",
        ),
        interp=dict(
            color="r",
            label="Interpolated",
        ),
    )
    cnamelist = options.keys()

    datalist = {}
    for p in pathlist:
        for c in cnamelist:
            if c in p:
                datalist[c] = logging.load(p)

    # Figure 1
    fig, axes = plt.subplots(2, 2)

    ylabels = [
        r"$V_T$ [m/s]", r"$\alpha$ [deg]", r"$Q$ [deg/s]", r"$\gamma$ [deg]"
    ]
    factor = [1] + [np.rad2deg(1)] * 3

    for i, ax in enumerate(axes.flat):
        ln = []
        for c in cnamelist:
            data = datalist[c]
            option = options[c]
コード例 #21
0
    plt.show()


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument("file", nargs="*")
    parser.add_argument("--all", action="store_true")
    args = parser.parse_args()

    color_cycle = cycler(
        color=plt.rcParams["axes.prop_cycle"].by_key()["color"])

    path_list = args.file
    if args.all:
        path_list = sorted(glob.glob(os.path.join(BASE_DATA_DIR, "*.h5")))
    else:
        path_list = sorted(filter(lambda x: x.endswith(".h5"), path_list))

    dataset = []
    for path, c in zip(path_list, color_cycle()):
        dataset.append(logging.load(path))

    names = [os.path.basename(os.path.splitext(path)[0]) for path in path_list]

    print("Plotting ...")
    print("\n".join(path_list))
    plot_mult(dataset, color_cycle, names=names)
コード例 #22
0
def get_data(exp, prefix=BASE_DATA_DIR):
    path = os.path.join(prefix, exp + ".h5")
    return logging.load(path)
コード例 #23
0
ファイル: main.py プロジェクト: seong-hun/ct-dpg
def _plot_case2():
    import matplotlib.pyplot as plt
    from cycler import cycler

    # Case 2
    casedir = os.path.join("data", "case2")
    samplelist = sorted(glob(os.path.join(casedir, "*", "sample-*.h5")))
    trainlist = sorted(glob(os.path.join(casedir, "*", "train-*.h5")))

    custom_cycler = (cycler(color=["k"]) * cycler(ls=["-", "--", "-.", ":"]))

    # plot samples
    fig, axes = plt.subplots(3, 1, sharex=True)
    for samplepath, cc in zip(samplelist, custom_cycler()):
        data = logging.load(samplepath)
        t = data["time"]
        x = data["state"].squeeze()
        u = data["control"].squeeze()
        axes[0].plot(t, x[:, 0], **cc)
        axes[1].plot(t, x[:, 1], **cc)
        axes[2].plot(t, u, **cc)

    axes[0].set_ylabel(r"$x_1$")
    axes[1].set_ylabel(r"$x_1$")
    axes[2].set_ylabel(r"$u$")
    axes[2].set_xlabel(r"Time [s]")
    set_axes(fig, axes)

    fig, axes = plt.subplots(2, 1, sharex=True)
    draw_true(axes)

    legendlines = []
    for trainpath, cc in zip(trainlist, custom_cycler()):
        data, info = logging.load(trainpath, with_info=True)
        if info["classname"] == "RADP":
            label = rf"RADP ($T = {info['T']}$)"
        elif info["classname"] == "IFRADP":
            label = r"IFRADP"
            cc = dict(color="b", ls="-", zorder=10)
        elif info["classname"] == "NDRADP":
            label = r"NDRADP"
            cc = dict(color="g", ls="-", zorder=10)
        epoch = data["epoch"]
        wa = data["params"]["wa"].squeeze()
        wc = data["params"]["wc"].squeeze()

        lines = axes[0].plot(epoch, wc, **cc, label=label)
        legendlines.append(lines[0])
        axes[1].plot(epoch, wa, **cc)

    axes[0].set_ylabel(r"$w_c$")
    axes[0].set_xlim(left=0)
    axes[1].set_ylabel(r"$w_a$")
    axes[1].set_xlabel("Iteration")

    fig.legend(handles=legendlines,
               bbox_to_anchor=(0.1, 0.92, 0.87, .05),
               loc='lower center',
               ncol=4,
               mode="expand",
               borderaxespad=0.)

    set_axes(fig, axes)

    fig, axes = plt.subplots(2, 1)

    legendlines = []
    for trainpath, cc in zip(trainlist, custom_cycler()):
        data, info = logging.load(trainpath, with_info=True)
        if info["classname"] == "RADP":
            label = rf"RADP ($T = {info['T']}$)"
        elif info["classname"] == "IFRADP":
            label = r"IFRADP"
            cc = dict(color="b", ls="-", zorder=10)
        elif info["classname"] == "NDRADP":
            label = r"NDRADP"
            cc = dict(color="g", ls="-", zorder=10)
        epoch = data["epoch"]
        wa = data["params"]["wa"].squeeze()
        ewa = np.linalg.norm(wa - [-1, -2], axis=1)
        wc = data["params"]["wc"].squeeze()
        ewc = np.linalg.norm(wc - [0.5, 1, 0], axis=1)

        lines = axes[0].plot(epoch, ewc, **cc, label=label)
        legendlines.append(lines[0])
        axes[1].plot(epoch, ewa, **cc)

        axes[0].set_yscale("log")
        axes[1].set_yscale("log")

    fig.legend(handles=legendlines,
               bbox_to_anchor=(0.1, 0.92, 0.87, .05),
               loc='lower center',
               ncol=4,
               mode="expand",
               borderaxespad=0.)
    set_axes(fig, axes)
コード例 #24
0
 def load(self, path):
     data = logging.load(path)
     self.load_weights(data)
     return int(data["epoch"][-1] + 1), int(data["i"][-1] + 1)
コード例 #25
0
ファイル: figures.py プロジェクト: seong-hun/rlcmrac
def get_data(exp, base=BASE_DATA_DIR):
    path = os.path.join(base, exp, "episodic.h5")
    data = logging.load(path)
    return data