diff --git a/src/lhw_intelligence/lhw_intelligence/safety_check/py_tree_behaviours.py b/src/lhw_intelligence/lhw_intelligence/safety_check/py_tree_behaviours.py index b9a52171de10d5c114c26f65360ab72ea57b5ef9..81472ee8cabe5f3335e0cc329a192192579d47e5 100644 --- a/src/lhw_intelligence/lhw_intelligence/safety_check/py_tree_behaviours.py +++ b/src/lhw_intelligence/lhw_intelligence/safety_check/py_tree_behaviours.py @@ -9,7 +9,7 @@ from ..behaviour_copy import Behaviour #TODO: Move behaviours to here from std_msgs.msg import Bool, String, Empty, Int16, Header, Int32 from builtin_interfaces.msg import Time import time, random -from lhw_interfaces.msg import Entities, Response, Entity, Result, RobotAction, HeadTouch +from lhw_interfaces.msg import Entities, Response, Entity, Result, RobotAction from nav2_msgs.action import NavigateToPose from geometry_msgs.msg import Twist, Pose, PoseStamped from diagnostic_msgs.msg._diagnostic_array import DiagnosticArray @@ -76,6 +76,7 @@ class MockNavigation(py_trees.behaviour.Behaviour): pass def update(self): + return py_trees.common.Status.SUCCESS rand = random.random() if rand < 0.3: return py_trees.common.Status.FAILURE @@ -216,6 +217,7 @@ class MoveToPoint(py_trees.behaviour.Behaviour): """ Checks if the head has been tapped + This is a blocking behaviour """ class IsHeadTouched(py_trees.behaviour.Behaviour): def __init__(self, name, node) -> None: @@ -322,3 +324,48 @@ class IsBatteryLow(py_trees.behaviour.Behaviour): def terminate(self, new_status): pass + +class Say(py_trees.behaviour.Behaviour): + def __init__(self, name, node, message: str) -> None: + super(Say, self).__init__(name) + self.node = node + self.message = message + self.say_pub = self.node.say_publisher + + def setup(self, **kwargs): + self.msg = String() + self.msg.data = self.message + pass + def initialise(self): + self.say_pub.publish(self.msg) + + def update(self): + return py_trees.common.Status.SUCCESS + + def terminate(self, new_status): + pass + +class ConfirmSay(py_trees.behaviour.Behaviour): + def __init__(self, name, node) -> None: + super(ConfirmSay, self).__init__(name) + self.node = node + self.say_pub = self.node.say_publisher # FOR TESTING + + def setup(self, **kwargs): + self.blackboard = py_trees.blackboard.Client(name="bb") + self.blackboard.register_key(key="dialogflow_response", access=py_trees.common.Access.READ) + def initialise(self): + pass + + def update(self): + msg = String() + if "yes" in self.blackboard.dialogflow_response.recognized_text.lower(): + msg.data = "Confirmed" + self.say_pub.publish(msg) + return py_trees.common.Status.SUCCESS + msg.data = "No" + self.say_pub.publish(msg) + return py_trees.common.Status.FAILURE + + def terminate(self, new_status): + pass diff --git a/src/lhw_intelligence/lhw_intelligence/safety_check/scenario_trees.py b/src/lhw_intelligence/lhw_intelligence/safety_check/scenario_trees.py index adb7a17ce887b166a45618d645ad949110050728..d8c1d63a5c86b1729f13ed625f324098c9c46143 100644 --- a/src/lhw_intelligence/lhw_intelligence/safety_check/scenario_trees.py +++ b/src/lhw_intelligence/lhw_intelligence/safety_check/scenario_trees.py @@ -1,24 +1,35 @@ import py_trees from .py_tree_behaviours import * +from lhw_intelligence.behaviour_copy import Behaviour """ Py_tree for the safety check procedure """ -def safety_check_tree(node, safety_point: Pose, exit: Pose): - root = py_trees.composites.Selector(name="Standby Selector") +def safety_check_tree(node, config: dict): + behaviour = Behaviour(node) + safety_pose = behaviour.position_to_pose(config["safety_point"]) + exit_pose = behaviour.position_to_pose(config["exit"]) + + root = py_trees.composites.Sequence(name="Standby Sequence") safety_check_sequence = py_trees.composites.Sequence(name="Safety Check Sequence") is_door_open = IsDoorOpen(name="Is Door Open", node=node) - move_forward = MoveForward(name="Move Forward", node=node, x=1.0) + mock_forward = MockNavigation(name="Mock Forward Move", node=node) + #move_forward = MoveForward(name="Move Forward", node=node, x=1.0) wait = py_trees.timers.Timer(name="Wait", duration=2) - move_to_safety_point = MoveToPoint(name="Move to Point",node=node, pose=safety_point) - signal_given = IsHeadTouched(name="Signal given", node=node) - move_to_exit = MoveToPoint(name="Move to Exit", node=node, pose=exit) - mock_nav = MockNavigation(name="Mock move", node=node) + mock_safety = MockNavigation(name="Mock Safety Point Move", node=node) + #move_to_safety_point = MoveToPoint(name="Move to Point",node=node, pose=safety_pose) + head_touched_selector_wait = py_trees.composites.Selector(name="Head Touched Selector Wait") + is_head_touched = IsHeadTouched(name="Is Head Touched") + head_touched_retry = Standby(name="Head Touched Retry") + #move_to_exit = MoveToPoint(name="Move to Exit", node=node, pose=exit_pose) + mock_exit = MockNavigation(name="Mock Exit Move", node=node) standby = Standby(name="Standby", node=node) + head_touched_selector_wait.add_children([is_head_touched, head_touched_retry]) + - safety_check_sequence.add_children([is_door_open, move_forward, wait, move_to_safety_point, signal_given, mock_nav]) + safety_check_sequence.add_children([is_door_open, mock_forward, wait, mock_safety, head_touched_selector_wait, mock_exit]) root.add_children([safety_check_sequence, standby]) return root # Root