使用move_base导航 ---13
摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/
我们现在准备用move_base简单的移动机器人记住,一个“pose”在ros的意思是一个位置和方向。
1.首先启动turtlebot机器人。
- roslaunch rbx1_bringup fake_turtlebot.launch
2.在另一个终端运行:
- roslaunch rbx1_nav fake_move_base_blank_map.launch
3.打开rviz视图查看机器人。
- rosrun rviz rviz -d `rospack find rbx1_nav`/nav.rviz
4.运行move_base_square.py脚本移动机器人。
- rosrun rbx1_nav move_base_square.py
5.rviz视图如下:
6.rqt_graph节点框图如下:
7.节点move_base_square.py代码如下:
- #!/usr/bin/env python
- import rospy
- import actionlib
- from actionlib_msgs.msg import *
- from geometry_msgs.msg import Pose, Point, Quaternion, Twist
- from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal
- from tf.transformations import quaternion_from_euler
- from visualization_msgs.msg import Marker
- from math import radians, pi
- class MoveBaseSquare():
- def __init__(self):
- rospy.init_node('nav_test', anonymous=False)
- rospy.on_shutdown(self.shutdown)
- # How big is the square we want the robot to navigate?
- square_size = rospy.get_param("~square_size", 1.0) # meters
- # Create a list to hold the target quaternions (orientations)
- quaternions = list()
- # First define the corner orientations as Euler angles
- euler_angles = (pi/, pi, *pi/, )
- # Then convert the angles to quaternions
- for angle in euler_angles:
- q_angle = quaternion_from_euler(, , angle, axes='sxyz')
- q = Quaternion(*q_angle)
- quaternions.append(q)
- # Create a list to hold the waypoint poses
- waypoints = list()
- # Append each of the four waypoints to the list. Each waypoint
- # is a pose consisting of a position and orientation in the map frame.
- waypoints.append(Pose(Point(square_size, 0.0, 0.0), quaternions[]))
- waypoints.append(Pose(Point(square_size, square_size, 0.0), quaternions[]))
- waypoints.append(Pose(Point(0.0, square_size, 0.0), quaternions[]))
- waypoints.append(Pose(Point(0.0, 0.0, 0.0), quaternions[]))
- # Initialize the visualization markers for RViz
- self.init_markers()
- # Set a visualization marker at each waypoint
- for waypoint in waypoints:
- p = Point()
- p = waypoint.position
- self.markers.points.append(p)
- # Publisher to manually control the robot (e.g. to stop it, queue_size=)
- self.cmd_vel_pub = rospy.Publisher('cmd_vel', Twist, queue_size=)
- # Subscribe to the move_base action server
- self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction)
- rospy.loginfo("Waiting for move_base action server...")
- # Wait seconds for the action server to become available
- self.move_base.wait_for_server(rospy.Duration())
- rospy.loginfo("Connected to move base server")
- rospy.loginfo("Starting navigation test")
- # Initialize a counter to track waypoints
- i =
- # Cycle through the four waypoints
- while i < and not rospy.is_shutdown():
- # Update the marker display
- self.marker_pub.publish(self.markers)
- # Intialize the waypoint goal
- goal = MoveBaseGoal()
- # Use the map frame to define goal poses
- goal.target_pose.header.frame_id = 'map'
- # Set the time stamp to "now"
- goal.target_pose.header.stamp = rospy.Time.now()
- # Set the goal pose to the i-th waypoint
- goal.target_pose.pose = waypoints[i]
- # Start the robot moving toward the goal
- self.move(goal)
- i +=
- def move(self, goal):
- # Send the goal pose to the MoveBaseAction server
- self.move_base.send_goal(goal)
- # Allow minute to get there
- finished_within_time = self.move_base.wait_for_result(rospy.Duration())
- # If we don't get there in time, abort the goal
- if not finished_within_time:
- self.move_base.cancel_goal()
- rospy.loginfo("Timed out achieving goal")
- else:
- # We made it!
- state = self.move_base.get_state()
- if state == GoalStatus.SUCCEEDED:
- rospy.loginfo("Goal succeeded!")
- def init_markers(self):
- # Set up our waypoint markers
- marker_scale = 0.2
- marker_lifetime = # is forever
- marker_ns = 'waypoints'
- marker_id =
- marker_color = {'r': 1.0, 'g': 0.7, 'b': 1.0, 'a': 1.0}
- # Define a marker publisher.
- self.marker_pub = rospy.Publisher('waypoint_markers', Marker, queue_size=)
- # Initialize the marker points list.
- self.markers = Marker()
- self.markers.ns = marker_ns
- self.markers.id = marker_id
- self.markers.type = Marker.CUBE_LIST
- self.markers.action = Marker.ADD
- self.markers.lifetime = rospy.Duration(marker_lifetime)
- self.markers.scale.x = marker_scale
- self.markers.scale.y = marker_scale
- self.markers.color.r = marker_color['r']
- self.markers.color.g = marker_color['g']
- self.markers.color.b = marker_color['b']
- self.markers.color.a = marker_color['a']
- self.markers.header.frame_id = 'odom'
- self.markers.header.stamp = rospy.Time.now()
- self.markers.points = list()
- def shutdown(self):
- rospy.loginfo("Stopping the robot...")
- # Cancel any active goals
- self.move_base.cancel_goal()
- rospy.sleep()
- # Stop the robot
- self.cmd_vel_pub.publish(Twist())
- rospy.sleep()
- if __name__ == '__main__':
- try:
- MoveBaseSquare()
- except rospy.ROSInterruptException:
- rospy.loginfo("Navigation test finished.")
使用move_base导航 ---13的更多相关文章
- 利用move_base导航--42
摘要: 原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 各位博友好长时间又没有写博客了,突然发现上班和在学校是不一样的,在公司的却没有时间写博客了,不过 ...
- 多个精美的导航样式web2.0源码
效果体验:http://keleyi.com/keleyi/phtml/divcss/6.htm 兼容多浏览器,例如IE,Chrome,火狐 等. 完整代码,保存到htm文件打开也可以查看效果: &l ...
- javascript权威指南第13章 事件示例代码
html 部分 <!DOCTYPE html> <html> <head> <title>Event Bubling Example</title ...
- 企业IT管理员IE11升级指南【9】—— IE10与IE11的功能对比
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- ROS--导航、路径规划和SLAM
一.用move_base导航走正方形 1. roscore 2.执行 roslaunch rbx1_bringup fake_turtlebot.launch 然后 roslaunch rbx1_na ...
- 前端组件库 - 搭建web app常用的样式/组件等收集列表(移动优先)
0. 前端自动化(Workflow) 前端构建工具 Webpack - module bundler Yeoman - a set of tools for automating developmen ...
- MVC官方教程索引
1.MVC教程首页http://www.asp.net/learn/mvc/?lang=cs 2.MVC概况2.1创建一个基于数据库的"电影"web应用http://www.asp ...
- Javascript导航菜单13则
来源:http://www.noupe.com/ajax/13-awesome-java-script-css-menu.html翻译:http://parandroid.com下面为你准备了13个利 ...
- iOS开发笔记13:顶部标签式导航栏及下拉分类菜单
当内容及分类较多时,往往采用顶部标签式导航栏,例如网易新闻客户端的顶部分类导航,最近刚好有这样的应用场景,参考网络上一些demo,实现了这种导航效果,记录一些要点. 效果图(由于视频转GIF掉帧,滑动 ...
随机推荐
- WP8.1 Study12:文件压缩与Known Folder(包含SD卡操作)
一.文件压缩 当应用程序保存和加载数据,它可以使用压缩. 1.使用 Windows.Storage.Compression.Compressor 压缩,获得一个Compressor stream. v ...
- Session初识
web服务器没有短期记忆,所以需要使用session来跟踪用户的整个会话活动.会话管理有3种解决方案: 1)使用隐藏域(很少使用) 在显示页面中使用隐藏域来保存会话ID.例如,在JSP中将input标 ...
- 用Qt实现简单的视频播放器
ui 在.pro文件中添加 QT +=phonon 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> ...
- 自定义ImageView
package com.example.myimageview; import android.content.Context;import android.graphics.Bitmap;impor ...
- 压力测试工具——Galting
为什么要写Gatling呢?网上已经有一些介绍Gatling的好文章了,比如两位TW同事的文章,可以看这里(我知道Gatling也是因为这位作者介绍的),还有这里.主要是因为最近在使用Gatling做 ...
- Chrome 应用推荐 - 下载管理扩展: Chrono
地址:http://goo.gl/JVdxvg Chrono下载管理器让你轻松高效地管理Chrome浏览器中的下载任务.Chrono与Chrome浏览器紧密地整合在一起,如菜单.工具栏支持等等.Chr ...
- SharePoint 2013 开发——SharePoint APP介绍
博客地址:http://blog.csdn.net/FoxDave 新的APP模型让我们能够创建看起来像是SharePoint的一部分的应用程序,但是它完全运行在独立于SharePoint服务器 ...
- Mac下SVN服务器环境的搭建和配置(除展示图片外,所有命令在Linux/Unix下适用)
这几天领导没有安排工作,闲着没事就想把自己这两年做iOS开发时感觉知识有欠缺的地方想好好深入地补习一下,昨天和今天就计划好好学习下SVN和git的从创建和到原理,到命令,到界面的使用.一不小心被另一领 ...
- c#图像处理入门(-bitmap类和图像像素值获取方法) 转
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
- hdu1505 dp
//Accepted 5196 KB 109 ms //类似hdu1506 //输入数据的格式没有明确的限制 //可能出现以下情况 //5 5 //R //F //F F F //F F F F F ...