示例#1
0
def get_straight_traj(env, init_stds, n_points=50):
    """Straight line demonstration"""
    start = env.start_state
    goal = env.goal_state

    dx = (goal[:3] - start[:3]) / float(n_points)
    traj_pts = [start]
    traj_stds = [init_stds]
    dists = []

    for i in range(n_points):

        point = copy.deepcopy(traj_pts[0])
        point[:3] += dx * float(i + 1)

        q = qt.slerp(start[3:], goal[3:], float(i + 1) / float(n_points))
        point[3] = q[0]
        point[4] = q[1]
        point[5] = q[2]
        point[6] = q[3]

        traj_pts.append(point)
        ## traj_stds.append( list(np.array(init_stds)*(1. + float(n_points-i)/float(n_points))/2.0 ))
        traj_stds.append(
            list(
                np.array(init_stds) *
                np.exp(-1.5 * float(i) / float(n_points))))

        dists.append(pose_distance(traj_pts[i - 1], traj_pts[i]))

    assert np.amax(
        dists
    ) < MAX_EDGE_LEN, "reference trajectory's resolution {} is too low".format(
        np.amax(dists))
    return traj_pts, traj_stds
示例#2
0
def sample_points_rrm(env,
                      traj_pts,
                      traj_stds,
                      samples,
                      node_groups,
                      roadmap,
                      max_dist=0.005,
                      min_dist=0.001,
                      leafsize=30):

    # random samples
    nearest_samples = []

    if len(node_groups) > 1:
        sub_samples = []
        for group in node_groups:
            sub_samples.append(np.array(samples)[group].tolist())
    else:
        sub_samples = [samples]

    n_points = len(traj_pts)
    p = np.linspace(1., 0.1, n_points)
    p /= np.sum(p)

    for i, (point, std) in enumerate(zip(traj_pts, traj_stds)):
        # random
        i = np.random.choice(range(n_points), p=p)
        point = traj_pts[i]
        std = traj_stds[i]
        ## from IPython import embed; embed(); sys.exit()

        rnd = np.array([
            truncnorm((env.observation_space.low[0] - point[0]) / std[0],
                      (env.observation_space.high[0] - point[0]) / std[0],
                      loc=point[0],
                      scale=std[0]).rvs(1)[0],
            truncnorm((env.observation_space.low[1] - point[1]) / std[1],
                      (env.observation_space.high[1] - point[1]) / std[1],
                      loc=point[1],
                      scale=std[1]).rvs(1)[0],
            truncnorm((env.observation_space.low[2] - point[2]) / std[2],
                      (env.observation_space.high[2] - point[2]) / std[2],
                      loc=point[2],
                      scale=std[2]).rvs(1)[0], 0, 0, 0, 1
        ])
        rnd[3:7] = qt.quat_QuTem(point[3:7], 1, std[3:7])[0]

        for sub_sample in sub_samples:
            # Find nearest node
            nind = np.argmin(pose_distance(sub_sample, rnd))

            #block
            d_max = 0.01  # 0.005
            w_max = 1.
            max_dist = MAX_EDGE_LEN
            min_dist = 0.008  #0.009 # 0.017 = 1deg, scale=0.3

            nearest_sample = copy.deepcopy(sub_sample[nind])

            # ang
            org_dist = qt.quat_angle(nearest_sample[3:7],
                                     rnd[3:7]) / np.pi / 2.
            nearest_sample[3:7] = qt.slerp(
                nearest_sample[3:7], rnd[3:7],
                min(w_max / 180. * np.pi / org_dist, 1.))

            # pos
            unit_vec = rnd[:3] - nearest_sample[:3]
            unit_vec /= np.linalg.norm(unit_vec)

            d_collision = env.get_distance(nearest_sample)
            if d_collision <= 0: continue
            else: expandPosDis = d_max
            nearest_sample[:3] += expandPosDis * unit_vec
            if expandPosDis == 0: continue

            if env.isValid(nearest_sample, check_collision=True) is False:
                continue

            dists = pose_distance(samples + nearest_samples,
                                  np.array(nearest_sample))
            j = np.argmin(dists)
            pose_dist = dists[j]
            grip_dist = abs((samples + nearest_samples)[j][7] -
                            nearest_sample[7])

            if pose_dist > max_dist or (pose_dist < min_dist
                                        and grip_dist < 0.5):
                continue
            nearest_samples.append(nearest_sample)

    if len(nearest_samples) == 0: return samples, roadmap

    #expand roadmap
    pre_max_indx = len(samples) - 1
    roadmap += [[i + len(samples)] for i in range(len(nearest_samples))]
    samples += nearest_samples
    state_inds = np.array(range(len(samples)))

    max_edge = 0
    for s in nearest_samples:
        dists = pose_distance(samples, s)

        try:
            inds = state_inds[dists <= max_dist]
            dists = dists[inds]

            tmp = np.argsort(dists)
            inds = np.array(inds)[tmp]
            roadmap[inds[0]] = inds.tolist()
        except:
            print "Maybe env's observation limit does not match with reference traj"
            from IPython import embed
            embed()
            sys.exit()

        for ii, ind in enumerate(inds):
            if ii == 0: continue
            if pre_max_indx < ind: continue
            roadmap[ind].append(inds[0])
            if len(roadmap[ind]) > max_edge:
                max_edge = len(roadmap[ind])

    print len(samples), max_edge, len(nearest_samples)
    return samples, roadmap
