Robotics StackExchange | Archived questions

turtlesim tutorial "Go to Goal"

Hi, recently, while i was learning on how to control turtle in turtlesim i stumbled upon a tutorial on ros wiki on how to make a code in python that moves turtle to a specific position. The code is following:

#!/usr/bin/env python
import rospy
from geometry_msgs.msg  import Twist
from turtlesim.msg import Pose
from math import pow,atan2,sqrt

class turtlebot():
def __init__(self):
    #Creating our node,publisher and subscriber
    rospy.init_node('turtlebot_controller', anonymous=True)
    self.velocity_publisher = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
    self.pose_subscriber = rospy.Subscriber('/turtle1/pose', Pose, self.callback)
    self.pose = Pose()
    self.rate = rospy.Rate(10)

#Callback function implementing the pose value received
def callback(self, data):
    self.pose = data
    self.pose.x = round(self.pose.x, 4)
    self.pose.y = round(self.pose.y, 4)

def get_distance(self, goal_x, goal_y):
    distance = sqrt(pow((goal_x - self.pose.x), 2) + pow((goal_y - self.pose.y), 2))
    return distance

def move2goal(self):
    goal_pose = Pose()
    goal_pose.x = input("Set your x goal:")
    goal_pose.y = input("Set your y goal:")
    distance_tolerance = input("Set your tolerance:")
    vel_msg = Twist()

    while sqrt(pow((goal_pose.x - self.pose.x), 2) + pow((goal_pose.y - self.pose.y), 2)) >= distance_tolerance:

        #Porportional Controller
        #linear velocity in the x-axis:
        vel_msg.linear.x = 1.5 * sqrt(pow((goal_pose.x - self.pose.x), 2) + pow((goal_pose.y - self.pose.y), 2))
        vel_msg.linear.y = 0
        vel_msg.linear.z = 0

        #angular velocity in the z-axis:
        vel_msg.angular.x = 0
        vel_msg.angular.y = 0
        vel_msg.angular.z = 4 * (atan2(goal_pose.y - self.pose.y, goal_pose.x - self.pose.x) - self.pose.theta)

        #Publishing our vel_msg
        self.velocity_publisher.publish(vel_msg)
        self.rate.sleep()
    #Stopping our robot after the movement is over
    vel_msg.linear.x = 0
    vel_msg.angular.z =0
    self.velocity_publisher.publish(vel_msg)

    rospy.spin()

if __name__ == '__main__':
    try:
        #Testing our function
        x = turtlebot()
        x.move2goal()

except rospy.ROSInterruptException: pass

My first question is about get_distance function, is this function pointless in this code? Its defined but its not called anywhere. I also think there is a bug in this code, it doesnt work properly for all given coordinates, for example i put x coordinate to be 1 and y coordinate to be 9 with 0.5 distance tolerance, but turtle, when it started approaching given coordinates, it started rapidly spinning out and bumping into the wall on the right side(you can run the code on your own to get a better vision of situation). Can someone figure out where is the problem?

Asked by Brale on 2017-12-10 14:09:41 UTC

Comments

Hi, I have the same problem. Did you managed to find a solution to this issue ?

It's late but I think the function get_distance() was supposed to be use like this:

while self.get_distance() >= distance_tolerance:
        #Proportional Controller
        #linear velocity in the x-axis:
        vel_msg.linear.x = 1.5 * self.get_distance()

In my cas the robot never stop moving.

Asked by Shanika on 2019-06-25 04:34:12 UTC

Answers

Please see this link: http://wiki.ros.org/turtlesim/Tutorials/Go%20to%20Goal Your code is out of date.

Asked by DiegoGuffanti on 2020-09-21 03:56:47 UTC

Comments