首先,我们需要打开一个终端,运行roscore

roscore

输出的结果为:

liuqiang@liuqiang-pc:~$ roscore
... logging to /home/liuqiang/.ros/log/0a374538-b24b-11e7-a8f1-30b49e59a135/roslaunch-liuqiang-pc-27883.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://liuqiang-pc:36661/
ros_comm version 1.11.21


SUMMARY
========

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.21

NODES

auto-starting new master
process[master]: started with pid [27895]
ROS_MASTER_URI=http://liuqiang-pc:11311/

setting /run_id to 0a374538-b24b-11e7-a8f1-30b49e59a135
process[rosout-1]: started with pid [27908]
started core service [/rosout]

注意:我们只需要运行一个roscore,运行多个roscore会在终端最下面以红字提示出错:

liuqiang@liuqiang-pc:~$ roscore
... logging to /home/liuqiang/.ros/log/0a374538-b24b-11e7-a8f1-30b49e59a135/roslaunch-liuqiang-pc-28133.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://liuqiang-pc:35059/
ros_comm version 1.11.21


SUMMARY
========

PARAMETERS
 * /rosdistro: indigo
 * /rosversion: 1.11.21

NODES

roscore cannot run as another roscore/master is already running. 
Please kill other roscore/master processes before relaunching.
The ROS_MASTER_URI is http://liuqiang-pc:11311/
The traceback for the exception was written to the log file

在这一节里面,我们将运行海龟节点,打开一个新的终端,输入:

rosrun turtlesim turtlesim_node

输出结果为:

liuqiang@liuqiang-pc:~$ rosrun turtlesim turtlesim_node
[ INFO] [1508142444.839103790]: Starting turtlesim with node name /turtlesim
[ INFO] [1508142444.842964339]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

再打开一个新的终端,输入:

rosrun turtlesim turtle_teleop_key

输出结果为:

liuqiang@liuqiang-pc:~$ rosrun turtlesim turtle_teleop_key
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.

现在,你可以使用键盘的方向键来控制窗口中的小海龟前进、后退、左转和右转等操作!

注意:如果,你移动不了小海龟,请用鼠标激活最后一个终端,然后执行键盘的方向键。

现在,turtlesim_nodeturtle_teleop_key这两个节点正在通过ROS的话题进行相互间的通信。

其中,turtle_teleop_key正在向话题发布消息,而turtlesim_node正在接收话题的消息。

注意:话题本质上就是一个一条消息通道(或者管道)

现在,我们可以使用rqt_graph来查看正在运行中的节点和话题之间的关系:

rqt_graph

输出的结果为:

rqt_graph创建ROS系统正在发生的事情的动态图,而rqt_graph是一个rqt功能包,如果你还没有安装rqt_graph请使用如下的命令安装:

sudo apt-get install ros-kinetic-rqt
sudo apt-get install ros-kinetic-rqt-common-plugins

获取rostopic的帮助:

rostopic -h

输出结果为:

liuqiang@liuqiang-pc:~$ rostopic -h
rostopic is a command-line tool for printing information about ROS Topics.

Commands:
	rostopic bw	display bandwidth used by topic
	rostopic delay	display delay of topic from timestamp in header
	rostopic echo	print messages to screen
	rostopic find	find topics by type
	rostopic hz	display publishing rate of topic    
	rostopic info	print information about active topic
	rostopic list	list active topics
	rostopic pub	publish data to topic
	rostopic type	print topic type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'

当然了,我们也可以使用Tab键,还记得我们前面讲过的相关知识点吗?

当我们输入rostopic 后,接着按下两次Tab键,就会出现如下的内容:

liuqiang@liuqiang-pc:~$ rostopic 
bw    echo  find  hz    info  list  pub   type 

我们可以根据系统输出的提示选择下一步要输入的内容。

现在,我们使用rostopic echo来显示发布到话题的数据:

rostopic echo /turtle1/cmd_vel

当我们激活turtle_teleop_key节点所在的终端,按下键盘的方向键之后,输出结果为:

liuqiang@liuqiang-pc:~$ rostopic echo /turtle1/cmd_vel
linear: 
  x: -2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---
