飞道的博客

ROS笔记八(基于Python、Kinetic):gazebo初探——实现turtlebot移动并避开障碍

869人阅读  评论(0)

前言:代码实现在gazebo7仿真环境中turtlebot机器人的自由移动并避开障碍物。

1.创建新的工作空间:

创建工作空间文件树:


  
  1. $ mkdir -p ~/wanderbot_ws/src
  2. $ cd ~/wanderbot_ws/src
  3. $ catkin_init_workspace

创建一个“wanderbot”程序包:


  
  1. $ cd ~ /wanderbot_ws/src
  2. $ catkin_create-pkg wanderbot rospy geometry_msgs sensor_msgs

依赖包:rospy(python编译)、geometry_msgs(用于传递机器人速度等数据)、sensor_msgs(用于传递机器人传感器数据)。

2.代码实现:

代码1:实现turtlebot移动和停止:


  
  1. #!/usr/bin/env python
  2. import rospy
  3. from geometry_msgs.msg import Twist
  4. #声明‘cmd_vel’的话题,消息类型为Twist,“queue_size=1”:rospy只缓冲一个消息
  5. cmd_vel_pub = rospy.Publisher( 'cmd_vel', Twist, queue_size= 1)
  6. #节点初始化
  7. rospy.init_node( 'red_light_green_light')
  8. #创建一个Twist消息,初始值为零
  9. red_light_twist = Twist() #停止消息流
  10. green_light_twist = Twist() #移动消息流
  11. #指定消息中linear沿着x方向速度
  12. green_light_twist.linear.x = 0.5
  13. driving_forward = False
  14. light_change_time = rospy.Time.now()
  15. #设置速率
  16. rate = rospy.Rate( 10)
  17. while not rospy.is_shutdown():
  18. if driving_forward:
  19. #持续发布速度命令消息流
  20. cmd_vel_pub.publish(green_light_twist)
  21. else:
  22. cmd_vel_pub.publish(red_light_twist)
  23. #检测系统时间,三秒周期性改变
  24. if rospy.Time.now() > light_change_time:
  25. driving_forward = not driving_forward
  26. light_change_time = rospy.Time.now() + rospy.Duration( 3)
  27. rate.sleep()

 代码2:检测机器人前方障碍物的距离:


  
  1. #!/usr/bin/env python
  2. import rospy
  3. from sensor_msgs.msg import LaserScan
  4. #回调函数:将数据输出到终端
  5. def scan_callback(msg):
  6. range_ahead = msg.ranges[len(msg.ranges)/ 2]
  7. print "range ahead: %0.1f" % range_ahead
  8. #节点初始化
  9. rospy.init_node( 'range_ahead')
  10. #订阅‘scan’话题,消息类型LaserScan
  11. scan_sub = rospy.Subscriber( 'scan', LaserScan, scan_callback)
  12. rospy.spin()

 代码3:感知环境并移动


  
  1. #!/usr/bin/env python
  2. import rospy
  3. from geometry_msgs.msg import Twist
  4. from sensor_msgs.msg import LaserScan
  5. def scan_callback(msg):
  6. #全局变量存储激光扫描器检测到的最小距离
  7. global g_range_ahead
  8. g_range_ahead = min(msg.ranges)
  9. g_range_ahead = 1
  10. #订阅‘scan’话题,消息类型LaserScan
  11. scan_sub = rospy.Subscriber( 'scan', LaserScan, scan_callback)
  12. #发布‘cmd_vel’话题,消息类型Twist,只缓冲一个消息
  13. cmd_vel_pub = rospy.Publisher( 'cmd_vel', Twist, queue_size= 1)
  14. #节点初始化
  15. rospy.init_node( 'wander')
  16. #获取系统当前时间
  17. state_change_time = rospy.Time.now()
  18. #前进/转向状态参数
  19. driving_forward = True
  20. #设置速率
  21. rate = rospy.Rate( 10)
  22. while not rospy.is_shutdown():
  23. if driving_forward:
  24. # 如果机器人距离障碍小于0.8M或则运行时间大于30秒,停止前进并转向
  25. if (g_range_ahead < 0.8 or rospy.Time.now() > state_change_time):
  26. #停止
  27. driving_forward = False
  28. #转向
  29. state_change_time = rospy.Time.now() + rospy.Duration( 5)
  30. else:
  31. if rospy.Time.now() > state_change_time:
  32. driving_forward = True # 完成转向,继续前进
  33. state_change_time = rospy.Time.now() + rospy.Duration( 30)
  34. twist = Twist()
  35. if driving_forward:
  36. #指定前进时的线速度
  37. twist.linear.x = 1
  38. else:
  39. #指定转向时的角速度
  40. twist.angular.z = 1
  41. cmd_vel_pub.publish(twist)
  42. rate.sleep()

3.安装gazebo:

$ sudo apt-get install ros-kinetic-turtlebot-gazebo

4.打开gazebo:

打开gazebo:

$ roslaunch turtlebot_gazebo turtlebot_world.launch

因为系统没有模型文件,所以加载非常缓慢,点击下载模型库即可。下载完成后解压至~/.gazebo/models/目录下即可。

5.在gazebo中运行turtlebot:

打开新的终端:

$ cd ~/wanderbot_ws/src/wanderbot/src

增加可执行权限:

$ chmod +x wander.py

运行程序:

./wander.py cmd_vel:=cmd_vel_mux/input/teleop

6.问题记录:

笔者在运行时候出现了下面的问题:

始终没找到办法解决,现在回想可能是在安装过程中:在终端最后一行出现File to patch:不明所以,Ctrl C也不能退出,最后强行关掉了终端。最后卸载了gazebo重新安装才得以解决。

安装完成后gazebo7所依赖的包如下:

 关于gazebo卸载:


  
  1. $ sudo apt-get remove gazebo*
  2. $ sudo apt-get remove libgazebo*
  3. $ sudo apt-get remove ros-kinetic-gazebo*

直到终端执行dpkg -l | grep gazebo 没有输出即完全卸载。


转载:https://blog.csdn.net/java0fu/article/details/106189053
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场