前言
在第0节中,我们尝试运行了第一个ROS程序,大家可能有疑问,这个程序究竟有什么用呢?请大家在运行小海龟例程的基础上,再新开一个终端,输入以下命令:
rqt_graph
不出意外的话,应该会d出这样的一幅图片:
这就是我们Ros当中最常见的 订阅与发布模型 ,图中展示了两个节点 “/teleop_turtle”与“/turtlesim”之间通过话题“/turtle1/cmd_vel”进行通讯。
发布—订阅模型基于话题通讯机制,其通讯流程可以简述为以下七步:- 发布者节点启动,向ROSMaster注册节点信息(发布的话题名等等)(RPC)
- 订阅者节点启动,向ROSMaster注册节点消息(订阅的话题名等等)(RPC)
- ROSMaster 将相同话题的发布者与订阅者之间进行匹配(向订阅者发送发布者的RPC地址信息)(RPC)
- 订阅者向发布者发送链接信息(话题名,消息类型,通信协议等)(RPC)
- 发布者接受连接请求后向订阅者发送确认信息(发布者本身的TCP地址信息)(RPC)
- 订阅者尝试与发布者建立网络连接
- 发布者向订阅者发布数据(TCP)
订阅与发布模型是一个多对多的模型,节点们可以发布同一个话题,节点们也可以订阅同一个话题。
发布者Python代码实现我们的目标是写一个发布/turtle1/cmd_vel话题的发布者,控制我们的小海龟转圈。
首先,我们进入功能包下的scripts文件夹cd ~/WORKSPACE_NAME/src/pkg_name/scripts
在功能包下创建一个名为“talker.py”的文件,写入以下代码(推荐使用VScode进行编辑)
代码如下,亲测可用。
#!/usr/bin/env python3
#coding = 'utf-8'
#上面这段一定要加
import turtle
import rospy
from geometry_msgs.msg import Twist
#从geometry_msg中导入Twist消息类型
def turtle_publisher():
rospy.init_node('turtle_publisher',anonymous=True)
#对节点进行初始化,命名一个叫turtle_publisher的节点
turtle_pub = rospy.Publisher('/turtle1/cmd_vel',Twist,queue_size=10)
#实例化一个发布者对象,发布的话题名为 /turtle1/cmd_vel ,消息类型为 Twist,队列长度为10
rate = rospy.Rate(10)
#设置循环的频率
while not rospy.is_shutdown():
#装载消息
cmd_msg = Twist()
cmd_msg.linear.x = 1
cmd_msg.angular.z = 0.5
turtle_pub.publish(cmd_msg)
#发布话题消息
rospy.loginfo("message have published x = %d angular z = %0.2f",cmd_msg.linear.x,cmd_msg.angular.z)
#在终端打印一份日志
rate.sleep()
#按照设置的速率进行延时
if __name__ == '__main__':
try:
turtle_publisher()
except rospy.ROSInterruptException:
pass
(初学的同学可以自己手动敲一遍试一试,千万别漏了文件开头的注释,这对我们至关重要)
之后我们还要在scripts文件夹下赋予py文件可执行权限:chmod a+x talker.py
回到工作空间根目录,我们执行一次工作空间的编译 *** 作:
cd ~/WORKSPACE_NAME
catkin_make
之后对环境变量进行配置(前几节已经讲过 一劳永逸的方法了,我希望大家要有一劳永逸的精神,所以这里不再赘述环境变量配置方法)
运行!开启一个终端,然后运行:
roscore
再新开两个终端,分别运行:
rosrun turtlesim turtlrsim_node
rosrun pkg_name talker.py
如图:
启动发布者后,我们可以看到:
(小海龟开始自动转圈圈啦!)
此时我们打开节点图看一看:
这就说明我们的发布者已经成功工作啦!
恭喜各位同学,现在已经完成了第一个程序的编写。需要注意的是,由于我们使用Python进行程序编写,而Python文件的好处就是不需要进行编译,所以我们不需要配置功能包中的CMakeList.txt文件,比较方便,这也是笔者喜欢Python的一个原因。
下一节,我们将学习订阅者程序的编写。
路漫漫其修远兮,吾将上下而求索。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)