蓝桥ROS之半自动贪吃龟turtlesim版

举报
zhangrelay 发表于 2022/05/01 22:20:58 2022/05/01
【摘要】 为啥不是全自动?全自动是作业,半自动是提示。     一步一步完成吧,非常简单。 第一步:打开蓝桥ROS www.lanqiao.cn/courses/854 第二步:双击xfce终端,分别在不同窗口开启roscore和turtlesim     第三...

为啥不是全自动?全自动是作业,半自动是提示。

 

 

一步一步完成吧,非常简单。


第一步:打开蓝桥ROS

www.lanqiao.cn/courses/854


第二步:双击xfce终端,分别在不同窗口开启roscore和turtlesim

 

 


第三步:贪吃龟(蓝桥ROS机器人之turtlesim贪吃蛇) 


  
  1. import rospy
  2. from tanksim.msg import Pose
  3. from tanksim.srv import Spawn
  4. from tanksim.srv import SetPen
  5. from geometry_msgs.msg import Twist
  6. from geometry_msgs.msg import TransformStamped
  7. import random
  8. import math
  9. tank1_pose = Pose()
  10. tanklist = []
  11. lasttank = 1
  12. nexttankIndex = 1
  13. class mySpawner:
  14. def __init__(self, tname):
  15. self.tank_name = tname
  16. self.state = 1
  17. rospy.wait_for_service('/spawn')
  18. try:
  19. client = rospy.ServiceProxy('/spawn', Spawn)
  20. x = random.randint(1, 10)
  21. y = random.randint(1, 10)
  22. theta = random.uniform(1, 3.14)
  23. name = tname
  24. _nm = client(x, y, theta, name)
  25. rospy.loginfo("tank Created [%s] [%f] [%f]", name, x, y)
  26. rospy.Subscriber(self.tank_name + '/pose', Pose, self.tank_poseCallback)
  27. self.pub = rospy.Publisher(self.tank_name + '/cmd_vel', Twist, queue_size=10)
  28. self.tank_to_follow = 1
  29. self.tank_pose = Pose()
  30. rospy.wait_for_service("/" + tname + '/set_pen')
  31. try:
  32. client = rospy.ServiceProxy("/" + tname + '/set_pen', SetPen)
  33. client(0,0,0,0,1)
  34. except rospy.ServiceException as e:
  35. print("Service call failed: %s"%e)
  36. except rospy.ServiceException as e:
  37. print("Service tp spawn a tank failed. %s", e)
  38. def tank_poseCallback(self, data):
  39. self.tank_pose = data
  40. def tank_velocity(self, msg):
  41. self.pub.publish(msg)
  42. def tank1_poseCallback(data):
  43. global tank1_pose
  44. global lasttank
  45. global tanklist
  46. global nexttankIndex
  47. tank1_pose.x = round(data.x, 4)
  48. tank1_pose.y = round(data.y, 4)
  49. tank1_pose.theta = round(data.theta, 4)
  50. for i in range(len(tanklist)):
  51. twist_data = Twist()
  52. diff = math.sqrt(pow((tank1_pose.x - tanklist[i].tank_pose.x) , 2) + pow((tank1_pose.y - tanklist[i].tank_pose.y), 2))
  53. ang = math.atan2(tank1_pose.y - tanklist[i].tank_pose.y, tank1_pose.x - tanklist[i].tank_pose.x) - tanklist[i].tank_pose.theta
  54. if(ang <= -3.14) or (ang > 3.14):
  55. ang = ang / math.pi
  56. if (tanklist[i].state == 1):
  57. if diff < 1.0:
  58. tanklist[i].state = 2
  59. tanklist[i].tank_to_follow = lasttank
  60. lasttank = i + 2
  61. rospy.loginfo("tank Changed [%s] [%f] [%f]", tanklist[i].tank_name, diff, ang)
  62. nexttankIndex += 1
  63. tanklist.append(mySpawner("tank" + str(nexttankIndex)))
  64. else:
  65. parPose = tank1_pose
  66. if(tanklist[i].tank_to_follow != 1):
  67. parPose = tanklist[tanklist[i].tank_to_follow - 2].tank_pose
  68. diff = math.sqrt(pow((parPose.x - tanklist[i].tank_pose.x) , 2) + pow((parPose.y - tanklist[i].tank_pose.y), 2))
  69. goal = math.atan2(parPose.y - tanklist[i].tank_pose.y, parPose.x - tanklist[i].tank_pose.x)
  70. ang = math.atan2(math.sin(goal - tanklist[i].tank_pose.theta), math.cos(goal - tanklist[i].tank_pose.theta))
  71. if(ang <= -3.14) or (ang > 3.14):
  72. ang = ang / (2*math.pi)
  73. if(diff < 0.8):
  74. twist_data.linear.x = 0
  75. twist_data.angular.z = 0
  76. else:
  77. twist_data.linear.x = 2.5 * diff
  78. twist_data.angular.z = 20 * ang
  79. tanklist[i].tank_velocity(twist_data)
  80. tanklist[i].oldAngle = ang
  81. def spawn_tank_fn():
  82. global nexttankIndex
  83. rospy.init_node('snake_tank', anonymous=True)
  84. rospy.Subscriber('/tank1/pose', Pose, tank1_poseCallback)
  85. rospy.wait_for_service("/tank1/set_pen")
  86. try:
  87. client = rospy.ServiceProxy('/tank1/set_pen', SetPen)
  88. client(0,0,0,0,1)
  89. except rospy.ServiceException as e:
  90. print("Service call failed: %s"%e)
  91. nexttankIndex += 1
  92. tanklist.append(mySpawner("tank" + str(nexttankIndex)))
  93. # for i in range(2,10):
  94. # tanklist.append(mySpawner("tank" + str(i)))
  95. rospy.spin()
  96. if __name__ == "__main__":
  97. spawn_tank_fn()

 

新开窗口输入python snake.py


第四步:输入坐标实现贪吃龟(ROS机器人从起点到终点(四)蓝桥云实践复现

一个bug点!符号-0.1到0.1跳变,3.14? -3.14?

 


 

第五步:写个节点全自动?留作思考题吧 

 ^_^  ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ ^_^ 


 

文章来源: zhangrelay.blog.csdn.net,作者:zhangrelay,版权归原作者所有,如需转载,请联系作者。

原文链接:zhangrelay.blog.csdn.net/article/details/124503850

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。