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
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
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:
In my cas the robot never stop moving.
Asked by Shanika on 2019-06-25 04:34:12 UTC