Exemplo n.º 1
0
    def get_a_list_of_pose_to_goal(self, start, goal, tf_listener, dist_limit=None, pathpub=None, wppub=None, skip=1):
        resolution = self.og.info.resolution
        width = self.og.info.width
        height = self.og.info.height
        offsetX = self.og.info.origin.position.x
        offsetY = self.og.info.origin.position.y

        tf_listener.waitForTransform('odom', 'map', rospy.Time(0), rospy.Duration(10.0))
        tstart = tf_listener.transformPose(self.og.header.frame_id, fuck_the_time(start))
        tgoal = tf_listener.transformPose(self.og.header.frame_id, fuck_the_time(goal))

        if dist_limit is not None:
            tgoal = self.limit_max_dist(tstart, tgoal, dist_limit)

        if wppub is not None:
            ttgoal = tf_listener.transformPose('map', fuck_the_time(tgoal))
            wppub.publish(ttgoal)

        start_grid_pos = pose2gridpos(tstart.pose, resolution, offsetX, offsetY)
        goal_grid_pos = pose2gridpos(tgoal.pose, resolution, offsetX, offsetY)

        try:
            path = aStar(self.make_navigable_gridpos(), start_grid_pos, goal_grid_pos, self.astarnodescb)
            wp = self.getWaypoints(path, tgoal, publisher=pathpub)
            list_of_pose = []
            # magic number. skip a few waypoints in the beginning
            for stuff in wp:
                retp = PoseStamped()
                retp.pose = stuff.pose
                retp.header = self.og.header
                list_of_pose.append(retp)
            return list_of_pose

        except NoPathFoundException as e:
            raise e
Exemplo n.º 2
0
    def limit_max_dist(self, fr_posestamped, to_posestamped, max_dist):
        assert fr_posestamped.header.frame_id == to_posestamped.header.frame_id
        assert max_dist > 0
        angle = get_direction(fr_posestamped, to_posestamped)
        dist = get_distance(fr_posestamped, to_posestamped)
        if dist > max_dist:
            print 'next waypoint at dist ' + str(dist) + ' limiting the dist to ' + str(max_dist)
            ps = PoseStamped()
            ps.pose.position.x = (fr_posestamped.pose.position.x + math.cos(angle) * max_dist)
            ps.pose.position.y = (fr_posestamped.pose.position.y + math.sin(angle) * max_dist)
            # ps.pose.position.x = 1
            # ps.pose.position.y = 1
            ps.header.frame_id = fr_posestamped.header.frame_id

            quaternion = tf.transformations.quaternion_from_euler(0, 0, angle)
            ps.pose.orientation.x = quaternion[0]
            ps.pose.orientation.y = quaternion[1]
            ps.pose.orientation.z = quaternion[2]
            ps.pose.orientation.w = quaternion[3]

            ps = fuck_the_time(ps)
            print 'actual dist ' + str(get_distance(fr_posestamped, ps))
            return ps
        else:
            return to_posestamped
Exemplo n.º 3
0
    def getWaypoints(self, list_of_gridpos, goal_pose, publisher=None):
        resolution = self.og.info.resolution
        width = self.og.info.width
        height = self.og.info.height
        offsetX = self.og.info.origin.position.x
        offsetY = self.og.info.origin.position.y

        wp = Path()
        wp.header.frame_id = self.og.header.frame_id
        poses = []
        lastdirection = -999
        for i in range(0, len(list_of_gridpos) - 1):
            direction = getDirection(list_of_gridpos[i], list_of_gridpos[i + 1])
            if direction != lastdirection:
                lastdirection = copy.deepcopy(direction)
                newPose = PoseStamped()
                newPose.header.frame_id = self.og.header.frame_id
                newPose.pose = Pose()
                newPose.pose.position = getPoint(list_of_gridpos[i], resolution, offsetX, offsetY)
                quaternion = tf.transformations.quaternion_from_euler(0, 0, direction)
                newPose.pose.orientation.x = quaternion[0]
                newPose.pose.orientation.y = quaternion[1]
                newPose.pose.orientation.z = quaternion[2]
                newPose.pose.orientation.w = quaternion[3]
                poses.append(newPose)
        newPose = self.tf_listener.transformPose(self.og.header.frame_id, fuck_the_time(goal_pose))
        poses.append(newPose)
        wp.poses = poses
        if publisher is not None:
            publisher.publish(wp)
        return wp.poses
Exemplo n.º 4
0
 def get_my_posestamped(self):
     self.tf_listener.waitForTransform('map', 'odom', rospy.Time(0), rospy.Duration(10.0))
     ps = PoseStamped()
     ps.pose = self.odom.pose.pose
     ps.header = self.odom.header
     current_pose_stamped_in_map = self.tf_listener.transformPose('/map', fuck_the_time(ps))
     return current_pose_stamped_in_map
