原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/

1.到目前为止,我们已经从命令行移动机器人,但大多数时间你将依靠一个ros节点发布适当的Twist消息。作为一个简单的例子,假设你想让你的机器人向前移动一个1米大约180度,然后回到起点。我们将尝试完成这项任务,这将很好地说明不同层次的ros运动控制。

启动tulterbot机器人:

roslaunch rbx1_bringup fake_turtlebot.launch

2.在rviz视图窗口查看机器人:

rosrun rviz rviz -d `rospack find rbx1_nav`/sim.rviz

3.运行timed_out_and_back.py节点:

rosrun rbx1_nav timed_out_and_back.py

4.通过rqt_graph查看消息订阅的框图:

rosrun rqt_graph rqt_graph

5.分析timed_out_and_back.py节点代码:

#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist
from math import pi class OutAndBack():
def __init__(self):
# Give the node a name
rospy.init_node('out_and_back', anonymous=False)
# Set rospy to execute a shutdown function when exiting
rospy.on_shutdown(self.shutdown) # Publisher to control the robot's speed
self.cmd_vel = rospy.Publisher('/cmd_vel', Twist, queue_size=) # How fast will we update the robot's movement?
rate = # Set the equivalent ROS rate variable
r = rospy.Rate(rate) # Set the forward linear speed to 0.2 meters per second
linear_speed = 0.2 # Set the travel distance to 1.0 meters
goal_distance = 1.0 # How long should it take us to get there?
linear_duration = goal_distance / linear_speed # Set the rotation speed to 1.0 radians per second
angular_speed = 1.0 # Set the rotation angle to Pi radians ( degrees)
goal_angle = pi # How long should it take to rotate?
angular_duration = goal_angle / angular_speed # Loop through the two legs of the trip
for i in range():
# Initialize the movement command
move_cmd = Twist() # Set the forward speed
move_cmd.linear.x = linear_speed # Move forward for a time to go the desired distance
ticks = int(linear_duration * rate) for t in range(ticks):
self.cmd_vel.publish(move_cmd)
r.sleep() # Stop the robot before the rotation
move_cmd = Twist()
self.cmd_vel.publish(move_cmd)
rospy.sleep() # Now rotate left roughly degrees # Set the angular speed
move_cmd.angular.z = angular_speed # Rotate for a time to go degrees
ticks = int(goal_angle * rate) for t in range(ticks):
self.cmd_vel.publish(move_cmd)
r.sleep() # Stop the robot before the next leg
move_cmd = Twist()
self.cmd_vel.publish(move_cmd)
rospy.sleep() # Stop the robot
self.cmd_vel.publish(Twist()) def shutdown(self):
# Always stop the robot when shutting down the node.
rospy.loginfo("Stopping the robot...")
self.cmd_vel.publish(Twist())
rospy.sleep() if __name__ == '__main__':
try:
OutAndBack()
except:
rospy.loginfo("Out-and-Back node terminated.")

6.等以上节点运行完成后。可以运行下一个节点;

rosrun rbx1_nav nav_square.py

查看节点订阅框图:

7.分析nav_square.py节点的源码:

