首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SMACH并发容器的不同状态下使用相同的数据

在SMACH并发容器的不同状态下使用相同的数据
EN

Stack Overflow用户
提问于 2020-09-17 14:21:56
回答 1查看 299关注 0票数 0

假设我们有一个并发SMACH容器sm_con,它包括两个状态机SM1和SM2。我需要找到一种方法,让SM1不断地更新一些数据,并使SM2能够访问(并最终修改)相同的数据。我想通过将sm_con的用户数据传递给SM1和SM2作为输入和输出键来解决这个问题,希望如果SM1修改数据,它将自动覆盖_sm_con_s用户数据(有点像使用c++中的指针),但这不起作用。

相应的代码如下所示:

代码语言:javascript
复制
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'})

        sm_2 = smach.StateMachine(outcomes=['success', 'preempted'], input_keys=['testdata'])
        with sm_2:
            smach.StateMachine.add('ST2', st2(),
                                   remapping={'in_test':'testdata'},
                                   transitions={'successful': 'ST2'})

        smach.Concurrence.add('SM1', sm_1)
        smach.Concurrence.add('SM2', sm_2)

    # Execute SMACH plan
    outcome = sm_con.execute()
    print('exit-outcome:' + outcome)
    # Wait for ctrl-c to stop the application
    rospy.spin()

运行此代码,输出“test 1:.”显示在SM1内部,当输出'test 2:.‘时,用户数据会增加。显示当输出保持不变时,SM2不访问递增的数据。

如何在SM1中修改某些数据并访问SM2中的修改数据

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-22 11:23:34

我使用描述的这里这样的可变对象找到了解决办法。

应用于上面的代码,如下所示:

代码语言:javascript
复制
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'])

    def execute(self, userdata):
        if self.preempt_requested():
            self.service_preempt()
            return 'preempted'
        rospy.logerr('test 1: '+str(userdata.in_test))
        userdata.in_test[0]=userdata.in_test[0]+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[0]))
        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'])
        with sm_1:
            smach.StateMachine.add('ST1', st1(),
                                   remapping={'in_test': 'testdata'},
                                   transitions={'successful': 'ST1'})

        sm_2 = smach.StateMachine(outcomes=['success', 'preempted'], input_keys=['testdata'])
        with sm_2:
            smach.StateMachine.add('ST2', st2(),
                                   remapping={'in_test':'testdata'},
                                   transitions={'successful': 'ST2'})

        smach.Concurrence.add('SM1', sm_1)
        smach.Concurrence.add('SM2', sm_2)

    # Execute SMACH plan
    outcome = sm_con.execute()
    print('exit-outcome:' + outcome)
    # Wait for ctrl-c to stop the application
    rospy.spin()

由于这只是一个解决办法,请参考我相应的问题-post 这里以获得更多信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63940131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档