diff --git a/examples/agriculture-demo.py b/examples/agriculture-demo.py index ac49e0e98..e80d7a474 100644 --- a/examples/agriculture-demo.py +++ b/examples/agriculture-demo.py @@ -15,6 +15,12 @@ import argparse import rclpy +from rclpy.action import ActionClient +from rclpy.callback_groups import ReentrantCallbackGroup +from rclpy.executors import MultiThreadedExecutor +from rclpy.node import Node +from std_srvs.srv import Trigger + from rai.node import RaiStateBasedLlmNode, describe_ros_image from rai.tools.ros.native import ( GetCameraImage, @@ -24,12 +30,6 @@ Ros2ShowMsgInterfaceTool, ) from rai.tools.time import WaitForSecondsTool -from rclpy.action import ActionClient -from rclpy.callback_groups import ReentrantCallbackGroup -from rclpy.executors import MultiThreadedExecutor -from rclpy.node import Node -from std_srvs.srv import Trigger - from rai_interfaces.action import Task diff --git a/examples/manipulation-demo-streamlit.py b/examples/manipulation-demo-streamlit.py index e226c1f88..bec608118 100644 --- a/examples/manipulation-demo-streamlit.py +++ b/examples/manipulation-demo-streamlit.py @@ -16,6 +16,7 @@ import streamlit as st from langchain_core.messages import AIMessage, HumanMessage, ToolMessage + from rai.agents.integrations.streamlit import get_streamlit_cb, streamlit_invoke from rai.messages import HumanMultimodalMessage diff --git a/examples/manipulation-demo.launch.py b/examples/manipulation-demo.launch.py index a9210698f..565e57df2 100644 --- a/examples/manipulation-demo.launch.py +++ b/examples/manipulation-demo.launch.py @@ -12,22 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -import rclpy -from launch import LaunchContext, LaunchDescription +from launch import LaunchDescription from launch.actions import ( DeclareLaunchArgument, ExecuteProcess, IncludeLaunchDescription, - OpaqueFunction, - RegisterEventHandler, ) -from launch.event_handlers import OnExecutionComplete, OnProcessStart from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import LaunchConfiguration from launch_ros.actions import Node from launch_ros.substitutions import FindPackageShare -from rclpy.qos import QoSProfile, ReliabilityPolicy -from rosgraph_msgs.msg import Clock def generate_launch_description(): @@ -46,21 +40,6 @@ def generate_launch_description(): output="screen", ) - def wait_for_clock_message(context: LaunchContext, *args, **kwargs): - rclpy.init() - node = rclpy.create_node("wait_for_game_launcher") - node.create_subscription( - Clock, - "/clock", - lambda msg: rclpy.shutdown(), - QoSProfile(depth=1, reliability=ReliabilityPolicy.BEST_EFFORT), - ) - rclpy.spin(node) - return None - - # Game launcher will start publishing the clock message after loading the simulation - wait_for_game_launcher = OpaqueFunction(function=wait_for_clock_message) - launch_moveit = IncludeLaunchDescription( PythonLaunchDescriptionSource( [ @@ -90,28 +69,10 @@ def wait_for_clock_message(context: LaunchContext, *args, **kwargs): return LaunchDescription( [ - # Include the game_launcher argument game_launcher_arg, - # Launch the game launcher and wait for it to load launch_game_launcher, - RegisterEventHandler( - event_handler=OnProcessStart( - target_action=launch_game_launcher, - on_start=[ - wait_for_game_launcher, - ], - ) - ), - # Launch the MoveIt node after loading the simulation - RegisterEventHandler( - event_handler=OnExecutionComplete( - target_action=wait_for_game_launcher, - on_completion=[ - launch_openset, - launch_moveit, - launch_robotic_manipulation, - ], - ) - ), + launch_openset, + launch_moveit, + launch_robotic_manipulation, ] ) diff --git a/examples/manipulation-demo.py b/examples/manipulation-demo.py index 92c820031..a89ec61e2 100644 --- a/examples/manipulation-demo.py +++ b/examples/manipulation-demo.py @@ -16,12 +16,13 @@ import rclpy import rclpy.qos from langchain_core.messages import HumanMessage +from rai_open_set_vision.tools import GetGrabbingPointTool + from rai.agents.conversational_agent import create_conversational_agent from rai.communication.ros2.connectors import ROS2ARIConnector from rai.tools.ros.manipulation import GetObjectPositionsTool, MoveToPointTool from rai.tools.ros2.topics import GetROS2ImageTool, GetROS2TopicsNamesAndTypesTool from rai.utils.model_initialization import get_llm_model -from rai_open_set_vision.tools import GetGrabbingPointTool def create_agent(): diff --git a/examples/rosbot-xl-demo.py b/examples/rosbot-xl-demo.py index b6c1ab666..90600b6ae 100644 --- a/examples/rosbot-xl-demo.py +++ b/examples/rosbot-xl-demo.py @@ -18,6 +18,8 @@ import rclpy import rclpy.executors import rclpy.logging +from rai_open_set_vision.tools import GetDetectionTool, GetDistanceToObjectsTool + from rai.node import RaiStateBasedLlmNode from rai.tools.ros.native import ( GetMsgFromTopic, @@ -33,7 +35,6 @@ Ros2RunActionAsync, ) from rai.tools.time import WaitForSecondsTool -from rai_open_set_vision.tools import GetDetectionTool, GetDistanceToObjectsTool p = argparse.ArgumentParser() p.add_argument("--allowlist", type=Path, required=False, default=None) diff --git a/examples/taxi-demo.py b/examples/taxi-demo.py index 18d498a68..6f5d24a48 100644 --- a/examples/taxi-demo.py +++ b/examples/taxi-demo.py @@ -20,12 +20,12 @@ from langchain_community.tools.tavily_search import TavilySearchResults from langchain_core.messages import BaseMessage, HumanMessage from langchain_core.tools import tool +from std_msgs.msg import String + from rai.agents.conversational_agent import create_conversational_agent from rai.tools.ros.cli import Ros2ServiceTool from rai.tools.ros.native import Ros2PubMessageTool from rai.utils.model_initialization import get_llm_model, get_tracing_callbacks -from std_msgs.msg import String - from rai_hmi.api import GenericVoiceNode, split_message system_prompt = """ diff --git a/src/examples/turtlebot4/turtlebot_demo.py b/src/examples/turtlebot4/turtlebot_demo.py index c3ea985b8..393606374 100644 --- a/src/examples/turtlebot4/turtlebot_demo.py +++ b/src/examples/turtlebot4/turtlebot_demo.py @@ -23,6 +23,7 @@ import rclpy.qos import rclpy.subscription import rclpy.task + from rai.node import RaiStateBasedLlmNode from rai.tools.ros.native import ( GetCameraImage, diff --git a/src/rai_core/rai/communication/ros2/connectors.py b/src/rai_core/rai/communication/ros2/connectors.py index ba66b43b2..f4e72bad2 100644 --- a/src/rai_core/rai/communication/ros2/connectors.py +++ b/src/rai_core/rai/communication/ros2/connectors.py @@ -205,11 +205,11 @@ def node(self) -> Node: return self._node def shutdown(self): - self._executor.shutdown() - self._thread.join() + self._node.destroy_node() self._actions_api.shutdown() self._topic_api.shutdown() - self._node.destroy_node() + self._executor.shutdown() + self._thread.join() class ROS2HRIMessage(HRIMessage): diff --git a/src/rai_core/rai/tools/ros/manipulation.py b/src/rai_core/rai/tools/ros/manipulation.py index 18865dd26..9436490b0 100644 --- a/src/rai_core/rai/tools/ros/manipulation.py +++ b/src/rai_core/rai/tools/ros/manipulation.py @@ -15,12 +15,6 @@ from typing import Literal, Type import numpy as np -import rclpy -import rclpy.callback_groups -import rclpy.executors -import rclpy.qos -import rclpy.subscription -import rclpy.task from geometry_msgs.msg import Point, Pose, PoseStamped, Quaternion from langchain_core.tools import BaseTool from pydantic import BaseModel, Field @@ -29,6 +23,7 @@ from rai.communication.ros2.connectors import ROS2ARIConnector from rai.tools.utils import TF2TransformFetcher +from rai.utils.ros_async import get_future_result from rai_interfaces.srv import ManipulatorMoveTo @@ -113,17 +108,14 @@ def _run( self.connector.node.get_logger().debug( f"Calling ManipulatorMoveTo service with request: x={request.target_pose.pose.position.x:.2f}, y={request.target_pose.pose.position.y:.2f}, z={request.target_pose.pose.position.z:.2f}" ) + response = get_future_result(future, timeout_sec=5.0) + if response is None: + return f"Service call failed for point ({x:.2f}, {y:.2f}, {z:.2f})." - rclpy.spin_until_future_complete(self.connector.node, future, timeout_sec=5.0) - - if future.result() is not None: - response = future.result() - if response.success: - return f"End effector successfully positioned at coordinates ({x:.2f}, {y:.2f}, {z:.2f}). Note: The status of object interaction (grab/drop) is not confirmed by this movement." - else: - return f"Failed to position end effector at coordinates ({x:.2f}, {y:.2f}, {z:.2f})." + if response.success: + return f"End effector successfully positioned at coordinates ({x:.2f}, {y:.2f}, {z:.2f}). Note: The status of object interaction (grab/drop) is not confirmed by this movement." else: - return f"Service call failed for point ({x:.2f}, {y:.2f}, {z:.2f})." + return f"Failed to position end effector at coordinates ({x:.2f}, {y:.2f}, {z:.2f})." class GetObjectPositionsToolInput(BaseModel): diff --git a/src/rai_core/rai/tools/ros/utils.py b/src/rai_core/rai/tools/ros/utils.py index 8c34e23c4..1e207e31c 100644 --- a/src/rai_core/rai/tools/ros/utils.py +++ b/src/rai_core/rai/tools/ros/utils.py @@ -151,7 +151,9 @@ def wait_for_message( if msg_info is not None: return True, msg_info[0] finally: - node.destroy_subscription(sub) + # TODO(boczekbartek): uncomment when rclpy resolves: https://github.com/ros2/rclpy/issues/1142 + # node.destroy_subscription(sub) + pass return False, None diff --git a/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/gdino_tools.py b/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/gdino_tools.py index 4e1f0ff19..95ebf36f4 100644 --- a/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/gdino_tools.py +++ b/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/gdino_tools.py @@ -17,16 +17,16 @@ import numpy as np import sensor_msgs.msg from pydantic import BaseModel, Field -from rai.communication.ros2.connectors import ROS2ARIConnector -from rai.tools.ros import Ros2BaseInput, Ros2BaseTool -from rai.tools.ros.utils import convert_ros_img_to_ndarray -from rai.utils.ros_async import get_future_result from rclpy.exceptions import ( ParameterNotDeclaredException, ParameterUninitializedException, ) from rclpy.task import Future +from rai.communication.ros2.connectors import ROS2ARIConnector +from rai.tools.ros import Ros2BaseInput, Ros2BaseTool +from rai.tools.ros.utils import convert_ros_img_to_ndarray +from rai.utils.ros_async import get_future_result from rai_interfaces.srv import RAIGroundingDino from rai_open_set_vision import GDINO_SERVICE_NAME diff --git a/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/segmentation_tools.py b/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/segmentation_tools.py index 6c83ebf92..7df7ce8f8 100644 --- a/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/segmentation_tools.py +++ b/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/tools/segmentation_tools.py @@ -20,16 +20,16 @@ import sensor_msgs.msg from langchain_core.tools import BaseTool from pydantic import Field -from rai.communication.ros2.connectors import ROS2ARIConnector -from rai.tools.ros import Ros2BaseInput -from rai.tools.ros.utils import convert_ros_img_to_base64, convert_ros_img_to_ndarray -from rai.utils.ros_async import get_future_result from rclpy import Future from rclpy.exceptions import ( ParameterNotDeclaredException, ParameterUninitializedException, ) +from rai.communication.ros2.connectors import ROS2ARIConnector +from rai.tools.ros import Ros2BaseInput +from rai.tools.ros.utils import convert_ros_img_to_base64, convert_ros_img_to_ndarray +from rai.utils.ros_async import get_future_result from rai_interfaces.srv import RAIGroundedSam, RAIGroundingDino from rai_open_set_vision import GDINO_SERVICE_NAME @@ -342,21 +342,17 @@ def _run( ) conversion_ratio = 0.001 resolved = None - while rclpy.ok(): - resolved = self._get_gdino_response(future) - if resolved is not None: - break + + resolved = get_future_result(future) assert resolved is not None future = self._call_gsam_node(camera_img_msg, resolved) ret = [] - while rclpy.ok(): - resolved = self._get_gsam_response(future) - if resolved is not None: - for img_msg in resolved.masks: - ret.append(convert_ros_img_to_base64(img_msg)) - break + resolved = get_future_result(future) + if resolved is not None: + for img_msg in resolved.masks: + ret.append(convert_ros_img_to_base64(img_msg)) assert resolved is not None rets = [] for mask_msg in resolved.masks: diff --git a/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/vision_markup/segmenter.py b/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/vision_markup/segmenter.py index e91563a83..e9c44c087 100644 --- a/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/vision_markup/segmenter.py +++ b/src/rai_extensions/rai_open_set_vision/rai_open_set_vision/vision_markup/segmenter.py @@ -20,12 +20,13 @@ import numpy as np import torch from cv_bridge import CvBridge -from rai.tools.ros.utils import convert_ros_img_to_ndarray from sam2.build_sam import build_sam2 from sam2.sam2_image_predictor import SAM2ImagePredictor from sensor_msgs.msg import Image from vision_msgs.msg import BoundingBox2D +from rai.tools.ros.utils import convert_ros_img_to_ndarray + class GDSegmenter: def __init__( diff --git a/src/rai_hmi/rai_hmi/agent.py b/src/rai_hmi/rai_hmi/agent.py index c54ead3da..7243b699f 100644 --- a/src/rai_hmi/rai_hmi/agent.py +++ b/src/rai_hmi/rai_hmi/agent.py @@ -17,11 +17,11 @@ from typing import List from langchain.tools import tool + from rai.agents.conversational_agent import create_conversational_agent from rai.node import RaiBaseNode from rai.tools.ros.native import GetCameraImage, Ros2GetRobotInterfaces from rai.utils.model_initialization import get_llm_model - from rai_hmi.base import BaseHMINode from rai_hmi.chat_msgs import MissionMessage from rai_hmi.task import Task, TaskInput diff --git a/src/rai_hmi/rai_hmi/base.py b/src/rai_hmi/rai_hmi/base.py index 41bf656d6..9502a2255 100644 --- a/src/rai_hmi/rai_hmi/base.py +++ b/src/rai_hmi/rai_hmi/base.py @@ -22,13 +22,13 @@ from langchain_core.documents import Document from langchain_core.tools import BaseTool from pydantic import UUID4 -from rai.node import append_whoami_info_to_prompt -from rai.utils.model_initialization import get_embeddings_model from rclpy.action import ActionClient from rclpy.node import Node from std_msgs.msg import String from std_srvs.srv import Trigger +from rai.node import append_whoami_info_to_prompt +from rai.utils.model_initialization import get_embeddings_model from rai_hmi.chat_msgs import ( MissionAcceptanceMessage, MissionDoneMessage, diff --git a/src/rai_hmi/rai_hmi/ros.py b/src/rai_hmi/rai_hmi/ros.py index eed05149e..181132f3e 100644 --- a/src/rai_hmi/rai_hmi/ros.py +++ b/src/rai_hmi/rai_hmi/ros.py @@ -19,9 +19,9 @@ from typing import Optional, Tuple import rclpy -from rai.node import RaiBaseNode from rclpy.executors import MultiThreadedExecutor +from rai.node import RaiBaseNode from rai_hmi.base import BaseHMINode diff --git a/src/rai_hmi/rai_hmi/text_hmi.py b/src/rai_hmi/rai_hmi/text_hmi.py index 8f89b5bf7..955888062 100644 --- a/src/rai_hmi/rai_hmi/text_hmi.py +++ b/src/rai_hmi/rai_hmi/text_hmi.py @@ -33,12 +33,12 @@ ) from PIL import Image from pydantic import BaseModel -from rai.messages import HumanMultimodalMessage -from rai.node import RaiBaseNode -from rai.utils.artifacts import get_stored_artifacts from rclpy.node import Node from streamlit.delta_generator import DeltaGenerator +from rai.messages import HumanMultimodalMessage +from rai.node import RaiBaseNode +from rai.utils.artifacts import get_stored_artifacts from rai_hmi.agent import initialize_agent from rai_hmi.base import BaseHMINode from rai_hmi.chat_msgs import EMOJIS, MissionMessage diff --git a/src/rai_hmi/rai_hmi/voice_hmi.py b/src/rai_hmi/rai_hmi/voice_hmi.py index 71b9e04a3..e380020f2 100644 --- a/src/rai_hmi/rai_hmi/voice_hmi.py +++ b/src/rai_hmi/rai_hmi/voice_hmi.py @@ -22,12 +22,12 @@ import rclpy from langchain_core.messages import HumanMessage -from rai.node import RaiBaseNode from rclpy.callback_groups import ReentrantCallbackGroup from rclpy.executors import MultiThreadedExecutor from rclpy.qos import DurabilityPolicy, HistoryPolicy, QoSProfile, ReliabilityPolicy from std_msgs.msg import String +from rai.node import RaiBaseNode from rai_hmi.agent import initialize_agent from rai_hmi.base import BaseHMINode from rai_hmi.text_hmi_utils import Memory diff --git a/src/rai_whoami/rai_whoami/rai_whoami_node.py b/src/rai_whoami/rai_whoami/rai_whoami_node.py index d592fb54d..19c8eae26 100644 --- a/src/rai_whoami/rai_whoami/rai_whoami_node.py +++ b/src/rai_whoami/rai_whoami/rai_whoami_node.py @@ -18,12 +18,12 @@ import rclpy from ament_index_python.packages import get_package_share_directory from langchain_community.vectorstores import FAISS -from rai.utils.model_initialization import get_embeddings_model from rclpy.node import Node from rclpy.parameter import Parameter from std_srvs.srv import Trigger from std_srvs.srv._trigger import Trigger_Request, Trigger_Response +from rai.utils.model_initialization import get_embeddings_model from rai_interfaces.srv import VectorStoreRetrieval from rai_interfaces.srv._vector_store_retrieval import ( VectorStoreRetrieval_Request, diff --git a/tests/communication/ros2/test_api.py b/tests/communication/ros2/test_api.py index 982325255..b0f14f6df 100644 --- a/tests/communication/ros2/test_api.py +++ b/tests/communication/ros2/test_api.py @@ -18,6 +18,9 @@ import pytest from action_msgs.msg import GoalStatus from action_msgs.srv import CancelGoal +from rclpy.executors import MultiThreadedExecutor +from rclpy.node import Node + from rai.communication.ros2.api import ( ConfigurableROS2TopicAPI, ROS2ActionAPI, @@ -25,8 +28,6 @@ ROS2TopicAPI, TopicConfig, ) -from rclpy.executors import MultiThreadedExecutor -from rclpy.node import Node from .helpers import ActionServer_ as ActionServer from .helpers import ( diff --git a/tests/communication/ros2/test_connectors.py b/tests/communication/ros2/test_connectors.py index 7ddd674f7..81ac739fe 100644 --- a/tests/communication/ros2/test_connectors.py +++ b/tests/communication/ros2/test_connectors.py @@ -18,6 +18,9 @@ import pytest from PIL import Image from pydub import AudioSegment +from std_msgs.msg import String +from std_srvs.srv import SetBool + from rai.communication.ros2.connectors import ( HRIPayload, ROS2ARIConnector, @@ -25,8 +28,6 @@ ROS2HRIConnector, ROS2HRIMessage, ) -from std_msgs.msg import String -from std_srvs.srv import SetBool from .helpers import ActionServer_ as ActionServer from .helpers import ( diff --git a/tests/communication/sounds_device/test_api.py b/tests/communication/sounds_device/test_api.py index b5a62a54a..f5f9b3b74 100644 --- a/tests/communication/sounds_device/test_api.py +++ b/tests/communication/sounds_device/test_api.py @@ -16,6 +16,7 @@ import numpy as np import pytest import sounddevice + from rai.communication.sound_device import ( SoundDeviceAPI, SoundDeviceConfig, diff --git a/tests/communication/sounds_device/test_connector.py b/tests/communication/sounds_device/test_connector.py index a7f86caa9..ba0daf9c4 100644 --- a/tests/communication/sounds_device/test_connector.py +++ b/tests/communication/sounds_device/test_connector.py @@ -18,13 +18,14 @@ import numpy as np import pytest import sounddevice +from scipy.io import wavfile + from rai.communication import HRIPayload from rai.communication.sound_device import SoundDeviceConfig, SoundDeviceError from rai.communication.sound_device.connector import ( # Replace with actual module name SoundDeviceConnector, SoundDeviceMessage, ) -from scipy.io import wavfile @pytest.fixture diff --git a/tests/communication/test_hri_message.py b/tests/communication/test_hri_message.py index 87a4385fb..bba976da6 100644 --- a/tests/communication/test_hri_message.py +++ b/tests/communication/test_hri_message.py @@ -18,6 +18,7 @@ from langchain_core.messages import HumanMessage from PIL import Image from pydub import AudioSegment + from rai.communication import HRIMessage, HRIPayload from rai.messages.multimodal import MultimodalMessage as RAIMultimodalMessage diff --git a/tests/conftest.py b/tests/conftest.py index 74089aea0..ce9dfd6df 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -18,9 +18,10 @@ import pytest from _pytest.terminal import TerminalReporter -from rai.config.models import BEDROCK_CLAUDE_HAIKU, OPENAI_MINI from tabulate import tabulate +from rai.config.models import BEDROCK_CLAUDE_HAIKU, OPENAI_MINI + @pytest.fixture def chat_openai_multimodal(): diff --git a/tests/core/test_rai_cli.py b/tests/core/test_rai_cli.py index fa7aa3b24..19f16f97a 100644 --- a/tests/core/test_rai_cli.py +++ b/tests/core/test_rai_cli.py @@ -17,6 +17,7 @@ from unittest.mock import MagicMock, patch import pytest + from rai.cli.rai_cli import create_rai_ws diff --git a/tests/core/test_ros2_tools.py b/tests/core/test_ros2_tools.py index 6fc48ddda..10f7c5a65 100644 --- a/tests/core/test_ros2_tools.py +++ b/tests/core/test_ros2_tools.py @@ -19,12 +19,13 @@ import rclpy from langchain_core.messages import HumanMessage, SystemMessage from langchain_openai.chat_models import ChatOpenAI -from rai.agents.state_based import create_state_based_agent -from rai.tools.ros.native import Ros2PubMessageTool from rclpy.executors import MultiThreadedExecutor from rclpy.node import Node from std_msgs.msg import String +from rai.agents.state_based import create_state_based_agent +from rai.tools.ros.native import Ros2PubMessageTool + class Subscriber(Node): def __init__(self) -> None: diff --git a/tests/core/test_tool_runner.py b/tests/core/test_tool_runner.py index 0c6971d26..7397e3724 100644 --- a/tests/core/test_tool_runner.py +++ b/tests/core/test_tool_runner.py @@ -16,6 +16,7 @@ from langchain_core.messages import AIMessage, ToolCall, ToolMessage from langchain_core.tools import tool + from rai.agents.tool_runner import ToolRunner from rai.messages import HumanMultimodalMessage, ToolMultimodalMessage from rai.messages.utils import preprocess_image diff --git a/tests/messages/test_multimodal.py b/tests/messages/test_multimodal.py index 667d506fa..3cff3e797 100644 --- a/tests/messages/test_multimodal.py +++ b/tests/messages/test_multimodal.py @@ -29,6 +29,7 @@ from langfuse.callback import CallbackHandler from pydantic import BaseModel, Field from pytest import FixtureRequest + from rai.messages import HumanMultimodalMessage from rai.tools.utils import run_requested_tools diff --git a/tests/messages/test_transport.py b/tests/messages/test_transport.py index 42b20869c..93a31e5e6 100644 --- a/tests/messages/test_transport.py +++ b/tests/messages/test_transport.py @@ -20,13 +20,14 @@ import numpy as np import pytest import rclpy -from rai.node import RaiBaseNode from rclpy.executors import SingleThreadedExecutor from rclpy.node import Node from rclpy.qos import QoSPresetProfiles, QoSProfile from sensor_msgs.msg import Image from std_msgs.msg import String +from rai.node import RaiBaseNode + def get_qos_profiles() -> List[str]: ros_distro = os.environ.get("ROS_DISTRO") diff --git a/tests/messages/test_utils.py b/tests/messages/test_utils.py index baa727cba..268aa4c7a 100644 --- a/tests/messages/test_utils.py +++ b/tests/messages/test_utils.py @@ -18,6 +18,7 @@ import numpy as np import pytest from PIL import Image + from rai.messages.utils import preprocess_image diff --git a/tests/tools/ros2/test_action_tools.py b/tests/tools/ros2/test_action_tools.py index e8aa6945c..3d46c69b6 100644 --- a/tests/tools/ros2/test_action_tools.py +++ b/tests/tools/ros2/test_action_tools.py @@ -24,7 +24,6 @@ from rai.communication.ros2.connectors import ROS2ARIConnector from rai.tools.ros2 import StartROS2ActionTool - from tests.communication.ros2.helpers import ActionServer_ as ActionServer from tests.communication.ros2.helpers import ( multi_threaded_spinner, diff --git a/tests/tools/ros2/test_service_tools.py b/tests/tools/ros2/test_service_tools.py index ca60515ad..ee813b327 100644 --- a/tests/tools/ros2/test_service_tools.py +++ b/tests/tools/ros2/test_service_tools.py @@ -24,7 +24,6 @@ from rai.communication.ros2.connectors import ROS2ARIConnector from rai.tools.ros2 import CallROS2ServiceTool - from tests.communication.ros2.helpers import ( ServiceServer, multi_threaded_spinner, diff --git a/tests/tools/ros2/test_topic_tools.py b/tests/tools/ros2/test_topic_tools.py index 5e320bf2e..4d615597e 100644 --- a/tests/tools/ros2/test_topic_tools.py +++ b/tests/tools/ros2/test_topic_tools.py @@ -26,6 +26,7 @@ import time from PIL import Image + from rai.communication.ros2.connectors import ROS2ARIConnector from rai.tools.ros2 import ( GetROS2ImageTool, @@ -35,7 +36,6 @@ PublishROS2MessageTool, ReceiveROS2MessageTool, ) - from tests.communication.ros2.helpers import ( ImagePublisher, MessagePublisher, diff --git a/tests/tools/test_tool_utils.py b/tests/tools/test_tool_utils.py index 1efec5425..fb62fb21a 100644 --- a/tests/tools/test_tool_utils.py +++ b/tests/tools/test_tool_utils.py @@ -16,10 +16,11 @@ import pytest from geometry_msgs.msg import Point, TransformStamped from nav2_msgs.action import NavigateToPose -from rai.tools.ros2.utils import ros2_message_to_dict from sensor_msgs.msg import Image from tf2_msgs.msg import TFMessage +from rai.tools.ros2.utils import ros2_message_to_dict + # TODO(`maciejmajek`): Add custom RAI messages? @pytest.mark.parametrize(