您的位置:首页 > 其它

ROS中常用的一些命令

2018-01-22 09:37 441 查看

图概念概述

Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。

Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。

Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。

Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。

rosout: ROS中相当于stdout/stderr。

roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。

节点

一个节点其实只不过是ROS程序包中的一个可执行文件。

ROS节点可以使用ROS客户库与其他节点通信。

节点可以发布或接收一个话题。

节点也可以提供或使用某种服务。

使用rospack和rosstack

rospack和rosstack命令都包含于rospackpackage中.

两个命令用于获取packages 和stacks的信息.

教程中我们只提及命令的find的参数,作用是返回相应package或者stack的目录路径.

Rospack depends package 功能包依赖项查询

roscd log

roscd log命令切换到ROS储存日志文件的目录。

注意:如果从未运行过任何ROS程序,命令会返回目录不存在的错误。

使用 rosls

rosls包含于rosbash package中.

作用是列出指定的package或stack中的文件及目录

Rosnode

用来显示当前运行的ROS节点信息。

rosnode list指令列出活跃的节点:

rosnode info命令返回的是关于一个特定节点的信息

rosparam

rosparam set 设置参数

rosparam get 获取参数

rosparam load 从文件读取参数

rosparam dump 向文件中写入参数

rosparam delete 删除参数

rosparam list 列出参数名

rosmsg

rosmsg show(显示消息)

users(显示使用指定消息的代码)

package(列出指定功能包中的所有消息)

rosnode package 列出带有消息的所有功能包

rosrun [package_name] [node_name]

$ rosrun rqt_graph rqt_graph

创建包catkin

$ catkin_create_pkg beginner_tutorialsstd_msgs rospy roscp

rostopic介绍

rostopic命令工具能让你获取有关ROS话题的信息。

你可以使用帮助选项查看rostopic的子命令:

$ rostopic -h

显示:

rostopic bw display bandwidth used by topic

rostopic echo print messages to screen

rostopic hz display publishing rate of topic

rostopic list printinformation about active topics

<
4000
p>rostopic pub publish data to topic
rostopic type printtopic type

rostopic echo

rostopic echo 可以显示在某个话题上发布的数据。

用法:

rostopic echo [topic]

让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocit话题(非hydro版)上发布的数据.

$ rostopic echo /turtle1/command_velocity

如果你是用ROS Hydro 及其之后的版本(下同),请运行:

$ rostopic echo /turtle1/cmd_vel

你可能看不到任何东西因为现在还没有数据发布到该话题上。

接下来我们通过按下方向键使turtle_teleop_key节点发布数据。

记住如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。

rostopic list

rostopic list能够列出所有当前订阅和发布的话题。

让我们查看一下list子命令需要的参数,在一个新终端中运行:

$ rostopic list -h

显示:

Usage: rostopic list [/topic]

Options:

-h,–help show this help messageand exit

-bBAGFILE, –bag=BAGFILE

list topics in .bagfile

-v,–verbose list full details abouteach topic

-p list onlypublishers

-s list only subscribers

ROS Messages

话题之间的通信是通过在节点之间发送ROS消息实现的。

