假设我们有一个并发 SMACH 容器sm_con,其中包括两个状态机SM1和SM2。我需要找到一种方法,让SM1不断更新一些数据,让SM2访问(并最终修改)相同的数据。我考虑通过将sm_con的用户数据作为输入和输出键传递给SM1和SM2来解决这个问题,希望如果SM1修改数据,它会自动覆盖sm_con的用户数据(有点像在 C++ 中使用指针),但这并不'不工作。
相应的代码如下所示:
import smach
import smach_ros
import rospy
class st1(smach.State):
def __init__(self, outcomes=['successful', 'preempted']):
smach.State.__init__(self, outcomes, input_keys=['in_test'], output_keys=['out_test'])
def execute(self, userdata):
if self.preempt_requested():
self.service_preempt()
return 'preempted'
rospy.logerr('test 1: '+str(userdata.in_test))
userdata.out_test=userdata.in_test+1
return 'successful'
class st2(smach.State):
def __init__(self, outcomes=['successful', 'preempted']):
smach.State.__init__(self, outcomes, input_keys=['in_test'])
def execute(self, userdata):
#time.sleep(2)
if self.preempt_requested():
self.service_preempt()
return 'preempted'
rospy.logerr('test 2: ' + str(userdata.in_test))
return 'successful'
if __name__=="__main__":
rospy.init_node('test_state_machine')
sm_con = smach.Concurrence(outcomes=['success'],
default_outcome='success'
)
sm_con.userdata.testdata = 0
with sm_con:
sm_1 = smach.StateMachine(outcomes=['success', 'preempted'], input_keys=['testdata'], output_keys=['testdata'])
with sm_1:
smach.StateMachine.add('ST1', st1(),
remapping={'in_test': 'testdata', 'out_test': 'testdata'},
transitions={'successful': 'ST1'})
运行此代码,输出“ test 1: ... ”显示SM1内部用户数据增加,而输出“ test 2: ... ”显示SM2不会访问增加的数据,因为输出仍为0。
如何修改SM1中的某些数据并访问SM2中修改后的数据?
慕无忌1623718
相关分类