Пример #1
0
 def c(self, v, w):
     # admissible estimate of the cost of an edge between state v, w
     collide, dist = isCollide(self, v, w)
     if collide:
         return np.inf
     else:
         return dist
Пример #2
0
    def run(self, Reversed = True, xrobot = None):
        if Reversed:
            if xrobot is None:
                self.x0 = tuple(self.env.goal)
                self.xt = tuple(self.env.start)
            else:
                self.x0 = tuple(self.env.goal)
                self.xt = xrobot
            xnew = self.env.goal
        else:
            xnew = self.env.start
        self.V.append(self.x0)
        while self.ind < self.maxiter:
            xrand = sampleFree(self)
            xnearest = nearest(self, xrand)
            xnew = steer(self, xnearest, xrand)
            collide, _ = isCollide(self, xnearest, xnew)
            if not collide:
                self.V.append(xnew)  # add point
                if self.Flag is not None:
                    self.Flag[xnew] = 'Valid'
                self.wireup(xnew, xnearest)

                if getDist(xnew, self.xt) <= self.stepsize:
                    self.wireup(self.xt, xnew)
                    self.Path, D = path(self)
                    print('Total distance = ' + str(D))
                    if self.Flag is not None:
                        self.Flag[self.xt] = 'Valid'
                    break
                # visualization(self)
                self.i += 1
            self.ind += 1
Пример #3
0
    def run(self):
        self.V.append(tuple(self.env.start))
        self.ind = 0
        self.fig = plt.figure(figsize=(10, 8))
        xnew = self.env.start
        while self.ind < self.maxiter and getDist(
                xnew, self.env.goal) > self.stepsize:
            xrand = sampleFree(self)
            xnearest = nearest(self, xrand)
            xnew = steer(self, xnearest, xrand)
            collide, _ = isCollide(self, xnearest, xnew)
            if not collide:
                self.V.append(xnew)  # add point
                self.wireup(xnew, xnearest)

                if getDist(xnew, self.env.goal) <= self.stepsize:
                    goal = tuple(self.env.goal)
                    self.wireup(goal, xnew)
                    self.Path, D = path(self)
                    print('Total distance = ' + str(D))
                # visualization(self)
                self.i += 1
            self.ind += 1
            # if the goal is really reached

        self.done = True
        visualization(self)
        plt.show()
Пример #4
0
 def run(self):
     xnew = self.x0
     print('start rrt*... ')
     self.fig = plt.figure(figsize=(10, 8))
     while self.ind < self.maxiter:
         xrand = sampleFree(self)
         xnearest = nearest(self, xrand)
         xnew, dist = steer(self, xnearest, xrand)
         collide, _ = isCollide(self, xnearest, xnew, dist=dist)
         if not collide:
             Xnear = near(self, xnew)
             self.V.append(xnew)  # add point
             # visualization(self)
             # minimal path and minimal cost
             xmin, cmin = xnearest, cost(self, xnearest) + getDist(
                 xnearest, xnew)
             # connecting along minimal cost path
             Collide = []
             for xnear in Xnear:
                 xnear = tuple(xnear)
                 c1 = cost(self, xnear) + getDist(xnew, xnear)
                 collide, _ = isCollide(self, xnew, xnear)
                 Collide.append(collide)
                 if not collide and c1 < cmin:
                     xmin, cmin = xnear, c1
             self.wireup(xnew, xmin)
             # rewire
             for i in range(len(Xnear)):
                 collide = Collide[i]
                 xnear = tuple(Xnear[i])
                 c2 = cost(self, xnew) + getDist(xnew, xnear)
                 if not collide and c2 < cost(self, xnear):
                     # self.removewire(xnear)
                     self.wireup(xnear, xnew)
             self.i += 1
         self.ind += 1
     # max sample reached
     self.reached()
     print('time used = ' + str(time.time() - starttime))
     print('Total distance = ' + str(self.D))
     visualization(self)
     plt.show()
Пример #5
0
 def FindAffectedEdges(self, obstacle):
     # scan the graph for the changed edges in the tree.
     # return the end point and the affected
     print('finding affected edges...')
     Affectededges = []
     for e in self.Edge:
         child, parent = e
         collide, _ = isCollide(self, child, parent)
         if collide:
             Affectededges.append(e)
     return Affectededges
