首先,我们需要打开一个终端,运行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_node
和turtle_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 type
和rosmsg 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