zl程序教程

您现在的位置是:首页 >  后端

当前栏目

ROS Python 入门学习笔记--2--发布者程序的编写

2023-09-14 09:16:16 时间

        

前言

        在第0节中,我们尝试运行了第一个ROS程序,大家可能有疑问,这个程序究竟有什么用呢?请大家在运行小海龟例程的基础上,再新开一个终端,输入以下命令:

rqt_graph

        不出意外的话,应该会弹出这样的一幅图片:

        这就是我们Ros当中最常见的 订阅与发布模型 ,图中展示了两个节点 “/teleop_turtle”与“/turtlesim”之间通过话题“/turtle1/cmd_vel”进行通讯。

发布—订阅模型基于话题通讯机制,其通讯流程可以简述为以下七步:

  1. 发布者节点启动,向ROSMaster注册节点信息(发布的话题名等等)(RPC)
  2. 订阅者节点启动,向ROSMaster注册节点消息(订阅的话题名等等)(RPC)
  3. ROSMaster 将相同话题的发布者与订阅者之间进行匹配(向订阅者发送发布者的RPC地址信息)(RPC)
  4. 订阅者向发布者发送链接信息(话题名,消息类型,通信协议等)(RPC)
  5. 发布者接受连接请求后向订阅者发送确认信息(发布者本身的TCP地址信息)(RPC)
  6. 订阅者尝试与发布者建立网络连接
  7. 发布者向订阅者发布数据(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的一个原因。

        下一节,我们将学习订阅者程序的编写。

路漫漫其修远兮,吾将上下而求索。