Пример #6
0
 def c(self, v, w):
     # admissible estimate of the cost of an edge between state v, w
     if (v, w) in self.edgeCost:
         pass
     else:
         collide, dist = isCollide(self, v, w)
         if collide:
             self.edgeCost[(v, w)] = np.inf
         else:
             self.edgeCost[(v, w)] = dist
     return self.edgeCost[(v, w)]
Пример #7
0
 def FMTrun(self):
     z = self.xinit
     rn = self.radius
     Nz = self.Near(self.Vunvisited, z, rn)
     E = set()
     self.Save(Nz, z)
     ind = 0
     while z != self.xgoal:
         Vopen_new = set()
         #Nz = self.Near(self.Vunvisited, z, rn)
         #self.Save(Nz, z)
         #Xnear = Nz.intersection(self.Vunvisited)
         Xnear = self.Near(self.Vunvisited, z, rn)
         self.Save(Xnear, z)
         for x in Xnear:
             #Nx = self.Near(self.V.difference({x}), x, rn)
             #self.Save(Nx, x)
             #Ynear = list(Nx.intersection(self.Vopen))
             Ynear = list(self.Near(self.Vopen, x, rn))
             # self.Save(set(Ynear), x)
             ymin = Ynear[np.argmin([
                 self.c[y] + self.Cost(y, x) for y in Ynear
             ])]  # DP programming equation
             collide, _ = isCollide(self, ymin, x)
             if not collide:
                 E.add(
                     (ymin, x)
                 )  # straight line joining ymin and x is collision free
                 Vopen_new.add(x)
                 self.Parent[x] = z
                 self.Vunvisited = self.Vunvisited.difference({x})
                 self.c[x] = self.c[ymin] + self.Cost(
                     ymin, x
                 )  # estimated cost-to-arrive from xinit in tree T = (VopenUVclosed, E)
         # update open set
         self.Vopen = self.Vopen.union(Vopen_new).difference({z})
         self.Vclosed.add(z)
         if len(self.Vopen) == 0:
             print('Failure')
             return
         ind += 1
         print(str(ind) + ' node expanded')
         self.visualization(ind, E)
         # update current node
         Vopenlist = list(self.Vopen)
         z = Vopenlist[np.argmin([self.c[y] for y in self.Vopen])]
     # creating the tree
     T = (self.Vopen.union(self.Vclosed), E)
     self.done = True
     self.Path = self.path(z, T)
     self.visualization(ind, E)
     plt.show()
Пример #8
0
 def run(self):
     self.V.append(self.env.start)
     self.ind = 0
     xnew = self.env.start
     print('start rrt*... ')
     self.fig = plt.figure(figsize=(10, 8))
     while self.ind < self.maxiter:
         xrand = sampleFree(self)
         xnearest = nearest(self, xrand)
         xnew = steer(self, xnearest, xrand)
         if not isCollide(self, xnearest, xnew):
             Xnear = near(self, xnew)
             self.V.append(xnew)  # add point
             visualization(self)
             # minimal path and minimal cost
             xmin, cmin = xnearest, cost(self, xnearest) + getDist(
                 xnearest, xnew)
             # connecting along minimal cost path
             for xnear in Xnear:
                 c1 = cost(self, xnear) + getDist(xnew, xnear)
                 if not isCollide(self, xnew, xnear) and c1 < cmin:
                     xmin, cmin = xnear, c1
             self.wireup(xnew, xmin)
             # rewire
             for xnear in Xnear:
                 c2 = cost(self, xnew) + getDist(xnew, xnear)
                 if not isCollide(self, xnew,
                                  xnear) and c2 < cost(self, xnear):
                     self.removewire(xnear)
                     self.wireup(xnear, xnew)
             self.i += 1
         self.ind += 1
     # max sample reached
     self.reached()
     print('time used = ' + str(time.time() - starttime))
     print('Total distance = ' + str(self.D))
     visualization(self)
     plt.show()
