先启动roscore
roscore
为了获取节点信息,可以使用rosnode命令
$ rosnode
获取得一个可接受参数清单
使用rosrun命令启动一个新的节点,如下所示
$ rosrun turtlesim turtlesim_node
我们可以看见出现了一个新窗口,窗口中间有一个小乌龟,如下图:
出现一个新节点
使用主题与节点交互
现在要使用一个节点,并让节点做如下工作:
$ rosrun turtlesim turtle_teleop_key
通过节点订阅的主题,我们可以用箭头键移动乌龟,如下图:
为什么turtle_teleop_key执行时,小海龟会移动?
使用以下命令查看主题清单
$ rostopic list
使用echo参数,可以查看节点发出的信息。运行以下命令行并使用键盘出发消息
$ rostopic echo /turtle1/cmd_vel
看到类似显示
使用命令行擦好看消息类型
rostopic type /turtle1/cmd_vel
如果你想看到消息字段,使用以下命令:
$ rosmsg show geometry_msgs/Twist
我们可以通过这些工具使用rostopic pub [topic] [msg_type] [args] 命令直接发布主题
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
参数分析:
rostopic pub 这条命令将会发布消息到某个给定的话题。
-1 (单个破折号)这个参数选项使rostopic发布一条消息后马上退出。
/turtle1/command_velocity 这是消息所发布到的话题名称。
turtlesim/Velocity 这是所发布消息的类型。
-- (双破折号)这会告诉命令选项解析器接下来的参数部分都不是命令选项。这在参数里面包含有破折号-(比如负号)时是必须要添加的。
2.0 1.8 正如之前提到的,在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular。在本例中,2.0是linear的值,1.8是angular的值。这些参数其实是按照YAML语法格式编写的,这在YAML文档中有更多的描述。
小乌龟画圆:
你可能已经注意到turtle已经停止移动了。这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。我们可以使用rostopic pub -r命令来发布一个稳定的命令流
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
..使用 rostopic hz
rostopic hz命令可以用来查看数据发布的频率。 用法: rostopic hz [topic]
turtlesim_node发布/turtle/pose时有多快:
rostopic hz /turtle1/pose
现在我们可以知道了turtlesim正以大约60Hz的频率发布数据给turtle。
1.理解ROS Topic
这个教程介绍ROS topic和rostopic和rqt_plot命令行工具.
1.1建立
1.1.1roscore
先在一个新的终端中运行roscore;
$ roscore
注意:只能运行一个roscore.
1.1.2tuetlesim
在新的终端中运行turtlesim;
$ rosrun turtlesim turtlesim_node
1.1.3turtle 键盘遥控
我们需要用一些东西去控制turtle,在新的终端运行:
$ rosrun turtlesim turtle_teleop_key
[ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
现在你可以用键盘上的方向键控制小乌龟了(保持键盘输入窗口在焦点).再看看窗口后面发生了什么.
1.2ROS Topic
turtlesim_node和turtle_teleop_key node之间用topic交流通信.
turtle_teleop_key 在这个topic上发布按键敲击,而turtlesim订阅同样的topic接受按键敲击.让我们用rqt_graph显示现在正在运行的topic和nodes.
如果你是用electric或更早的版本,建议用rxygrah替代。
1.2.1用rqt_grah
rqt_grah创建了一个动态的图形显示系统上正在进行什么,rqt_grah是qpt package的一部分.运行:
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
<distro>用你的ros版本名替代
再在新终端输入:
$ rosrun rqt_graph rqt_graph
你将会看到:
如果把鼠标放上去将会高亮,node是蓝色或者绿色,topic是红色.正如你所见到的一样,turtlesim_node nodes 是通过叫做
/turtle1/command_velocity. 的在通信.
1.2.3介绍rostopic
rostopic工具允许你从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 print information about active topics
rostopic pub publish data to topic
rostopic type print topic type
让我们用这些命令去检验一下turtlesim.
1.2.3使用rostopic echo
用法:
rostopic echo [topic]
允许我们看看turtle_teleop_key node. 发布的命令速度数据;
对于ROS Hydro和之后的版本,这个数据在发布在/turtle1/cmd_vel topic,在新终端,运行:
$ rostopic echo /turtle1/cmd_vel
选择turtle_teleop_key终端,用方向键控制小乌龟,你将会看到
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
让我们再来看看rqt_graph.点击左上角的刷新按钮显示新的node.你将会看到rostopic echo也订阅了turtle1/command_velocity topic.
1.2.4使用rostopic list
rostopic list会列出现在所有被订阅和发布的topic.
看看这个命令需要什么参数,运行:
$ rostopic list -h
Usage: rostopic list [/topic]
Options:
-h, --help show this help message and exit
-b BAGFILE, --bag=BAGFILE
list topics in .bag file
-v, --verbose list full details about each topic
-p list only publishers
-s list only subscribers
对于verbose选项:
$ rostopic list -v
显示详细的一列topic信息包括发布的,订阅的和它们的类型.
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
* /rosout [roslib/Log] 2 publishers
* /rosout_agg [roslib/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
* /rosout [roslib/Log] 1 subscriber
1.3 ROS Messages
Topic上的通信通过在nodes之间发送messages来实现.对于发布者(turtle_teleop_key)和订阅者(turtlesim_node)之间的通信必须使用相同的
message类型.这就意味着,topic的类型由发布的message类型决定.发布在topic上的message的类型可以由rostopic type来决定.
1.3.1使用rostopic type
rostopic type返回任何topic发布的message类型.
用法:
rostopic type [topic]
对于ROS Hydro 和之后的版本:
$ rostopic type /turtle1/cmd_vel
你会得到:
geometry_msgs/Twist
想得到详细信息运行:
$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
既然我们已经知道turtlesim期待什么类型的message了,我们可以发布命令给小乌龟.
1.4继续rostopic
既然我们已经知道ros message 了,让我们一起用ros messages吧。
1.4.1使用rostopic pub
rostopic pub把数据发布到正被广播的topic上。
用法:
rostopic pub [topic] [msg_type] [args]
对于ROS Hydro和之后的版本:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
这会给turtle发布一个message告诉它线速度2.0,角速度1.8.
这个命令十分复杂,所以我们仔细看看它的每个参数
对于ROS Hydro和之后的版本:
这个命令会发送messages给给定的topic:
rostopic pub
这个选项使得rostopic只发布一条message然后退出:
-1
这是要发布给它信息的那个topic:
/turtle1/cmd_vel
这是发布topic时的message类型:
geometry_msgs/Twist
双虚线告诉选项剖析器接下来的参数都不是选择,以免把负号后面的参数当成参数选项。
--
一个geometry_msgs/Twist 有两组由三个浮点元素组成得的向量:线性的和角度的.这样的话,'[2.0, 0.0, 0.0]'就是线性值x=2.0,y=0.0,z=0.0,而'[0.0, 0.0, 1.8]'就是角度的值x=0.0,y=0.0,z=1.8.这些参数遵从YAML 语法规则。更多信息查看YAML command line documentation.
'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
你也许注意到小乌龟已经停止了;这是因为小乌龟需要稳定的1HZ的命令流去保持运动。我们可以用rostopic pub -r命令发布一个稳定的命令流。
对于ROS Hydro和之后的版本:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
这将以1HZ的速度去发布速度命令给速度topic.
再刷新一下rqt_graph,看到rostopic pub node 在和rostopic echo node 通信
当你看到小乌龟在绕圈圈的时候可以在一个新的终端输入rostopic echo 命令看看turtlesim发布的数据。
1.4.2使用rostopic hz
rostopic hz 报告数据发布的速度
用法:
rostopic hz [topic]
来看看turtkesim node 以多快的速度发布/turtle1/pose。
$ rostopic hz /turtle1/pose
你会看到:
subscribed to [/turtle1/pose]
average rate: 59.354
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
average rate: 59.459
min: 0.005s max: 0.027s std dev: 0.00271s window: 118
average rate: 59.539
min: 0.004s max: 0.030s std dev: 0.00339s window: 177
average rate: 59.492
min: 0.004s max: 0.030s std dev: 0.00380s window: 237
average rate: 59.463
min: 0.004s max: 0.030s std dev: 0.00380s window: 290
现在我们知道turtlesim大概以60HZ的速度发布数据。也可以用rostopic type和rosmsg获取关于topic进一步的信息。
对于ROS Hydro和之后的版本:
$ rostopic type /turtle1/cmd_vel | rosmsg show
现在我们已经用rostopic检验了topic,让我们用其他工具看看turtlesim发布的数据把。