摘要: 原创博客:转载请表明出处: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的更多相关文章

  1. 利用move_base导航--42

    摘要: 原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 各位博友好长时间又没有写博客了,突然发现上班和在学校是不一样的,在公司的却没有时间写博客了,不过 ...

  2. 多个精美的导航样式web2.0源码

    效果体验:http://keleyi.com/keleyi/phtml/divcss/6.htm 兼容多浏览器,例如IE,Chrome,火狐 等. 完整代码,保存到htm文件打开也可以查看效果: &l ...

  3. javascript权威指南第13章 事件示例代码

    html 部分 <!DOCTYPE html> <html> <head> <title>Event Bubling Example</title ...

  4. 企业IT管理员IE11升级指南【9】—— IE10与IE11的功能对比

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  5. ROS--导航、路径规划和SLAM

    一.用move_base导航走正方形 1. roscore 2.执行 roslaunch rbx1_bringup fake_turtlebot.launch 然后 roslaunch rbx1_na ...

  6. 前端组件库 - 搭建web app常用的样式/组件等收集列表(移动优先)

    0. 前端自动化(Workflow) 前端构建工具 Webpack - module bundler Yeoman - a set of tools for automating developmen ...

  7. MVC官方教程索引

    1.MVC教程首页http://www.asp.net/learn/mvc/?lang=cs 2.MVC概况2.1创建一个基于数据库的"电影"web应用http://www.asp ...

  8. Javascript导航菜单13则

    来源:http://www.noupe.com/ajax/13-awesome-java-script-css-menu.html翻译:http://parandroid.com下面为你准备了13个利 ...

  9. iOS开发笔记13:顶部标签式导航栏及下拉分类菜单

    当内容及分类较多时,往往采用顶部标签式导航栏,例如网易新闻客户端的顶部分类导航,最近刚好有这样的应用场景,参考网络上一些demo,实现了这种导航效果,记录一些要点. 效果图(由于视频转GIF掉帧,滑动 ...

随机推荐

  1. MapReduce 重要组件——Recordreader组件

    (1)以怎样的方式从分片中读取一条记录,每读取一条记录都会调用RecordReader类: (2)系统默认的RecordReader是LineRecordReader,如TextInputFormat ...

  2. SharePoint 2013 开发——APP开发的考虑和建议

    博客地址:http://blog.csdn.net/FoxDave 需要考虑的方面: 1. 记得CSOM授予网站集及以下的权限,而场解决方案需要整个场的访问权限. 2. 由于应用程序是彼此完全独立 ...

  3. 机器翻译(noip2010)

    分析:该题是经典的队列题目,直接用队列实现就可以.如果数据范围大一些的话还可hash判重! 这可以说是一道送分的题目,但是还有粗心的学生会在这里失分,主要原因是数组的范围定义的不合适,因为空间足够用, ...

  4. linux 杀死进程的方法

    # kill -pid 注释:标准的kill命令通常都能达到目的.终止有问题的进程,并把进程的资源释放给系统.然而,如果进程启动了子进程,只杀死父进程,子进程仍在运行,因此仍消耗资源.为了防止这些所谓 ...

  5. sidePagination: "server"和responseHandler: responseHandler

    bootstrapTable()中有两个属性 一个是sidePagination,表示服务器分页,responseHandler:responseHandler 表示回应操作的rows和total 两 ...

  6. LoadImage函数问题

    loadimage函数加载图片类型 Value Meaning IMAGE_BITMAP Loads a bitmap. IMAGE_CURSOR Loads a cursor. IMAGE_ICON ...

  7. 玩转渗透神器Kali:Kali Linux作为主系统使用的正确姿势TIPS

    Kali Linux 前身是著名渗透测试系统BackTrack ,是一个基于 Debian 的 Linux 发行版,包含很多安全和取证方面的相关工具. 本文假设你在新装好的kali linux环境下… ...

  8. (转)phoneGap-Android开发环境搭建

    (原)http://www.cnblogs.com/shawn-xie/archive/2012/08/15/2638480.html phoneGap-Android开发环境搭建   一.安装 在安 ...

  9. 用python做些有意思的事——分析QQ聊天记录——私人订制

    之前,写了这篇文章,用python提取全部群成员的发言时间,并简单做了下分析.先补充一下,针对特定单个群成员(这里以  小小白   为例)消息记录的获取. 代码比较简单,主要是正则表达式的书写.(附: ...

  10. Nearest number - 2_暴力&&bfs

    Description Input is the matrix A of N by N non-negative integers. A distance between two elements A ...