python subprocess popen函数,python的subprocess.Popen()的简单用法
参考:http://wiki.ROS.org/ROS/tutorials/writingpublishersubscriber(Python))。
编写发布者节点是ROS术语,指连接到ROS网络的可执行文件。在这里,您将创建一个publisher“talker”节点,它将继续广播消息。您可以创建一个ros包或使用现有的ros包,例如:
请参阅之前的文章《ROS中编写服务器和客户端的方法(C++版)》,了解如何创建roscd初学者教程包。
1.1代码的第一部分称为“‘脚本’路径”,保存python代码。
Mkdir scriptscd脚本然后创建一个名为talker.py的新文件,并复制以下代码:
#!/usr/lovely hat/env python # licenseremovedforrevisiimortrospyfromstd _ msgs . msgimportstringdeftalker():pub=rospy queue _ size=10(rospy . init _ node),anonymous=true(rate=ro spy . rate(10)# 10hz while not rospy . is _ shut down):hello _ str= hello world % s ro
#!/usr/lovely hat/env python每个python版本的ROS节点前面都有一个声明,表示这个文件属于python类型。
如果要编写ImportrospyFromstd _ msgs . msgimportstringeros节点,必须导入rospy。std_msgs.msg的用途是可以使用std_msgs/String消息类型发布。
Pub=rospy.publisher(chatter ,String,queue_size=10) rospy.init_node),anonymous=True)这是
Pub=rospy.publisher(chatter ,String,queue_size=10)表示您正在通过使用字符串类型消息将节点字符串发布到chatter。字符串是std_msgs.msg.String类。如果没有订阅者可以足够快地接收消息,queue_size将限制队列中的消息数量。在旧的ROS版本中,这被忽略了。
下一行很重要。因为我要告诉ro spy ROS节点的名字。在rospy获得此信息之前,它无法开始与ROS Master通信。在本例中,您的节点名称是talker。
Anoymous=True通过在名称后添加一个随机数来确保您的节点是唯一的。
Line rate=rospy.rate(10) # 10hz创建速率对象速率。借助于这种方法sleep),提供了一种以恒定速率循环的有用方法。参数10表示如果处理时间小于或等于1/10秒,则预计每秒循环10次。
whiotrospy . is _ shut down(:hello _ str= hello world % s % rospy . get _ time)rospy . log info)hello _ time这个循环是一个相当标准的rospy结构。检查rospy.is_shutdown标志并开始“工作”(“工作”)。要确定到期是否应该结束,必须检查is_shutdown()。例如,Ctrl-C操作。在此示例中,“工作”调用pub.publish(Hello_str)在chatter主题中发布字符串。在循环中调用rate.sleep()以获得足够的睡眠时间,从而在循环中保持所需的速度。
(rospy.sleep))和time.sleep))来获得相同的计时效果))))。
循环CNOOC rospy.loginfo(str)执行三项任务。消息打印在屏幕上,写入节点的日志文件,然后写入rosout。Ros对于调试很有用。您可以使用rqt_console提取消息。您不需要使用节点的输出来查找控制台窗口。
String是一个非常简单的消息类
类型,所以您可能想知道发布更复杂的类型是什么样子。一般的经验是,构造函数参数的顺序与。消息文件。您也可以传递任何参数或直接初始化该字段。
Msg=String()msg.data=str或者您可以初始化一些值,其余的将采用默认值:
String(data=str)您可能对剩下的几行代码感到好奇:
Try: talker()除了rospy.rosinterrupteException:pass除了标准的Python_main_ check之外,他还会捕捉到一个rospy . rosinterrupteexception异常,这个异常会被rospy.sleep()和rospy抛出。按Ctrl-C或关闭节点时的Rate.sleep()。引发此异常是因为睡眠()后代码执行将不再继续。
现在,让我们编写一个节点来接收这个消息。
2.编写一个订阅者节点2.1代码,或者放在前一节的文件夹中。创建listener.py文件,并复制以下代码:
#!/usr/lovely hat/env python import rospy from STD _ msgs . msg import string def callback(data):rospy . log info(rospy . get _ caller _ id() I heard % s ,data.data) def listener(): #在ROS中,节点是唯一命名的。如果两个具有相同# node的节点被启动,则前一个被启动。# anonymous=True标志意味着rospy将为我们的“listener”节点选择一个唯一的# name,这样多个侦听器就可以#同时运行。init_node(listener ,匿名=True)。Subscriber(chatter ,String,callback) # spin()只是保持python不退出,直到这个节点停止rospy . spin()if _ _ name _ _= _ _ main _ _ :listener()2.2代码解释listener.py类似于talker.py文件,listener中会引入一个新的基于回调机制的回调来订阅消息。
init_node(listener ,匿名=True)。Subscriber(chatter ,String,Callback) # spin()简单地保持python不存在,直到此节点停止rospy.spin()此语句表示您的节点订阅消息类型为std_msgs.msgs.String的chatter主题当收到新消息时,Callback回调将作为第一个参数调用。
我们还更改了对rospy.init_node()的调用,并添加了anonymous=True关键字参数。ROS要求每个节点都有一个唯一的名称。如果出现同名节点,将会突破前一个节点。这样,故障节点可以很容易地从网络启动。Anonymous=True flag高速rospy为节点生成唯一的名称,这样可以轻松运行多个listener.py节点。
最后,添加rospy.spin()只是为了让您的节点退出,直到节点关闭。与roscpp不同,rospy.spin()不会影响用户回调函数,因为它们有自己的线程。
3构建自己的节点我们使用CMake作为我们的构建系统。是的,即使对于python节点,我们也必须使用它。这是为了确保为自动生成的消息和服务创建python代码。
运行到柳絮工作区,然后运行柳絮_make:
然后,CD ~/柔荑_ws柔荑_make在三个不同的终端上运行下面的指令。
roserosrunstarter _ tutorials talker . pyrosrunstarter _ tutorials listener . py运行结果如下
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。