コード例 #1
0
def main(env=None, test=False):
    "Main function."
    parser = argparse.ArgumentParser(description="A simple example in which trajectories, which are planned using"
                                                 "OpenRAVE is retimed using toppra. The trajectories are found using"
                                                 "birrt, the default planner. Goals are generated randomly and "
                                                 "uniformly.")
    parser.add_argument('-e', '--env', help='OpenRAVE Environment file', default="data/lab1.env.xml")
    parser.add_argument('-v', '--verbose', help='Show DEBUG log and plot trajectories', action="store_true")
    parser.add_argument('-N', '--Ngrid', help='Number of discretization step', default=100, type=int)
    args = vars(parser.parse_args())

    if args['verbose']:
        toppra.setup_logging('DEBUG')
    else:
        toppra.setup_logging('INFO')

    if env is None:
        env = orpy.Environment()
    env.SetDebugLevel(0)
    env.Load(args['env'])
    env.SetViewer('qtosg')
    robot = env.GetRobots()[0]
    robot.SetDOFAccelerationLimits(np.ones(11) * 3)
    manipulator = robot.GetManipulators()[0]
    robot.SetActiveManipulator(manipulator)
    robot.SetActiveDOFs(manipulator.GetArmIndices())
    controller = robot.GetController()
    basemanip = orpy.interfaces.BaseManipulation(robot)
    dof = robot.GetActiveDOF()

    pc_torque = toppra.create_rave_torque_path_constraint(
        robot, discretization_scheme=toppra.constraint.DiscretizationType.Interpolation)

    it = 0
    while True or (test and it > 5):
        lower, upper = robot.GetActiveDOFLimits()
        qrand = np.random.rand(dof) * (upper - lower) + lower
        with robot:
            robot.SetActiveDOFValues(qrand)
            incollision = env.CheckCollision(robot) or robot.CheckSelfCollision()
            if incollision:
                continue
        traj_original = basemanip.MoveActiveJoints(qrand, execute=False, outputtrajobj=True)
        if traj_original is None:
            continue
        traj_retimed, trajra = toppra.retime_active_joints_kinematics(
            traj_original, robot, output_interpolator=True, N=args['Ngrid'],
            additional_constraints=[pc_torque])

        print(("Original duration: {:.3f}. Retimed duration: {:3f}.".format(
            traj_original.GetDuration(), traj_retimed.GetDuration())))

        if args['verbose']:
            plot_trajectories(traj_original, traj_retimed, robot)
        time.sleep(1)

        controller.SetPath(traj_retimed)
        robot.WaitForController(0)
        it += 1
コード例 #2
0
def robot_fixture():
    env = orpy.Environment()
    env.Load("data/lab1.env.xml")
    robot = env.GetRobots()[0]
    manipulator = robot.GetManipulators()[0]
    robot.SetActiveDOFs(manipulator.GetArmIndices())
    # Generate IKFast if needed
    iktype = orpy.IkParameterization.Type.Transform6D
    ikmodel = orpy.databases.inversekinematics.InverseKinematicsModel(robot, iktype=iktype)
    if not ikmodel.load():
        print 'Generating IKFast {0}. It will take few minutes...'.format(iktype.name)
        ikmodel.autogenerate()
        print 'IKFast {0} has been successfully generated'.format(iktype.name)
    # env.SetViewer('qtosg')
    toppra.setup_logging("INFO")
    yield robot
    env.Destroy()
コード例 #3
0
def main(env=None, test=False):
    "Main function."
    args = parse_cli_arguments()
    toppra.setup_logging('INFO')
    robot = load_rave_robot(args)
    basemanip = orpy.interfaces.BaseManipulation(robot)
    pc_torque = toppra.create_rave_torque_path_constraint(
        robot,
        discretization_scheme=toppra.constraint.DiscretizationType.
        Interpolation)

    it = 0
    while True or (test and it > 5):
        qrand = generate_random_configuration(robot)
        traj_original = basemanip.MoveActiveJoints(qrand,
                                                   execute=False,
                                                   outputtrajobj=True)
        if traj_original is None:
            continue

        traj_retimed, trajra = toppra.retime_active_joints_kinematics(
            traj_original,
            robot,
            output_interpolator=True,
            N=args['Ngrid'],
            additional_constraints=[pc_torque],
            solver_wrapper='seidel')

        print("Original duration: {:.3f}. Retimed duration: {:3f}.".format(
            traj_original.GetDuration(), traj_retimed.GetDuration()))

        robot.GetController().SetPath(traj_retimed)
        if args['verbose']:
            plot_trajectories(traj_original, traj_retimed, robot)

        robot.WaitForController(0)
        it += 1
コード例 #4
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"
コード例 #5
0
"""This test suite ensures that problem scaling does not affect
solution quality, in the sense that a very short path (~1e-2) and a
very long path (~1e2) can be both parameterized.
"""
import pytest
import numpy as np
import toppra
import toppra.constraint as constraint

toppra.setup_logging(level="INFO")


@pytest.mark.parametrize("solver_wrapper", ["cvxpy", "hotqpoases", "seidel"])
def test_linear_case1(basic_constraints, basic_path, solver_wrapper):
    """A generic test case.

    Compare scaling between 0.5 and 1.0. Since the scaling factor is
    quite small, resulting trajectories should have similar durations.

    """
    vel_c, acc_c, ro_acc_c = basic_constraints
    instance_scale1 = toppra.algorithm.TOPPRA(
        [vel_c, acc_c], basic_path, solver_wrapper=solver_wrapper, scaling=1.0)
    instance_scale05 = toppra.algorithm.TOPPRA(
        [vel_c, acc_c], basic_path, solver_wrapper=solver_wrapper, scaling=5)
    traj1, _ = instance_scale1.compute_trajectory()
    traj05, _ = instance_scale05.compute_trajectory()
    # accurate up to 0.1%
    np.testing.assert_allclose(traj1.duration, traj05.duration, rtol=1e-3)
