data = [data] except Exception as e: smach.logwarn('Failed to parse data keys for CSV file writing: {}'.format(repr(e))) return 'aborted' # Write to CSV file try: with open(userdata.file, 'w') as fp: writer = csv.writer(fp, delimiter=self._delimiter) if header: writer.writerow(header) writer.writerows(data) except Exception as e: smach.logwarn('Failed to write to CSV file \'{}\': {}'.format(userdata.file, repr(e))) return 'aborted' # Write the header as output key if required. if 'header' in self._output_keys: userdata.header = header return 'succeeded' {% do defined_headers.append('class_WriteCSVFileState') %}{% endif %} {% endblock class_defs %} {% block body %} smach.{{ parent_type }}.add('{{ name }}', {{ '' | indent(23, true) }}WriteCSVFileState({% if delimiter is defined %}delimiter='{{ delimiter }}'{% endif %}{% if input_keys is defined %}{% if delimiter is defined %}, {% endif %}{{ render_input_keys(input_keys, indent=0) }}{% endif %}{% if output_keys is defined %}{% if input_keys is defined or delimiter is defined %}, {% endif %}{{ render_output_keys(output_keys, indent=0) }}{% endif %}{% if callbacks is defined %}, {{ render_callbacks(name, uuid, callbacks, indent=0) }}{% endif %}){% if transitions is defined %}, {{ render_transitions(transitions) }}{% endif %}{% if remapping is defined %}, {{ render_remapping(remapping) }}{% endif %}) {% endblock body %}
{% from "Utils.tpl.py" import render_outcomes, render_outcome_map, render_input_keys, render_output_keys, render_userdata, render_transitions, render_remapping %} {% set sm_name = ['sm_', name | lower()] | join() %} {% block upper_comments %} #---------------------------------------------------------------------------------------- # BEGIN: {{ name }} # TEMPLATE: Concurrence # {% endblock upper_comments %} {% block body %} {{ sm_name }} = smach.Concurrence({{ render_outcomes(outcomes) }}, {{ 'default_outcome=' | indent(35, true) }}'{{ default_outcome }}', {{ render_outcome_map(outcome_map) }}{% if input_keys is defined %}, {{ render_input_keys(input_keys, indent=35) }}{% endif %}{% if output_keys is defined %}, {{ render_output_keys(output_keys) }}{% endif %}) {# Container header insertion variable indexed by container state name #} {% if name in header %}{{ header[name] }}{% endif %} {# Render container userdata #} {% if userdata is defined %}{{ render_userdata(name | lower(), userdata) }}{% endif %} {# Render state userdat #} {% if name in header_userdata %}{{ header_userdata[name] | indent(4, true) }}{% endif %} with {{ sm_name }}: {# Container body insertion variable #} {{ body | indent(4) }}
rospy.loginfo('Userdata input key \'{}\' BEFORE callback execution: {}'.format(input_key, userdata[input_key])) {{ render_execute_callbacks() }} for input_key in self._input_keys: rospy.loginfo('Userdata input key \'{}\' AFTER callback execution: {}'.format(input_key, userdata[input_key])) return 'succeeded' {% do defined_headers.append('class_Foo') %}{% endif %} {% endblock class_defs %} {% block cb_defs %} {% if callbacks is defined %} {% if input_keys is defined %} {{ render_def_lambda_callbacks(defined_headers, 'Foo', name, uuid, input_keys, outcomes, callbacks) }} {% else %} {{ render_def_lambda_callbacks(defined_headers, 'Foo', name, uuid, [], outcomes, callbacks) }} {% endif %} {% endif %} {% endblock cb_defs %} {% block header_userdata %} {% if userdata is defined %}{{ render_userdata(parent_sm_name, userdata) }}{% endif %} {% endblock header_userdata %} {% block body %} smach.{{ parent_type }}.add('{{ name }}', Foo('{{ name }}'{% if input_keys is defined %}, {{ render_input_keys(input_keys, indent=0) }}{% endif %}{% if output_keys is defined %}, {{ render_output_keys(output_keys, indent=0) }}{% endif %}{% if callbacks is defined %}, {{ render_callbacks(name, uuid, callbacks, indent=0) }}{% endif %}){% if transitions is defined %}, {{ render_transitions(transitions) }}{% endif %}{% if remapping is defined %}, {{ render_remapping(remapping) }}{% endif %}) {% endblock body %}
The names of the userdata input keys needed for the request callback. type: list of str - - output_keys: description: The names of the userdata output keys needed for the response callback. type: list of str - - userdata: description: The definitions for the userdata keys named in the input_keys and output_keys variables. type: dict of str {% endblock meta %} {% from "Utils.tpl.py" import render_request_slots, render_input_keys, render_response_slots, render_output_keys, render_transitions, render_remapping %} {% extends "State.tpl.py" %} {% block body %} smach.{{ parent_type }}.add('{{ name }}', {{ '' | indent(23, true) }}smach_ros.ServiceState('{{ service_namespace }}', {{ service }}{% if request is defined %}, {{ 'request = ' | indent(51, true) }}{{ request }}{% elif request_slots is defined %}, {{ render_request_slots(request_slots) }}{% elif request_cb is defined %}, {{ 'request_cb = ' | indent(51, true) }}{{ request_cb }}{% if input_keys is defined %}, {{ render_input_keys(input_keys) }}{% endif %}{% endif %}{% if response_slots is defined %}, {{ render_response_slots(response_slots) }}{% elif response_cb is defined %}, {{ 'response_cb = ' | indent(51, true) }}{{ response_cb }}{% if output_keys is defined %}, {{ render_output_keys(output_keys) }}{% endif %}{% endif %}){% if transitions is defined %}, {{ render_transitions(transitions) }}{% endif %}{% if remapping is defined %}, {{ render_remapping(remapping) }}{% endif %}) {% endblock body %}
{% block main_def %} {{ super() }} {% if 'msg_publisher' not in defined_headers %} msg_publisher = MsgPublisher() {% do defined_headers.append('msg_publisher') %}{% endif %} {% endblock main_def %} {% block header %} {{ super() }} {# # By using this bit of trickery, we ensure that the mandatory userdata variables # 'rate' and 'topic' get defined as an empty string before any other userdata # variables are defined (these are rendered via the 'header_userdata' block # usually, which is rendered after the 'header' block). This allows for the # specification of 'rate' and 'topic' to be omitted in the SMACHA script state # definitions to simplify scripts under certain circumstances, # e.g. 'topic' can be omitted when the 'action' variable is set to 'stop_all'. #} {% if mandatory_userdata is not defined %}{% set mandatory_userdata = dict() %}{% endif %} {% if 'rate' not in mandatory_userdata.keys() %}{% set _dummy = mandatory_userdata.update({'rate':100.0}) %}{% endif %} {% if action == 'stop_all' and 'topic' not in mandatory_userdata.keys() %}{% set _dummy = mandatory_userdata.update({'topic':''}) %}{% endif %} {% if mandatory_userdata is defined %}{{ render_userdata(parent_sm_name, mandatory_userdata) }}{% endif %} {% endblock header %} {% block body %} smach.{{ parent_type }}.add('{{ name }}', {{ '' | indent(23, true) }}{{ class_name }}('{{ name }}', msg_publisher, '{{ action }}'{% if input_keys is defined %}, {{ render_input_keys(input_keys, indent=0) }}{% endif %}{% if output_keys is defined %}, {{ render_output_keys(output_keys, indent=0) }}{% endif %}{% if callbacks is defined %}, {{ render_callbacks(name, uuid, callbacks, indent=0) }}{% endif %}){% if transitions is defined %}, {{ render_transitions(transitions) }}{% endif %}{% if remapping is defined %}, {{ render_remapping(remapping) }}{% endif %}) {% endblock body %}
# Transform the msg try: if 'msg_type' in self._input_keys: transformed_msg = self._transform_msg(parsed_msg, transform, msg_type=userdata.msg_type) else: transformed_msg = self._transform_msg(parsed_msg, transform) except Exception as e: rospy.logerr('Error when transforming msg: ' + repr(e)) return 'aborted' # Set point output key if specified for output_key in ['msg', 'output_msg', 'msg_output']: if output_key in self._output_keys: setattr(userdata, output_key, transformed_msg) # Set transform output key if specified for output_key in ['transform', 'output_transform', 'transform_output']: if output_key in self._output_keys: setattr(userdata, output_key, transform) return 'succeeded' {% do defined_headers.append('class_TransformMsgState') %}{% endif %} {% endblock class_defs %} {% block body %} smach.{{ parent_type }}.add('{{ name }}', {{ '' | indent(23, true) }}TransformMsgState({% if transform_type is defined %}transform_type = '{{ transform_type }}'{% endif %}{% if input_keys is defined %}{% if transform_type is defined %}, {% endif %}{{ render_input_keys(input_keys, indent=0) }}{% endif %}{% if output_keys is defined %}{% if transform_type is defined or input_keys is defined %}, {% endif %}{{ render_output_keys(output_keys, indent=0) }}{% endif %}{% if callbacks is defined %}, {{ render_callbacks(name, uuid, callbacks, indent=0) }}{% endif %}){% if transitions is defined %}, {{ render_transitions(transitions) }}{% endif %}{% if remapping is defined %}, {{ render_remapping(remapping) }}{% endif %}) {% endblock body %}
{% endif %} {% endblock cb_defs %} {% block main_def %} {% endblock main_def %} {% block header %} {% endblock header %} {% block header_userdata %} {% if userdata is defined %}{{ render_userdata(parent_sm_name, userdata) }}{% endif %} {% endblock header_userdata %} {% block body %} smach.{{ parent_type }}.add('{{ name }}', {{ '' | indent(23, true) }}{{ class_name }}({% if input_keys is defined %}{{ render_input_keys(input_keys, indent=0) }}{% endif %}{% if output_keys is defined %}{% if input_keys is defined %}, {% endif %}{{ render_output_keys(output_keys, indent=0) }}{% endif %}{% if callbacks is defined %}{% if input_keys is defined or output_keys is defined %}, {% endif %}{{ render_callbacks(name, uuid, callbacks, indent=0) }}{% endif %}{% if outcomes is defined %}{% if input_keys is defined or output_keys is defined or callbacks is defined %}, {% endif %}{{ render_outcomes(outcomes, indent=0) }}{% endif %}){% if transitions is defined %}, {{ render_transitions(transitions) }}{% endif %}{% if remapping is defined %}, {{ render_remapping(remapping) }}{% endif %}) {% endblock body %} {% block footer %} {% endblock footer %} {% block introspection_server %} {% endblock introspection_server %} {% block execute %} {% endblock execute %} {% block spin %} {% endblock spin %}
{% endblock meta %} {% from "Utils.tpl.py" import render_outcomes, render_input_keys, render_output_keys, render_userdata, render_transitions, render_remapping %} {% set sm_name = ['sm_', name | lower()] | join() %} {% block upper_comments %} #---------------------------------------------------------------------------------------- # BEGIN: {{ name }} # TEMPLATE: StateMachine # {% endblock upper_comments %} {% block body %} {{ sm_name }} = smach.StateMachine({{ render_outcomes(outcomes) }}{% if input_keys is defined %}, {{ render_input_keys(input_keys) }}{% endif %}{% if output_keys is defined %}, {{ render_output_keys(output_keys) }}{% endif %}) {# Base container header insertion variable indexed by container state name #} {% if name in header %}{{ header[name] }}{% endif %} {# Render base container userdata #} {% if userdata is defined %}{{ render_userdata('sm_' + (name | lower()), userdata) }}{% endif %} {# Render state userdata #} {% if name in header_userdata %}{{ header_userdata[name] }}{% endif %} with {{ sm_name }}: {# Base container body insertion variable #} {{ body | indent(4) }}