def sample_points_rrm2(env,
                       traj_pts,
                       traj_stds,
                       samples,
                       node_groups,
                       roadmap,
                       default_y_angle=0,
                       max_dist=0.005,
                       min_dist=0.001,
                       leafsize=30):

    # random samples
    nearest_samples = []

    if len(node_groups) > 1:
        sub_samples = []
        for group in node_groups:
            sub_samples.append(np.array(samples)[group].tolist())
    else:
        sub_samples = [samples]

    n_points = len(traj_pts)
    p = np.linspace(1., 0.1, n_points)
    p /= np.sum(p)

    for i, (point, std) in enumerate(zip(traj_pts, traj_stds)):
        # random
        i = np.random.choice(range(n_points), p=p)
        #i = random.randint(0, len(traj_pts)-1)
        point = traj_pts[i]
        std = traj_stds[i]
        ## from IPython import embed; embed(); sys.exit()

        rnd = np.array([
            truncnorm((env.observation_space.low[0] - point[0]) / std[0],
                      (env.observation_space.high[0] - point[0]) / std[0],
                      loc=point[0],
                      scale=std[0]).rvs(1)[0],
            truncnorm((env.observation_space.low[1] - point[1]) / std[1],
                      (env.observation_space.high[1] - point[1]) / std[1],
                      loc=point[1],
                      scale=std[1]).rvs(1)[0],
            truncnorm((env.observation_space.low[2] - point[2]) / std[2],
                      (env.observation_space.high[2] - point[2]) / std[2],
                      loc=point[2],
                      scale=std[2]).rvs(1)[0], 0, 0, 0, 1
        ])
        M = PyKDL.Rotation.RPY(random.gauss(point[3], std[3]),
                               random.gauss(point[4], std[4]), default_y_angle)
        q = M.GetQuaternion()
        rnd[3] = q[0]
        rnd[4] = q[1]
        rnd[5] = q[2]
        rnd[6] = q[3]

        for sub_sample in sub_samples:
            # Find nearest node
            nind = np.argmin(pose_distance(sub_sample, rnd))

            #peginhole
            d_max = 0.01  # 0.005
            w_max = 1.
            max_dist = MAX_EDGE_LEN
            min_dist = 0.003  #0.002 # 0.005 0.017 = 1deg, scale=0.3

            #clamp
            d_max = 0.005  #0.01 # 0.005
            w_max = 1.
            max_dist = MAX_EDGE_LEN
            min_dist = 0.003  #0.005 # 0.005 0.017 = 1deg, scale=0.3

            ## dist = env.get_distance(sub_sample[nind])
            ## if  dist > collision_dist:
            ##     d_max    = d_max*dist/collision_dist if dist < collision_dist*collision_mult else d_max*collision_mult
            ##     w_max    = w_max*dist/collision_dist if dist < collision_dist*collision_mult else w_max*collision_mult
            ##     max_dist = min(dist, max_dist*collision_mult)
            ##     min_dist = min_dist #*mult

            nearest_sample = copy.deepcopy(sub_sample[nind])

            # ang
            org_dist = orient_distance(nearest_sample[3:], rnd[3:])
            q = qt.slerp(nearest_sample[3:], rnd[3:],
                         min(w_max / 180. * np.pi / org_dist, 1.))
            nearest_sample[3] = q[0]
            nearest_sample[4] = q[1]
            nearest_sample[5] = q[2]
            nearest_sample[6] = q[3]

            # pos
            unit_vec = rnd[:3] - nearest_sample[:3]
            unit_vec /= np.linalg.norm(unit_vec)

            d_collision = env.get_distance(nearest_sample)
            if d_collision <= 0:
                continue
                #elif d_collision < d_max: expandPosDis = d_collision*0.9
            else:
                expandPosDis = d_max
            nearest_sample[:3] += expandPosDis * unit_vec
            if expandPosDis == 0: continue

            if env.isValid(nearest_sample, check_collision=True) is False:
                continue

            dist = np.amin(
                pose_distance(samples + nearest_samples,
                              np.array(nearest_sample)))
            ## print dist, d_max, w_max, max_dist, min_dist
            if dist > max_dist or dist < min_dist: continue
            nearest_samples.append(nearest_sample)

    if len(nearest_samples) == 0: return samples, roadmap

    #start = time.time()
    #expand roadmap
    pre_max_indx = len(samples) - 1
    roadmap += [[i + len(samples)] for i in range(len(nearest_samples))]
    samples += nearest_samples
    state_inds = np.array(range(len(samples)))

    max_edge = 0
    for s in nearest_samples:
        dists = pose_distance(samples, s)

        ## dist = env.get_distance(s)
        ## if dist < collision_dist:
        ##     max_dist = MAX_EDGE_LEN
        ## else:
        ##     max_dist = min(dist, MAX_EDGE_LEN*collision_mult)

        try:
            inds = state_inds[dists <= max_dist]
            dists = dists[inds]

            tmp = np.argsort(dists)
            inds = np.array(inds)[tmp]
            roadmap[inds[0]] = inds.tolist()
        except:
            print "Maybe env's observation limit does not match with reference traj"
            from IPython import embed
            embed()
            sys.exit()

        for ii, ind in enumerate(inds):
            if ii == 0: continue
            if pre_max_indx < ind: continue
            roadmap[ind].append(inds[0])
            if len(roadmap[ind]) > max_edge:
                max_edge = len(roadmap[ind])
                ## if max_edge>100:
                ##     dd = pose_distance(samples, samples[ind])
                ##     print dd[dd<=MAX_EDGE_LEN]
                ##     sys.exit()

    print len(samples), max_edge, len(nearest_samples)
    #print(time.time() - start, len(samples)); start = time.time()
    return samples, roadmap