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 %}
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 %}
# 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 %}
{% 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 %}
{% 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 %}