-
Notifications
You must be signed in to change notification settings - Fork 51
Open
Description
I try to implement a simple Statemachine with a single concurrency container, but it fails to execute:
Start
|
\/
Container
|
----------------------------
| |
\/ \/
LOG_A LOG_B
| |
\/ \/
finshed failed
This is the statemachine implementation:
concurrency_test_sm.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
###########################################################
# WARNING: Generated code! #
# ************************** #
# Manual changes may get lost if file is generated again. #
# Only code inside the [MANUAL] tags will be kept. #
###########################################################
from flexbe_core import Behavior, Autonomy, OperatableStateMachine, ConcurrencyContainer, PriorityContainer, Logger
from flexbe_states.log_state import LogState
# Additional imports can be added inside the following tags
# [MANUAL_IMPORT]
# [/MANUAL_IMPORT]
'''
Created on Wed Jun 28 2023
@author: concurrency_test
'''
class concurrency_testSM(Behavior):
'''
concurrency_test
'''
def __init__(self, node):
super(concurrency_testSM, self).__init__()
self.name = 'concurrency_test'
# parameters of this behavior
# references to used behaviors
OperatableStateMachine.initialize_ros(node)
ConcurrencyContainer.initialize_ros(node)
PriorityContainer.initialize_ros(node)
Logger.initialize(node)
LogState.initialize_ros(node)
# Additional initialization code can be added inside the following tags
# [MANUAL_INIT]
# [/MANUAL_INIT]
# Behavior comments:
def create(self):
# x:30 y:365, x:130 y:365
_state_machine = OperatableStateMachine(outcomes=['finished', 'failed'])
# Additional creation code can be added inside the following tags
# [MANUAL_CREATE]
# [/MANUAL_CREATE]
# x:30 y:365, x:130 y:365, x:230 y:365, x:330 y:365, x:430 y:365
_sm_container_0 = ConcurrencyContainer(outcomes=['finished', 'failed'], conditions=[
('finished', [('A', 'done')]),
('failed', [('B', 'done')])
])
with _sm_container_0:
# x:165 y:142
OperatableStateMachine.add('A',
LogState(text="A", severity=Logger.REPORT_HINT),
transitions={'done': 'finished'},
autonomy={'done': Autonomy.Low})
# x:308 y:137
OperatableStateMachine.add('B',
LogState(text="B", severity=Logger.REPORT_HINT),
transitions={'done': 'failed'},
autonomy={'done': Autonomy.Low})
with _state_machine:
# x:241 y:89
OperatableStateMachine.add('Container',
_sm_container_0,
transitions={'finished': 'finished', 'failed': 'failed'},
autonomy={'finished': Autonomy.Inherit, 'failed': Autonomy.Inherit})
return _state_machine
# Private functions can be added inside the following tags
# [MANUAL_FUNC]
# [/MANUAL_FUNC]
When executed with "Block transitions which require at least "Low" autonomy the
Console output is:
12:20:41 PM] Onboard engine just started.
[12:20:46 PM] --> Preparing new behavior...
[12:20:46 PM] BE Starting [concurrency_test : 1208022996]
[12:20:46 PM] A
[12:20:46 PM] B
[12:20:46 PM] ConcurrencyContainer Container returning outcome failed (request inner sync)
[12:20:46 PM] Behavior execution for concurrency_test: 1208022996 failed! [-]
exceptions must derive from BaseException
[12:20:46 PM] Traceback (most recent call last): [+]
[12:20:46 PM] No behavior active.
[12:20:46 PM] Onboard engine just started.
[12:20:46 PM] �[92m--- Behavior Engine finished - ready for more! ---�[0m
[12:20:52 PM] Onboard engine just started.
A and B are printed, which is fine.
I would expect to see A and B in the "Behavior Execution" in the "Runtime Control".
There I would expect to be able to select "done" outcome from either A or B.
But the Behavior finished by itself, without waiting for Operator Input.
Am I missing something?
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels