Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions examples/UC3-museum-guide/high-level-models-full/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Museum guide (high-level model)

This folder contains all the elements specifying a UC3-inspired model in the high-level/ROS SCXML format.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?xml version="1.0" encoding="UTF-8"?>
<scxml
initial="idle"
version="1.0"
name="ROS2Action"
model_src=""
xmlns="http://www.w3.org/2005/07/scxml">

<bt_declare_port_in key="service_name" type="string" />

<datamodel>
<data id="SKILL_SUCCESS" type="int8" expr="0" />
<data id="SKILL_FAILURE" type="int8" expr="1" />
<data id="SKILL_RUNNING" type="int8" expr="2" />
</datamodel>

<ros_service_client type="bt_interfaces_dummy/TickAction" name="srv_name_tick">
<service_name>
<bt_get_input key="service_name" />
</service_name>
</ros_service_client>
<!-- <ros_service_client type="bt_interfaces_dummy/HaltAction" name="srv_name_halt">
<service_name>
<bt_get_input key="service_name" />
</service_name>
</ros_service_client> -->


<state id="idle">
<bt_tick target="handle_response_tick">
<ros_service_send_request name="srv_name_tick"/>
</bt_tick>
<bt_halt target="idle">
<bt_return_halted />
</bt_halt>

<!-- <transition event="bt_halt" target="handle_response_halt">
<ros_service_send_request name="srv_name_halt"/>
</transition> -->
</state>

<state id="handle_response_tick">
<ros_service_handle_response name="srv_name_tick" cond="_res.status == SKILL_SUCCESS" target="idle" >
<bt_return_status status="SUCCESS" />
</ros_service_handle_response>
<ros_service_handle_response name="srv_name_tick" cond="_res.status == SKILL_FAILURE" target="idle" >
<bt_return_status status="FAILURE" />
</ros_service_handle_response>
<ros_service_handle_response name="srv_name_tick" cond="_res.status == SKILL_RUNNING" target="idle" >
<bt_return_status status="RUNNING" />
</ros_service_handle_response>
</state>

<!-- <state id="handle_response_halt">
<ros_service_handle_response name="srv_name_halt" target="idle" >
<send event="bt_halt_response" />
</ros_service_handle_response>
</state> -->

</scxml>
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<scxml
initial="idle"
version="1.0"
name="ROS2Condition"
model_src=""
xmlns="http://www.w3.org/2005/07/scxml">

<bt_declare_port_in key="service_name" type="string" />

<datamodel>
<data id="SKILL_SUCCESS" type="int8" expr="0" />
<data id="SKILL_FAILURE" type="int8" expr="1" />
</datamodel>

<ros_service_client type="bt_interfaces_dummy/TickCondition" name="srv_name">
<service_name>
<bt_get_input key="service_name" />
</service_name>
</ros_service_client>

<state id="idle">
<bt_tick target="handle_response">
<ros_service_send_request name="srv_name"/>
</bt_tick>
<bt_halt target="idle">
<bt_return_halted />
</bt_halt>
</state>

<state id="handle_response">
<ros_service_handle_response name="srv_name" cond="_res.status == SKILL_SUCCESS" target="idle" >
<bt_return_status status="SUCCESS" />
</ros_service_handle_response>
<ros_service_handle_response name="srv_name" cond="_res.status == SKILL_FAILURE" target="idle" >
<bt_return_status status="FAILURE" />
</ros_service_handle_response>
</state>

</scxml>
Original file line number Diff line number Diff line change
@@ -0,0 +1,207 @@
<?xml version='1.0' encoding='utf-8'?>
<root BTCPP_format="3" main_tree_to_execute="BehaviorTree">
<BehaviorTree ID="BatteryManagement">
<ReactiveSequence>
<ReactiveFallback>
<ROS2Condition name="BatteryLevel" interface="ROS2SERVICE" isMonitored="false" />
<ReactiveFallback>
<ReactiveSequence>
<Inverter>
<ROS2Condition name="BatteryCharging" interface="ROS2SERVICE" isMonitored="false" />
</Inverter>
<Parallel failure_threshold="1" success_threshold="2">
<ReactiveFallback>
<ROS2Condition name="IsAtChargingStation" interface="ROS2SERVICE" isMonitored="false" />
<Sequence>
<ROS2Action name="SayBye" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="ResetTour" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="GoToChargingStation" interface="ROS2SERVICE" isMonitored="false" />
</Sequence>
</ReactiveFallback>
<ROS2Action name="AlarmBatteryLow" interface="ROS2SERVICE" isMonitored="false" />
</Parallel>
</ReactiveSequence>
<ROS2Action name="Wait" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveFallback>
</ReactiveFallback>
<Parallel failure_threshold="1" success_threshold="2">
<ROS2Action name="NotifyCharged" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Condition name="IsAllowedToMove" interface="ROS2SERVICE" isMonitored="false" />
</Parallel>
</ReactiveSequence>
</BehaviorTree>

