From 90edb4a2f237083d67b577d1490f2c269ed32b59 Mon Sep 17 00:00:00 2001 From: Sebastian <sebol117@student.liu.se> Date: Thu, 6 Jul 2023 15:11:11 +0200 Subject: [PATCH] Working safety check --- docker-compose.yml | 1 + presets.json | 15 +++-- .../behaviours/motion_behaviours.py | 41 +++---------- .../behaviours/wait_for_touch_behaviour.py | 61 ++++++++++--------- .../lhw_intelligence/set_head.py | 2 +- .../trees/scenario_trees/safety_check_tree.py | 12 ++-- src/lhw_qi/activate | 2 +- src/lhw_tablet/activate | 2 +- src/move_base_msgs/CMakeLists.txt | 29 +++++++++ .../msg/MoveBaseActionResult.msg | 3 + src/move_base_msgs/msg/MoveBaseResult.msg | 0 src/move_base_msgs/package.xml | 26 ++++++++ 12 files changed, 115 insertions(+), 79 deletions(-) create mode 100644 src/move_base_msgs/CMakeLists.txt create mode 100644 src/move_base_msgs/msg/MoveBaseActionResult.msg create mode 100644 src/move_base_msgs/msg/MoveBaseResult.msg create mode 100644 src/move_base_msgs/package.xml diff --git a/docker-compose.yml b/docker-compose.yml index 6d405b26..95071a00 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,7 @@ services: - NVIDIA_VISIBLE_DEVICES=all - LD_LIBRARY_PATH=/usr/local/cuda/lib:/usr/local/cuda/lib64 - NVIDIA_DRIVER_CAPABILITIES=compute,utility + - PEPPER_IP=169.254.127.207 network_mode: host ipc: host tty: True diff --git a/presets.json b/presets.json index f2eef492..ca6e9c7f 100644 --- a/presets.json +++ b/presets.json @@ -31,12 +31,6 @@ "safety_check" : { "containers" : ["lhw_qi", "lhw_tablet", "lhw_intelligence"], "commands" : [ - - { - "container" : "lhw_qi", - "command" : "ros2 run lhw_qi tablet -i $PEPPER_IP", - "verbose" : true - }, { "container" : "lhw_qi", "command" : "ros2 run lhw_qi microphone -i $PEPPER_IP", @@ -48,8 +42,13 @@ "verbose" : true }, { - "container" : "lhw_tablet", - "command" : "ros2 run lhw_tablet action_server", + "container" : "lhw_qi", + "command" : "ros2 run lhw_qi motion_topics -i $PEPPER_IP", + "verbose" : false + }, + { + "container" : "lhw_intelligence", + "command" : "ros2 run lhw_intelligence head_fix_node", "verbose" : true }, { diff --git a/src/lhw_intelligence/lhw_intelligence/behaviours/motion_behaviours.py b/src/lhw_intelligence/lhw_intelligence/behaviours/motion_behaviours.py index a3f5fac9..1978c666 100644 --- a/src/lhw_intelligence/lhw_intelligence/behaviours/motion_behaviours.py +++ b/src/lhw_intelligence/lhw_intelligence/behaviours/motion_behaviours.py @@ -12,14 +12,16 @@ Behaviours for basic motions import py_trees import time +import math import lhw_interfaces.msg as lhw_msgs import lhw_interfaces.srv as lhw_srvs from rclpy.action import ActionClient import lhw_interfaces.action as lhw_actions from geometry_msgs.msg import Twist, Pose, PoseStamped from actionlib_msgs.msg import GoalStatusArray +from move_base_msgs.msg import MoveBaseActionResult -from geometry_msgs.msg import Pose +from geometry_msgs.msg import Pose, PoseWithCovarianceStamped from std_msgs.msg import Bool, String # from lhw_interfaces.action import RobotAction @@ -99,12 +101,8 @@ class MoveToPoint(py_trees.behaviour.Behaviour): msg = Bool() msg.data = True - self.accepted = False self.fix_head_pub.publish(msg) self.move_base_status = 0 - self.prior_status = 0 - - #Orientation goal_orientation = '{{x: {0}, y: {1}, z: {2}, w: {3}}}' g_o = goal_orientation.format(self.pose.orientation.x, self.pose.orientation.y, self.pose.orientation.z, self.pose.orientation.w) # Unpack the list as laid out args @@ -112,7 +110,7 @@ class MoveToPoint(py_trees.behaviour.Behaviour): print(g_o) #Position goal_position = '{{x: {0}, y: {1}, z: {2}}}' - self.move_status_subscription = self.node.create_subscription(GoalStatusArray, "/lhw/nav/move_base/status", self.goal_feedback_callback, 10) + self.move_result_subscription = self.node.create_subscription(MoveBaseActionResult, "/lhw/nav/move_base/result", self.goal_result_callback, 10) g_p = goal_position.format(self.pose.position.x, self.pose.position.y, self.pose.position.z) self.goal_cmd = f"rostopic pub /lhw/nav/goal_server/goal geometry_msgs/PoseStamped \"{{header: {{frame_id: 'map'}}, pose: {{position: {g_p}, orientation: {g_o} }}}}\" --once" @@ -129,40 +127,19 @@ class MoveToPoint(py_trees.behaviour.Behaviour): def update(self): print("Listening for callback...") - - if self.move_base_status == 2 and self.prior_status == 2: - return py_trees.common.Status.SUCCESS - if not self.accepted: - return py_trees.common.Status.RUNNING - - if self.move_base_status == 3: + if self.move_base_status == 2 or self.move_base_status == 3: return py_trees.common.Status.SUCCESS - if self.move_base_status >= 4: + elif self.move_base_status >= 4: return py_trees.common.Status.FAILED else: return py_trees.common.Status.RUNNING def terminate(self, new_status: py_trees.common.Status): - self.node.destroy_subscription(self.move_status_subscription) - - def goal_feedback_callback(self, msg): - try: - print(msg.status_list[0].status, "Current Status") - except IndexError: - return - - if msg.status_list[0].status == 1: - self.accepted = True - - # if self.move_base_status == 1 and self.prior_status == 2: - # self.resend = True - # stdin, stdout, stderr = self.ssh_client.exec_command("source ~/.bash_profile && " + self.goal_cmd) - - #May Add more Statuses if necessary + self.node.destroy_subscription(self.move_result_subscription) - self.prior_status = self.move_base_status - self.move_base_status = msg.status_list[0].status + def goal_result_callback(self, msg): + self.move_base_status = msg.status.status diff --git a/src/lhw_intelligence/lhw_intelligence/behaviours/wait_for_touch_behaviour.py b/src/lhw_intelligence/lhw_intelligence/behaviours/wait_for_touch_behaviour.py index be4fcecd..a0aadb76 100644 --- a/src/lhw_intelligence/lhw_intelligence/behaviours/wait_for_touch_behaviour.py +++ b/src/lhw_intelligence/lhw_intelligence/behaviours/wait_for_touch_behaviour.py @@ -42,16 +42,16 @@ class WaitForHeadTouch(py_trees.behaviour.Behaviour): raise KeyError(error_message) from e # 'direct cause' traceability self.led_pub = self.node.create_publisher(std_msgs.msg.Bool, "turn_on_off", 10) - self.tablet_action_client = rclpy.action.ActionClient( - node=self.node, - action_type=TabletAction, - action_name="tablet_action_server" - ) + #self.tablet_action_client = rclpy.action.ActionClient( + # node=self.node, + # action_type=TabletAction, + # action_name="tablet_action_server" + #) - if not self.tablet_action_client.wait_for_server(timeout_sec=3.0): - raise RuntimeError("client timed out waiting for server tablet_action_server") + #if not self.tablet_action_client.wait_for_server(timeout_sec=3.0): + # raise RuntimeError("client timed out waiting for server tablet_action_server") - self.logger.debug("Action client successfully created") + #self.logger.debug("Action client successfully created") def initialise(self): @@ -64,14 +64,14 @@ class WaitForHeadTouch(py_trees.behaviour.Behaviour): #self.timer = self.node.create_timer(1.0, self._toggle_leds_callback) self.head_touch_sub = self.node.create_subscription(HeadTouch, 'head_touch', self._head_touch_callback, 10) self.blackboard.scenario_started = False - goal = TabletAction.Goal() - goal.type = "text" - goal.text = "Please tap on my head" - - self.send_goal_future = self.tablet_action_client.send_goal_async( - goal, - feedback_callback=None - ) + #goal = TabletAction.Goal() + #goal.type = "text" + #goal.text = "Please tap on my head" + + #self.send_goal_future = self.tablet_action_client.send_goal_async( + # goal, + # feedback_callback=None + #) self.logger.debug("Action goal sent") @@ -107,26 +107,27 @@ class WaitForHeadTouch(py_trees.behaviour.Behaviour): goal.type = "text" goal.text = "Scenario Started" - self.send_goal_future = self.tablet_action_client.send_goal_async( - goal, - feedback_callback=None - ) + #self.send_goal_future = self.tablet_action_client.send_goal_async( + # goal, + # feedback_callback=None + #) def shutdown(self): """ This function is executed when the tree is destroyed. Destroy the publisher created in setup. """ - goal = TabletAction.Goal() - goal.type = "image" - goal.url = "assets/fia_logo.png" - - self.send_goal_future = self.tablet_action_client.send_goal_async( - goal, - feedback_callback=None - ) - self.led_pub.destroy() - self.tablet_action_client.destroy() + pass + #goal = TabletAction.Goal() + #goal.type = "image" + #goal.url = "assets/fia_logo.png" + + #self.send_goal_future = self.tablet_action_client.send_goal_async( + # goal, + # feedback_callback=None + #) + #self.led_pub.destroy() + #self.tablet_action_client.destroy() def _toggle_leds_callback(self): diff --git a/src/lhw_intelligence/lhw_intelligence/set_head.py b/src/lhw_intelligence/lhw_intelligence/set_head.py index 0307c7e7..09334d60 100644 --- a/src/lhw_intelligence/lhw_intelligence/set_head.py +++ b/src/lhw_intelligence/lhw_intelligence/set_head.py @@ -14,7 +14,7 @@ class HeadMotion(Node): self.robot_action_pub = self.create_publisher(RobotAction, 'robot_action', 1) self.head_fix_timer = self.create_timer(1.0, self.head_fix_timer_cb) - self.fix_head = False + self.fix_head = True def head_fix_callback(self, msg): self.fix_head = msg.data diff --git a/src/lhw_intelligence/lhw_intelligence/trees/scenario_trees/safety_check_tree.py b/src/lhw_intelligence/lhw_intelligence/trees/scenario_trees/safety_check_tree.py index 18ac4672..911f755c 100644 --- a/src/lhw_intelligence/lhw_intelligence/trees/scenario_trees/safety_check_tree.py +++ b/src/lhw_intelligence/lhw_intelligence/trees/scenario_trees/safety_check_tree.py @@ -100,17 +100,17 @@ def create_root(ssh) -> py_trees.behaviour.Behaviour: name="Safety Check Sequence", children=[ set_pose, - py_trees.timers.Timer(name="Wait", duration=5), + py_trees.timers.Timer(name="Wait1", duration=5), say_door_open, wait_for_door, move_inside_door, - py_trees.timers.Timer(name="Wait", duration=1), + #py_trees.timers.Timer(name="Wait2", duration=1), move_middle, - py_trees.timers.Timer(name="Wait", duration=1), + #py_trees.timers.Timer(name="Wait3", duration=1), move_before_safety, - py_trees.timers.Timer(name="Wait", duration=1), + #py_trees.timers.Timer(name="Wait4", duration=1), move_to_safety_point, - py_trees.timers.Timer(name="Wait", duration=8), + #py_trees.timers.Timer(name="Wait5", duration=8), speech_tree, move_to_exit, idle @@ -128,7 +128,7 @@ def main(): ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy) pepper_ip = os.getenv("PEPPER_IP") if not pepper_ip: - pepper_ip = "169.254.3.76" + pepper_ip = "169.254.127.207" ssh_client.connect(hostname = pepper_ip, username = "nao", password = "ellis") ssh_client.invoke_shell() root = create_root(ssh_client) diff --git a/src/lhw_qi/activate b/src/lhw_qi/activate index 2987a047..6551058b 100644 --- a/src/lhw_qi/activate +++ b/src/lhw_qi/activate @@ -23,7 +23,7 @@ echo "Searching for the IP of Pepper" #export PEPPER_IP=$(arp-scan --localnet | grep -i "48:a9:d2:8c:6a:0c\|00:13:95:1d:4c:43" | cut -f1) - pepper linköping MAC #export PEPPER_IP=$(arp-scan --localnet | grep -i "48:a9:d2:8c:68:0c\|00:13:95:1d:4c:43" | cut -f1) -export PEPPER_IP=169.254.3.76 +export PEPPER_IP=169.254.127.207 if [[ -z "${PEPPER_IP}" ]]; then echo "${ORANGE}Pepper was not found on the current network, please set PEPPER_IP manually!${NC}" else diff --git a/src/lhw_tablet/activate b/src/lhw_tablet/activate index 2b9a761f..f61e0cac 100644 --- a/src/lhw_tablet/activate +++ b/src/lhw_tablet/activate @@ -21,7 +21,7 @@ ldconfig # Search for pepper on the local network echo "Searching for the IP of Pepper" #export EPPER_IP=$(arp-scan --localnet | grep -i "48:a9:d2:8c:6a:0c\|00:13:95:1d:4c:43" | cut -f1) -export PEPPER_IP=169.254.3.76 + if [[ -z "${PEPPER_IP}" ]]; then echo "${ORANGE}Pepper was not found on the current network, please set PEPPER_IP manually!${NC}" else diff --git a/src/move_base_msgs/CMakeLists.txt b/src/move_base_msgs/CMakeLists.txt new file mode 100644 index 00000000..ddc60329 --- /dev/null +++ b/src/move_base_msgs/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.5) +project(move_base_msgs) + +# Default to C++14 +if(NOT CMAKE_CXX_STANDARD) + set(CMAKE_CXX_STANDARD 14) +endif() + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(std_msgs REQUIRED) +find_package(actionlib_msgs REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +include_directories(${PYTHON_INCLUDE_DIRS}) + +rosidl_generate_interfaces(${PROJECT_NAME} + "msg/MoveBaseActionResult.msg" + "msg/MoveBaseResult.msg" + DEPENDENCIES std_msgs actionlib_msgs +) + +ament_export_dependencies(rosidl_default_runtime) + +ament_package() diff --git a/src/move_base_msgs/msg/MoveBaseActionResult.msg b/src/move_base_msgs/msg/MoveBaseActionResult.msg new file mode 100644 index 00000000..c1a07d4d --- /dev/null +++ b/src/move_base_msgs/msg/MoveBaseActionResult.msg @@ -0,0 +1,3 @@ +std_msgs/Header header +actionlib_msgs/GoalStatus status +MoveBaseResult result \ No newline at end of file diff --git a/src/move_base_msgs/msg/MoveBaseResult.msg b/src/move_base_msgs/msg/MoveBaseResult.msg new file mode 100644 index 00000000..e69de29b diff --git a/src/move_base_msgs/package.xml b/src/move_base_msgs/package.xml new file mode 100644 index 00000000..455f03a6 --- /dev/null +++ b/src/move_base_msgs/package.xml @@ -0,0 +1,26 @@ +<?xml version="1.0"?> +<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> +<package format="3"> + <name>move_base_msgs</name> + <version>0.0.0</version> + <description>TODO: Package description</description> + <maintainer email="root@todo.todo">root</maintainer> + <license>TODO: License declaration</license> + + <buildtool_depend>ament_cmake</buildtool_depend> + <build_depend>rosidl_default_generators</build_depend> + + <exec_depend>rosidl_default_runtime</exec_depend> + + <depend>std_msgs</depend> + <depend>actionlib_msgs</depend> + + <test_depend>ament_lint_auto</test_depend> + <test_depend>ament_lint_common</test_depend> + + <member_of_group>rosidl_interface_packages</member_of_group> + + <export> + <build_type>ament_cmake</build_type> + </export> +</package> -- GitLab