对于发布器(turtle_teleop_key和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。

这意味着话题的类型是由发布在它上面的消息类型决定的。

使用rostopic type命令可以查看发布在某个话题上的消息类型。

使用 rostopic type

rostopic type命令用来查看所发布话题的消息类型。

用法:

rostopic type [topic]

我们可以使用rosmsg命令来查看消息的详细情况(非hydro版):

$ rosmsg show turtlesim/Velocity

Rostopic pub可以把数据发布到当前某个正在广播的话题上。

用法:

rostopic pub [topic] [msg_type] [args]

rostopic pub -1 /turtle1/command_velocityturtlesim/Velocity – 2.0 1.8

-1

(单个破折号)这个参数选项使rostopic发布一条消息后马上退出。

/turtle1/command_velocity这是消息所发布到的话题名称。

turtlesim/Velocity这是所发布消息的类型。

–(双破折号)这会告诉命令选项解析器接下来的参数部分都不是命令选项。

这在参数里面包含有破折号-(比如负号)时是必须要添加的。

2.0 1.8

正如之前提到的,在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular。

在本例中2.0是linear的值,1.8是angula的值。

这些参数其实是按照YAML语法格式编写的,这在YAML文档中有更多的描述。

你可能已经注意到turtle已经停止移动了。

$ rostopic pub /turtle1/cmd_velgeometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’

这条命令以1Hz的频率发布速度命令到速度话题上。

使用 rostopic hz

rostopic hz命令可以用来查看数据发布的频率。

用法:rostopic hz [topic]

ROS Services

服务(services)是节点之间通讯的另一种方式。

服务允许节点发送请求(request)并获得一个响应(response)

rosservice

rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。

rosservice提供了很多可以在topic上使用的命令,如下所示:

使用方法:

rosservice list 输出可用服务的信息

rosservice call 调用带参数的服务

rosservice type 输出服务类型

rosservice find 依据类型寻找服务find services by service type

rosservice uri 输出服务的ROSRPC uri

rosservice type命令更进一步查看clear服务:

rosservice type使用方法:

rosservice type [service]

我们来看看clear服务的类型:

$ rosservice type clear

显示:

std_srvs/Empty

服务的类型为空(empty),这表明在调用这个服务是不需要参数(比如,请求不需要发送数据,响应也没有数据)。

下面我们使用rosservice call命令调用服务:

rosservice call使用方法:

rosservice call [service] [args]

因为服务类型是空,所以进行无参数调用:

$ rosservice call clear

正如我们所期待的,服务清除了turtlesim_node的背景上的轨迹

$ rosservice type spawn | rossrv show(了解参数的服务)

ros::ok()在以下几种情况下也会返回false:

(1)按下Ctrl-C时

(2)我们被一个同名同姓的节点从网络中踢出

(3)ros::shutdown()被应用程序的另一部分调用

(4)所有的ros::NodeHandles都被销毁了。

一旦ros::ok()返回false,所有的ROS调用都会失败

ros::spin()和ros::spinonce()的区别在于:

前者调用后不在返回,后者调用后继续执行后面的程序。

在使用ros::spin()的情况下

一般来说在初始化时已经设置好所有消息的回调,并且不需要其他背景程序运行。这样以来,每次消息到达时会执行用户的回调函数进行操作,相当于程序是消息事件驱动的;

在使用ros::spinOnce()的情况下

一般来说仅仅使用回调不足以完成任务,还需要其他辅助程序的执行:比如定时任务、数据处理、用户界面等。

rospy.init_node

rospy.init_node (name, anonymous=False,log_level=rospy.INFO,disable_signals=False)

anoymous=True 通过在你名字的后边添加一个随机数,来保证你的节点独一无二。

rospy.on_shutdown(h)

rospy.on_shutdown(h)这个函数为Ctrl+C这类shutdown事件创建一个退出之前的回调函数h,可以在程序退出之前做点什么。如果在h函数内Publish消息,不保证能成功发出消息!

Publisher

Publisher pub=rospy.Publisher(‘topic_name’,std_msgs.msg.String,queue_size=10)

queue_size:

queue_size: None(不建议) 这将设置为阻塞式同步收发模式!

queue_size: 0(不建议)这将设置为无限缓冲区模式,很危险!

queue_size: 1,2,3;对于只关心最新数据的sensor消息,可以设为1; 对于系统负载不高,能及时处理的消息,可以设为1,2,3.

queue_size: 10 or more ;一般情况下,设为10 。queue_size太大了会导致数据延迟不同步。

_connection_header

topic连接后,发送的数据中包括header信息,订阅者subscriber可以在回调函数的data中查看header信息:

Parameter Server

Getting parameters

global_name = rospy.get_param(“/global_name”)

relative_name = rospy.get_param(“relative_name”)

private_param = rospy.get_param(‘~private_name’)

default_param = rospy.get_param(‘default_param’,‘default_value’)

# fetch a group (dictionary) of parameters

gains = rospy.get_param(‘gains’)

p, i, d = gains[‘P’], gains[‘I’],gains[‘D’]

Setting parameters

rospy.set_param(‘a_string’, ‘baz’)

rospy.set_param(‘~private_int’, 2)

rospy.set_param(‘list_of_floats’, [1., 2., 3., 4.])

rospy.set_param(‘bool_True’, True)

rospy.set_param(‘gains’, {‘p’: 1, ‘i’: 2,‘d’: 3})

Deleting parameters

rospy.delete_param(param_name)

Parameter existence

rospy.has_param(param_name)

执行get_param()和delete_param()前,最好检查一下参数名是否存在。否则会引发KeyError异常

Time

time和duration是rospy中两个重要的时间概念

time指时刻,类型是rospy.Time。

duration指时段,类型是rospy.Duration

两者单位一样,直接print则是纳秒。数值形式一样:

int32 secs

int32 nsecs

timer

rospy.Timer(period, callback, oneshot=False)

period,调用回调函数的时间间隔,如rospy.Duration(0.1)即为10分之1秒。

callback,定义回调函数,会传递TimerEvent实例

oneshot,定时器,是否执行多次。false即一直执行

在callback函数中参数为event:rospy.TimerEvent。TimerEvent的内部属性包括:

current_expected: 理想值,这次callback的被调用时刻。

current_real: 现实值,这次callback的被调用时刻。

last_expected: 上次的理想值。

last_real: 上次的现实值。

last_duration: 上次callback的持续时段

Exceptions

除了python体系内的异常类型,rospy还有下面几种exception异常类型:

-ROSException:ROS相关异常的基类。

-ROSSerializationException:ROS消息串行化异常!

-ROSInitException: ROS初始化异常!

-ROSInterruptException:ROS中断异常!

-ROSInternalException:ROS内部异常!

-ServiceException:Service通信异常!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: