multiple_events_in_same_skill.xml

This example checks if a certain bug happens during event processing.

skill_guarded_approach contains 2 monitors that fire at the same time. In older versions, this led to a transition to skill_lin (“back”), followed immediately by a transition exiting the parent skill_sequence. This was due to a bug that checks monitors even after their skill is already finished.

Models used

File contents

  1<?xml version="1.0" encoding="UTF-8"?>
  2
  3<!-- This example checks if a certain bug happens during event processing.
  4
  5skill_guarded_approach contains 2 monitors that fire at the same time. In older versions,
  6this led to a transition to skill_lin ("back"), followed immediately by a transition
  7exiting the parent skill_sequence. This was due to a bug that checks monitors even after
  8their skill is already finished.
  9-->
 10
 11<pitasc>
 12
 13    <models>
 14        <include package="pitasc_library" file="models/pitasc.xml"/>
 15        <include package="pitasc_library" file="models/skills.xml"/>
 16
 17        <include package="pitasc_library" file="universal_robots/ur.xml"/>
 18    </models>
 19
 20    <clone prototype="project">
 21
 22        <member id="configuration">
 23            <clone id="configuration" prototype="default_configuration"/>
 24        </member>
 25
 26        <member id="environment">
 27            <clone prototype="robot_ur5">
 28                <member id="robot_driver.max_velocity">2.0</member>
 29                <member id="robot_driver.max_acceleration">3.0</member>
 30                <member id="components">
 31                    <clone prototype="force_sensor">
 32                        <member id="wrench_topic">wrench</member>
 33                    </clone>
 34                </member>
 35            </clone>
 36        </member>
 37
 38        <member id="applications">
 39            <clone prototype="skill_sequence">
 40
 41                <member id="robot" reference_id="environment.robot_ur5"/>
 42
 43                <!-- Skills -->
 44                <member id="skills">
 45
 46                    <!-- First move to start position -->
 47                    <clone prototype="skill_lin">
 48                        <member id="tool_frame">tool</member>
 49                        <member id="target_frame">start_position</member>
 50                    </clone>
 51
 52                    <!-- Moves along z until it hits something-->
 53                    <clone prototype="skill_guarded_approach">
 54                        <member id="control_frame">start_position</member>
 55                        <member id="tool_frame">tool</member>
 56                        <member id="axes">z</member>
 57                        <member id="velocities">0.02</member>
 58                        <member id="max_forces">10.0</member>
 59
 60                        <member id="monitors">
 61                            <clone id="force_threshold_copy" prototype="monitor_threshold">
 62                                <member id="provider" reference_id="force_skill.collections.force_chain.chains[0]"/>
 63                                <member id="coordinates" reference_id="axes"/>
 64                                <member id="prefix" reference_id="force_skill.collections.force_chain.prefix"/>
 65                                <member id="operator">absolute_greater</member>
 66                                <member id="thresholds" reference_id="max_forces"/>
 67                            </clone>
 68                        </member>
 69                    </clone>
 70
 71                    <!-- Back to start position -->
 72                    <clone id="back" prototype="skill_lin">
 73                        <member id="tool_frame">tool</member>
 74                        <member id="target_frame">start_position</member>
 75                    </clone>
 76
 77                    <!-- This skill will only be reached if the monitors of guarded_approach are handled correctly -->
 78                    <!-- In the old, bugged codebase, monitor `force_threshold_copy` of skill_guarded_approach
 79                         fires when skill_lin is reached, skipping skill "do_nothing", as the event is not associated
 80                         with skill_lin, but guarded_approach, and thus the parent skill_sequence -->
 81                    <clone id="do_nothing" prototype="skill_idle_duration">
 82                        <member id="duration">2</member>
 83
 84                        <member id="scripts">
 85                            <clone prototype="script_measurement_publisher">
 86                                <member id="provider" reference_id="robot.robot_driver"/>
 87                                <member id="topic">robot_measurements</member>
 88                                <member id="coordinates">shoulder_pan_joint</member>
 89                            </clone>
 90                        </member>
 91                    </clone>
 92
 93                </member>
 94
 95            </clone>
 96        </member>
 97
 98    </clone>
 99
100</pitasc>