Exemplo n.º 5
0
def navToPose_but_dont_care_end_orientation(whatever_frame_goal):
    """Drive to a goal subscribed to from /move_base_simple/goal"""
    # compute angle required to make straight-line move to desired pose
    global xPosition
    global yPosition
    global theta
    global odom_list

    odom_list.waitForTransform('odom', 'map', rospy.Time(0), rospy.Duration(10.0))
    goal = odom_list.transformPose('map', fuck_the_time(whatever_frame_goal))

    initialX = xPosition
    initialY = yPosition
    initialT = theta

    # capture desired x and y positions
    desiredY = goal.pose.position.y
    desiredX = goal.pose.position.x
    # capture desired angle
    quat = goal.pose.orientation
    q = [quat.x, quat.y, quat.z, quat.w]
    roll, pitch, yaw = euler_from_quaternion(q)
    desiredT = yaw

    dx = desiredX - initialX
    dy = desiredY - initialY
    distance = math.sqrt((dx) ** 2 + (dy) ** 2)
    pathT = math.atan2(dy, dx)

    initialTurn = getMinimalAngleDifference(pathT, initialT)
    finalTurn = getMinimalAngleDifference(desiredT, pathT)

    rotate(initialTurn)
    driveSmooth(0.25, distance)
Exemplo n.º 6
0
def navToPose_but_dont_care_end_orientation(whatever_frame_goal):
    """Drive to a goal subscribed to from /move_base_simple/goal"""
    # compute angle required to make straight-line move to desired pose
    global xPosition
    global yPosition
    global theta
    global odom_list

    odom_list.waitForTransform('odom', 'map', rospy.Time(0),
                               rospy.Duration(10.0))
    goal = odom_list.transformPose('map', fuck_the_time(whatever_frame_goal))

    initialX = xPosition
    initialY = yPosition
    initialT = theta

    # capture desired x and y positions
    desiredY = goal.pose.position.y
    desiredX = goal.pose.position.x
    # capture desired angle
    quat = goal.pose.orientation
    q = [quat.x, quat.y, quat.z, quat.w]
    roll, pitch, yaw = euler_from_quaternion(q)
    desiredT = yaw

    dx = desiredX - initialX
    dy = desiredY - initialY
    distance = math.sqrt((dx)**2 + (dy)**2)
    pathT = math.atan2(dy, dx)

    initialTurn = getMinimalAngleDifference(pathT, initialT)
    finalTurn = getMinimalAngleDifference(desiredT, pathT)

    rotate(initialTurn)
    driveSmooth(0.25, distance)
Exemplo n.º 7
0
    def test_get_goal_points(self, event):
        print "test get goal points"
        points = self.fe.get_nav_goal_point_candidates()

        next_goal = PoseStamped()
        next_goal.pose.position = points.pop(0)
        next_goal.header.frame_id = 'map'
        next_goal = fuck_the_time(next_goal)

        self.next_goal_pub.publish(next_goal)
Exemplo n.º 8
0
    def test_get_goal_points(self,event):
        print "test get goal points"
        points = self.fe.get_nav_goal_point_candidates()

        next_goal = PoseStamped()
        next_goal.pose.position = points.pop(0)
        next_goal.header.frame_id = 'map'
        next_goal = fuck_the_time(next_goal)

        self.next_goal_pub.publish(next_goal)
Exemplo n.º 9
0
def point2pose(point):
    next_goal = PoseStamped()
    next_goal.pose.position = point
    q = tf.transformations.quaternion_from_euler(0, 0, 0)
    next_goal.pose.orientation.x = q[0]
    next_goal.pose.orientation.y = q[1]
    next_goal.pose.orientation.z = q[2]
    next_goal.pose.orientation.w = q[3]
    next_goal.header.frame_id = 'map'
    next_goal = fuck_the_time(next_goal)
    return next_goal
Exemplo n.º 10
0
def point2pose(point):
    next_goal = PoseStamped()
    next_goal.pose.position = point
    q = tf.transformations.quaternion_from_euler(0, 0, 0)
    next_goal.pose.orientation.x = q[0]
    next_goal.pose.orientation.y = q[1]
    next_goal.pose.orientation.z = q[2]
    next_goal.pose.orientation.w = q[3]
    next_goal.header.frame_id = 'map'
    next_goal = fuck_the_time(next_goal)
    return next_goal
