首页 > 编程知识 正文

python subprocess popen,ros开发语言

时间:2023-05-03 08:03:40 阅读:112635 作者:289

参考: http://wiki.ROS.org/ROS/tutorials/writingpublishersubscriber (python ) )。

编写Publisher节点是连接到ROS网络的可执行文件的ROS术语。 在此处,您将创建一个发布器" talker "节点,该节点将继续广播消息。 您可以创建ros包,也可以使用现有的ros包,例如:

有关如何创建roscd beginner_tutorials包的信息,请参阅上一篇文章《ROS中编写服务器和客户端的方法(C++版)》

1.1代码首先生成“‘script”路径,保存python代码

mkdir scriptscd scripts然后创建一个名为talker.py的新文件,并复制以下代码:

#! /usr/多情帽子/env python # licenseremovedforbrevityimportrospyfromstd _ msgs.msgimportstringdeftalker () : pub=ro spy queue_size=10(Rospy.init_node ) ', anonymous=true (rate=ro spy.rate (10 ) # 10hz while not rospy.is_shutdown ) : hello _ str=' hello world % s ' ro

#! /usr/多情帽子/env python每个python版本的ROS节点都在前面有一个声明,表明此文件属于python类型

如果要写入importrospyfromstd _ msgs.msgimportstringros节点,则必须导入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 )表示您正在使用String类型的消息向chatter发布您的节点String是std_msgs.msg.String类。 如果任何订阅者都无法足够快地接收消息,则queue_size会限制队列消息的数量。 在旧的ROS版本中,这一点被忽略了。

下一行非常重要。 因为我在告诉ro spy ROS节点的名字。 在rospy拥有此信息之前,无法与ROS Master开始通信。 在本例中,您的节点名称为talker

anoymous=True通过在你的名字后面添加随机数来确保你的节点是唯一的。

行rate=rospy.rate(10 ) # 10hz创建速率对象rate。 此方法sleep ) )的帮助下,提供以恒定速率循环的有用方法。 参数10表示如果处理时间小于或等于1/10秒,则预期每秒循环10次

whilenotrospy.is _ shut down (: hello _ str=' hello world % s ' % ro spy.get _ time ) rospy.loginfo ) hello_time 该循环是相当标准的rospy结构。 检查rospy.is_shutdown标志位并开始工作(“‘work”)。 要确定成熟是否应该结束,必须检查is_shutdown ()。 例如,Ctrl-C操作。 在此示例中,‘work’调用pub.publish(Hello_str )在chatter主题中发布字符串。 在循环中调用rate.sleep (),获得足够的时间睡眠,以保持循环中所需的速度。

(rospy.sleep ) )和time.sleep ) )以获得相同的计时效果) ) ) )。

循环中海油rospy.loginfo(str ),执行三项任务。 消息打印在屏幕上,写入节点的日志文件,然后写入rosout。 rosout对调试很有用。 可以使用rqt_console提取消息。 不需要使用节点的输出来找到控制台窗口。

std_msgs.msg.String是一个非常简单的消息类

型,所以你可能会想知道发布更复杂的类型是什么样子。一般的经验是构造函数args与.msg文件中的顺序相同。你也可以传递任何参数,也可以直接初始化字段。

msg = String()msg.data = str

或者可以初始化一些值,剩余的采用默认值:

String(data=str)

你可能会好奇剩余的几行代码:

try: talker() except rospy.ROSInterruptException: pass

除了标准的Python_main_检查之外,他会捕获一个rospy.ROSInterruptException异常,当Ctrl-C被按下或者Node被关闭时,它将以rospy.sleep()和rospy.Rate.sleep()的方法抛出。引发这个异常的原因是因为在sleep()之后不会再继续执行代码。

现在,让我们来写一个节点来接收这条消息。

2.写一个Subscriber节点 2.1 代码

还是在上一节文件夹中,建立一个listener.py的文件,复制以下代码:

#!/usr/多情的帽子/env pythonimport rospyfrom std_msgs.msg import Stringdef 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() 2.2 代码解释

listener.py与talker.py文件类似,在listener中会引入一种新的基于回调机制callback来订阅消息。

rospy.init_node('listener', anonymous=True) rospy.Subscriber("chatter", String, callback) # spin() simply keeps python from exiting until this node is stopped rospy.spin()

这个声明表示你的节点订阅消息类型为std_msgs.msgs.String的chatter主题。当接收到新的消息时,回调callback将作为第一个参数被调用。

我们也改变了对rospy.init_node()的调用,我们添加了anonymous=True关键字参数。ROS要求每个节点都有唯一的名称,如果有相同名称的节点出现,则会突破前一个节点。这样就可以很容易地从网络上启动故障的节点。anonymous=True标志高速rospy为节点生成唯一的名称,以便可以轻松地运行多个listener.py节点。

最后添加rospy.spin()只是为了让你的节点退出,直到节点已经关闭。与roscpp不同,rospy.spin()不影响用户回调函数,因为它们有自己的线程。

3 构建自己的节点

我们使用CMake作为我们的构建系统,是的,即使对于python节点也必须使用它。这是为了确保自动生成的消息和服务的python代码被创建。

运行到catkin工作空间,然后运行catkin_make:

cd ~/catkin_wscatkin_make

然后分别在三个不同的终端运行下边的指令

roscorerosrun beginner_tutorials talker.pyrosrun beginner_tutorials listener.py

运行结果如下

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。