linear: 
  x: 0.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: -2.0

使用rostopic list可以查看所有当前被订阅和发布的话题。

首先,查看rostopic list有哪些帮助信息:

rostopic list -h 

输出的结果为:

liuqiang@liuqiang-pc:~$ rostopic list -h
Usage: rostopic list [/namespace]

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
  --host                group by host name

如果要查看关于话题的详细信息,输入:

rostopic list -v

输出的结果为:

liuqiang@liuqiang-pc:~$ rostopic list -v

Published topics:
 * /turtle1/color_sensor [turtlesim/Color] 1 publisher
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
 * /rosout [rosgraph_msgs/Log] 3 publishers
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics:
 * /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
 * /rosout [rosgraph_msgs/Log] 1 subscriber
 * /statistics [rosgraph_msgs/TopicStatistics] 1 subscriber

ROS的消息

基于话题的通信机制:是通过在节点之间发送ROS消息来实现的,对于消息的发布者(例如:turtle_teleop_key)和消息的订阅者(例如:turtlesim_node)必须发送和订阅相同的消息类型,也就是说:话题的类型是由发布给它的消息类型定义的,而发送给话题的消息类型可以通过使用rostopic type来进行确认。

该命令的格式为:

rostopic type [topic]

例如:

rostopic type /turtle1/cmd_vel

输出结果为:

liuqiang@liuqiang-pc:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist

也就是说,话题: turtle1/cmd_vel的消息类型为geometry_msgs/Twist

当然了,我们还可以使用rosmsg show来进一步查看消息类型geometry_msgs/Twist的细节内容:

该命令的输入格式为:

rosmsg show [message type]
rosmsg show geometry_msgs/Twist

输出的结果为:

liuqiang@liuqiang-pc:~$ 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

好了,我们已经熟悉了话题以及基于话题的消息,现在我们来试着发布一条消息到话题。

我们使用rostopic pub来发布数据到当前广播了的话题之上:

rostopic pub -1 /turtle1/cmd_vel/ geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

上面的那条命令将发送一条消息到小海龟节点,并告诉该节点,让它以2.0的线速度和1.8的角速度移动

现在,我们来详细讲解上面的那条指令:

rostopic pub将发布消息到指定的话题;

-1该选项将引发rostopic仅仅发布一条消息就退出;

turtle1/cmd_vel是接受消息的话题;

geometry_msgs/Twist是需要发布到话题之上的消息类型;

--此选项告诉选项解析器,下列参数没有一个是选项。

'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'正如我们前面看到的那样,geometry_msgs/Twist包含两个三维向量,分别是x,y,z方向的线速度和x,y,z方向的角速度,这三个参数遵循YML语法,向量的元素数据类型是浮点型。

或许你已经发现了,小海龟运行了一会儿就停下来了,这是因为小海龟需要以1赫兹的频率发布的平稳的命令流来使他继续移动。我们可以使用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]'

上面的命令以1赫兹的速率发布速度命令到速度话题。

输出的结果为:

现在,我们可以使用rqt_graph来查看节点和话题:

我们还可以使用rostopic hz来查看数据发布的频率:

rostopic hz /turtle1/cmd_vel

输出结果为:

liuqiang@liuqiang-pc:~$ rostopic hz /turtle1/cmd_vel
subscribed to [/turtle1/cmd_vel]
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00000s window: 2
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00001s window: 3
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00001s window: 4
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00003s window: 5
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00003s window: 6
average rate: 1.000
	min: 1.000s max: 1.000s std dev: 0.00004s window: 7
...

可以看出,输出频率和我们之前设置的频率是相一致的!

我们还可以使用如下的命令来查看基于话题的消息:

rostopic type /turtle1/cmd_vel | rosmsg show

输出结果为:

liuqiang@liuqiang-pc:~$ rostopic type /turtle1/cmd_vel | rosmsg show
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

其本质就是结合了rostopic typerosmsg show两条命令:

liuqiang@liuqiang-pc:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
liuqiang@liuqiang-pc:~$ 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

我们还可以使用rqt_plot来显示发布到话题上的滚动时间数据。

rqt_plot