#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist, Point, Quaternion
import tf
from rbx1_nav.transform_utils import quat_to_angle, normalize_angle
from math import radians, copysign, sqrt, pow, pi class NavSquare():
def __init__(self):
# Give the node a name
rospy.init_node('nav_square', anonymous=False) # Set rospy to execute a shutdown function when terminating the script
rospy.on_shutdown(self.shutdown) # How fast will we check the odometry values?
rate = # Set the equivalent ROS rate variable
r = rospy.Rate(rate) # Set the parameters for the target square
goal_distance = rospy.get_param("~goal_distance", 1.0) # meters
goal_angle = rospy.get_param("~goal_angle", radians()) # degrees converted to radians
linear_speed = rospy.get_param("~linear_speed", 0.2) # meters per second
angular_speed = rospy.get_param("~angular_speed", 0.7) # radians per second
angular_tolerance = rospy.get_param("~angular_tolerance", radians()) # degrees to radians # Publisher to control the robot's speed
self.cmd_vel = rospy.Publisher('/cmd_vel', Twist, queue_size=) # The base frame is base_footprint for the TurtleBot but base_link for Pi Robot
self.base_frame = rospy.get_param('~base_frame', '/base_link') # The odom frame is usually just /odom
self.odom_frame = rospy.get_param('~odom_frame', '/odom') # Initialize the tf listener
self.tf_listener = tf.TransformListener() # Give tf some time to fill its buffer
rospy.sleep() # Set the odom frame
self.odom_frame = '/odom' # Find out if the robot uses /base_link or /base_footprint
try:
self.tf_listener.waitForTransform(self.odom_frame, '/base_footprint', rospy.Time(), rospy.Duration(1.0))
self.base_frame = '/base_footprint'
except (tf.Exception, tf.ConnectivityException, tf.LookupException):
try:
self.tf_listener.waitForTransform(self.odom_frame, '/base_link', rospy.Time(), rospy.Duration(1.0))
self.base_frame = '/base_link'
except (tf.Exception, tf.ConnectivityException, tf.LookupException):
rospy.loginfo("Cannot find transform between /odom and /base_link or /base_footprint")
rospy.signal_shutdown("tf Exception") # Initialize the position variable as a Point type
position = Point() # Cycle through the four sides of the square
for i in range():
# Initialize the movement command
move_cmd = Twist() # Set the movement command to forward motion
move_cmd.linear.x = linear_speed # Get the starting position values
(position, rotation) = self.get_odom() x_start = position.x
y_start = position.y # Keep track of the distance traveled
distance = # Enter the loop to move along a side
while distance < goal_distance and not rospy.is_shutdown():
# Publish the Twist message and sleep cycle
self.cmd_vel.publish(move_cmd) r.sleep() # Get the current position
(position, rotation) = self.get_odom() # Compute the Euclidean distance from the start
distance = sqrt(pow((position.x - x_start), ) +
pow((position.y - y_start), )) # Stop the robot before rotating
move_cmd = Twist()
self.cmd_vel.publish(move_cmd)
rospy.sleep(1.0) # Set the movement command to a rotation
move_cmd.angular.z = angular_speed # Track the last angle measured
last_angle = rotation # Track how far we have turned
turn_angle = # Begin the rotation
while abs(turn_angle + angular_tolerance) < abs(goal_angle) and not rospy.is_shutdown():
# Publish the Twist message and sleep cycle
self.cmd_vel.publish(move_cmd) r.sleep() # Get the current rotation
(position, rotation) = self.get_odom() # Compute the amount of rotation since the last lopp
delta_angle = normalize_angle(rotation - last_angle) turn_angle += delta_angle
last_angle = rotation move_cmd = Twist()
self.cmd_vel.publish(move_cmd)
rospy.sleep(1.0) # Stop the robot when we are done
self.cmd_vel.publish(Twist()) def get_odom(self):
# Get the current transform between the odom and base frames
try:
(trans, rot) = self.tf_listener.lookupTransform(self.odom_frame, self.base_frame, rospy.Time())
except (tf.Exception, tf.ConnectivityException, tf.LookupException):
rospy.loginfo("TF Exception")
return return (Point(*trans), quat_to_angle(Quaternion(*rot))) def shutdown(self):
# Always stop the robot when shutting down the node
rospy.loginfo("Stopping the robot...")
self.cmd_vel.publish(Twist())
rospy.sleep() if __name__ == '__main__':
try:
NavSquare()
except rospy.ROSInterruptException:
rospy.loginfo("Navigation terminated.")

