1.Viewing the Code
roscd rospy_tutorials
2.Beginner Tutorials
1.Writing the Publisher Node
#!/usr/bin/env python
# license removed for brevity
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
#!/usr/bin/env python
# Software License Agreement (BSD License)
## Simple talker demo that published std_msgs/Strings messages
## to the 'chatter' topic
import rospy
from std_msgs.msg import String
'''如果您正在编写ROS节点,则需要导入std_msgs.msg导入是为了我们可以调用std_msgs / String消息类型(一个简单的字符串容器)进行发布。'''
def talker():
pub = rospy.Publisher('chatter', String, queue_size=10)
'''
这部分代码定义了talker与ROS其余部分的接口。 pub = rospy.Publisher(“chatter”,String,queue_size = 10)声明您的节点正在使用消息类型String发布到chatter主题。 String这里实际上是类std_msgs.msg.String。 queue_size参数使新添加的,含义为如果任何订户没有足够快地接收它们,则限制排队的消息量。 在ROS之前的版本中只省略了参数。
'''
rospy.init_node('talker', anonymous=True)
'''
rospy.init_node(NAME),非常重要,因为它告诉rospy你的节点的名称 - 直到rospy有这个信息,它才能开始与ROS主机通信。 在这种情况下,您的节点将命名为talker。 注意:名称必须是基本名称,即它不能包含任何斜杠“/”。
'''
rate = rospy.Rate(10) # 10hz
'''
此行创建一个Rate对象速率。 在它的方法sleep()的帮助下,它提供了一种方便的途径使得循环可以按照指定的速率进行。 它的参数为10,我们应该期望每秒循环10次(只要我们的处理时间不超过1/10秒)!
'''
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
'''
这个循环是一个相当标准的rospy结构:检查rospy.is_shutdown()标志,然后做工作。 你必须检查is_shutdown()来检查你的程序是否应该退出(例如,如果有一个Ctrl-C或其他)。 在这种情况下,“工作”是对pub.publish(hello_str)的调用,它将字符串发布到我们的chatter主题。 rate.sleep(),相当于延时程序。
(你也可以运行rospy.sleep()这是类似于time.sleep(),除了它工作与模拟时间(见时钟)。
这个循环也调用rospy.loginfo(str),它执行三重任务:消息被打印到屏幕,它被写入节点的日志文件,它被写入rosout。 rosout是一个方便的调试:可以使用rqt_console提取消息,而不必使用Node的输出查找控制台窗口。
'''
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
'''
除了标准的Python __main__检查,这会捕获一个rospy.ROSInterruptException异常,当按下Ctrl-C或者你的Node被关闭时,可以通过rospy.sleep()和rospy.Rate.sleep()方法抛出异常。 引发此异常的原因是,您不会在sleep()之后意外继续执行代码。
'''
python 知识:
1.#!/usr/bin/env python
每一个Python的ros 节点文件都会在开头写上这一句。
2.import:
引入不属于Python内建函数的库
3.如何导入message
有时候有一些特定的message需要导入,一般是有一个msg文件。
所以,比如要导入turtlesim/Pose的message类型,那么在python中是这样:
from turtlesim.msg import Pose
2.Writting a listener
#!/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():
# In ROS, nodes are uniquely named. If two nodes with the same
# node are launched, the previous one is kicked off. The
# anonymous=True flag means that rospy will choose a unique
# name for our 'listener' node so that multiple listeners can
# run simultaneously.
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()
$ chmod +x listener.py
关于rospy.get_caller_id
def callback(data):
rospy.loginfo(rospy.get_caller_id()+": %s",data.data)
def callback(data):
rospy.loginfo(rospy.get_caller_id()+"I heard snippy think something: %s",data.data)