<BehaviorTree ID="BehaviorTree">
<ReactiveSequence>
<SubTree ID="BatteryManagement" __shared_blackboard="false" />
<!-- <SubTree ID="NetworkManagement" /> -->
<Sequence>
<SubTree ID="MuseumHours" />
<SubTree ID="PoiScheduler" __shared_blackboard="false" />
<SubTree ID="GoToPoi" __shared_blackboard="false" />
<SubTree ID="CheckArtworkAndExplain" __shared_blackboard="false" />
</Sequence>
</ReactiveSequence>
</BehaviorTree>

<BehaviorTree ID="CheckArtworkAndExplain">
<Sequence>
<ROS2Action name="NarratePoi" interface="ROS2SERVICE" isMonitored="false" />
<!-- <ROS2Action name="Dialog" interface="ROS2SERVICE" isMonitored="false" /> -->
<ROS2Action name="SetCurrentPoiDone" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="ResetCounters" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="SetNavigationPosition" interface="ROS2SERVICE" isMonitored="false" />
</Sequence>
</BehaviorTree>

<BehaviorTree ID="GoToPoi">
<ReactiveFallback>
<ROS2Condition name="IsAtCurrentPoi" interface="ROS2SERVICE" isMonitored="false" />
<ReactiveSequence>
<SubTree ID="PeopleFollowing" />
<ReactiveSequence>
<ROS2Action name="SetNotTurning" interface="ROS2SERVICE" isMonitored="false" />
<Parallel failure_threshold="1" success_threshold="2">
<ROS2Action name="GoToPoiAction" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="SayWhileNavigating" interface="ROS2SERVICE" isMonitored="false" />
</Parallel>
</ReactiveSequence>
</ReactiveSequence>
</ReactiveFallback>
</BehaviorTree>

<BehaviorTree ID="MuseumHours">
<Fallback>
<Inverter>
<ROS2Condition name="CheckIfStart" interface="ROS2SERVICE" isMonitored="false" />
</Inverter>
<Inverter>
<ROS2Condition name="IsMuseumClosing" interface="ROS2SERVICE" isMonitored="false" />
</Inverter>
</Fallback>
</BehaviorTree>

<!-- <BehaviorTree ID="NetworkManagement">
<ReactiveFallback>
<Inverter>
<ROS2Condition name="NetworkStatusChanged" interface="ROS2SERVICE" isMonitored="false" />
</Inverter>
<ReactiveFallback>
<ReactiveSequence>
<ROS2Condition name="NetworkUp" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="StopService" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveSequence>
<ROS2Action name="StartService" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveFallback>
</ReactiveFallback>
</BehaviorTree> -->

<BehaviorTree ID="PeopleFollowing">
<ReactiveFallback>
<ROS2Condition name="CheckIfStart" interface="ROS2SERVICE" isMonitored="false" />
<Inverter>
<ROS2Condition name="IsAllowedToTurnBack" interface="ROS2SERVICE" isMonitored="false" />
</Inverter>
<ROS2Condition name="VisitorsFollowingRobot" interface="ROS2SERVICE" isMonitored="false" />
<ReactiveSequence>
<ReactiveFallback>
<ROS2Condition name="IsCheckingForPeople" interface="ROS2SERVICE" isMonitored="false" />
<ReactiveSequence>
<ROS2Action name="SetTurning" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="StopAndTurnBack" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="SetTurned" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveSequence>
</ReactiveFallback>
<ROS2Action name="RunTimer" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="SayFollowMe" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="Wait" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveSequence>
</ReactiveFallback>
</BehaviorTree>

<BehaviorTree ID="PeopleLeaving">
<ReactiveFallback>
<ROS2Condition name="ArePeoplePresent" interface="ROS2SERVICE" isMonitored="false" />
<ReactiveSequence>
<ROS2Action name="SayPeopleLeft" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="PeopleLeft" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveSequence>
</ReactiveFallback>
</BehaviorTree>

<BehaviorTree ID="PoiScheduler">
<Fallback>
<Sequence>
<Inverter>
<Condition ID="ROS2Condition" interface="ROS2SERVICE" isMonitored="false" name="IsPoiDone0" />
</Inverter>
<Action ID="ROS2Action" interface="ROS2SERVICE" isMonitored="false" name="SetPoi0" />
</Sequence>
<Sequence>
<Inverter>
<Condition ID="ROS2Condition" interface="ROS2SERVICE" isMonitored="false" name="IsPoiDone1" />
</Inverter>
<Action ID="ROS2Action" interface="ROS2SERVICE" isMonitored="false" name="SetPoi1" />
</Sequence>
<Sequence>
<Inverter>
<Condition ID="ROS2Condition" interface="ROS2SERVICE" isMonitored="false" name="IsPoiDone2" />
</Inverter>
<Action ID="ROS2Action" interface="ROS2SERVICE" isMonitored="false" name="SetPoi2" />
</Sequence>
<Sequence>
<Inverter>
<Condition ID="ROS2Condition" interface="ROS2SERVICE" isMonitored="false" name="IsPoiDone3" />
</Inverter>
<Action ID="ROS2Action" interface="ROS2SERVICE" isMonitored="false" name="SetPoi3" />
</Sequence>
<Sequence>
<Inverter>
<Condition ID="ROS2Condition" interface="ROS2SERVICE" isMonitored="false" name="IsPoiDone4" />
</Inverter>
<Action ID="ROS2Action" interface="ROS2SERVICE" isMonitored="false" name="SetPoi4" />
</Sequence>
<Sequence>
<Inverter>
<Condition ID="ROS2Condition" interface="ROS2SERVICE" isMonitored="false" name="IsPoiDone5" />
</Inverter>
<Action ID="ROS2Action" interface="ROS2SERVICE" isMonitored="false" name="SetPoi5" />
</Sequence>
<ROS2Action name="ResetTourAndFlags" interface="ROS2SERVICE" isMonitored="false" />
</Fallback>
</BehaviorTree>

