使用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掉帧,滑动 ...
随机推荐
- mac下安装apache+php+mysql
运行“sudo apachectl start”,再输入帐号密码,这样Apache就运行了. 运行“sudo apachectl -v”,你会看到Mac OS X 10.6.3中的Apache版本号: ...
- 企业需要k2来解放孤岛危机
当我谈孤岛危机时,我谈些什么?你以为我要说的是一款风靡的游戏?那恐怕要让你失望了,今天要谈的是“企业管理体系孤岛”,但更多人甚至都没意识到这是危机. 下面的场景,也许你会觉得似曾相识. 场景一 某制鞋 ...
- 多线程同步内功心法——PV操作上(未完待续。。。)
阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇一个经典的多线程同步问题> <秒杀多线程第五篇经典线程同步关键段CS> <秒杀多线程第六篇经典线程同步事件Event& ...
- ios上传应用后,审核流程完成前(reveiw)修改了程序内容,如何上传替换
其实挺简单,只需要更改下version和build版本 看图说话就可以.我的程序之前版的版本设置 修改bug之后的设置: 然后重新打包就好了,提示打包成功后,在itunesconnect查看发现 选中 ...
- UIScrollerView常见属性
CGSize contentSize :设置UIScrollView的滚动范围 CGPoint contentOffset :UIScrollView当前滚动的位置 UIEdgeInsets cont ...
- MongoDB应用篇(转)
一.高级查询 1. 查询操作符 1.1 比较操作符$gt,$lt,$gte,$lte 实例: select * from things where field<value -- 等价于db.th ...
- ZOJ 3747 - Attack on Titans (递推)
题意:有三个兵种R,G,C,选取N个排成一列,要求G至少有M个连续的,R至多有K个连续的,问有多少种排列方式. 此题与UVa 10328 - Coin Toss非常相似,都是问某个字符连续出现的种数. ...
- Python学习路程day3
set集合 set是一个无序且不重复的元素集合,访问速度快,天生解决重复问题 s1 = set() s1.add('luo') s2 = set (['luo','wu','wei','ling' ...
- 国产单机RPG游戏的情怀
最近在玩儿仙剑奇侠传5,这个游戏从小时候玩儿到现在,也算是见证了一代人的成长,小时候没少玩盗版,现在自己工作了,有了固定的收入,也能体会到游戏开发者的不容易,尤其是单机游戏这个圈子,现在国内几乎没有人 ...
- Camel routes in Spring config file
The normal spring bean definition configuration file, the xsi:schemaLocation only has two: beans and ...