Пример #1
0
def main():
    # Parameters
    N_samples = 5
    SEED = 9
    dof = 7

    # Random waypoints used to obtain a random geometric path. Here,
    # we use spline interpolation.
    np.random.seed(SEED)
    way_pts = np.random.randn(N_samples, dof)
    path = ta.SplineInterpolator(np.linspace(0, 1, 5), way_pts)

    # Create velocity bounds, then velocity constraint object
    vlim_ = np.random.rand(dof) * 20
    vlim = np.vstack((-vlim_, vlim_)).T
    # Create acceleration bounds, then acceleration constraint object
    alim_ = np.random.rand(dof) * 2
    alim = np.vstack((-alim_, alim_)).T
    pc_vel = constraint.JointVelocityConstraint(vlim)
    pc_acc = constraint.JointAccelerationConstraint(
        alim,
        discretization_scheme=constraint.DiscretizationType.Interpolation)

    # Setup a parametrization instance
    instance = algo.TOPPRAsd([pc_vel, pc_acc],
                             path,
                             gridpoints=np.linspace(0, 1, 101),
                             solver_wrapper='seidel')
    instance.set_desired_duration(60)
    t0 = time.time()
    # Retime the trajectory, only this step is necessary.
    jnt_traj = instance.compute_trajectory(0, 0)
    print("Parameterization took {:} secs".format(time.time() - t0))
    ts_sample = np.linspace(0, jnt_traj.get_duration(), 100)
    qs_sample = jnt_traj.evaldd(ts_sample)

    plt.plot(ts_sample, qs_sample)
    plt.xlabel("Time (s)")
    plt.ylabel("Joint acceleration (rad/s^2)")
    plt.show()

    # Compute the feasible sets and the controllable sets for viewing.
    # Note that these steps are not necessary.
    X = instance.compute_feasible_sets()
    K = instance.compute_controllable_sets(0, 0)

    _, sd_vec, _ = instance.compute_parameterization(0, 0)

    X = np.sqrt(X)
    K = np.sqrt(K)

    plt.plot(X[:, 0], c='green', label="Feasible sets")
    plt.plot(X[:, 1], c='green')
    plt.plot(K[:, 0], '--', c='red', label="Controllable sets")
    plt.plot(K[:, 1], '--', c='red')
    plt.plot(sd_vec, label="Velocity profile")
    plt.title("Path-position path-velocity plot")
    plt.xlabel("Path position")
    plt.ylabel("Path velocity square")
    plt.legend()
    plt.tight_layout()
    plt.show()