通过ros节点发布Twist Messages控制机器人--10的更多相关文章

  1. ROS 多台计算机联网控制机器人

    0. 时间同步 sudo apt-get install chrony 1. ubuntu自带的有openssh-client 可以通过如下指令 ssh username@host 来连接同一局域网内 ...

  2. ROS主题发布订阅控制真实的机器人下位机

    先模拟控制小乌龟 新建cmd_node.ccpp文件: #include"ros/ros.h" #include"geometry_msgs/Twist.h" ...

  3. ROS中发布激光扫描消息

    激光雷达工作时会先在当前位置发出激光并接收反射光束,解析得到距离信息,而后激光发射器会转过一个角度分辨率对应的角度再次重复这个过程.限于物理及机械方面的限制,激光雷达通常会有一部分“盲区”.使用激光雷 ...

  4. ROS学习笔记三(理解ROS节点)

    要求已经在Linux系统中安装一个学习用的ros软件包例子: sudo apt-get install ros-indigo-ros-tutorials ROS图形概念概述 nodes:节点,一个节点 ...

  5. ROS节点理解--5

    理解 ROS节点(原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/) Description: 本教程主要介绍 ROS 图(graph)概念 并讨 ...

  6. 通过joystick遥感和按键控制机器人--11

    原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 1.首先安装joystick遥控器驱动: sudo apt-get install ros-indigo ...

  7. (五)ROS节点

    一. 理解ROS 节点: ROS的节点: 可以说是一个可运行的程序.当然这个程序可不简单.因为它可以接受来自ROS网络上其他可运行程序的输出信息,也可以发送信息给ROS网络,被其他 ROS 可运行程序 ...

  8. ROS学习(六)—— 理解ROS节点

    一.准备工作 下载一个轻量级的模拟器 sudo apt-get install ros-kinetic-ros-tutorials 二.图概念的理解 1.Nodes:一个节点就是一个可执行文件,用来与 ...

  9. ROS Learning-007 beginner_Tutorials ROS节点

    ROS Indigo beginner_Tutorials-06 ROS节点 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LT ...

随机推荐

  1. 5种JavaScript和CSS交互的方法

      分享   分享   分享   分享   分享   随着浏览器不断的升级改进,CSS和JavaScript之间的界限越来越模糊.本来它们是负责着完全不同的功能,但最终,它们都属于网页前端技术,它们需 ...

  2. ubuntu 12.04内核升级到3.13.1

    1.背景:今天上午连接Android调试之后,突然又出现了无法识别usb的问题.具体表现为:除usb无线网卡有效外,其他usb设备包括usb鼠标.u盘.android手机插上后都没反应.dmesg一直 ...

  3. 基于MVC的应用框架之Struts前奏

    1.JSP&Servlet中的MVC MVC的关键是,业务逻辑要与表示分离.通过把业务逻辑放在一个“模型”中,这样业务逻辑本身就能作为一个可重用的JAVA类存在. 在JSP&Servl ...

  4. 利用ps指令查看某个程序的进程状态

    ps -ef是查看所有的进程,然后用grep筛选出你要的信息. eg.

  5. pager分页框架体会

    <pg:pager> 元素的属性中: maxPageItems说的是每页偏移量是多少,这个并不是说每一页显示多少,而是第二页比第一页来说,在第一页的尾部增加多少,第一页又被覆盖多少,是决定 ...

  6. objectARX判断当前坐标系

    判断当前坐标系是WCS还是UCS 使用系统变量 WORLDUCS   请参见 用户坐标系 (UCS) 概述 (只读) 类型: 整数 保存位置: 未保存 初始值: 1 指示 UCS 是否与 WCS 相同 ...

  7. char, signed char, and unsigned char in C++

    关于这三者的区别stackoverrflow里有一个答案是这样说的: 3.9.1 Fundamental types [basic.fundamental] 1 Objects declared as ...

  8. ios工程中ARC与非ARC的混合

    ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并 ...

  9. js中的apply调用

    今天看了阮一锋老师的一篇文章,感觉很明了对闭包的理解,尤其是文章中的apply的介绍 apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象. ...

  10. JQuery源码分析(四)

    jQuery多库共存处理 多库共存换句话说可以叫无冲突处理. 总的来说会有2种情况会遇到: 1.$太火热,jQuery采用$作为命名空间,不免会与别的库框架或者插件相冲突. 2.jQuery版本更新太 ...