话题(topic)是ROS中一种异步通信模式,其中消息以单向发布/订阅(Publish/Subscribe)的方式传递。
- 发布者(Publier):给指定的话题发布消息。
- 订阅者(Subscriber):订阅指定的话题接收消息。
- 关系:Publier-Subscriber 多对多
话题是单向的,适用于需要连续发送消息的传感器数据,因为它们通过一次的连接连续发送和接收消息。
例如,通过计算移动机器人的两个车轮的编码器值生成可以描述机器人当前位置的里程计(odometry) 信息,并以话题信息(x, y, i)传达,以此实现异步单向的连续消息传输。
话题是一种多对多的通信,即一个话题可以有多个发布者和订阅者。发布者和订阅者并不了解彼此的存在,系统中可能有多个节点发布和订阅同一个话题。单个发布者可以与多个订阅者进行通信,相反,一个订阅者可以在单个话题上与多个发布者进行通信。当然,这两家发布者都可以和多个订阅者进行通信。
话题程序编写
本例程放在ros_learning
功能包script文件夹下,新建ros_learning
功能包:
$ cs
$ catkin_create_pkg ros_learning std_msgs rospy roscpp
$ cm
创建发布者(Publier)
路径:catkin_ws/src/ros_learning/script/publisher.py
1 | #!/usr/bin/env python |
创建发布者完成后,使用命令sudo chmod +x XXX.py
为Python文件添加可执行权限:
tao@ubuntu:~/catkin_ws/src/ros_learning/script$ sudo chmod +x publisher.py
创建订阅者(Subscriber)
路径:catkin_ws/src/ros_learning/script/subscriber.py
1 | #!/usr/bin/env python |
创建订阅者完成后,使用sudo chmod +x XXX.py
命令为Python文件添加可执行权限:
tao@ubuntu:~/catkin_ws/src/ros_learning/script$ sudo chmod +x subscriber.py
运行测试
运行一组话题节点
打开新终端,编译功能包,启动ROS:
$ cm
$ roscore打开新终端,运行订阅者,此时发布者还没发送消息:
$ rosrun ros_learning subscriber.py
- 打开新终端,运行发布者,可以看到打印的发布消息和订阅消息:
$ rosrun ros_learning publisher.py
- 查看话题列表
rostopic list
和节点列表rosnode list
tao@ubuntu:~$ rostopic list
/chatter
/rosout
/rosout_agg
tao@ubuntu:~$ rosnode list
/listener_17529_1575516478892
/rosout
/talker_17632_1575516514932
- 查看节点关系
rqt_graph
,可以看到每一个节点后面都有编号,都是独一无二的。
运行两组话题节点
接着上一组,再运行一组节点。
- 打开新终端,运行订阅者:
$ rosrun ros_learning subscriber.py
- 打开新终端,运行发布者:
$ rosrun ros_learning publisher.py
- 查看话题列表
rostopic list
和节点列表rosnode list
tao@ubuntu:~$ rostopic list
/chatter
/rosout
/rosout_agg
tao@ubuntu:~$ rosnode list
/listener_17529_1575516478892
/listener_18076_1575516788711
/rosout
/talker_17632_1575516514932
/talker_17809_1575516645091
- 查看节点关系
rqt_graph
,可以看到每一个节点后面都有编号,都是独一无二的。
到此,已经简单了解一下话题的通信模式。