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
monitor_threshold: lines 61
script_measurement_publisher: lines 85
skill_guarded_approach: lines 53
skill_idle_duration: lines 81
skill_lin: lines 47, 72
skill_sequence: lines 39
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>