Robotics StackExchange | Archived questions

moving turtlebot to different locations on a map

Hello Everyone,

I am trying to make my turtlebot go to different locations on my map (sequentialy), I followed the tutorial at learn.turtlebot.com for going to a specific point on the map and tried to tweek it a bit so that it goes to different pointS on the map. I publish the points that I want to reach (an array of floats) to a topic called "Goal_Pos" and each time I reach a position, I send a new position to the topic. My problem is once a position is reached, the subscriber doesn't get the new array being published right away, (it takes it about 40 second to actually get the new value that has been published) and after reaching the second goal, it gets lost and start spinning on itself.

Can anyone please help me? either by telling me what's wrong on my mess or what would be a better way to do it.

Thank you for you time

class GoToPose():
def __init__(self):
    rospy.init_node('nav_test', anonymous=False)
    self.sub = rospy.Subscriber("Goal_Pos", Float64MultiArray, self.callback)
    self.pub = rospy.Publisher("goal_achieved", Int32, queue_size=100)




def callback(self, ros_data):

    my_array= list(ros_data.data)
    # a condition to know that that we have already reached the final pose
    if(my_array[0]<-100):
        self.pub.publish(1)
        self.sub.unregister()
        rospy.loginfo("Final destination achieved")
        return
    #tell the action client that we want to spin a thread by default
    self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)
    rospy.loginfo("wait for the action server to come up")
    #allow up to 5 seconds for the action server to come up
    self.move_base.wait_for_server(rospy.Duration(5))
    #we'll send a goal to the robot to tell it to move to a pose that's near the docking station
    goal = MoveBaseGoal()
    goal.target_pose.header.frame_id = 'map'
    goal.target_pose.header.stamp = rospy.Time.now()
    #customize the following Point() values so they are appropriate for your location
    #following Point() values so they are appropriate for your location
    goal.target_pose.pose = Pose(Point(my_array[0], my_array[1], my_array[2]), Quaternion(my_array[3], my_array[4], my_array[5], my_array[6]))
    #start moving
    self.move_base.send_goal(goal)
    #allow TurtleBot up to 90 seconds to complete task
    success = self.move_base.wait_for_result(rospy.Duration(90))
    if success:
        state = self.move_base.get_state()
        if state == GoalStatus.SUCCEEDED:
            rospy.loginfo("Hooray, reached the desired pose")
    if not success:
                self.move_base.cancel_goal()
                rospy.loginfo("The base failed to reach the desired pose")
                self.pub.publish(0)
if __name__ == '__main__':
try:
    GoToPose()
except rospy.ROSInterruptException:
    rospy.loginfo("Exception thrown")

`

Asked by Marouane on 2016-02-19 14:27:55 UTC

Comments

Answers