Пример #2
0
def test_robustness_main(request):
    """ Load problem suite based on regex, run test and report results.
    """
    toppra.setup_logging(request.config.getoption("--loglevel"))
    problem_regex = request.config.getoption("--robust_regex")
    visualize = request.config.getoption("--visualize")
    # parse problems from a configuration file
    parsed_problems = []
    path = pathlib.Path(__file__)
    path = path / '../problem_suite_1.yaml'
    problem_dict = yaml.load(path.resolve().read_text(), Loader=yaml.SafeLoader)
    for key in problem_dict:
        if len(problem_dict[key]['ss_waypoints']) == 2:
            ss_waypoints = np.linspace(problem_dict[key]['ss_waypoints'][0],
                                       problem_dict[key]['ss_waypoints'][1],
                                       len(problem_dict[key]['waypoints']))

        for duration in problem_dict[key]['desired_duration']:
            for solver_wrapper in problem_dict[key]['solver_wrapper']:
                for nb_gridpoints in problem_dict[key]['nb_gridpoints']:
                    parsed_problems.append({
                        "name": key,
                        "problem_id": "{:}-{:5f}-{:}-{:}".format(key, duration, solver_wrapper, nb_gridpoints),
                        'waypoints': np.array(problem_dict[key]['waypoints'], dtype=float),
                        'ss_waypoints': ss_waypoints,
                        'vlim': np.r_[problem_dict[key]['vlim']],
                        'alim': np.r_[problem_dict[key]['alim']],
                        'desired_duration': duration,
                        'solver_wrapper': solver_wrapper,
                        'gridpoints': np.linspace(ss_waypoints[0], ss_waypoints[-1], nb_gridpoints),
                        'nb_gridpoints': nb_gridpoints
                    })
    parsed_problems_df = pandas.DataFrame(parsed_problems)

    # solve problems that matched the given regex
    all_success = True
    for row_index, problem_data in parsed_problems_df.iterrows():
        if re.match(problem_regex, problem_data['problem_id']) is None:
            continue
        t0 = time.time()
        path = toppra.SplineInterpolator(
            problem_data['ss_waypoints'],
            problem_data['waypoints'], bc_type='clamped')
        vlim = np.vstack((- problem_data['vlim'], problem_data['vlim'])).T
        alim = np.vstack((- problem_data['alim'], problem_data['alim'])).T
        pc_vel = constraint.JointVelocityConstraint(vlim)
        pc_acc = constraint.JointAccelerationConstraint(
            alim, discretization_scheme=constraint.DiscretizationType.Interpolation)
        t1 = time.time()

        if problem_data['desired_duration'] == 0:
            instance = algo.TOPPRA([pc_vel, pc_acc], path, gridpoints=problem_data['gridpoints'],
                                   solver_wrapper=problem_data['solver_wrapper'])
        else:
            instance = algo.TOPPRAsd([pc_vel, pc_acc], path, gridpoints=problem_data['gridpoints'],
                                     solver_wrapper=problem_data['solver_wrapper'])
            instance.set_desired_duration(problem_data['desired_duration'])

        t2 = time.time()
        jnt_traj = instance.compute_trajectory(0, 0)
        data = instance.problem_data
        t3 = time.time()

        if visualize:
            _t = np.linspace(0, jnt_traj.duration, 100)
            fig, axs = plt.subplots(2, 2)
            axs[0, 0].plot(data.K[:, 0], c="C0")
            axs[0, 0].plot(data.K[:, 1], c="C0")
            axs[0, 0].plot(data.sd_vec ** 2, c="C1")
            axs[0, 1].plot(_t, jnt_traj(_t))
            axs[1, 0].plot(_t, jnt_traj(_t, 1))
            axs[1, 1].plot(_t, jnt_traj(_t, 2))

            axs[0, 0].set_title("param")
            axs[0, 1].set_title("jnt. pos.")
            axs[1, 0].set_title("jnt. vel.")
            axs[1, 1].set_title("jnt. acc.")
            plt.show()

        if jnt_traj is None:
            all_success = False
            parsed_problems_df.loc[row_index, "status"] = "FAIL"
            parsed_problems_df.loc[row_index, "duration"] = None
        else:
            parsed_problems_df.loc[row_index, "status"] = "SUCCESS"
            parsed_problems_df.loc[row_index, "duration"] = jnt_traj.duration
        parsed_problems_df.loc[row_index, "t_init(ms)"] = (t1 - t0) * 1e3
        parsed_problems_df.loc[row_index, "t_setup(ms)"] = (t2 - t1) * 1e3
        parsed_problems_df.loc[row_index, "t_solve(ms)"] = (t3 - t2) * 1e3
    # get all rows with status different from NaN, then reports other columns.
    result_df = parsed_problems_df[parsed_problems_df["status"].notna()][
        ["status", "duration", "desired_duration", "name", "solver_wrapper",
         "nb_gridpoints", "problem_id", "t_init(ms)", "t_setup(ms)", "t_solve(ms)"]]
    result_df.to_csv('%s.result' % __file__)
    
    print("Test summary\n")
    print(tabulate.tabulate(result_df, result_df.columns))
    assert all_success, "Unable to solve some problems in the test suite"
Пример #3
0
################################################################################
# Create velocity bounds, then velocity constraint object
vlim_ = np.random.rand(dof) * 20
vlim = np.vstack((-vlim_, vlim_)).T

################################################################################
# Create acceleration bounds, then acceleration constraint object
alim_ = np.random.rand(dof) * 2
alim = np.vstack((-alim_, alim_)).T
pc_vel = constraint.JointVelocityConstraint(vlim)
pc_acc = constraint.JointAccelerationConstraint(
    alim, discretization_scheme=constraint.DiscretizationType.Interpolation)

################################################################################
# Setup a parametrization instance
instance = algo.TOPPRAsd([pc_vel, pc_acc], path)
instance.set_desired_duration(60)

################################################################################
# Retime the trajectory, only this step is necessary.
jnt_traj = instance.compute_trajectory(0, 0)
ts_sample = np.linspace(0, jnt_traj.get_duration(), 100)
qs_sample = jnt_traj(ts_sample, 2)

################################################################################
# Output
plt.plot(ts_sample, qs_sample)
plt.xlabel("Time (s)")
plt.ylabel("Joint acceleration (rad/s^2)")
plt.show()