<BehaviorTree ID="TourDuration">
<Fallback>
<ReactiveSequence>
<ROS2Condition name="CheckIfStart" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="StopTourTimer" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveSequence>
<ReactiveSequence>
<ROS2Condition name="CheckIfFirstPoi" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="StartTourTimer" interface="ROS2SERVICE" isMonitored="false" />
</ReactiveSequence>
<Inverter>
<ROS2Condition name="IsWarningDuration" interface="ROS2SERVICE" isMonitored="false" />
</Inverter>
<Sequence>
<ROS2Action name="SayDurationWarning" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Condition name="IsMaximumDuration" interface="ROS2SERVICE" isMonitored="false" />
<ROS2Action name="SayDurationExceeded" interface="ROS2SERVICE" isMonitored="false" />
</Sequence>
</Fallback>
</BehaviorTree>


<TreeNodesModel>
<Action ID="ROS2Action">
<input_port name="interface" type="std::string" />
<input_port name="isMonitored" type="std::string" />
</Action>
<Condition ID="ROS2Condition">
<input_port name="interface" type="std::string" />
<input_port name="isMonitored" type="std::string" />
</Condition>
</TreeNodesModel>

</root>
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<scxml xmlns="http://www.w3.org/2005/07/scxml"
version="1.0"
initial="idle"
name="AllowedToMoveComponent"
datamodel="ecmascript">

<datamodel>
<data id="is_robot_allowed_to_move" type="boolean" expr="false"/>
<data id="temp_is_allowed_to_move_request" type="boolean" expr="false"/>
</datamodel>

<ros_service_server service_name="/AllowedToMoveComponent/SetAllowedToMove" type="allowed_to_move_interfaces/SetAllowedToMove"/>
<ros_service_server service_name="/AllowedToMoveComponent/IsAllowedToMove" type="allowed_to_move_interfaces/IsAllowedToMove"/>

<state id="idle">
<ros_service_handle_request name="/AllowedToMoveComponent/SetAllowedToMove" target="HandleSetAllowedToMove">
<assign location="temp_is_allowed_to_move_request" expr="_req.is_allowed_to_move"/>
</ros_service_handle_request>

<ros_service_handle_request name="/AllowedToMoveComponent/IsAllowedToMove" target="HandleIsAllowedToMove"/>
</state>

<state id="HandleSetAllowedToMove">
<onentry>
<assign location="is_robot_allowed_to_move" expr="temp_is_allowed_to_move_request"/>
<ros_service_send_response name="/AllowedToMoveComponent/SetAllowedToMove">
<field name="is_ok" expr="true"/>
</ros_service_send_response>
</onentry>
<transition target="idle"/>
</state>

<state id="HandleIsAllowedToMove">
<onentry>
<ros_service_send_response name="/AllowedToMoveComponent/IsAllowedToMove">
<field name="is_ok" expr="true"/>
<field name="is_allowed_to_move" expr="is_robot_allowed_to_move"/>
</ros_service_send_response>
</onentry>
<transition target="idle"/>
</state>

</scxml>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<scxml
version="1.0"
xmlns="..."
datamodel="ecmascript"
name="BatteryComponent"
initial="idle">

<datamodel>
<data id="percentage" type="int32" expr="100" />
<!-- <data id="timer_duration" type="int32" expr="1000" /> --> <!--Timer duration in milliseconds -->
</datamodel>

<ros_topic_publisher topic="/BatteryComponent/battery_status" type="sensor_msgs/BatteryState" />

<ros_time_rate name="control_timer" rate_hz="1.0" />

<state id="idle">
<onentry>
<!-- <send event="timer_expired" delayexpr="timer_duration + 'ms'" /> -->
<!-- <if cond="percentage &gt; 0" >
<assign location="percentage" expr="percentage - 1" />
</if> -->
<ros_topic_publish name="/BatteryComponent/battery_status">
<field name="data" expr="percentage" />
<field name="power_supply_status" expr="3" /> <!-- Assuming 3 means not charging -->
</ros_topic_publish>
</onentry>
<!-- <transition event="timer_expired" target="idle"/> -->
<ros_rate_callback name="control_timer" target="idle">
<if cond="percentage &gt; 0" >
<assign location="percentage" expr="percentage - 1" />
</if>
</ros_rate_callback>
<!-- <transition target="idle"/> -->
</state>

</scxml>
Loading