您的位置:首页 > 其它

ROS中常用的一些命令

2017-11-13 21:35 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

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都被
4000
销毁了。

一旦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通信异常!

 

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