コード例 #6
0
ファイル: kinematics.py プロジェクト: Puttichai/toppra
import toppra as ta
import toppra.constraint as constraint
import toppra.algorithm as algo
import numpy as np
import matplotlib.pyplot as plt
import argparse

ta.setup_logging("INFO")


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,
コード例 #7
0
"""A test suite for solverwrappers that implement solve methods for
canonical linear constraints. Wrapppers considered include:
'cvxpy', 'qpOASES', "ecos", 'hotqpOASES', 'seidel'.

"""
import pytest
import numpy as np
import numpy.testing as npt

import toppra
import toppra.constraint as constraint

toppra.setup_logging(level="DEBUG")

try:
    import cvxpy
    FOUND_CXPY = True
except ImportError:
    FOUND_CXPY = False

try:
    import mosek
    FOUND_MOSEK = True
except ImportError:
    FOUND_MOSEK = False


class RandomSecondOrderLinearConstraint(constraint.CanonicalLinearConstraint):
    """A random Second-Order non-identical constraint.

    This contraint is defined solely for testing purposes. It accepts
コード例 #8
0
ファイル: conftest.py プロジェクト: hyzcn/toppra
def pytest_collection_modifyitems(config, items):
    toppra.setup_logging(config.getoption("--loglevel"))
コード例 #9
0
def main():
    parser = argparse.ArgumentParser(
        description="An example showcasing the usage of robust constraints."
        "A velocity constraint and a robust acceleration constraint"
        "are considered in this script.")
    parser.add_argument("-N",
                        "--N",
                        type=int,
                        help="Number of segments in the discretization.",
                        default=100)
    parser.add_argument("-v", "--verbose", action="store_true", default=False)
    parser.add_argument("-du", "--du", default=1e-3, type=float)
    parser.add_argument("-dx", "--dx", default=5e-2, type=float)
    parser.add_argument("-dc", "--dc", default=9e-3, type=float)
    parser.add_argument("-so", "--solver_wrapper", default='ecos')
    parser.add_argument("-i", "--interpolation_scheme", default=1, type=int)
    args = parser.parse_args()
    if args.verbose:
        ta.setup_logging("DEBUG")
    else:
        ta.setup_logging("INFO")

    # Parameters
    N_samples = 5
    dof = 7

    # Random waypoints used to obtain a random geometric path.
    np.random.seed(9)
    way_pts = np.random.randn(N_samples, dof)

    # 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

    path = ta.SplineInterpolator(np.linspace(0, 1, 5), way_pts)
    pc_vel = constraint.JointVelocityConstraint(vlim)
    pc_acc = constraint.JointAccelerationConstraint(
        alim,
        discretization_scheme=constraint.DiscretizationType.Interpolation)
    robust_pc_acc = constraint.RobustLinearConstraint(
        pc_acc, [args.du, args.dx, args.dc], args.interpolation_scheme)
    instance = algo.TOPPRA([pc_vel, robust_pc_acc],
                           path,
                           gridpoints=np.linspace(0, 1, args.N + 1),
                           solver_wrapper=args.solver_wrapper)

    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.legend()
    plt.title("Path-position path-velocity plot")
    plt.show()

    jnt_traj, aux_traj = instance.compute_trajectory(0, 0)
    ts_sample = np.linspace(0, jnt_traj.duration, 100)
    qs_sample = jnt_traj.evaldd(ts_sample)

    plt.plot(ts_sample, qs_sample)
    plt.show()
コード例 #10
0
parser.add_argument(
    "-N",
    "--N",
    type=int,
    help="Number of segments in the discretization.",
    default=100,
)
parser.add_argument("-v", "--verbose", action="store_true", default=False)
parser.add_argument("-du", "--du", default=1e-3, type=float)
parser.add_argument("-dx", "--dx", default=5e-2, type=float)
parser.add_argument("-dc", "--dc", default=9e-3, type=float)
parser.add_argument("-so", "--solver_wrapper", default="ecos")
parser.add_argument("-i", "--interpolation_scheme", default=1, type=int)
args = parser.parse_args()
if args.verbose:
    ta.setup_logging("DEBUG")
else:
    ta.setup_logging("INFO")

# Parameters
N_samples = 5
dof = 7

# Random waypoints used to obtain a random geometric path.
np.random.seed(9)
way_pts = np.random.randn(N_samples, dof)

# 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
コード例 #11
0
import pytest
import toppra
import numpy as np
try:
    import openravepy as orpy
    FOUND_OPENRAVE = True
except ImportError:
    FOUND_OPENRAVE = False

toppra.setup_logging("DEBUG")


@pytest.fixture(scope='module')
def robot_fixture():
    env = orpy.Environment()
    env.Load("data/lab1.env.xml")
    robot = env.GetRobots()[0]
    manipulator = robot.GetManipulators()[0]
    robot.SetActiveDOFs(manipulator.GetArmIndices())
    # Generate IKFast if needed
    iktype = orpy.IkParameterization.Type.Transform6D
    ikmodel = orpy.databases.inversekinematics.InverseKinematicsModel(
        robot, iktype=iktype)
    if not ikmodel.load():
        print('Generating IKFast {0}. It will take few minutes...'.format(
            iktype.name))
        ikmodel.autogenerate()
        print('IKFast {0} has been successfully generated'.format(iktype.name))
    # env.SetViewer('qtosg')
    toppra.setup_logging("INFO")
    yield robot