diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index bb6b8697..8faf406f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -2,5 +2,12 @@ "image": "mcr.microsoft.com/devcontainers/base:jammy", "features": { "ghcr.io/devcontainers/features/python:1": {} + }, + "customizations": { + "vscode": { + "extensions": [ + "ms-python.black-formatter" + ] + } } } diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml new file mode 100644 index 00000000..d2621058 --- /dev/null +++ b/.github/workflows/black.yml @@ -0,0 +1,10 @@ +name: Lint + +on: pull_request + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: psf/black@stable \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..6c08f501 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.defaultFormatter": "ms-python.black-formatter", + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/norms/ball.py b/norms/ball.py index caf8ffd2..70321b4c 100644 --- a/norms/ball.py +++ b/norms/ball.py @@ -147,10 +147,9 @@ def create_root() -> py_trees.behaviour.Behaviour: eventually=py_trees.common.Status.SUCCESS, ) approach = py_trees.behaviours.Running(name="Approach Ball") - + move_to_ball.add_children([isClose, approach]) - isGrasped = py_trees.behaviours.StatusQueue( name="Ball Grasped?", queue=[ @@ -160,7 +159,7 @@ def create_root() -> py_trees.behaviour.Behaviour: eventually=py_trees.common.Status.SUCCESS, ) grasp = py_trees.behaviours.Running(name="Grasp Ball") - + obtain_ball.add_children([isGrasped, grasp]) return root @@ -204,4 +203,4 @@ def main() -> None: if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/norms/ball_blackboard.py b/norms/ball_blackboard.py index 62122fd2..c9a0a5d7 100644 --- a/norms/ball_blackboard.py +++ b/norms/ball_blackboard.py @@ -44,6 +44,7 @@ blackboard.isBallClose = False blackboard.isBallGrasped = False + def description() -> str: """ Print description and usage information about the program. @@ -146,28 +147,26 @@ def create_root() -> py_trees.behaviour.Behaviour: print(blackboard) - isClose = py_trees.behaviours.CheckBlackboardVariableValue( - name="Ball Close?", - check=py_trees.common.ComparisonExpression( - variable="isBallClose", value=True, operator=operator.eq - ), - ) + name="Ball Close?", + check=py_trees.common.ComparisonExpression( + variable="isBallClose", value=True, operator=operator.eq + ), + ) approach = py_trees.behaviours.Running(name="Approach Ball") - - move_to_ball.add_children([isClose, approach]) + move_to_ball.add_children([isClose, approach]) isGrasped = py_trees.behaviours.CheckBlackboardVariableValue( - name="Ball Grasped?", - check=py_trees.common.ComparisonExpression( - variable="isBallGrasped", value=True, operator=operator.eq - ), - ) + name="Ball Grasped?", + check=py_trees.common.ComparisonExpression( + variable="isBallGrasped", value=True, operator=operator.eq + ), + ) grasp = py_trees.behaviours.Running(name="Grasp Ball") - + obtain_ball.add_children([isGrasped, grasp]) return root @@ -218,4 +217,4 @@ def main() -> None: if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/norms/deliver_medicine.py b/norms/deliver_medicine.py index 1fd818a7..2c61139d 100644 --- a/norms/deliver_medicine.py +++ b/norms/deliver_medicine.py @@ -52,6 +52,7 @@ blackboard.isElevatorOn7th = False blackboard.canLeaveElevator = False + def description() -> str: """ Print description and usage information about the program. @@ -128,6 +129,7 @@ def command_line_argument_parser() -> argparse.ArgumentParser: ) return parser + def wait(name, ticks) -> py_trees.behaviours.StatusQueue: queue = [] for i in range(0, ticks + 1): @@ -150,7 +152,6 @@ def create_root() -> py_trees.behaviour.Behaviour: root = py_trees.composites.Sequence(name="Sequence", memory=False) - get_medicine = py_trees.composites.Sequence(name="Sequence", memory=False) take_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) @@ -159,74 +160,71 @@ def create_root() -> py_trees.behaviour.Behaviour: root.add_children([get_medicine, take_elevator, deliver_medicine]) - - go_to = py_trees.behaviours.Success(name="Go To Medicine Cabinet") unlock = py_trees.composites.Selector(name="Selector", memory=False) take = py_trees.behaviours.Success(name="Take Medicine") get_medicine.add_children([go_to, unlock, take]) unlock_cabinet = py_trees.behaviours.CheckBlackboardVariableValue( - name="Unlock Cabinet", - check=py_trees.common.ComparisonExpression( - variable="isCabinetUnlocked", value=True, operator=operator.eq - ), - ) + name="Unlock Cabinet", + check=py_trees.common.ComparisonExpression( + variable="isCabinetUnlocked", value=True, operator=operator.eq + ), + ) wait_cabinet = wait("Wait for at most 3 Ticks", 3) supervisor = py_trees.behaviours.Success(name="Call Supervisor for Virtual Unlock") unlock.add_children([unlock_cabinet, wait_cabinet, supervisor]) - go_to_elevator = py_trees.behaviours.Success(name="Go to Elevator") click_up_button = py_trees.behaviours.Success(name="Click Up Button") wait_for_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) enter_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) - take_elevator.add_children([go_to_elevator, click_up_button, wait_for_elevator, enter_elevator]) + take_elevator.add_children( + [go_to_elevator, click_up_button, wait_for_elevator, enter_elevator] + ) is_elevator_open = py_trees.composites.Selector(name="Selector", memory=False) has_space_in_elevator = py_trees.composites.Selector(name="Selector", memory=False) can_enter_elevator = py_trees.composites.Selector(name="Selector", memory=False) - wait_for_elevator.add_children([is_elevator_open, has_space_in_elevator, can_enter_elevator]) - + wait_for_elevator.add_children( + [is_elevator_open, has_space_in_elevator, can_enter_elevator] + ) elevator_open = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator Open?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOpen", value=True, operator=operator.eq - ), - ) + name="Is Elevator Open?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOpen", value=True, operator=operator.eq + ), + ) wait_for_open_elevator = wait("Wait for at most 5 Ticks", 5) - supervisor = py_trees.behaviours.Success(name="Call Supervisor to Virtually Call Elevator") + supervisor = py_trees.behaviours.Success( + name="Call Supervisor to Virtually Call Elevator" + ) is_elevator_open.add_children([elevator_open, wait_for_open_elevator, supervisor]) elevator_space = py_trees.behaviours.CheckBlackboardVariableValue( - name=">= 9ft^2 of space in the Elevator?", - check=py_trees.common.ComparisonExpression( - variable="elevatorHasSpace", value=True, operator=operator.eq - ), - ) - wait_for_space = py_trees.behaviours.Running(name="State \'I’ll wait\'") + name=">= 9ft^2 of space in the Elevator?", + check=py_trees.common.ComparisonExpression( + variable="elevatorHasSpace", value=True, operator=operator.eq + ), + ) + wait_for_space = py_trees.behaviours.Running(name="State 'I’ll wait'") has_space_in_elevator.add_children([elevator_space, wait_for_space]) - + elevator_enter = py_trees.behaviours.CheckBlackboardVariableValue( - name="Ask to enter Elevator", - check=py_trees.common.ComparisonExpression( - variable="canEnterElevator", value=True, operator=operator.eq - ), - ) + name="Ask to enter Elevator", + check=py_trees.common.ComparisonExpression( + variable="canEnterElevator", value=True, operator=operator.eq + ), + ) wait_to_enter_elevator = py_trees.behaviours.Running(name="State I’ll wait") can_enter_elevator.add_children([elevator_enter, wait_to_enter_elevator]) - - - - enter_elevator_task = py_trees.behaviours.Success(name="Enter Elevator") hit_7th_floor_button = py_trees.behaviours.Success(name="Hit 7th Floor Button") enter_elevator.add_children([enter_elevator_task, hit_7th_floor_button]) - exit = py_trees.composites.Sequence(name="Sequence", memory=False) exit_statement = py_trees.behaviours.Success(name="State: I'll exit now") go_to_patient = py_trees.behaviours.Success(name="Go to Patient") @@ -235,34 +233,27 @@ def create_root() -> py_trees.behaviour.Behaviour: get_to_7th = py_trees.composites.Selector(name="Selector", memory=False) can_exit_now = py_trees.composites.Selector(name="Selector", memory=False) - + exit.add_children([get_to_7th, can_exit_now]) is_elevator_on_7th = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator on 7th?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOn7th", value=True, operator=operator.eq - ), - ) + name="Is Elevator on 7th?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOn7th", value=True, operator=operator.eq + ), + ) elevator_wait = py_trees.behaviours.Running(name="Wait") get_to_7th.add_children([is_elevator_on_7th, elevator_wait]) are_people_on_elevator = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is >= 1 Person in Elevator?", - check=py_trees.common.ComparisonExpression( - variable="canLeaveElevator", value=True, operator=operator.eq - ), - ) + name="Is >= 1 Person in Elevator?", + check=py_trees.common.ComparisonExpression( + variable="canLeaveElevator", value=True, operator=operator.eq + ), + ) exit_elevator_wait = wait("Wait for at most 3 Ticks", 3) can_exit_now.add_children([are_people_on_elevator, exit_elevator_wait]) - - - - - - - return root @@ -330,4 +321,4 @@ def main() -> None: if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/norms/deliver_medicine_with_deontic.py b/norms/deliver_medicine_with_deontic.py index b8600722..87fce26b 100644 --- a/norms/deliver_medicine_with_deontic.py +++ b/norms/deliver_medicine_with_deontic.py @@ -52,6 +52,7 @@ blackboard.isElevatorOn7th = False blackboard.canLeaveElevator = False + def description() -> str: """ Print description and usage information about the program. @@ -66,14 +67,16 @@ def description() -> str: content += "There are failing nodes within the tree that asks the human for input to demonstrate altering the tree between ticks.\n" content += "\n" content += "Key:\n" - content += "'--> ' - A leaf node that can return success, failure, or running when ran.\n" + content += ( + "'--> ' - A leaf node that can return success, failure, or running when ran.\n" + ) content += "'\{-\} Sequence' - A sequential operator with children that will be run in sequential order.\n" content += "'\{o\} Selector' - A fallback operator with children that will be run one at a time if the previous child fails.\n" content += "'-' - A node that has not been ran in the current tick yet.\n" content += "'✕' - A node that has ran and failed in the current tick.\n" content += "'✓' - A node that has ran and succeeded in the current tick.\n" content += "'*' - A node that has ran and returned running in the current tick.\n" - + if py_trees.console.has_colours: banner_line = console.green + "*" * 79 + "\n" + console.reset s = banner_line @@ -134,6 +137,7 @@ def command_line_argument_parser() -> argparse.ArgumentParser: ) return parser + def wait(name, ticks) -> py_trees.behaviours.StatusQueue: queue = [] for i in range(0, ticks + 1): @@ -156,7 +160,6 @@ def create_root() -> py_trees.behaviour.Behaviour: root = py_trees.composites.Sequence(name="Sequence", memory=False) - get_medicine = py_trees.composites.Sequence(name="Sequence", memory=False) take_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) @@ -165,76 +168,73 @@ def create_root() -> py_trees.behaviour.Behaviour: root.add_children([get_medicine, take_elevator, deliver_medicine]) - - go_to = py_trees.behaviours.Success(name="Go To Medicine Cabinet") unlock = py_trees.composites.Selector(name="Selector", memory=False) take = py_trees.behaviours.Success(name="Pickup Medicine") get_medicine.add_children([go_to, unlock, take]) unlock_cabinet = py_trees.behaviours.CheckBlackboardVariableValue( - name="Unlock Cabinet", - check=py_trees.common.ComparisonExpression( - variable="isCabinetUnlocked", value=True, operator=operator.eq - ), - ) + name="Unlock Cabinet", + check=py_trees.common.ComparisonExpression( + variable="isCabinetUnlocked", value=True, operator=operator.eq + ), + ) - wait_cabinet = py_trees.behaviours.Running(name="Wait") + wait_cabinet = py_trees.behaviours.Running(name="Wait") supervisor = py_trees.behaviours.Success(name="Call Supervisor for Virtual Unlock") unlock.add_children([unlock_cabinet, wait_cabinet, supervisor]) - go_to_elevator = py_trees.behaviours.Success(name="Go to Elevator") click_up_button = py_trees.behaviours.Success(name="Click Up Button") wait_for_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) enter_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) - take_elevator.add_children([go_to_elevator, click_up_button, wait_for_elevator, enter_elevator]) + take_elevator.add_children( + [go_to_elevator, click_up_button, wait_for_elevator, enter_elevator] + ) is_elevator_open = py_trees.composites.Selector(name="Selector", memory=False) has_space_in_elevator = py_trees.composites.Selector(name="Selector", memory=False) can_enter_elevator = py_trees.composites.Selector(name="Selector", memory=False) - wait_for_elevator.add_children([is_elevator_open, has_space_in_elevator, can_enter_elevator]) - + wait_for_elevator.add_children( + [is_elevator_open, has_space_in_elevator, can_enter_elevator] + ) elevator_open = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator Open?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOpen", value=True, operator=operator.eq - ), - ) + name="Is Elevator Open?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOpen", value=True, operator=operator.eq + ), + ) wait_for_open_elevator = py_trees.behaviours.Running(name="Wait") - supervisor = py_trees.behaviours.Success(name="Call Supervisor to Virtually Call Elevator") + supervisor = py_trees.behaviours.Success( + name="Call Supervisor to Virtually Call Elevator" + ) is_elevator_open.add_children([elevator_open, wait_for_open_elevator, supervisor]) # is_elevator_open.add_children([elevator_open, wait_for_open_elevator]) elevator_space = py_trees.behaviours.CheckBlackboardVariableValue( - name=">= 9ft^2 of space in the Elevator?", - check=py_trees.common.ComparisonExpression( - variable="elevatorHasSpace", value=True, operator=operator.eq - ), - ) + name=">= 9ft^2 of space in the Elevator?", + check=py_trees.common.ComparisonExpression( + variable="elevatorHasSpace", value=True, operator=operator.eq + ), + ) wait_for_space = py_trees.behaviours.Running(name="State I’ll wait") has_space_in_elevator.add_children([elevator_space, wait_for_space]) - + elevator_enter = py_trees.behaviours.CheckBlackboardVariableValue( - name="Ask to enter Elevator", - check=py_trees.common.ComparisonExpression( - variable="canEnterElevator", value=True, operator=operator.eq - ), - ) + name="Ask to enter Elevator", + check=py_trees.common.ComparisonExpression( + variable="canEnterElevator", value=True, operator=operator.eq + ), + ) wait_to_enter_elevator = py_trees.behaviours.Running(name="State I’ll wait") can_enter_elevator.add_children([elevator_enter, wait_to_enter_elevator]) - - - - enter_elevator_task = py_trees.behaviours.Success(name="Enter Elevator") hit_7th_floor_button = py_trees.behaviours.Success(name="Hit 7th Floor Button") enter_elevator.add_children([enter_elevator_task, hit_7th_floor_button]) - exit = py_trees.composites.Sequence(name="Sequence", memory=False) exit_statement = py_trees.behaviours.Success(name="State: I'll exit now") go_to_patient = py_trees.behaviours.Success(name="Go to Patient") @@ -243,34 +243,27 @@ def create_root() -> py_trees.behaviour.Behaviour: get_to_7th = py_trees.composites.Selector(name="Selector", memory=False) can_exit_now = py_trees.composites.Selector(name="Selector", memory=False) - + exit.add_children([get_to_7th, can_exit_now]) is_elevator_on_7th = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator on 7th?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOn7th", value=True, operator=operator.eq - ), - ) + name="Is Elevator on 7th?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOn7th", value=True, operator=operator.eq + ), + ) elevator_wait = py_trees.behaviours.Running(name="Wait") get_to_7th.add_children([is_elevator_on_7th, elevator_wait]) are_people_on_elevator = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is >= 1 Person in Elevator?", - check=py_trees.common.ComparisonExpression( - variable="canLeaveElevator", value=True, operator=operator.eq - ), - ) + name="Is >= 1 Person in Elevator?", + check=py_trees.common.ComparisonExpression( + variable="canLeaveElevator", value=True, operator=operator.eq + ), + ) exit_elevator_wait = wait("Wait for at most 3 Ticks", 3) can_exit_now.add_children([are_people_on_elevator, exit_elevator_wait]) - - - - - - - return root @@ -334,7 +327,9 @@ def main() -> None: if behaviour_tree.root.status == py_trees.common.Status.SUCCESS: tree_success = True elif behaviour_tree.root.status == py_trees.common.Status.FAILURE: - callSupervisor = input("Should the robot call it's supervisor for help on the next tick for the failed task? (1 for Yes 0 for No)\n") + callSupervisor = input( + "Should the robot call it's supervisor for help on the next tick for the failed task? (1 for Yes 0 for No)\n" + ) if callSupervisor == "1": node = behaviour_tree.root found = False @@ -346,10 +341,14 @@ def main() -> None: if type(node) == py_trees.composites.Selector: found = True # supervisor = py_trees.behaviours.Success(name="Call Supervisor to " + node.name) - supervisor = py_trees.behaviours.Success(name="Call Supervisor for help") + supervisor = py_trees.behaviours.Success( + name="Call Supervisor for help" + ) node.add_children([supervisor]) elif behaviour_tree.root.status == py_trees.common.Status.RUNNING: - reduceDeontic = input("Should the robot reduce the deontic force of the current running task to be less than the next task? (1 for Yes 0 for No)\n") + reduceDeontic = input( + "Should the robot reduce the deontic force of the current running task to be less than the next task? (1 for Yes 0 for No)\n" + ) if reduceDeontic == "1": node = behaviour_tree.root found = False @@ -366,8 +365,6 @@ def main() -> None: # supervisor = py_trees.behaviours.Success(name="Call Supervisor for help") parent.add_children([node]) - - i += 1 except KeyboardInterrupt: break @@ -375,4 +372,4 @@ def main() -> None: if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/norms/deliver_medicine_with_input.py b/norms/deliver_medicine_with_input.py index dd79b1ec..3f7b0b55 100644 --- a/norms/deliver_medicine_with_input.py +++ b/norms/deliver_medicine_with_input.py @@ -52,6 +52,7 @@ blackboard.isElevatorOn7th = False blackboard.canLeaveElevator = False + def description() -> str: """ Print description and usage information about the program. @@ -66,14 +67,16 @@ def description() -> str: content += "There are failing nodes within the tree that asks the human for input to demonstrate altering the tree between ticks.\n" content += "\n" content += "Key:\n" - content += "'--> ' - A leaf node that can return success, failure, or running when ran.\n" + content += ( + "'--> ' - A leaf node that can return success, failure, or running when ran.\n" + ) content += "'\{-\} Sequence' - A sequential operator with children that will be run in sequential order.\n" content += "'\{o\} Selector' - A fallback operator with children that will be run one at a time if the previous child fails.\n" content += "'-' - A node that has not been ran in the current tick yet.\n" content += "'✕' - A node that has ran and failed in the current tick.\n" content += "'✓' - A node that has ran and succeeded in the current tick.\n" content += "'*' - A node that has ran and returned running in the current tick.\n" - + if py_trees.console.has_colours: banner_line = console.green + "*" * 79 + "\n" + console.reset s = banner_line @@ -134,6 +137,7 @@ def command_line_argument_parser() -> argparse.ArgumentParser: ) return parser + def wait(name, ticks) -> py_trees.behaviours.StatusQueue: queue = [] for i in range(0, ticks + 1): @@ -156,7 +160,6 @@ def create_root() -> py_trees.behaviour.Behaviour: root = py_trees.composites.Sequence(name="Sequence", memory=False) - get_medicine = py_trees.composites.Sequence(name="Sequence", memory=False) take_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) @@ -165,76 +168,71 @@ def create_root() -> py_trees.behaviour.Behaviour: root.add_children([get_medicine, take_elevator, deliver_medicine]) - - go_to = py_trees.behaviours.Success(name="Go To Medicine Cabinet") unlock = py_trees.composites.Selector(name="Selector", memory=False) take = py_trees.behaviours.Success(name="Pickup Medicine") get_medicine.add_children([go_to, unlock, take]) unlock_cabinet = py_trees.behaviours.CheckBlackboardVariableValue( - name="Unlock Cabinet", - check=py_trees.common.ComparisonExpression( - variable="isCabinetUnlocked", value=True, operator=operator.eq - ), - ) + name="Unlock Cabinet", + check=py_trees.common.ComparisonExpression( + variable="isCabinetUnlocked", value=True, operator=operator.eq + ), + ) wait_cabinet = wait("Wait for at most 3 Ticks", 3) # supervisor = py_trees.behaviours.Success(name="Call Supervisor for Virtual Unlock") # unlock.add_children([unlock_cabinet, wait_cabinet, supervisor]) unlock.add_children([unlock_cabinet, wait_cabinet]) - go_to_elevator = py_trees.behaviours.Success(name="Go to Elevator") click_up_button = py_trees.behaviours.Success(name="Click Up Button") wait_for_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) enter_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) - take_elevator.add_children([go_to_elevator, click_up_button, wait_for_elevator, enter_elevator]) + take_elevator.add_children( + [go_to_elevator, click_up_button, wait_for_elevator, enter_elevator] + ) is_elevator_open = py_trees.composites.Selector(name="Selector", memory=False) has_space_in_elevator = py_trees.composites.Selector(name="Selector", memory=False) can_enter_elevator = py_trees.composites.Selector(name="Selector", memory=False) - wait_for_elevator.add_children([is_elevator_open, has_space_in_elevator, can_enter_elevator]) - + wait_for_elevator.add_children( + [is_elevator_open, has_space_in_elevator, can_enter_elevator] + ) elevator_open = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator Open?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOpen", value=True, operator=operator.eq - ), - ) + name="Is Elevator Open?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOpen", value=True, operator=operator.eq + ), + ) wait_for_open_elevator = wait("Wait for at most 5 Ticks", 5) # supervisor = py_trees.behaviours.Success(name="Call Supervisor to Virtually Call Elevator") # is_elevator_open.add_children([elevator_open, wait_for_open_elevator, supervisor]) is_elevator_open.add_children([elevator_open, wait_for_open_elevator]) elevator_space = py_trees.behaviours.CheckBlackboardVariableValue( - name=">= 9ft^2 of space in the Elevator?", - check=py_trees.common.ComparisonExpression( - variable="elevatorHasSpace", value=True, operator=operator.eq - ), - ) - wait_for_space = py_trees.behaviours.Running(name="State \'I’ll wait\'") + name=">= 9ft^2 of space in the Elevator?", + check=py_trees.common.ComparisonExpression( + variable="elevatorHasSpace", value=True, operator=operator.eq + ), + ) + wait_for_space = py_trees.behaviours.Running(name="State 'I’ll wait'") has_space_in_elevator.add_children([elevator_space, wait_for_space]) - + elevator_enter = py_trees.behaviours.CheckBlackboardVariableValue( - name="Ask to enter Elevator", - check=py_trees.common.ComparisonExpression( - variable="canEnterElevator", value=True, operator=operator.eq - ), - ) + name="Ask to enter Elevator", + check=py_trees.common.ComparisonExpression( + variable="canEnterElevator", value=True, operator=operator.eq + ), + ) wait_to_enter_elevator = py_trees.behaviours.Running(name="State I’ll wait") can_enter_elevator.add_children([elevator_enter, wait_to_enter_elevator]) - - - - enter_elevator_task = py_trees.behaviours.Success(name="Enter Elevator") hit_7th_floor_button = py_trees.behaviours.Success(name="Hit 7th Floor Button") enter_elevator.add_children([enter_elevator_task, hit_7th_floor_button]) - exit = py_trees.composites.Sequence(name="Sequence", memory=False) exit_statement = py_trees.behaviours.Success(name="State: I'll exit now") go_to_patient = py_trees.behaviours.Success(name="Go to Patient") @@ -243,34 +241,27 @@ def create_root() -> py_trees.behaviour.Behaviour: get_to_7th = py_trees.composites.Selector(name="Selector", memory=False) can_exit_now = py_trees.composites.Selector(name="Selector", memory=False) - + exit.add_children([get_to_7th, can_exit_now]) is_elevator_on_7th = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator on 7th?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOn7th", value=True, operator=operator.eq - ), - ) + name="Is Elevator on 7th?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOn7th", value=True, operator=operator.eq + ), + ) elevator_wait = py_trees.behaviours.Running(name="Wait") get_to_7th.add_children([is_elevator_on_7th, elevator_wait]) are_people_on_elevator = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is >= 1 Person in Elevator?", - check=py_trees.common.ComparisonExpression( - variable="canLeaveElevator", value=True, operator=operator.eq - ), - ) + name="Is >= 1 Person in Elevator?", + check=py_trees.common.ComparisonExpression( + variable="canLeaveElevator", value=True, operator=operator.eq + ), + ) exit_elevator_wait = wait("Wait for at most 3 Ticks", 3) can_exit_now.add_children([are_people_on_elevator, exit_elevator_wait]) - - - - - - - return root @@ -333,7 +324,9 @@ def main() -> None: if behaviour_tree.root.status == py_trees.common.Status.SUCCESS: tree_success = True elif behaviour_tree.root.status == py_trees.common.Status.FAILURE: - callSupervisor = input("Should the robot call it's supervisor for help on the next tick for the failed task? (1 for Yes 0 for No)\n") + callSupervisor = input( + "Should the robot call it's supervisor for help on the next tick for the failed task? (1 for Yes 0 for No)\n" + ) if callSupervisor == "1": node = behaviour_tree.root found = False @@ -345,9 +338,10 @@ def main() -> None: if type(node) == py_trees.composites.Selector: found = True # supervisor = py_trees.behaviours.Success(name="Call Supervisor to " + node.name) - supervisor = py_trees.behaviours.Success(name="Call Supervisor for help") + supervisor = py_trees.behaviours.Success( + name="Call Supervisor for help" + ) node.add_children([supervisor]) - i += 1 except KeyboardInterrupt: @@ -356,4 +350,4 @@ def main() -> None: if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/norms/deliver_medicine_with_reorder.py b/norms/deliver_medicine_with_reorder.py index 080938c4..6aa74c6c 100644 --- a/norms/deliver_medicine_with_reorder.py +++ b/norms/deliver_medicine_with_reorder.py @@ -55,7 +55,6 @@ # exit() - def description() -> str: """ Print description and usage information about the program. @@ -70,14 +69,16 @@ def description() -> str: content += "There are failing nodes within the tree that asks the human for input to demonstrate altering the tree between ticks.\n" content += "\n" content += "Key:\n" - content += "'--> ' - A leaf node that can return success, failure, or running when ran.\n" + content += ( + "'--> ' - A leaf node that can return success, failure, or running when ran.\n" + ) content += "'\{-\} Sequence' - A sequential operator with children that will be run in sequential order.\n" content += "'\{o\} Selector' - A fallback operator with children that will be run one at a time if the previous child fails.\n" content += "'-' - A node that has not been ran in the current tick yet.\n" content += "'✕' - A node that has ran and failed in the current tick.\n" content += "'✓' - A node that has ran and succeeded in the current tick.\n" content += "'*' - A node that has ran and returned running in the current tick.\n" - + if py_trees.console.has_colours: banner_line = console.green + "*" * 79 + "\n" + console.reset s = banner_line @@ -138,6 +139,7 @@ def command_line_argument_parser() -> argparse.ArgumentParser: ) return parser + def wait(name, ticks) -> py_trees.behaviours.StatusQueue: queue = [] for i in range(0, ticks + 1): @@ -160,7 +162,6 @@ def create_root() -> py_trees.behaviour.Behaviour: root = py_trees.composites.Sequence(name="Sequence", memory=False) - get_medicine = py_trees.composites.Sequence(name="Sequence", memory=False) take_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) @@ -169,77 +170,81 @@ def create_root() -> py_trees.behaviour.Behaviour: root.add_children([get_medicine, take_elevator, deliver_medicine]) - - go_to = py_trees.behaviours.Success(name="Go To Medicine Cabinet") unlock = py_trees.composites.Selector(name="Selector", memory=False) take = py_trees.behaviours.Success(name="Pickup Medicine") get_medicine.add_children([go_to, unlock, take]) unlock_cabinet = py_trees.behaviours.CheckBlackboardVariableValue( - name="Unlock Cabinet", - check=py_trees.common.ComparisonExpression( - variable="isCabinetUnlocked", value=True, operator=operator.eq - ), - ) + name="Unlock Cabinet", + check=py_trees.common.ComparisonExpression( + variable="isCabinetUnlocked", value=True, operator=operator.eq + ), + ) - wait_cabinet = py_trees.behaviours.Running(name="Wait") + wait_cabinet = py_trees.behaviours.Running(name="Wait") supervisor = py_trees.behaviours.Success(name="Call Supervisor for Virtual Unlock") unlock.add_children([unlock_cabinet, wait_cabinet, supervisor]) - go_to_elevator = py_trees.behaviours.Success(name="Go to Elevator") click_up_button = py_trees.behaviours.Success(name="Click Up Button") wait_for_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) enter_elevator = py_trees.composites.Sequence(name="Sequence", memory=False) - take_elevator.add_children([go_to_elevator, click_up_button, wait_for_elevator, enter_elevator]) + take_elevator.add_children( + [go_to_elevator, click_up_button, wait_for_elevator, enter_elevator] + ) is_elevator_open = py_trees.composites.Selector(name="Selector", memory=False) has_space_in_elevator = py_trees.composites.Selector(name="Selector", memory=False) can_enter_elevator = py_trees.composites.Selector(name="Selector", memory=False) - wait_for_elevator.add_children([is_elevator_open, has_space_in_elevator, can_enter_elevator]) - + wait_for_elevator.add_children( + [is_elevator_open, has_space_in_elevator, can_enter_elevator] + ) elevator_open = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator Open?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOpen", value=True, operator=operator.eq - ), - ) + name="Is Elevator Open?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOpen", value=True, operator=operator.eq + ), + ) wait_for_open_elevator = py_trees.behaviours.Running(name="Wait") button_again = py_trees.behaviours.Running(name="Press button again") - supervisor = py_trees.behaviours.Success(name="Call Supervisor to Virtually Call Elevator") - is_elevator_open.add_children([elevator_open, wait_for_open_elevator, button_again, supervisor, ]) + supervisor = py_trees.behaviours.Success( + name="Call Supervisor to Virtually Call Elevator" + ) + is_elevator_open.add_children( + [ + elevator_open, + wait_for_open_elevator, + button_again, + supervisor, + ] + ) # is_elevator_open.add_children([elevator_open, wait_for_open_elevator]) elevator_space = py_trees.behaviours.CheckBlackboardVariableValue( - name=">= 9ft^2 of space in the Elevator?", - check=py_trees.common.ComparisonExpression( - variable="elevatorHasSpace", value=True, operator=operator.eq - ), - ) + name=">= 9ft^2 of space in the Elevator?", + check=py_trees.common.ComparisonExpression( + variable="elevatorHasSpace", value=True, operator=operator.eq + ), + ) wait_for_space = py_trees.behaviours.Running(name="State I’ll wait") has_space_in_elevator.add_children([elevator_space, wait_for_space]) - + elevator_enter = py_trees.behaviours.CheckBlackboardVariableValue( - name="Ask to enter Elevator", - check=py_trees.common.ComparisonExpression( - variable="canEnterElevator", value=True, operator=operator.eq - ), - ) + name="Ask to enter Elevator", + check=py_trees.common.ComparisonExpression( + variable="canEnterElevator", value=True, operator=operator.eq + ), + ) wait_to_enter_elevator = py_trees.behaviours.Running(name="State I’ll wait") can_enter_elevator.add_children([elevator_enter, wait_to_enter_elevator]) - - - - enter_elevator_task = py_trees.behaviours.Success(name="Enter Elevator") hit_7th_floor_button = py_trees.behaviours.Success(name="Hit 7th Floor Button") enter_elevator.add_children([enter_elevator_task, hit_7th_floor_button]) - exit = py_trees.composites.Sequence(name="Sequence", memory=False) exit_statement = py_trees.behaviours.Success(name="State: I'll exit now") go_to_patient = py_trees.behaviours.Success(name="Go to Patient") @@ -248,34 +253,27 @@ def create_root() -> py_trees.behaviour.Behaviour: get_to_7th = py_trees.composites.Selector(name="Selector", memory=False) can_exit_now = py_trees.composites.Selector(name="Selector", memory=False) - + exit.add_children([get_to_7th, can_exit_now]) is_elevator_on_7th = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is Elevator on 7th?", - check=py_trees.common.ComparisonExpression( - variable="isElevatorOn7th", value=True, operator=operator.eq - ), - ) + name="Is Elevator on 7th?", + check=py_trees.common.ComparisonExpression( + variable="isElevatorOn7th", value=True, operator=operator.eq + ), + ) elevator_wait = py_trees.behaviours.Running(name="Wait") get_to_7th.add_children([is_elevator_on_7th, elevator_wait]) are_people_on_elevator = py_trees.behaviours.CheckBlackboardVariableValue( - name="Is >= 1 Person in Elevator?", - check=py_trees.common.ComparisonExpression( - variable="canLeaveElevator", value=True, operator=operator.eq - ), - ) + name="Is >= 1 Person in Elevator?", + check=py_trees.common.ComparisonExpression( + variable="canLeaveElevator", value=True, operator=operator.eq + ), + ) exit_elevator_wait = wait("Wait for at most 3 Ticks", 3) can_exit_now.add_children([are_people_on_elevator, exit_elevator_wait]) - - - - - - - return root @@ -339,7 +337,9 @@ def main() -> None: if behaviour_tree.root.status == py_trees.common.Status.SUCCESS: tree_success = True elif behaviour_tree.root.status == py_trees.common.Status.FAILURE: - callSupervisor = input("Should the robot call it's supervisor for help on the next tick for the failed task? (1 for Yes 0 for No)\n") + callSupervisor = input( + "Should the robot call it's supervisor for help on the next tick for the failed task? (1 for Yes 0 for No)\n" + ) if callSupervisor == "1": node = behaviour_tree.root found = False @@ -351,10 +351,14 @@ def main() -> None: if type(node) == py_trees.composites.Selector: found = True # supervisor = py_trees.behaviours.Success(name="Call Supervisor to " + node.name) - supervisor = py_trees.behaviours.Success(name="Call Supervisor for help") + supervisor = py_trees.behaviours.Success( + name="Call Supervisor for help" + ) node.add_children([supervisor]) elif behaviour_tree.root.status == py_trees.common.Status.RUNNING: - reorder = input("Would you like to reorder the children of the Selector that is running? (1 for Yes 0 for No)\n") + reorder = input( + "Would you like to reorder the children of the Selector that is running? (1 for Yes 0 for No)\n" + ) if reorder == "1": node = behaviour_tree.root found = False @@ -377,24 +381,32 @@ def main() -> None: stored = [] for i in range(0, len(stored_children)): valid_input = False - while(not valid_input): - user_input = input("Which node (input number e.g. 0) would you like in position " + str(i) + "? ") + while not valid_input: + user_input = input( + "Which node (input number e.g. 0) would you like in position " + + str(i) + + "? " + ) try: node_number = int(user_input) except ValueError: - print("Please enter an integer equal to one of the node numbers.") + print( + "Please enter an integer equal to one of the node numbers." + ) continue if node_number >= len(stored_children) or node_number < 0: - print("Please enter an integer equal to one of the node numbers.") + print( + "Please enter an integer equal to one of the node numbers." + ) elif node_number in stored: - print("Please enter a node that hasn't been used already.") + print( + "Please enter a node that hasn't been used already." + ) else: stored.append(node_number) valid_input = True parent.add_child(stored_children[node_number]) - - i += 1 except KeyboardInterrupt: break @@ -402,4 +414,4 @@ def main() -> None: if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/norms/nest.py b/norms/nest.py index 15938bf3..fc785345 100644 --- a/norms/nest.py +++ b/norms/nest.py @@ -142,7 +142,9 @@ def create_root() -> py_trees.behaviour.Behaviour: eventually=py_trees.common.Status.SUCCESS, ) always_running2 = py_trees.behaviours.Running(name="Running") - new_root = py_trees.composites.Selector(name="Selector", memory=False).add_children([root, root2, root3]) + new_root = py_trees.composites.Selector(name="Selector", memory=False).add_children( + [root, root2, root3] + ) # new_root.add_children([ffs, always_running]) root.add_children([ffs]) root2.add_children([ffs2]) @@ -190,4 +192,4 @@ def main() -> None: if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/norms/norms.py b/norms/norms.py index ca013b85..eee6740b 100644 --- a/norms/norms.py +++ b/norms/norms.py @@ -9,4 +9,4 @@ print("Which action should I take first? (type A, B, or C) _") print("Which action should I take second? (type A, B, or C) _") print("") -print("") \ No newline at end of file +print("") diff --git a/norms/selector.py b/norms/selector.py index 0f573280..ba4ed2a8 100644 --- a/norms/selector.py +++ b/norms/selector.py @@ -159,4 +159,5 @@ def main() -> None: break print("\n") -# main() \ No newline at end of file + +# main() diff --git a/norms/wsocket.py b/norms/wsocket.py index 0a4f9ca6..db0ac92a 100644 --- a/norms/wsocket.py +++ b/norms/wsocket.py @@ -3,13 +3,16 @@ import asyncio from websockets.server import serve + async def echo(websocket): async for message in websocket: print("Message from client:", message) await websocket.send("Hello client") + async def main(): async with serve(echo, "localhost", 8765): await asyncio.Future() # run forever -asyncio.run(main()) \ No newline at end of file + +asyncio.run(main()) diff --git a/pyproject.toml b/pyproject.toml index 4731e25a..a5458a3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -118,3 +118,6 @@ build-backend = "hatchling.build" [tool.hatch] version.source = "vcs" + +[tool.black] +target-version = ['py311'] \ No newline at end of file diff --git a/src/social_norms_trees/mutate_tree.py b/src/social_norms_trees/mutate_tree.py index 3146f154..5241a2a8 100644 --- a/src/social_norms_trees/mutate_tree.py +++ b/src/social_norms_trees/mutate_tree.py @@ -502,11 +502,18 @@ def exchange_nodes( def prompt_select_node(behavior_library, text): + + for idx, tree_name in enumerate(behavior_library.behaviors.keys(), 1): + print(f"{idx}. {tree_name}") for idx, tree_name in enumerate( behavior_library.behavior_from_display_name.keys(), 1 ): print(f"{idx}. {tree_name}") + node_index = click.prompt( + text=text, + type=int, + ) choices = [str(i + 1) for i in range(len(behavior_library.behaviors))] node_index = click.prompt(text=text, type=click.Choice(choices), show_choices=False) diff --git a/tests/test_stub.py b/tests/test_stub.py index 601241aa..3ada1ee4 100644 --- a/tests/test_stub.py +++ b/tests/test_stub.py @@ -1,2 +1,2 @@ def test_placeholder(): - assert True \ No newline at end of file + assert True