Exemplo n.º 11
0
def plan_a_path_and_nav_to_goal(goal):
    global pose
    global globalCostmapThing
    global localCostmapThing
    global odom_list
    global pubintermediategoalpose
    global where_the_f_am_i_going
    global pubglobalwp
    global pubglobalpath

    ps = PoseStamped()
    ps.pose = pose
    ps.header.frame_id = 'map'
    ps.header.stamp = rospy.Time(0)

    localdone = False
    globaldone = False

    nextwp = None

    local_feasible = True
    global_feasible = True

    while not globaldone:
        try:
            print 'planning for global map'
            nextwp, globaldone = globalCostmapThing.getNextWaypoint(ps, goal, odom_list, wppub=pubglobalwp, pathpub=pubglobalpath, skip=1)
            global_feasible = True
            localdone = False
            while not localdone:
                try:
                    print 'tryin to replan in the local map'
                    # nextwp_l, localdone = localCostmapThing.getNextWaypoint(ps, nextwp, odom_list, pathpub=pubrealpath,
                    #                                                         dist_limit=1,
                    #                                                         wppub=pubintermediategoalpose, skip=2)
                    # nextwp = localCostmapThing.getNextWaypoint(ps, goal, odom_list, pathpub=pubrealpath,
                    #                                            wppub=pubintermediategoalpose, dist_limit=0.5)

                    if global_feasible and not local_feasible:
                        print 'found path in global but no path in local. go to global path.'
                        navToPose_but_dont_care_end_orientation(nextwp)

                    list_of_pose = localCostmapThing.get_a_list_of_pose_to_goal(ps, nextwp, odom_list, pathpub=pubrealpath,
                                                      dist_limit=0.8,
                                                      wppub=pubintermediategoalpose)
                    local_feasible = True
                    for i, nextwp_l in enumerate(list_of_pose):
                        if 0 < i < 2:
                            odom_list.waitForTransform('odom', 'map', rospy.Time(0), rospy.Duration(10.0))
                            nextwp_lt = odom_list.transformPose('map', fuck_the_time(nextwp_l))
                            where_the_f_am_i_going.publish(nextwp_lt)
                            print 'naving the local waypoints'
                            navToPose_but_dont_care_end_orientation(nextwp_lt)
                            localdone = True
                    # nextwp = nextwp_l
                except NoPathFoundException:
                    local_feasible = False
                    print 'no path found in local. replan in global'
                    try:
                        nextwp, globaldone = globalCostmapThing.getNextWaypoint(ps, goal, odom_list, wppub=pubglobalwp, pathpub=pubglobalpath, skip=1)
                        global_feasible = True
                    except:
                        global_feasible = False
                        print 'no path found to goal. give up'
                        return
            print 'Reached local goal'

        except NoPathFoundException:
            global_feasible = False
            print 'cannot find a path in global map'
            return
    navToPose(goal)
    print 'Reached global goal'
Exemplo n.º 12
0
def plan_a_path_and_nav_to_goal(goal):
    global pose
    global globalCostmapThing
    global localCostmapThing
    global odom_list
    global pubintermediategoalpose
    global where_the_f_am_i_going
    global pubglobalwp
    global pubglobalpath

    ps = PoseStamped()
    ps.pose = pose
    ps.header.frame_id = 'map'
    ps.header.stamp = rospy.Time(0)

    localdone = False
    globaldone = False

    nextwp = None

    local_feasible = True
    global_feasible = True

    while not globaldone:
        try:
            print 'planning for global map'
            nextwp, globaldone = globalCostmapThing.getNextWaypoint(
                ps,
                goal,
                odom_list,
                wppub=pubglobalwp,
                pathpub=pubglobalpath,
                skip=1)
            global_feasible = True
            localdone = False
            while not localdone:
                try:
                    print 'tryin to replan in the local map'
                    # nextwp_l, localdone = localCostmapThing.getNextWaypoint(ps, nextwp, odom_list, pathpub=pubrealpath,
                    #                                                         dist_limit=1,
                    #                                                         wppub=pubintermediategoalpose, skip=2)
                    # nextwp = localCostmapThing.getNextWaypoint(ps, goal, odom_list, pathpub=pubrealpath,
                    #                                            wppub=pubintermediategoalpose, dist_limit=0.5)

                    if global_feasible and not local_feasible:
                        print 'found path in global but no path in local. go to global path.'
                        navToPose_but_dont_care_end_orientation(nextwp)

                    list_of_pose = localCostmapThing.get_a_list_of_pose_to_goal(
                        ps,
                        nextwp,
                        odom_list,
                        pathpub=pubrealpath,
                        dist_limit=0.8,
                        wppub=pubintermediategoalpose)
                    local_feasible = True
                    for i, nextwp_l in enumerate(list_of_pose):
                        if 0 < i < 2:
                            odom_list.waitForTransform('odom', 'map',
                                                       rospy.Time(0),
                                                       rospy.Duration(10.0))
                            nextwp_lt = odom_list.transformPose(
                                'map', fuck_the_time(nextwp_l))
                            where_the_f_am_i_going.publish(nextwp_lt)
                            print 'naving the local waypoints'
                            navToPose_but_dont_care_end_orientation(nextwp_lt)
                            localdone = True
                    # nextwp = nextwp_l
                except NoPathFoundException:
                    local_feasible = False
                    print 'no path found in local. replan in global'
                    try:
                        nextwp, globaldone = globalCostmapThing.getNextWaypoint(
                            ps,
                            goal,
                            odom_list,
                            wppub=pubglobalwp,
                            pathpub=pubglobalpath,
                            skip=1)
                        global_feasible = True
                    except:
                        global_feasible = False
                        print 'no path found to goal. give up'
                        return
            print 'Reached local goal'

        except NoPathFoundException:
            global_feasible = False
            print 'cannot find a path in global map'
            return
    navToPose(goal)
    print 'Reached global goal'