Пример #9
0
 def run(self):
     self.V.append(self.env.start)
     self.ind = 0
     self.fig = plt.figure(figsize=(10, 8))
     xnew = self.env.start
     while self.ind < self.maxiter and getDist(xnew, self.env.goal) > 1:
         xrand = sampleFree(self)
         xnearest = nearest(self, xrand)
         xnew = steer(self, xnearest, xrand)
         if not isCollide(self, xnearest, xnew):
             self.V.append(xnew)  # add point
             self.wireup(xnew, xnearest)
             visualization(self)
             self.i += 1
         self.ind += 1
         if getDist(xnew, self.env.goal) <= 1:
             self.wireup(self.env.goal, xnew)
             self.Path, D = path(self)
             print('Total distance = ' + str(D))
     self.done = True
     visualization(self)
     plt.show()
Пример #10
0
    def run(self):
        self.V.append(self.x0)
        while self.ind < self.maxiter:
            xrand = sampleFree(self)
            xnearest = nearest(self, xrand)
            xnew, dist = steer(self, xnearest, xrand)
            collide, _ = isCollide(self, xnearest, xnew, dist=dist)
            if not collide:
                self.V.append(xnew)  # add point
                self.wireup(xnew, xnearest)

                if getDist(xnew, self.xt) <= self.stepsize:
                    self.wireup(self.xt, xnew)
                    self.Path, D = path(self)
                    print('Total distance = ' + str(D))
                    break
                # visualization(self)
                self.i += 1
            self.ind += 1
            # if the goal is really reached

        self.done = True
        visualization(self)
        plt.show()
Пример #11
0
 def Extend(self, nearest, target):
     extended, dist = steer(self, nearest, target, DIST=True)
     collide, _ = isCollide(self, nearest, target, dist)
     return extended, collide
Пример #12
0
 def NEW_CONFIG(self, q, qnear, qnew, dist=None):
     # to check if the new configuration is valid or not by
     # making a move is used for steer
     # check in bound
     collide, _ = isCollide(self, qnear, qnew, dist=dist)
     return not collide
Пример #13
0
    def Informed_rrt(self):
        self.V = [self.xstart]
        self.E = set()
        self.Xsoln = set()
        self.T = (self.V, self.E)

        c = 1
        while self.ind <= self.N:
            print(self.ind)
            self.visualization()
            # print(self.i)
            if len(self.Xsoln) == 0:
                cbest = np.inf
            else:
                cbest = min({self.cost(xsln) for xsln in self.Xsoln})
            xrand = self.Sample(self.xstart, self.xgoal, cbest)
            xnearest = nearest(self, xrand)
            xnew, dist = steer(self, xnearest, xrand)
            # print(xnew)
            collide, _ = isCollide(self, xnearest, xnew, dist=dist)
            if not collide:
                self.V.append(xnew)
                Xnear = near(self, xnew)
                xmin = xnearest
                cmin = self.cost(xmin) + c * self.line(xnearest, xnew)
                for xnear in Xnear:
                    xnear = tuple(xnear)
                    cnew = self.cost(xnear) + c * self.line(xnear, xnew)
                    if cnew < cmin:
                        collide, _ = isCollide(self, xnear, xnew)
                        if not collide:
                            xmin = xnear
                            cmin = cnew
                self.E.add((xmin, xnew))
                self.Parent[xnew] = xmin

                for xnear in Xnear:
                    xnear = tuple(xnear)
                    cnear = self.cost(xnear)
                    cnew = self.cost(xnew) + c * self.line(xnew, xnear)
                    # rewire
                    if cnew < cnear:
                        collide, _ = isCollide(self, xnew, xnear)
                        if not collide:
                            xparent = self.Parent[xnear]
                            self.E.difference_update((xparent, xnear))
                            self.E.add((xnew, xnear))
                            self.Parent[xnear] = xnew
                self.i += 1
                if self.InGoalRegion(xnew):
                    print('reached')
                    self.done = True
                    self.Parent[self.xgoal] = xnew
                    self.Path, _ = path(self)
                    self.Xsoln.add(xnew)
            # update path
            if self.done:
                self.Path, _ = path(self, Path=[])
            self.ind += 1
        # return tree
        return self.T