How to move a turtle bot with specifc velocity
I am using gazibo simulator to simulate multiple turtlebots, I have three robots, all the robots have to move to one goal point but with different velocities. Please suggest me how to set a velocity and move the robot to the point. I am using Twist() function to set the velocity Twist().linear.x = 0.5 but its not accurate.
And more over if I increase the velocity greater than 1, the robot is not going to the target. Below is my code, please let me know what is the problem in my code:
speed = Twist()
while abs(goal1.x-x) > 0.15 and abs(goal1.y-y) > 0.2:
if abs(angle_to_goal-theta) > 0.15:
speed.linear.x = 0.0
speed.angular.z = 0.5
else:
speed.linear.x = 1.5
speed.angular.z = 0.0
pub.publish(speed)
r.sleep()
Thank you
Asked by Satish on 2019-10-30 20:30:28 UTC
Answers
So as I Understand you code you first aim to target pos and then drive to it.
distance=sqrt(pow(goal1.x-x,2) + pow(goal1.y-y, 2))
scale=0.3
scaleVel=0.3
if abs(angle_to_goal-theta) > 0.15:
dir=(angle_to_goal-theta) /abs( angle_to_goal-theta)
angSpeed= min(0.5, abs( angle_to_goal-theta) / scale)
speed.linear.x = 0.0
speed.angular.z = dir*angSpeed
else:
speed.linear.x = min(1.5, distance * scaleVel)
speed.angular.z = 0.0
Vou can tune the scale values for daster drive and rotate.
Asked by duck-development on 2019-10-31 02:58:07 UTC
Comments
@duck-development, Thanks a lot for your response. when I use your logic the robot is not stopping at all. Please look below the code of mine. I can't post the complete code due to size constraints
def newOdom(msg):
global x
global y
global theta
x = msg.pose.pose.position.x
y = msg.pose.pose.position.y
rot_q = msg.pose.pose.orientation
(roll, pitch, theta) = euler_from_quaternion([rot_q.x, rot_q.y, rot_q.z, rot_q.w])
pub = rospy.Publisher("/robot2/cmd_vel", Twist, queue_size = 1)
speed = Twist()
inc_x = goal.x-x
inc_y = goal.y-y
angle_to_goal = atan2(inc_y, inc_x)
distance=sqrt(pow(goal.x-x,2) + pow(goal.y-y, 2))
while distance >= 0.5:
Your Code
After while loop:
speed.angular.z =0.0
pub.publish(speed)
rospy.loginfo(x)
rospy.loginfo(y)
Asked by Satish on 2019-10-31 14:27:42 UTC
did you try to change the scale velues, make them smaller.
start the vehicle to drive to the target or does it only turns. because here we have a P-Controller to get it better you need an PID-Controller. you have to change the while to a if and insert a else with speed = 0 afer. because insde you whilee x y theta do not get updated. you clond provide a peste bin with you full code.
Asked by duck-development on 2019-11-04 02:50:48 UTC
@duck-development, I am sorry, I did not fully understand your answer, I have created a new question with better explanation and modified full code. If you can please review and let me know what you think. Here is the link to the question: [https://answers.ros.org/question/337695/pointing-turtlebot-to-the-target-position-before-moving/]
Asked by Satish on 2019-11-14 19:40:35 UTC
Comments