Rospy的官方教程代码讲解(一)发布与订阅

时间:2022-03-06 19:14:04

我的C++功底很差,除了自己看着视频学了一点,就是在波特兰的天坑小学里某不是教授的教授讲的东西。所以人生苦短,我选择Python。

Rospy是什么

Rospy官方wiki

Rospy是ROS对python的主要接口,通过Rospy API程序猿能够快速的进行ROS topic,service和param的操作,其主要优势(对比C++)在于其开发速度,当然运行效率会在一定程度上下滑。

Rospy官方教程(一)

Rospy官方教程

今天先看看官方教程的第一部分,发布与订阅

发布器:

import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass
直接划重点:

导入std_msgs中的String消息类型

from std_msgs.msg import String
定义发布器pub,发布的题目是chatter,消息类型是String,然后queue_size是在订阅者接受消息不够快的时候保留的消息的数量,如果对qos要求低的话可以设为0,不设置的话会出个报警,不过不会出错
pub = rospy.Publisher('chatter', String, queue_size=10)
接下来这里初始化了一个名为talker的节点,节点的名字不能以‘/’开头,因为之后会自动给你加一个。anonymous参数在为True的时候会在原本节点名字的后面加一串随机数,来保证可以同时开启多个同样的节点,如果为false的话就只能开一个。

rospy.init_node('talker', anonymous=True)

这里初始化一个Rate对象,通过后面的sleep()可以设定循环的频率

rate = rospy.Rate(10) # 10hz
这里把hello_str发布出去了
pub.publish(hello_str)
没了,发布器就这样,很简单吧。。。
运行的时候只要python+文件名.py就好
接下来我们看订阅器

订阅器:

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
    
def listener():

    rospy.init_node('listener', anonymous=True)

    rospy.Subscriber("chatter", String, callback)

    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

if __name__ == '__main__':
    listener()
重点只有两句:

这里初始化了一个订阅器,订阅了‘chatter’这个主题,接收的消息类型为String,每次接收到消息,就会开一个新线程来呼叫callback,每个订阅器只能有一个callback,另外似乎可以做到通过一个订阅器订阅多个主题或多个类型不同的消息,但我认为应该尽量避免这么做,尤其是涉及时间敏感度比较高的主题的时候,消息时间同步这类的事情很难处理。

rospy.Subscriber("chatter", String, callback)
spin()的功能是让程序在手动停止前一直循环,但我其实还不能很好的理解这个语句的用法,总之就是保持主进程一直循环吧,我这种单片机出身的渣渣经常靠while(1)解决问题(~ ̄▽ ̄)~

# spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

运行的方法和上面一样,python+文件名.py就好

记得要先打开roscore,否则。。。会报错。。。

这是第一篇正式的博客呢。。。

特地去搜了怎么插入代码。。。版面做得也不怎么漂亮,之后再努努力吧

总之这几天先随便穿点自己写的简单代码上来,其实重点是记录自己的学习过程,而不是翻译和转载已经有的东西