摘要: 原创博客:转载请表明出处: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. APP主流UI框架结构

    uitabbar控制器为根控制器在其基础上 放多个导航栏控制器

  2. 事件函数SetEvent、PulseEvent与WaitForSingleObject详解

    系统核心对象中的Event事件对象,在进程.线程间同步的时候是比较常用,发现它有两个出发函数,一个是SetEvent,还有一个PulseEvent, 两者的区别是: SetEvent为设置事件对象为有 ...

  3. 自定义ImageView

    package com.example.myimageview; import android.content.Context;import android.graphics.Bitmap;impor ...

  4. Jquery实现的Tabs标签页

    效果图: HTML: <div class="tabs"> <ul id="tabs"> <li class="tab- ...

  5. struts2的返回类型

    return 一个字符串,如果是success 直接 服务器端跳转 返回到和方法名对应的页面去 不过如果返回的页面和方法没有太大关系,比如删除修改添加之后要 客户端跳转 返回所有用户列表,这个时候可以 ...

  6. C# 对MongoDB 进行增删改查的简单操作 (转)

    运用到的MongoDB支持的C#驱动,当前版本为1.6.0 下载地址:https://github.com/mongodb/mongo-csharp-driver/downloads 1,连接数据库 ...

  7. 本周实验的PSP0过程文档

    项目计划总结:       日期/任务      听课        编写程序         阅读相关书籍 日总计          周一      110           60         ...

  8. ios上架

    1.登录developer.apple.com 2.点击member center后 进下图 3.点击certificates Identifiers进下图 4.点击Certificates进下图,首 ...

  9. 利用NTFS交换数据流隐藏文件

    利用NTFS交换数据流隐藏文件 发表于 2012 年 12 月 15 日 由 晴刃 这篇文章介绍一下Windows的NTFS文件系统的ADS(alternate data streams,交换数据流) ...

  10. 5分钟学习maven

    英文原地址:http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html 一.前提 需要懂得如何在计算机上安装软件 ...