+
+First, source your chosen ros2 distro.
+```
+source /opt/ros/rolling/setup.bash
+```
+```
+source /opt/ros/galactic/setup.bash
+```
+
+Before you build, make sure you've installed all the dependencies...
+
+```
+rosdep install --ignore-src --from-paths src -y -r
+```
+
+Then build with colcon build...
+
+```
+colcon build
+```
+
Operating Instructions
+After you build, remember to source the proper install folder...
+
+```
+source ~//install/setup.bash
+```
+
+And then run the launch file...
+
+```
+ros2 launch sm_multi_panda_sim sm_multi_panda_sim.launch
+```
+
+
Viewer Instructions
+If you have the SMACC2 Runtime Analyzer installed then type...
+
+```
+ros2 run smacc2_rta smacc2_rta
+```
+
+If you don't have the SMACC2 Runtime Analyzer click here
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/cartesian_limits.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/cartesian_limits.yaml
new file mode 100644
index 000000000..c1e8d321d
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/cartesian_limits.yaml
@@ -0,0 +1,5 @@
+cartesian_limits:
+ max_trans_vel: 1.0
+ max_trans_acc: 2.25
+ max_trans_dec: -5.0
+ max_rot_vel: 1.57
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/hand.xacro b/smacc2_sm_reference_library/sm_multi_panda_sim/config/hand.xacro
new file mode 100644
index 000000000..566f1c1b6
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/hand.xacro
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/joint_limits.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/joint_limits.yaml
new file mode 100644
index 000000000..ab296964e
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/joint_limits.yaml
@@ -0,0 +1,55 @@
+# joint_limits.yaml allows the dynamics properties specified in the URDF to be overwritten or augmented as needed
+# Specific joint properties can be changed with the keys [max_position, min_position, max_velocity, max_acceleration]
+# Joint limits can be turned off with [has_velocity_limits, has_acceleration_limits]
+
+# As MoveIt! does not support jerk limits, the acceleration limits provided here are the highest values that guarantee
+# that no jerk limits will be violated. More precisely, applying Euler differentiation in the worst case (from min accel
+# to max accel in 1 ms) the acceleration limits are the ones that satisfy
+# max_jerk = (max_acceleration - min_acceleration) / 0.001
+
+joint_limits:
+ panda_joint1:
+ has_velocity_limits: true
+ max_velocity: 2.1750
+ has_acceleration_limits: true
+ max_acceleration: 3.75
+ panda_joint2:
+ has_velocity_limits: true
+ max_velocity: 2.1750
+ has_acceleration_limits: true
+ max_acceleration: 1.875
+ panda_joint3:
+ has_velocity_limits: true
+ max_velocity: 2.1750
+ has_acceleration_limits: true
+ max_acceleration: 2.5
+ panda_joint4:
+ has_velocity_limits: true
+ max_velocity: 2.1750
+ has_acceleration_limits: true
+ max_acceleration: 3.125
+ panda_joint5:
+ has_velocity_limits: true
+ max_velocity: 2.6100
+ has_acceleration_limits: true
+ max_acceleration: 3.75
+ panda_joint6:
+ has_velocity_limits: true
+ max_velocity: 2.6100
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ panda_joint7:
+ has_velocity_limits: true
+ max_velocity: 2.6100
+ has_acceleration_limits: true
+ max_acceleration: 5.0
+ panda_finger_joint1:
+ has_velocity_limits: true
+ max_velocity: 0.1
+ has_acceleration_limits: false
+ max_acceleration: 0.0
+ panda_finger_joint2:
+ has_velocity_limits: true
+ max_velocity: 0.1
+ has_acceleration_limits: false
+ max_acceleration: 0.0
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/kinematics.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/kinematics.yaml
new file mode 100644
index 000000000..36a8b6d76
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/kinematics.yaml
@@ -0,0 +1,8 @@
+left_panda_arm:
+ kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
+ kinematics_solver_search_resolution: 0.005
+# kinematics_solver_timeout: 0.05
+right_panda_arm:
+ kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
+ kinematics_solver_search_resolution: 0.005
+# kinematics_solver_timeout: 0.05
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/left_initial_positions.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/left_initial_positions.yaml
new file mode 100644
index 000000000..b81bb6029
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/left_initial_positions.yaml
@@ -0,0 +1,9 @@
+# Default initial positions for the panda arm's ros2_control fake system
+initial_positions:
+ panda_joint1: 0.0
+ panda_joint2: -0.785
+ panda_joint3: 0.0
+ panda_joint4: -2.356
+ panda_joint5: 0.0
+ panda_joint6: 1.571
+ panda_joint7: 0.785
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/moveit_controllers.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/moveit_controllers.yaml
new file mode 100644
index 000000000..6942732c2
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/moveit_controllers.yaml
@@ -0,0 +1,7 @@
+# MoveIt uses this configuration for controller management
+trajectory_execution:
+ allowed_execution_duration_scaling: 1.2
+ allowed_goal_duration_margin: 0.5
+ allowed_start_tolerance: 0.01
+
+moveit_controller_manager: moveit_ros_control_interface/MoveItMultiControllerManager
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/moveit_cpp.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/moveit_cpp.yaml
new file mode 100644
index 000000000..ffa333f8a
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/moveit_cpp.yaml
@@ -0,0 +1,18 @@
+planning_scene_monitor_options:
+ name: "planning_scene_monitor"
+ robot_description: "robot_description"
+ joint_state_topic: "/joint_states"
+ attached_collision_object_topic: "/moveit_cpp/planning_scene_monitor"
+ publish_planning_scene_topic: "/moveit_cpp/publish_planning_scene"
+ monitored_planning_scene_topic: "/moveit_cpp/monitored_planning_scene"
+ wait_for_initial_state_timeout: 10.0
+
+planning_pipelines:
+ #namespace: "moveit_cpp" # optional, default is ~
+ pipeline_names: ["ompl"]
+
+plan_request_params:
+ planning_attempts: 1
+ planning_pipeline: ompl
+ max_velocity_scaling_factor: 1.0
+ max_acceleration_scaling_factor: 1.0
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/ompl_planning.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/ompl_planning.yaml
new file mode 100644
index 000000000..d145553d0
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/ompl_planning.yaml
@@ -0,0 +1,212 @@
+planning_plugin: ompl_interface/OMPLPlanner
+request_adapters: >-
+ default_planner_request_adapters/AddTimeOptimalParameterization
+ default_planner_request_adapters/ResolveConstraintFrames
+ default_planner_request_adapters/FixWorkspaceBounds
+ default_planner_request_adapters/FixStartStateBounds
+ default_planner_request_adapters/FixStartStateCollision
+ default_planner_request_adapters/FixStartStatePathConstraints
+start_state_max_bounds_error: 0.1
+planner_configs:
+ SBLkConfigDefault:
+ type: geometric::SBL
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ ESTkConfigDefault:
+ type: geometric::EST
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0 setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05
+ LBKPIECEkConfigDefault:
+ type: geometric::LBKPIECE
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9
+ min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5
+ BKPIECEkConfigDefault:
+ type: geometric::BKPIECE
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9
+ failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5
+ min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5
+ KPIECEkConfigDefault:
+ type: geometric::KPIECE
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05
+ border_fraction: 0.9 # Fraction of time focused on boarder default: 0.9 (0.0,1.]
+ failed_expansion_score_factor: 0.5 # When extending motion fails, scale score by factor. default: 0.5
+ min_valid_path_fraction: 0.5 # Accept partially valid moves above fraction. default: 0.5
+ RRTkConfigDefault:
+ type: geometric::RRT
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05
+ RRTConnectkConfigDefault:
+ type: geometric::RRTConnect
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ RRTstarkConfigDefault:
+ type: geometric::RRTstar
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05
+ delay_collision_checking: 1 # Stop collision checking as soon as C-free parent found. default 1
+ TRRTkConfigDefault:
+ type: geometric::TRRT
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability? default: 0.05
+ max_states_failed: 10 # when to start increasing temp. default: 10
+ temp_change_factor: 2.0 # how much to increase or decrease temp. default: 2.0
+ min_temperature: 10e-10 # lower limit of temp change. default: 10e-10
+ init_temperature: 10e-6 # initial temperature. default: 10e-6
+ frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup()
+ frountierNodeRatio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1
+ k_constant: 0.0 # value used to normalize expression. default: 0.0 set in setup()
+ PRMkConfigDefault:
+ type: geometric::PRM
+ max_nearest_neighbors: 10 # use k nearest neighbors. default: 10
+ PRMstarkConfigDefault:
+ type: geometric::PRMstar
+ FMTkConfigDefault:
+ type: geometric::FMT
+ num_samples: 1000 # number of states that the planner should sample. default: 1000
+ radius_multiplier: 1.1 # multiplier used for the nearest neighbors search radius. default: 1.1
+ nearest_k: 1 # use Knearest strategy. default: 1
+ cache_cc: 1 # use collision checking cache. default: 1
+ heuristics: 0 # activate cost to go heuristics. default: 0
+ extended_fmt: 1 # activate the extended FMT*: adding new samples if planner does not finish successfully. default: 1
+ BFMTkConfigDefault:
+ type: geometric::BFMT
+ num_samples: 1000 # number of states that the planner should sample. default: 1000
+ radius_multiplier: 1.0 # multiplier used for the nearest neighbors search radius. default: 1.0
+ nearest_k: 1 # use the Knearest strategy. default: 1
+ balanced: 0 # exploration strategy: balanced true expands one tree every iteration. False will select the tree with lowest maximum cost to go. default: 1
+ optimality: 1 # termination strategy: optimality true finishes when the best possible path is found. Otherwise, the algorithm will finish when the first feasible path is found. default: 1
+ heuristics: 1 # activates cost to go heuristics. default: 1
+ cache_cc: 1 # use the collision checking cache. default: 1
+ extended_fmt: 1 # Activates the extended FMT*: adding new samples if planner does not finish successfully. default: 1
+ PDSTkConfigDefault:
+ type: geometric::PDST
+ STRIDEkConfigDefault:
+ type: geometric::STRIDE
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05
+ use_projected_distance: 0 # whether nearest neighbors are computed based on distances in a projection of the state rather distances in the state space itself. default: 0
+ degree: 16 # desired degree of a node in the Geometric Near-neightbor Access Tree (GNAT). default: 16
+ max_degree: 18 # max degree of a node in the GNAT. default: 12
+ min_degree: 12 # min degree of a node in the GNAT. default: 12
+ max_pts_per_leaf: 6 # max points per leaf in the GNAT. default: 6
+ estimated_dimension: 0.0 # estimated dimension of the free space. default: 0.0
+ min_valid_path_fraction: 0.2 # Accept partially valid moves above fraction. default: 0.2
+ BiTRRTkConfigDefault:
+ type: geometric::BiTRRT
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ temp_change_factor: 0.1 # how much to increase or decrease temp. default: 0.1
+ init_temperature: 100 # initial temperature. default: 100
+ frountier_threshold: 0.0 # dist new state to nearest neighbor to disqualify as frontier. default: 0.0 set in setup()
+ frountier_node_ratio: 0.1 # 1/10, or 1 nonfrontier for every 10 frontier. default: 0.1
+ cost_threshold: 1e300 # the cost threshold. Any motion cost that is not better will not be expanded. default: inf
+ LBTRRTkConfigDefault:
+ type: geometric::LBTRRT
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05
+ epsilon: 0.4 # optimality approximation factor. default: 0.4
+ BiESTkConfigDefault:
+ type: geometric::BiEST
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ ProjESTkConfigDefault:
+ type: geometric::ProjEST
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ goal_bias: 0.05 # When close to goal select goal, with this probability. default: 0.05
+ LazyPRMkConfigDefault:
+ type: geometric::LazyPRM
+ range: 0.0 # Max motion added to tree. ==> maxDistance_ default: 0.0, if 0.0, set on setup()
+ LazyPRMstarkConfigDefault:
+ type: geometric::LazyPRMstar
+ SPARSkConfigDefault:
+ type: geometric::SPARS
+ stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0
+ sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25
+ dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001
+ max_failures: 1000 # maximum consecutive failure limit. default: 1000
+ SPARStwokConfigDefault:
+ type: geometric::SPARStwo
+ stretch_factor: 3.0 # roadmap spanner stretch factor. multiplicative upper bound on path quality. It does not make sense to make this parameter more than 3. default: 3.0
+ sparse_delta_fraction: 0.25 # delta fraction for connection distance. This value represents the visibility range of sparse samples. default: 0.25
+ dense_delta_fraction: 0.001 # delta fraction for interface detection. default: 0.001
+ max_failures: 5000 # maximum consecutive failure limit. default: 5000
+ TrajOptDefault:
+ type: geometric::TrajOpt
+
+panda_arm:
+ planner_configs:
+ - SBLkConfigDefault
+ - ESTkConfigDefault
+ - LBKPIECEkConfigDefault
+ - BKPIECEkConfigDefault
+ - KPIECEkConfigDefault
+ - RRTkConfigDefault
+ - RRTConnectkConfigDefault
+ - RRTstarkConfigDefault
+ - TRRTkConfigDefault
+ - PRMkConfigDefault
+ - PRMstarkConfigDefault
+ - FMTkConfigDefault
+ - BFMTkConfigDefault
+ - PDSTkConfigDefault
+ - STRIDEkConfigDefault
+ - BiTRRTkConfigDefault
+ - LBTRRTkConfigDefault
+ - BiESTkConfigDefault
+ - ProjESTkConfigDefault
+ - LazyPRMkConfigDefault
+ - LazyPRMstarkConfigDefault
+ - SPARSkConfigDefault
+ - SPARStwokConfigDefault
+ - TrajOptDefault
+panda_arm_hand:
+ planner_configs:
+ - SBLkConfigDefault
+ - ESTkConfigDefault
+ - LBKPIECEkConfigDefault
+ - BKPIECEkConfigDefault
+ - KPIECEkConfigDefault
+ - RRTkConfigDefault
+ - RRTConnectkConfigDefault
+ - RRTstarkConfigDefault
+ - TRRTkConfigDefault
+ - PRMkConfigDefault
+ - PRMstarkConfigDefault
+ - FMTkConfigDefault
+ - BFMTkConfigDefault
+ - PDSTkConfigDefault
+ - STRIDEkConfigDefault
+ - BiTRRTkConfigDefault
+ - LBTRRTkConfigDefault
+ - BiESTkConfigDefault
+ - ProjESTkConfigDefault
+ - LazyPRMkConfigDefault
+ - LazyPRMstarkConfigDefault
+ - SPARSkConfigDefault
+ - SPARStwokConfigDefault
+ - TrajOptDefault
+hand:
+ planner_configs:
+ - SBLkConfigDefault
+ - ESTkConfigDefault
+ - LBKPIECEkConfigDefault
+ - BKPIECEkConfigDefault
+ - KPIECEkConfigDefault
+ - RRTkConfigDefault
+ - RRTConnectkConfigDefault
+ - RRTstarkConfigDefault
+ - TRRTkConfigDefault
+ - PRMkConfigDefault
+ - PRMstarkConfigDefault
+ - FMTkConfigDefault
+ - BFMTkConfigDefault
+ - PDSTkConfigDefault
+ - STRIDEkConfigDefault
+ - BiTRRTkConfigDefault
+ - LBTRRTkConfigDefault
+ - BiESTkConfigDefault
+ - ProjESTkConfigDefault
+ - LazyPRMkConfigDefault
+ - LazyPRMstarkConfigDefault
+ - SPARSkConfigDefault
+ - SPARStwokConfigDefault
+ - TrajOptDefault
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.ros2_control.xacro b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.ros2_control.xacro
new file mode 100644
index 000000000..3d09e724a
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.ros2_control.xacro
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+ fake_components/GenericSystem
+
+
+
+
+ ${initial_positions['panda_joint1']}
+
+
+
+
+
+
+ ${initial_positions['panda_joint2']}
+
+
+
+
+
+
+ ${initial_positions['panda_joint3']}
+
+
+
+
+
+
+ ${initial_positions['panda_joint4']}
+
+
+
+
+
+
+ ${initial_positions['panda_joint5']}
+
+
+
+
+
+
+ ${initial_positions['panda_joint6']}
+
+
+
+
+
+
+ ${initial_positions['panda_joint7']}
+
+
+
+
+
+
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.srdf b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.srdf
new file mode 100644
index 000000000..4120d01ba
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.srdf
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.urdf.xacro b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.urdf.xacro
new file mode 100644
index 000000000..eae3a963e
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda.urdf.xacro
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda_arm_macro.xacro b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda_arm_macro.xacro
new file mode 100644
index 000000000..df6785149
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda_arm_macro.xacro
@@ -0,0 +1,238 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda_hand.ros2_control.xacro b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda_hand.ros2_control.xacro
new file mode 100644
index 000000000..9a33778e8
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/panda_hand.ros2_control.xacro
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+ fake_components/GenericSystem
+
+
+
+
+ 0.0
+
+
+
+
+ ${prefix}panda_finger_joint1
+ 1
+
+
+ 0.0
+
+
+
+
+
+
+
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/right_initial_positions.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/right_initial_positions.yaml
new file mode 100644
index 000000000..b81bb6029
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/right_initial_positions.yaml
@@ -0,0 +1,9 @@
+# Default initial positions for the panda arm's ros2_control fake system
+initial_positions:
+ panda_joint1: 0.0
+ panda_joint2: -0.785
+ panda_joint3: 0.0
+ panda_joint4: -2.356
+ panda_joint5: 0.0
+ panda_joint6: 1.571
+ panda_joint7: 0.785
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/config/ros2_controllers.yaml b/smacc2_sm_reference_library/sm_multi_panda_sim/config/ros2_controllers.yaml
new file mode 100644
index 000000000..0f8896802
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/config/ros2_controllers.yaml
@@ -0,0 +1,46 @@
+# This config file is used by ros2_control
+controller_manager:
+ ros__parameters:
+ update_rate: 100 # Hz
+
+ left_arm_controller:
+ type: joint_trajectory_controller/JointTrajectoryController
+
+ right_arm_controller:
+ type: joint_trajectory_controller/JointTrajectoryController
+
+ joint_state_broadcaster:
+ type: joint_state_broadcaster/JointStateBroadcaster
+
+
+left_arm_controller:
+ ros__parameters:
+ command_interfaces:
+ - position
+ state_interfaces:
+ - position
+ - velocity
+ joints:
+ - left_panda_joint1
+ - left_panda_joint2
+ - left_panda_joint3
+ - left_panda_joint4
+ - left_panda_joint5
+ - left_panda_joint6
+ - left_panda_joint7
+
+right_arm_controller:
+ ros__parameters:
+ command_interfaces:
+ - position
+ state_interfaces:
+ - position
+ - velocity
+ joints:
+ - right_panda_joint1
+ - right_panda_joint2
+ - right_panda_joint3
+ - right_panda_joint4
+ - right_panda_joint5
+ - right_panda_joint6
+ - right_panda_joint7
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/clients/move_group/client_behaviors/cb_move_synchronized_link_goals.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/clients/move_group/client_behaviors/cb_move_synchronized_link_goals.hpp
new file mode 100644
index 000000000..dbe41ca5f
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/clients/move_group/client_behaviors/cb_move_synchronized_link_goals.hpp
@@ -0,0 +1,80 @@
+
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/*****************************************************************************************************************
+ *
+ * Authors: Pablo Inigo Blasco, Brett Aldrich
+ *
+ ******************************************************************************************************************/
+#pragma once
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+namespace cl_move_group_interface
+{
+class CbMoveSynchronizedLinkGoals : public smacc2::SmaccAsyncClientBehavior
+{
+public:
+ CbMoveSynchronizedLinkGoals(const std::vector& poses, const std::vector& names)
+ {
+
+ }
+
+ void onEntry() override
+ {
+ ClMoveGroup * movegroupClient_;
+ requiresClient(movegroupClient_);
+
+ //auto group_name = movegroupClient_->getOptions().group_name_;
+ std::string ns = movegroupClient_->getOptions().move_group_namespace_;
+
+ //auto topicname = "/joint_state_broadcaster_"UR5PREFIX"/joint_states";
+
+ std::string topicname = "/joint_states";
+ if (!ns.empty())
+ {
+ topicname = ns + "/" + topicname;
+ }
+
+ //rclcpp::SensorDataQoS qos;
+ rclcpp::SubscriptionOptions sub_option;
+
+ sub_ = getNode()->create_subscription(
+ topicname, 20, std::bind(&CbMoveSynchronizedLinkGoals::onMessageReceived, this, std::placeholders::_1),
+ sub_option);
+
+ mutex.lock();
+ }
+
+private:
+ void onMessageReceived(const sensor_msgs::msg::JointState & msg)
+ {
+ postSuccessEvent();
+ mutex.unlock();
+ sub_ = nullptr; // unsuscribe
+ }
+
+ bool triggered = false;
+ std::mutex mutex;
+ rclcpp::Subscription::SharedPtr sub_;
+};
+}
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/clients/move_group/client_behaviors/cb_wait_joint_states.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/clients/move_group/client_behaviors/cb_wait_joint_states.hpp
new file mode 100644
index 000000000..e9985347e
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/clients/move_group/client_behaviors/cb_wait_joint_states.hpp
@@ -0,0 +1,78 @@
+
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/*****************************************************************************************************************
+ *
+ * Authors: Pablo Inigo Blasco, Brett Aldrich
+ *
+ ******************************************************************************************************************/
+#pragma once
+
+#include
+#include
+#include
+
+#include
+#include
+
+namespace cl_move_group_interface
+{
+class CbWaitJointState : public smacc2::SmaccAsyncClientBehavior
+{
+public:
+ CbWaitJointState()
+ {
+
+ }
+
+ void onEntry() override
+ {
+ ClMoveGroup * movegroupClient_;
+ requiresClient(movegroupClient_);
+
+ //auto group_name = movegroupClient_->getOptions().group_name_;
+ std::string ns = movegroupClient_->getOptions().move_group_namespace_;
+
+ //auto topicname = "/joint_state_broadcaster_"UR5PREFIX"/joint_states";
+
+ std::string topicname = "/joint_states";
+ if (!ns.empty())
+ {
+ topicname = ns + "/" + topicname;
+ }
+
+ //rclcpp::SensorDataQoS qos;
+ rclcpp::SubscriptionOptions sub_option;
+
+ sub_ = getNode()->create_subscription(
+ topicname, 20, std::bind(&CbWaitJointState::onMessageReceived, this, std::placeholders::_1),
+ sub_option);
+
+ mutex.lock();
+ }
+
+private:
+ void onMessageReceived(const sensor_msgs::msg::JointState & msg)
+ {
+ postSuccessEvent();
+ mutex.unlock();
+ sub_ = nullptr; // unsuscribe
+ }
+
+ bool triggered = false;
+ std::mutex mutex;
+ rclcpp::Subscription::SharedPtr sub_;
+};
+}
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_clearing.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_clearing.hpp
new file mode 100644
index 000000000..1628b8807
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_clearing.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct DsClearing : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_run.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_run.hpp
new file mode 100644
index 000000000..e77cb3445
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_run.hpp
@@ -0,0 +1,36 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct DsRun : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_stopped.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_stopped.hpp
new file mode 100644
index 000000000..0382d2894
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_stopped.hpp
@@ -0,0 +1,36 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct DsStopped : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ //smacc2::Transition
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_stopping.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_stopping.hpp
new file mode 100644
index 000000000..3d39e846a
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/domain_states/ds_stopping.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct DsStopping : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_aborted.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_aborted.hpp
new file mode 100644
index 000000000..dad542963
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_aborted.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct JsAborted : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_aborting.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_aborting.hpp
new file mode 100644
index 000000000..c79e66cfb
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_aborting.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct JsAborting : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_active.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_active.hpp
new file mode 100644
index 000000000..e1ecefa03
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/j_states/js_active.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct JsActive : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_complete.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_complete.hpp
new file mode 100644
index 000000000..5784e56c9
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_complete.hpp
@@ -0,0 +1,36 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsComplete : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_completing.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_completing.hpp
new file mode 100644
index 000000000..a5bdd16e1
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_completing.hpp
@@ -0,0 +1,43 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsCompleting : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+
+ static constexpr int ztotal_iterations() { return 1; }
+ int ziteration_count = 0;
+
+
+ static constexpr int ytotal_iterations() { return 1; }
+ int yiteration_count = 0;
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_execute.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_execute.hpp
new file mode 100644
index 000000000..06ea50278
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_execute.hpp
@@ -0,0 +1,45 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsExecute : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition,
+ smacc2::Transition,
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+
+ static constexpr int ztotal_iterations() { return 1; }
+ int ziteration_count = 0;
+
+
+ static constexpr int ytotal_iterations() { return 1; }
+ int yiteration_count = 0;
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_held.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_held.hpp
new file mode 100644
index 000000000..e23ec62d1
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_held.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsHeld : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_holding.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_holding.hpp
new file mode 100644
index 000000000..63b1ccf17
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_holding.hpp
@@ -0,0 +1,44 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsHolding : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+
+ static constexpr int ztotal_iterations() { return 1; }
+ int ziteration_count = 0;
+
+
+ static constexpr int ytotal_iterations() { return 1; }
+ int yiteration_count = 0;
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_idle.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_idle.hpp
new file mode 100644
index 000000000..e73de60a9
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_idle.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsIdle : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_resetting.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_resetting.hpp
new file mode 100644
index 000000000..3be0b2de4
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_resetting.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsResetting : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_starting.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_starting.hpp
new file mode 100644
index 000000000..72f3b13b6
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_starting.hpp
@@ -0,0 +1,44 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsStarting : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+
+ static constexpr int ztotal_iterations() { return 1; }
+ int ziteration_count = 0;
+
+
+ static constexpr int ytotal_iterations() { return 1; }
+ int yiteration_count = 0;
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_suspended.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_suspended.hpp
new file mode 100644
index 000000000..8dd30816d
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_suspended.hpp
@@ -0,0 +1,43 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsSuspended : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+
+ static constexpr int ztotal_iterations() { return 1; }
+ int ziteration_count = 0;
+
+
+ static constexpr int ytotal_iterations() { return 1; }
+ int yiteration_count = 0;
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_suspending.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_suspending.hpp
new file mode 100644
index 000000000..a65f9c736
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_suspending.hpp
@@ -0,0 +1,50 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsSuspending : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+
+ static constexpr int ztotal_iterations() { return 1; }
+ int ziteration_count = 0;
+
+
+ static constexpr int ytotal_iterations() { return 1; }
+ int yiteration_count = 0;
+
+
+ static constexpr int dtotal_iterations() { return 1; }
+ int diteration_count = 0;
+
+ static constexpr int gtotal_iterations() { return 1; }
+ int giteration_count = 0;
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_unholding.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_unholding.hpp
new file mode 100644
index 000000000..0847a1e0a
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_unholding.hpp
@@ -0,0 +1,36 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsUnholding : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+ smacc2::Transition
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_unsuspending.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_unsuspending.hpp
new file mode 100644
index 000000000..26c0c96cb
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/mode_states/ms_unsuspending.hpp
@@ -0,0 +1,35 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+// STATE DECLARATION
+struct MsUnsuspending : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+};
+
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_arm_left.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_arm_left.hpp
new file mode 100644
index 000000000..9099d8920
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_arm_left.hpp
@@ -0,0 +1,51 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include
+
+#include
+#include
+#include
+
+#include "ros_timer_client/cl_ros_timer.hpp"
+#include "smacc2/smacc.hpp"
+
+namespace sm_multi_panda_sim
+{
+using namespace std::chrono_literals;
+
+class OrArmLeft : public smacc2::Orthogonal
+{
+public:
+ void onInitialize() override
+ {
+ //moveit::planning_interface::MoveGroupInterface::Options options ("left_panda_arm");
+
+ // right
+ //moveit::planning_interface::MoveGroupInterface::Options options ("right_panda_arm");
+
+ moveit::planning_interface::MoveGroupInterface::Options options ("both_panda_arms");
+
+
+ auto move_group_client = this->createClient(options); //ur_manipulator
+
+ move_group_client->createComponent();
+
+ auto graspingComponent = move_group_client->createComponent();
+ graspingComponent->gripperLink_="tool0";
+ }
+};
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_arm_right.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_arm_right.hpp
new file mode 100644
index 000000000..114f84cba
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_arm_right.hpp
@@ -0,0 +1,46 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include
+
+#include
+#include
+#include
+
+#include "ros_timer_client/cl_ros_timer.hpp"
+#include "smacc2/smacc.hpp"
+
+namespace sm_multi_panda_sim
+{
+using namespace std::chrono_literals;
+
+class OrArmRight : public smacc2::Orthogonal
+{
+public:
+ void onInitialize() override
+ {
+
+ moveit::planning_interface::MoveGroupInterface::Options options ("right_panda_arm");
+
+ auto move_group_client = this->createClient(options); //ur_manipulator
+
+ move_group_client->createComponent();
+
+ auto graspingComponent = move_group_client->createComponent();
+ graspingComponent->gripperLink_="tool0";
+ }
+};
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_keyboard.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_keyboard.hpp
new file mode 100644
index 000000000..1d886cc54
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_keyboard.hpp
@@ -0,0 +1,30 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include
+#include
+
+namespace sm_multi_panda_sim
+{
+class OrKeyboard : public smacc2::Orthogonal
+{
+public:
+ virtual void onInitialize() override
+ {
+ auto clKeyboard = this->createClient();
+ }
+};
+} // namespace sm_pack_ml
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_timer.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_timer.hpp
new file mode 100644
index 000000000..d432af051
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_timer.hpp
@@ -0,0 +1,32 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include
+#include
+#include
+
+namespace sm_multi_panda_sim
+{
+using namespace std::chrono_literals;
+class OrTimer : public smacc2::Orthogonal
+{
+public:
+ virtual void onInitialize() override
+ {
+ auto actionclient = this->createClient(rclcpp::Duration(0.1s));
+ }
+};
+} // namespace sm_pack_ml
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_updatable_publisher.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_updatable_publisher.hpp
new file mode 100644
index 000000000..c868c6de1
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/orthogonals/or_updatable_publisher.hpp
@@ -0,0 +1,33 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include
+#include
+#include
+
+namespace sm_multi_panda_sim
+{
+using namespace cl_ros_publisher;
+
+class OrUpdatablePublisher : public smacc2::Orthogonal
+{
+public:
+ virtual void onInitialize() override
+ {
+ auto ros_publisher_client = this->createClient();
+ }
+};
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/sm_multi_panda_sim.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/sm_multi_panda_sim.hpp
new file mode 100644
index 000000000..f73e54007
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/sm_multi_panda_sim.hpp
@@ -0,0 +1,616 @@
+// Copyright 2021 MyName/MyCompany Inc.
+// Copyright 2021 RobosoftAI Inc. (template)
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+/*****************************************************************************************************************
+ *
+ * Authors: Pablo Inigo Blasco, Brett Aldrich
+ *
+ *****************************************************************************************************************/
+
+#pragma once
+
+#include
+
+#include "rclcpp/rclcpp.hpp"
+#include "smacc2/smacc.hpp"
+#include
+
+//CLIENT BEHAVIORS
+#include
+#include
+#include
+
+// #include
+// #include
+
+#include
+
+//#include
+#include
+
+//STATE REACTORS
+#include
+
+// ORTHOGONALS
+#include "orthogonals/or_arm_left.hpp"
+#include "orthogonals/or_arm_right.hpp"
+#include "orthogonals/or_timer.hpp"
+#include "orthogonals/or_keyboard.hpp"
+#include "orthogonals/or_updatable_publisher.hpp"
+
+// CLIENTS
+#include
+#include
+
+// CLIENT BEHAVIORS
+#include
+#include "clients/move_group/client_behaviors/cb_wait_joint_states.hpp"
+#include "clients/move_group/client_behaviors/cb_move_synchronized_link_goals.hpp"
+
+namespace sm_multi_panda_sim
+{
+
+using namespace cl_move_group_interface;
+using namespace cl_ros_timer;
+using namespace cl_keyboard;
+using namespace boost;
+using namespace smacc2;
+
+using namespace smacc2::default_events;
+
+//STATES
+struct StAcquireSensors;
+struct StMoveJoints;
+
+class JsAborting;
+class JsActive;
+class JsAborted;
+
+class DsClearing;
+class DsRun;
+class DsStopped;
+class DsStopping;
+
+class MsComplete;
+class MsCompleting;
+class MsExecute;
+class MsHeld;
+class MsHolding;
+class MsIdle;
+class MsResetting;
+class MsStarting;
+class MsSuspended;
+class MsSuspending;
+class MsUnholding;
+class MsUnsuspending;
+
+//SUPERSTATES
+class SsExecuteSequenceA;
+namespace execute_sequence_a
+{
+class StiExecuteSequenceALoop;
+class StiExecuteSequenceAStep1;
+class StiExecuteSequenceAStep2;
+class StiExecuteSequenceAStep3;
+class StiExecuteSequenceAStep4;
+class StiExecuteSequenceAStep5;
+class StiExecuteSequenceAStep6;
+class StiExecuteSequenceAStep7;
+class StiExecuteSequenceAStep8;
+class StiExecuteSequenceAStep9;
+} // namespace execute_sequence_a
+
+class SsStartSequenceA;
+namespace start_sequence_a
+{
+class StiStartSequenceALoop;
+class StiStartSequenceAStep1;
+class StiStartSequenceAStep2;
+class StiStartSequenceAStep3;
+class StiStartSequenceAStep4;
+class StiStartSequenceAStep5;
+class StiStartSequenceAStep6;
+class StiStartSequenceAStep7;
+class StiStartSequenceAStep8;
+class StiStartSequenceAStep9;
+} // namespace start_sequence_a
+
+class SsCompletingSequenceA;
+namespace completing_sequence_a
+{
+class StiCompletingSequenceALoop;
+class StiCompletingSequenceAStep1;
+class StiCompletingSequenceAStep2;
+class StiCompletingSequenceAStep3;
+class StiCompletingSequenceAStep4;
+class StiCompletingSequenceAStep5;
+class StiCompletingSequenceAStep6;
+class StiCompletingSequenceAStep7;
+class StiCompletingSequenceAStep8;
+class StiCompletingSequenceAStep9;
+} // namespace completing_sequence_a
+
+class SsSuspendingSequenceA;
+namespace suspending_sequence_a
+{
+class StiSuspendingSequenceALoop;
+class StiSuspendingSequenceAStep1;
+class StiSuspendingSequenceAStep2;
+class StiSuspendingSequenceAStep3;
+class StiSuspendingSequenceAStep4;
+class StiSuspendingSequenceAStep5;
+class StiSuspendingSequenceAStep6;
+class StiSuspendingSequenceAStep7;
+class StiSuspendingSequenceAStep8;
+class StiSuspendingSequenceAStep9;
+} // namespace suspending_sequence_a
+
+class SsSuspendingSequenceC;
+namespace suspending_sequence_c
+{
+class StiSuspendingSequenceCLoop;
+class StiSuspendingSequenceCStep1;
+class StiSuspendingSequenceCStep2;
+class StiSuspendingSequenceCStep3;
+class StiSuspendingSequenceCStep4;
+class StiSuspendingSequenceCStep5;
+class StiSuspendingSequenceCStep6;
+class StiSuspendingSequenceCStep7;
+class StiSuspendingSequenceCStep8;
+class StiSuspendingSequenceCStep9;
+} // namespace suspending_sequence_c
+
+class SsSuspendingSequenceD;
+namespace suspending_sequence_d
+{
+class StiSuspendingSequenceDLoop;
+class StiSuspendingSequenceDStep1;
+class StiSuspendingSequenceDStep2;
+class StiSuspendingSequenceDStep3;
+class StiSuspendingSequenceDStep4;
+class StiSuspendingSequenceDStep5;
+class StiSuspendingSequenceDStep6;
+class StiSuspendingSequenceDStep7;
+class StiSuspendingSequenceDStep8;
+class StiSuspendingSequenceDStep9;
+} // namespace suspending_sequence_d
+
+class SsHoldingSequenceA;
+namespace holding_sequence_a
+{
+class StiHoldingSequenceALoop;
+class StiHoldingSequenceAStep1;
+class StiHoldingSequenceAStep2;
+class StiHoldingSequenceAStep3;
+class StiHoldingSequenceAStep4;
+class StiHoldingSequenceAStep5;
+class StiHoldingSequenceAStep6;
+class StiHoldingSequenceAStep7;
+class StiHoldingSequenceAStep8;
+class StiHoldingSequenceAStep9;
+} // namespace holding_sequence_a
+
+
+class SsExecuteSequenceB;
+namespace execute_sequence_b
+{
+//FORWARD DECLARATIONS OF ALL INNER STATES
+class StiExecuteSequenceBLoop;
+class StiExecuteSequenceBStep1;
+class StiExecuteSequenceBStep2;
+class StiExecuteSequenceBStep3;
+class StiExecuteSequenceBStep4;
+class StiExecuteSequenceBStep5;
+class StiExecuteSequenceBStep6;
+class StiExecuteSequenceBStep7;
+class StiExecuteSequenceBStep8;
+class StiExecuteSequenceBStep9;
+} // namespace execute_sequence_b
+
+class SsStartSequenceB;
+
+namespace start_sequence_b
+{
+//FORWARD DECLARATIONS OF ALL INNER STATES
+class StiStartSequenceBLoop;
+class StiStartSequenceBStep1;
+class StiStartSequenceBStep2;
+class StiStartSequenceBStep3;
+class StiStartSequenceBStep4;
+class StiStartSequenceBStep5;
+class StiStartSequenceBStep6;
+class StiStartSequenceBStep7;
+class StiStartSequenceBStep8;
+class StiStartSequenceBStep9;
+} // namespace start_sequence_b
+
+class SsCompletingSequenceB;
+
+namespace completing_sequence_b
+{
+//FORWARD DECLARATIONS OF ALL INNER STATES
+class StiCompletingSequenceBLoop;
+class StiCompletingSequenceBStep1;
+class StiCompletingSequenceBStep2;
+class StiCompletingSequenceBStep3;
+class StiCompletingSequenceBStep4;
+class StiCompletingSequenceBStep5;
+class StiCompletingSequenceBStep6;
+class StiCompletingSequenceBStep7;
+class StiCompletingSequenceBStep8;
+class StiCompletingSequenceBStep9;
+} // namespace completing_sequence_b
+
+class SsSuspendingSequenceB;
+
+namespace suspending_sequence_b
+{
+//FORWARD DECLARATIONS OF ALL INNER STATES
+class StiSuspendingSequenceB;
+class StiSuspendingSequenceBStep1;
+class StiSuspendingSequenceBStep2;
+class StiSuspendingSequenceBStep3;
+class StiSuspendingSequenceBStep4;
+class StiSuspendingSequenceBStep5;
+class StiSuspendingSequenceBStep6;
+class StiSuspendingSequenceBStep7;
+class StiSuspendingSequenceBStep8;
+class StiSuspendingSequenceBStep9;
+} // namespace suspending_sequence_b
+
+class SsHoldingSequenceB;
+
+namespace holding_sequence_b
+{
+//FORWARD DECLARATIONS OF ALL INNER STATES
+class StiHoldingSequenceBLoop;
+class StiHoldingSequenceBStep1;
+class StiHoldingSequenceBStep2;
+class StiHoldingSequenceBStep3;
+class StiHoldingSequenceBStep4;
+class StiHoldingSequenceBStep5;
+class StiHoldingSequenceBStep6;
+class StiHoldingSequenceBStep7;
+class StiHoldingSequenceBStep8;
+class StiHoldingSequenceBStep9;
+} // namespace holding_sequence_b
+
+//STATES
+class ExecuteStObserve;
+class StRecoveryAnalyze1;
+class StRecoveryBifurcate1;
+class StRecoveryCalculate1;
+class StRecoveryDeliberate1;
+class StRecoveryEvaluate1;
+class StRecoveryGenerate1;
+class StRecoveryInnervate1;
+
+class StartStObserve;
+class StRecoveryAnalyze2;
+class StRecoveryBifurcate2;
+class StRecoveryCalculate2;
+class StRecoveryDeliberate2;
+class StRecoveryEvaluate2;
+class StRecoveryGenerate2;
+class StRecoveryInnervate2;
+
+class CompletingStObserve;
+class SuspendingStObserve;
+class HoldingStObserve;
+
+
+class ExecuteSequenceALoop;
+class ExecuteSequenceBLoop;
+class StartSequenceALoop;
+class StartSequenceBLoop;
+class CompletingSequenceALoop;
+class CompletingSequenceBLoop;
+class SuspendingSequenceALoop;
+class SuspendingSequenceCLoop;
+class SuspendingSequenceDLoop;
+class SuspendingSequenceBLoop;
+class HoldingSequenceALoop;
+class HoldingSequenceBLoop;
+
+
+//MODE STATES
+class MsExecute;
+class MsRecovery1;
+
+//MODE STATES
+class MsStarting;
+class MsRecovery2;
+
+class MsCompleting;
+class MsSuspending;
+class MsHolding;
+
+struct EvToDeep : sc::event
+{
+};
+
+struct EvFail : sc::event
+{
+};
+
+struct EvSc : sc::event
+{
+};
+
+struct EvStart : sc::event
+{
+};
+
+struct EvReset : sc::event
+{
+};
+
+struct EvSuspend : sc::event
+{
+};
+
+struct EvUnSuspend : sc::event
+{
+};
+
+struct EvHold : sc::event
+{
+};
+
+struct EvUnhold:sc::event
+{
+};
+
+struct EvStop:sc::event
+{
+};
+
+struct EvClear:sc::event
+{
+};
+
+//--------------------------------------------------------------------
+//STATE_MACHINE
+//struct SmMultiPandaSim : public smacc2::SmaccStateMachineBase
+
+struct SmMultiPandaSim : public smacc2::SmaccStateMachineBase
+{
+ using SmaccStateMachineBase::SmaccStateMachineBase;
+
+ void onInitialize() override
+ {
+ this->createOrthogonal();
+ this->createOrthogonal();
+ }
+};
+
+} // namespace sm_multi_panda_sim
+
+
+
+
+
+
+#include "j_states/js_aborted.hpp"
+#include "j_states/js_aborting.hpp"
+#include "j_states/js_active.hpp"
+
+#include "domain_states/ds_clearing.hpp"
+#include "domain_states/ds_run.hpp"
+#include "domain_states/ds_stopped.hpp"
+#include "domain_states/ds_stopping.hpp"
+
+#include "mode_states/ms_complete.hpp"
+#include "mode_states/ms_completing.hpp"
+#include "mode_states/ms_execute.hpp"
+#include "mode_states/ms_held.hpp"
+#include "mode_states/ms_holding.hpp"
+#include "mode_states/ms_idle.hpp"
+#include "mode_states/ms_resetting.hpp"
+#include "mode_states/ms_starting.hpp"
+#include "mode_states/ms_suspended.hpp"
+#include "mode_states/ms_suspending.hpp"
+#include "mode_states/ms_unholding.hpp"
+#include "mode_states/ms_unsuspending.hpp"
+
+#include "states/execute_sequence_a_loop.hpp"
+#include "states/start_sequence_a_loop.hpp"
+
+
+// STATES
+#include "states/st_acquire_sensors.hpp"
+#include "states/st_move_joints.hpp"
+
+
+#include "states/completing_sequence_a_loop.hpp"
+#include "states/suspending_sequence_a_loop.hpp"
+#include "states/holding_sequence_a_loop.hpp"
+
+#include "states/suspending_sequence_c_loop.hpp"
+#include "states/suspending_sequence_d_loop.hpp"
+
+#include "states/execute_sequence_b_loop.hpp"
+#include "states/start_sequence_b_loop.hpp"
+#include "states/completing_sequence_b_loop.hpp"
+#include "states/suspending_sequence_b_loop.hpp"
+#include "states/holding_sequence_b_loop.hpp"
+
+#include "states/execute_st_observe.hpp"
+#include "states/start_st_observe.hpp"
+#include "states/completing_st_observe.hpp"
+#include "states/suspending_st_observe.hpp"
+#include "states/holding_st_observe.hpp"
+
+#include "superstates/ss_execute_sequence_a.hpp"
+#include "superstates/ss_start_sequence_a.hpp"
+#include "superstates/ss_completing_sequence_a.hpp"
+#include "superstates/ss_suspending_sequence_a.hpp"
+#include "superstates/ss_holding_sequence_a.hpp"
+
+#include "superstates/ss_suspending_sequence_c.hpp"
+#include "superstates/ss_suspending_sequence_d.hpp"
+
+#include "superstates/ss_execute_sequence_b.hpp"
+#include "superstates/ss_start_sequence_b.hpp"
+#include "superstates/ss_completing_sequence_b.hpp"
+#include "superstates/ss_suspending_sequence_b.hpp"
+#include "superstates/ss_holding_sequence_b.hpp"
+
+// //ss_start_sequence_a
+#include "states/start_sequence_a/sti_start_sequence_a_loop.hpp"
+
+#include "states/start_sequence_a/sti_start_sequence_a_step_4.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_3.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_1.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_2.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_5.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_9.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_8.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_7.hpp"
+#include "states/start_sequence_a/sti_start_sequence_a_step_6.hpp"
+
+// //ss_execute_sequence_a
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_4.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_3.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_1.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_loop.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_2.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_5.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_9.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_8.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_7.hpp"
+#include "states/execute_sequence_a/sti_execute_sequence_a_step_6.hpp"
+
+
+//ss_completing_sequence_a
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_4.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_3.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_1.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_loop.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_2.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_5.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_9.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_8.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_7.hpp"
+#include "states/completing_sequence_a/sti_completing_sequence_a_step_6.hpp"
+
+//ss_suspending_sequence_a
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_4.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_3.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_1.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_loop.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_2.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_5.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_9.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_8.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_7.hpp"
+#include "states/suspending_sequence_a/sti_suspending_sequence_a_step_6.hpp"
+
+//ss_suspending_sequence_c
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_loop.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_1.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_2.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_3.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_4.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_5.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_6.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_7.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_8.hpp"
+#include "states/suspending_sequence_c/sti_suspending_sequence_c_step_9.hpp"
+
+//ss_suspending_sequence_d
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_4.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_3.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_1.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_loop.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_2.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_5.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_9.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_8.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_7.hpp"
+#include "states/suspending_sequence_d/sti_suspending_sequence_d_step_6.hpp"
+
+//ss_holding_sequence_a
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_4.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_3.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_1.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_loop.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_2.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_5.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_9.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_8.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_7.hpp"
+#include "states/holding_sequence_a/sti_holding_sequence_a_step_6.hpp"
+
+// //ss_execute_sequence_b
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_4.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_3.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_1.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_loop.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_2.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_5.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_9.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_8.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_7.hpp"
+#include "states/execute_sequence_b/sti_execute_sequence_b_step_6.hpp"
+
+// //ss_mode_2_sequence_b
+#include "states/start_sequence_b/sti_start_sequence_b_step_4.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_3.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_1.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_loop.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_2.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_5.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_9.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_8.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_7.hpp"
+#include "states/start_sequence_b/sti_start_sequence_b_step_6.hpp"
+
+//ss_completing_sequence_b
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_4.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_3.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_1.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_loop.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_2.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_5.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_9.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_8.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_7.hpp"
+#include "states/completing_sequence_b/sti_completing_sequence_b_step_6.hpp"
+
+//ss_suspending_sequence_b
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_4.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_3.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_1.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_loop.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_2.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_5.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_9.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_8.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_7.hpp"
+#include "states/suspending_sequence_b/sti_suspending_sequence_b_step_6.hpp"
+
+
+//ss_holding_seqence_b
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_4.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_3.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_1.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_loop.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_2.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_5.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_9.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_8.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_7.hpp"
+#include "states/holding_sequence_b/sti_holding_sequence_b_step_6.hpp"
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_loop.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_loop.hpp
new file mode 100644
index 000000000..d901c6473
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_loop.hpp
@@ -0,0 +1,54 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceALoop : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep1, CONTINUELOOP>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+ bool loopWhileCondition()
+ {
+ auto & superstate = this->context();
+
+ RCLCPP_INFO(
+ getLogger(), "Loop start, current iterations: %d, total iterations: %d",
+ superstate.iteration_count, superstate.total_iterations());
+ return superstate.iteration_count++ < superstate.total_iterations();
+ }
+
+ void onEntry()
+ {
+ RCLCPP_INFO(getLogger(), "LOOP START ON ENTRY");
+ checkWhileLoopConditionAndThrowEvent(&StiCompletingSequenceALoop::loopWhileCondition);
+ }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_1.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_1.hpp
new file mode 100644
index 000000000..27f3f6814
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_1.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep1 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep2, SUCCESS>,
+ Transition, StiCompletingSequenceAStep3, NEXT>
+ //Transition, StiStartSequenceALoop, PREVIOUS>,
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_2.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_2.hpp
new file mode 100644
index 000000000..9748c4f82
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_2.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep2 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep3, TIMEOUT>,
+ Transition, StiCompletingSequenceAStep1, PREVIOUS>,
+ Transition, StiCompletingSequenceAStep3, NEXT>
+
+ //Transition, ExecuteStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_3.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_3.hpp
new file mode 100644
index 000000000..bfb2c74ed
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_3.hpp
@@ -0,0 +1,56 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep3 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep4, TIMEOUT>,
+ Transition, StiCompletingSequenceAStep2, PREVIOUS>,
+ Transition, StiCompletingSequenceAStep4, NEXT>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_4.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_4.hpp
new file mode 100644
index 000000000..3f0a00ad3
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_4.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep4 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep5, TIMEOUT>,
+ Transition, StiCompletingSequenceAStep3, PREVIOUS>,
+ Transition, StiCompletingSequenceAStep5, NEXT>
+
+ //Transition, StartStObserve, RETURN>,
+ // Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_5.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_5.hpp
new file mode 100644
index 000000000..bee4f97e9
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_5.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep5 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep6, TIMEOUT>,
+ Transition, StiCompletingSequenceAStep4, PREVIOUS>,
+ Transition, StiCompletingSequenceAStep6, NEXT>
+
+ //Transition, ExecuteStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_6.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_6.hpp
new file mode 100644
index 000000000..d4ba32098
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_6.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep6 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep7, SUCCESS>,
+ Transition, StiCompletingSequenceAStep8, PREVIOUS>,
+ Transition, StiCompletingSequenceAStep7, NEXT>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_7.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_7.hpp
new file mode 100644
index 000000000..4e47f2463
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_7.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep7 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep8, TIMEOUT>,
+ Transition, StiCompletingSequenceAStep6, PREVIOUS>,
+ Transition, StiCompletingSequenceAStep8, NEXT>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_8.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_8.hpp
new file mode 100644
index 000000000..0f1de3c5f
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_8.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep8 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceAStep9, TIMEOUT>,
+ Transition, StiCompletingSequenceAStep7, PREVIOUS>,
+ Transition, StiCompletingSequenceAStep9, NEXT>
+
+ //Transition, ExecuteStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_9.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_9.hpp
new file mode 100644
index 000000000..429393f68
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a/sti_completing_sequence_a_step_9.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_a
+{
+// STATE DECLARATION
+struct StiCompletingSequenceAStep9 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceALoop, TIMEOUT>,
+ Transition, StiCompletingSequenceAStep8, PREVIOUS>,
+ Transition, StiCompletingSequenceALoop, NEXT>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_a
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a_loop.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a_loop.hpp
new file mode 100644
index 000000000..8c91cd04d
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_a_loop.hpp
@@ -0,0 +1,52 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+
+// STATE DECLARATION
+struct CompletingSequenceALoop : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, SsCompletingSequenceA, CONTINUELOOP>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+ bool loopWhileCondition()
+ {
+ auto & superstate = this->context();
+
+ RCLCPP_INFO(
+ getLogger(), "Loop start, current iterations: %d, total iterations: %d",
+ superstate.ziteration_count, superstate.ztotal_iterations());
+ return superstate.ziteration_count++ < superstate.ztotal_iterations();
+ }
+
+ void onEntry()
+ {
+ RCLCPP_INFO(getLogger(), "LOOP START ON ENTRY");
+ checkWhileLoopConditionAndThrowEvent(&CompletingSequenceALoop::loopWhileCondition);
+ }
+};
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_loop.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_loop.hpp
new file mode 100644
index 000000000..811efd61b
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_loop.hpp
@@ -0,0 +1,54 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_b
+{
+// STATE DECLARATION
+struct StiCompletingSequenceBLoop : smacc2::SmaccState
+{
+public:
+ using SmaccState::SmaccState;
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceBStep1, CONTINUELOOP>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure() {}
+
+ void runtimeConfigure() {}
+
+ bool loopWhileCondition()
+ {
+ auto & superstate = this->context();
+
+ RCLCPP_INFO(
+ getLogger(), "Loop start, current iterations: %d, total iterations: %d",
+ superstate.iteration_count, superstate.total_iterations());
+ return superstate.iteration_count++ < superstate.total_iterations();
+ }
+
+ void onEntry()
+ {
+ RCLCPP_INFO(getLogger(), "LOOP START ON ENTRY");
+ checkWhileLoopConditionAndThrowEvent(&StiCompletingSequenceBLoop::loopWhileCondition);
+ }
+};
+} // namespace execute_sequence_b
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_1.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_1.hpp
new file mode 100644
index 000000000..3eef589fc
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_1.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_b
+{
+// STATE DECLARATION
+struct StiCompletingSequenceBStep1 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceBStep2, TIMEOUT>,
+ Transition, StiCompletingSequenceBStep2, NEXT>,
+ Transition, StiCompletingSequenceBLoop, PREVIOUS>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_b
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_2.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_2.hpp
new file mode 100644
index 000000000..c37430db8
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_2.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_b
+{
+// STATE DECLARATION
+struct StiCompletingSequenceBStep2 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceBStep3, TIMEOUT>,
+ Transition, StiCompletingSequenceBStep1, PREVIOUS>,
+ Transition, StiCompletingSequenceBStep3, NEXT>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_b
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_3.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_3.hpp
new file mode 100644
index 000000000..2ba8450cf
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_3.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_b
+{
+// STATE DECLARATION
+struct StiCompletingSequenceBStep3 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceBStep4, SUCCESS>,
+ Transition, StiCompletingSequenceBStep5, SUCCESS>,
+ Transition, StiCompletingSequenceBStep6, SUCCESS>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_b
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_4.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_4.hpp
new file mode 100644
index 000000000..e51943acf
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_4.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_b
+{
+// STATE DECLARATION
+struct StiCompletingSequenceBStep4 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceBStep7, TIMEOUT>,
+ Transition, StiCompletingSequenceBStep3, PREVIOUS>,
+ Transition, StiCompletingSequenceBStep7, NEXT>
+
+ //ransition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_b
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_5.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_5.hpp
new file mode 100644
index 000000000..f74e101db
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_5.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_b
+{
+// STATE DECLARATION
+struct StiCompletingSequenceBStep5 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceBStep7, SUCCESS>,
+ Transition, StiCompletingSequenceBStep3, PREVIOUS>,
+ Transition, StiCompletingSequenceBStep7, NEXT>
+
+ //Transition, StartStObserve, RETURN>,
+ //Transition, MsRecovery2, ABORT>
+
+ >reactions;
+
+ // STATE FUNCTIONS
+ static void staticConfigure()
+ {
+ configure_orthogonal(20);
+ configure_orthogonal();
+ configure_orthogonal();
+ }
+
+ void runtimeConfigure() {}
+
+ void onEntry() { RCLCPP_INFO(getLogger(), "On Entry!"); }
+
+ void onExit() { RCLCPP_INFO(getLogger(), "On Exit!"); }
+};
+} // namespace execute_sequence_b
+} // namespace sm_multi_panda_sim
diff --git a/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_6.hpp b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_6.hpp
new file mode 100644
index 000000000..54b7b9547
--- /dev/null
+++ b/smacc2_sm_reference_library/sm_multi_panda_sim/include/sm_multi_panda_sim/states/completing_sequence_b/sti_completing_sequence_b_step_6.hpp
@@ -0,0 +1,57 @@
+// Copyright 2021 RobosoftAI Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+namespace sm_multi_panda_sim
+{
+namespace completing_sequence_b
+{
+// STATE DECLARATION
+struct StiCompletingSequenceBStep6 : smacc2::SmaccState
+{
+ using SmaccState::SmaccState;
+
+ // DECLARE CUSTOM OBJECT TAGS
+ struct TIMEOUT : ABORT{};
+ struct NEXT : SUCCESS{};
+ struct PREVIOUS : ABORT{};
+ struct RETURN : CANCEL{};
+
+ // TRANSITION TABLE
+ typedef mpl::list<
+
+ Transition, StiCompletingSequenceBStep7, TIMEOUT>,
+ Transition, StiCompletingSequenceBStep5, PREVIOUS>,
+ Transition, StiCompletingSequenceBStep7, NEXT>
+
+ //Transition