如何解决subprocess.popen-process与SMACH
我只是想在SMACH中从python启动rosbag命令。我发现这样做的一种方法是使用子流程。我的目标是,在rosbag启动后,状态机立即转换为状态T2(并停留在该状态)。
但是,当在SMACH状态内使用subprocess.popen启动rosbag,然后使用rostopic echo 'topic'
时,rosbag似乎首先正确地发布数据,然后突然停止发布数据,直到我结束SMACH使用Ctrl + C,rosbag会继续发布更多数据,并且在停止之前也是如此。
对此是否有任何合理的解释(我可能错过了一个参数,还是无法使节点保持这种方式运行)?还是有更好的方法启动rosbag并在后台运行?
(顺便说一句,其他一些命令,例如一些roslaunch命令,似乎在通过subprocess.popen启动后似乎停止工作!)
我的代码如下:
#!/usr/bin/env python3
import os
import signal
import subprocess
import smach
import smach_ros
import rospy
import time
from gnss_navigation.srv import *
class t1(smach.State):
def __init__(self,outcomes=['successful','failed','preempted']):
smach.State.__init__(self,outcomes)
def execute(self,userdata):
if self.preempt_requested():
self.service_preempt()
return 'preempted'
try:
process1 = subprocess.Popen('rosbag play /home/faps/bags/2020-05-07-11-18-18.bag',stdout=subprocess.PIPE,shell=True,preexec_fn=os.setsid)
except Exception:
return 'failed'
return 'successful'
class t2(smach.State):
def __init__(self,userdata):
#time.sleep(2)
if self.preempt_requested():
self.service_preempt()
return 'preempted'
return 'successful'
if __name__=="__main__":
rospy.init_node('test_state_machine')
sm_1 = smach.StateMachine(outcomes=['success','error','preempted'])
with sm_1:
smach.StateMachine.add('T1',t1(),transitions={'successful': 'T2','failed': 'error'})
smach.StateMachine.add('T2',t2(),'failed': 'error','preempted':'preempted'})
# Execute SMACH plan
outcome = sm_1.execute()
print('exit-outcome:' + outcome)
# Wait for ctrl-c to stop the application
rospy.spin()
解决方法
如this thread的答案注释部分所述,当使用 subprocess.PIPE 作为 stdout 时,会出现问题。
因此,我用来解决该问题的两种可能的解决方案是:
-
如果您不关心打印输出和内容->使用devnull作为输出:
FNULL = open(os.devnull,'w') process = subprocess.Popen('your command',stdout=FNULL,stderr=subprocess.STDOUT,shell=True,preexec_fn=os.setsid)
-
如果您确实需要打印输出和东西->创建一个日志文件并将其用作输出:
log_file = open('path_to_log/log.txt',stdout=log_file,preexec_fn=os.setsid)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。