8000 feat: rai_sim by MagdalenaKotynia · Pull Request #415 · RobotecAI/rai · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

feat: rai_sim #415

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 69 commits into from
Feb 26, 2025
Merged

feat: rai_sim #415

merged 69 commits into from
Feb 26, 2025

Conversation

MagdalenaKotynia
Copy link
Member
@MagdalenaKotynia MagdalenaKotynia commented Feb 10, 2025

Purpose

To implement package for running simulations with different setups.

  • SimulationBridge - the interface to connect with specific engine. It is responsible for scene setup, spawning, despawning objects, etc.

  • def setup_scene logic is based on the provided simulation_config of type specific for given bridge. There is a common configuration part that should be provided for each bridge, it is implemented as SimulationConfig class.

  • SceneState is going to store the initial scene setup.

  • O3DExROS2Bridge - implementation of the SimulationBridge for O3DE with ROS2

Issues

#405 - This PR covers the part responsible for connection with simulation (EngineConnector - currently named SimulationBridge).

Testing

  • Download binary
  • Save the following content as (adjust binary_path if needed):
    • base_config1.yaml:
entities:
  - name: apple1
    prefab_name: apple
    pose:
      translation:
        x: 0.5
        y: 0.0
        z: 0.05
      rotation:
        x: 0.0
        y: 0.0
        z: 0.0
        w: 1.0
  - name: cube1
    prefab_name: green_cube
    pose:
      translation:
        x: 0.5
        y: 0.3
        z: 0.05
      rotation:
        x: 0.0
        y: 0.0
        z: 0.0
        w: 1.0
  • base_config2.yaml:
entities:
  - name: object1
    prefab_name: carrot
    pose:
      translation:
        x: 0.5
        y: -0.3
        z: 0.05
      rotation:
        x: 0.0
        y: 0.0
        z: 0.0
        w: 1.0
  - name: object2
    prefab_name: corn
    pose:
      translation:
        x: 0.5
        y: 0.3
        z: 0.05
      rotation:
        x: 0.0
        y: 0.0
        z: 0.0
        w: 1.0
  • o3de_config.yaml
binary_path: RAIManipulationDemoBenchmark_jammyhumble/RAIManipulationDemo/RAIManipulationDemo.GameLauncher
robotic_stack_command: ros2 launch examples/manipulation-demo-no-binary.launch.py 
  • Run the following python script (adjust paths to yaml configs if needed):
import rclpy
from rai_sim.o3de.o3de_bridge import O3DExROS2Bridge, O3DExROS2SimulationConfig
from rai.communication.ros2.connectors import ROS2ARIConnector
import time
from pathlib import Path

if __name__ == "__main__":

    try:
        rclpy.init()
        connector = ROS2ARIConnector()
        o3de = O3DExROS2Bridge(connector)

        scene_config  = O3DExROS2SimulationConfig.load_config(base_config_path=Path("base_config1.yaml"), bridge_config_path=Path("o3de_config.yaml"))
        o3de.setup_scene(scene_config)
        time.sleep(5)

        scene_config  = O3DExROS2SimulationConfig.load_config(base_config_path=Path("base_config2.yaml"), bridge_config_path=Path("o3de_config.yaml"))
        o3de.setup_scene(scene_config)

        time.sleep(5)

        o3de.shutdown()
        
        
        connector.shutdown()
        rclpy.shutdown()

    except Exception as e:
        raise e
    finally:
        o3de.shutdown()
        
        
        connector.shutdown()
        rclpy.shutdown()

Summary by CodeRabbit

  • New Features

    • Introduced a new simulation module that enhances scene configuration and entity management for a more seamless simulation experience.
    • Added improved integration with a simulation engine for robust process control and dynamic entity handling.
  • Documentation

    • Updated package metadata to include clear licensing, versioning, and dependency requirements.

@MagdalenaKotynia MagdalenaKotynia marked this pull request as ready for review February 11, 2025 21:01
@MagdalenaKotynia MagdalenaKotynia changed the title feat: benchmarking feat: rai_sim Feb 11, 2025
@adamdbrw adamdbrw requested a review from pijaro February 12, 2025 13:35
@boczekbartek boczekbartek self-requested a review February 12, 2025 14:19
Copy link
Member
@boczekbartek boczekbartek left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MagdalenaKotynia Thank you for this PR!

  • I left some comments to the code.
  • Also I was able to run the example from the PR description, but it didn't work in the first run - I think the binary was loading too long. See my error below. Do you check if the binary is ready to spawn objects?
  • it would be good to add an info to the description of the PR that example will only work if you setup rai-manipulation-demo first (because for e.g. this line)
(rai-framework-py3.10) robo-pc-005 ➜  rai git:(feat/benchmarking) ✗ python run.py                      
/home/bboczek/.cache/pypoetry/virtualenvs/rai-framework-2NHnaPvx-py3.10/lib/python3.10/site-packages/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
  warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
2025-02-12 16:21:02 robo-pc-005 rai_sim.o3de.o3de_connector[159409] INFO Running command: ['ros2', 'launch', 'examples/manipulation-demo.launch.py', 'game_launcher:=/home/bboczek/Downloads/RAIManipulationDemo/RAIManipulationDemo.GameLauncher']
Traceback (most recent call last):
  File "/u24/home/bboczek/projects_u24/01_internal/01_repos/rai/run.py", line 16, in <module>
    o3de.setup_scene(scene_config)
  File "/u24/home/bboczek/projects_u24/01_internal/01_repos/rai/src/rai_sim/rai_sim/o3de/o3de_connector.py", line 161, in setup_scene
    self._spawn_entity(entity)
  File "/u24/home/bboczek/projects_u24/01_internal/01_repos/rai/src/rai_sim/rai_sim/o3de/o3de_connector.py", line 90, in _spawn_entity
    entity.pose, self.connector.get_transform("odom", "world")
  File "/u24/home/bboczek/projects_u24/01_internal/01_repos/rai/src/rai_core/rai/communication/ros2/connectors.py", line 176, in get_transform
    raise LookupException(
tf2.LookupException: Could not find transform from world to odom in 5.0 seconds
Exception in thread Thread-1 (spin):
Traceback (most recent call last):
  File "/usr/lib/python3.10/threading.py", line 1016, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.10/threading.py", line 953, in run
    self._target(*self._args, **self._kwargs)
  File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 294, in spin
    self.spin_once()
  File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 794, in spin_once
    self._spin_once_impl(timeout_sec)
  File "/opt/ros/humble/local/lib/python3.10/dist-packages/rclpy/executors.py", line 786, in _spin_once_impl
    self._executor.submit(handler)
  File "/usr/lib/python3.10/concurrent/futures/thread.py", line 169, in submit
    raise RuntimeError('cannot schedule new futures after '
RuntimeError: cannot schedule new futures after interpreter shutdown
Exception ignored in: <function O3DEngineConnector.__del__ at 0x7e176e350790>
Traceback (most recent call last):
  File "/u24/home/bboczek/projects_u24/01_internal/01_repos/rai/src/rai_sim/rai_sim/o3de/o3de_connector.py", line 75, in __del__
  File "/u24/home/bboczek/projects_u24/01_internal/01_repos/rai/src/rai_sim/rai_sim/o3de/o3de_connector.py", line 64, in shutdown
AttributeError: 'NoneType' object has no attribute 'warning'

Setup of scene - arrangmenet of objects, interactions, environment etc.
"""

binary_path: Optional[str]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

binary_path seem to be restrictive. How about allowing a command or script.
Looking at the implementation it seems like the rest of the code should handle it, but variable name suggests that only a binary file is supported

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently, base SimulationConfig has only the common part for all simulations so it does not have binary_path parameter. When implementing the SimulationBridge interface, it is needed to create a custom config and define parameters for running/setup of the simulation. Therefore, binary_path parameter was moved to O3DExROS2Bridge.

return SceneSetup(entities=scene_config.entities)

def launch_binary(self, binary_path: str):
# NOTE (mkotynia) ros2 launch command with binary path, to be refactored
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Connected to my previous comments

@maciejmajek
Copy link
Member

@coderabbitai full review

Copy link
Contributor
coderabbitai bot commented Feb 12, 2025

Walkthrough

The pull request introduces the new rai_sim module into the project. It adds a dependency entry in the root pyproject.toml pointing to the local module and creates a dedicated pyproject.toml within src/rai_sim with package metadata and dependency declarations. Additionally, it enhances the module’s documentation by adding license information and a version variable. New classes and methods are implemented for simulation engine connection, including an abstract EngineConnector and its O3DE-specific extension that manages scene setup, entity spawning, and process control.

Changes

File(s) Change Summary
pyproject.toml Added dependency for rai_sim with {path = "src/rai_sim", develop = true}.
src/rai_sim/pyproject.toml Introduced package metadata for rai-sim including version 0.0.1, dependency declarations (python "^3.10, <3.13", PyYAML), classifiers, and build system configuration.
src/rai_sim/.../__init__.py Added copyright notice, module-level docstring, and defined __version__ = "0.0.1".
src/rai_sim/.../engine_connector.py Introduced simulation engine abstractions: classes Entity, SceneConfig, SceneSetup, abstract EngineConnector (with methods for scene setup, spawning/despawning entities, and object position retrieval) and a load_config function.
src/rai_sim/.../o3de_connector.py Added O3DEngineConnector class extending EngineConnector with methods for shutdown, retrieving spawnable names, spawning/despawning entities, launching binaries, process monitoring, and comprehensive scene setup.

Sequence Diagram(s)

sequenceDiagram
    participant U as User/Application
    participant O3D as O3DEngineConnector
    participant ROS as ROS2 Service
    participant PM as Process Manager

    U->>O3D: load_config(file_path)
    U->>O3D: setup_scene(scene_config)
    alt Binary path has changed
        O3D->>PM: shutdown previous process
        O3D->>PM: launch_binary(binary_path)
        O3D->>PM: has_process_started(timeout)
    end
    loop For each entity in scene_config
        O3D->>ROS: _spawn_entity(entity)
    end
    O3D-->>U: return SceneSetup
Loading
✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor
@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (5)
src/rai_sim/rai_sim/engine_connector.py (3)

46-46: Fix typo in docstring.

“arrangmenet” should be corrected to “arrangement.”

-    Setup of scene - arrangmenet of objects, interactions, environment etc.
+    Setup of scene - arrangement of objects, interactions, environment etc.

66-67: Remove or annotate the empty constructor.

A constructor that does nothing in an abstract base class can be removed or marked as abstract if future child classes are expected to handle initialization themselves.

-class EngineConnector(ABC):
-    def __init__(self):
-        pass
+class EngineConnector(ABC):
+    @abstractmethod
+    def __init__(self):
+        """Child classes should perform specialized initialization."""
🧰 Tools
🪛 Ruff (0.8.2)

66-67: EngineConnector.__init__ is an empty method in an abstract base class, but has no abstract decorator

(B027)


96-97: Avoid re-raising the same exception directly.

Having an empty except block that simply re-raises the same exception is redundant. Either remove the try-except entirely or add additional exception handling logic.

-    except Exception as e:
-        raise e
+    except Exception:
+        logger.error("Failed to load config file.", exc_info=True)
+        raise
src/rai_sim/rai_sim/o3de/o3de_connector.py (2)

40-65: Consider a more graceful shutdown strategy.

The current approach forcefully kills processes and children, which may abruptly terminate ROS2. A more elegant solution would be to invoke ROS2 shutdown procedures or use graceful signals with retries before forcing termination.


167-168: Flatten nested if statements.

Combine the nested conditions into a single check to enhance readability.

-if self.current_process is not None:
-    if self.current_process.poll() is None:
-        return True
+if self.current_process is not None and self.current_process.poll() is None:
+    return True
🧰 Tools
🪛 Ruff (0.8.2)

167-168: Use a single if statement instead of nested if statements

(SIM102)

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ce4885c and ff3e445.

⛔ Files ignored due to path filters (1)
  • poetry.lock is excluded by !**/*.lock
📒 Files selected for processing (5)
  • pyproject.toml (1 hunks)
  • src/rai_sim/pyproject.toml (1 hunks)
  • src/rai_sim/rai_sim/__init__.py (1 hunks)
  • src/rai_sim/rai_sim/engine_connector.py (1 hunks)
  • src/rai_sim/rai_sim/o3de/o3de_connector.py (1 hunks)
🧰 Additional context used
🪛 Ruff (0.8.2)
src/rai_sim/rai_sim/engine_connector.py

66-67: EngineConnector.__init__ is an empty method in an abstract base class, but has no abstract decorator

(B027)

src/rai_sim/rai_sim/o3de/o3de_connector.py

167-168: Use a single if statement instead of nested if statements

(SIM102)

🔇 Additional comments (6)
src/rai_sim/rai_sim/engine_connector.py (1)

20-20: Use a more generic data structure to avoid ROS2 dependency.

Relying on geometry_msgs.msg at this abstraction level prevents the EngineConnector from being engine-neutral. This concern was previously raised and remains relevant.

src/rai_sim/rai_sim/o3de/o3de_connector.py (1)

69-75: Verify service usage mismatch.

Using gazebo_msgs/srv/GetWorldProperties to retrieve spawnable names in O3DE might be unintended. Confirm that the target engine and message types correspond correctly, and ensure the backend is actually O3DE-compatible.

src/rai_sim/rai_sim/__init__.py (1)

1-17: No issues found.

The file is well-documented, and versioning is clearly defined.

src/rai_sim/pyproject.toml (2)

1-14: LGTM! Well-structured package metadata.

The package metadata is well-defined with appropriate name, version, description, authors, and classifiers.


21-23: LGTM! Standard build system configuration.

The build system configuration follows Poetry's best practices.

pyproject.toml (1)

20-20: LGTM! Consistent dependency declaration.

The rai_sim dependency is correctly declared following the same pattern as other local modules.


[tool.poetry.dependencies]
python = "^3.10, <3.13"
PyYAML = "*"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Add version constraint for PyYAML dependency.

Using an unconstrained version (*) for dependencies can lead to compatibility issues when new versions are released. Consider adding a version constraint to ensure compatibility.

-PyYAML = "*"
+PyYAML = "^6.0.1"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
PyYAML = "*"
PyYAML = "^6.0.1"

for entity in self.entity_ids:
self._despawn_entity_by_id(self.entity_ids[entity])
self.entity_ids = {}
time.sleep(3)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hard coded sleep looks so wrong. We should be able to detect somehow that the binary has started and is ready to receive commands

I can guarantee that some sims will need more than N seconds to start.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed this hard-coded sleep, I added a check if the process has started inside launch_binary/launch_robotic_stack defs. I am wondering whether this check is enough to be sure that the binary has been launched. Maybe there should be some additional check whether some topics started to send messages, e.g. clock, what do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please fill the readme. At least some core information.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 13bf358

for child in alive:
logger.warning(f"Force killing child process PID: {child.pid}")
child.kill()
# NOTE (mkotynia) terminating ros2 launch
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is engine connector, why do you mention ros2 launch? what do ros2 launch have to do with O3DEngineConnector?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is related to this discussion #415 (comment). Currently, it is a simulation connector.

msg = ROS2ARIMessage(payload=msg_content)

response = self.connector.service_call(
msg, target="spawn_entity", msg_type="gazebo_msgs/srv/SpawnEntity"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not feeling coupling the ROS 2 interface with O3DEngineConnector. Semantically, talking about "o3de connector" - shouldn't we care about connecting rai with o3de only (o3de interfaces, launch arguments, parameters, configuration)?

We assumed here that the O3DE comes with ROS 2 interface and the simulation follows certain standard/implementation.

What if someone have different API to control O3DE simulation?

Maybe we should make a distinguish between engine, and provided simulation interface?

If we bring a concrete implementation of the "connector" (in this case, an O3DE based sim that follows a standard and uses ROS 2 gem), then we should consider changing a name to something more concrete.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should consider changing a name to something more concrete

Right. We have discussed this topic outside of git, our O3DE + ROS2 combo relies on a specific O3DE setup. @knicked is currently working on a o3de requirements document.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I renamed EngineConnector with SimulationConnector and O3DEngineConnector to O3DExROS2Connector to better reflect the meaning - that it is O3DE with ROS2 interface.

command,
)
if not self.has_process_started():
raise RuntimeError("Process did not start in time.")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inconsistent use of exception types. setup_scene throws an Exception, but here we are using RuntimeError. Both are "on the same level":

if scene_config.binary_path:
    self.launch_binary(scene_config.binary_path) # can raise RuntimeError
else:
    raise Exception("No binary path provided")

Copy link
Member Author
@MagdalenaKotynia MagdalenaKotynia Feb 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added the check if scene_config.binary_path outside the launch_binary method because it seemed for me to be a clearer solution than allowing the call of the launch_binary method with an optional binary_path argument and checking it inside this method. Currently the problem is outdated because after yesterday discussion with @maciejmajek we decided to separate common config attributes to base SimulationConfig class and to define other attributes in custom classes for each connector (implemented in ab5bf1f). As a result, the binary_path is now mandatory for this connector and there is no need to check it inside the connector (it is handled when loading config content to pydantic model).

Copy link
Contributor
@rachwalk rachwalk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for this PR in general it looks good. I left a few comments regarding coding practices, I will continue the review once these are implemented.

Comment on lines 126 to 127
response = self._try_service_call(
msg, target="spawn_entity", msg_type="gazebo_msgs/srv/SpawnEntity"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible for this service to return a value, while failing to spawn the entity? Or does getting a response guarantee success on the spawning task?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: handle if spawn fails

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added errors handling in 2a97f9f.
Services used in this task may return value with success == False (e.g. when not existing prefab name is given) or may raise an error (e.g. when the service with given name is not running or does not exist).

raise RuntimeError("Process did not start in time.")

def _has_process_started(
self, process: subprocess.Popen[Any] | None, timeout: int = 15
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is None a valid argument for this method? If process=None this method is equivalent to sleep(15), so even if it's required to handle such an argument it would be warranted to early quit instead of waiting for 15 seconds.

This comment was marked as outdated.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

applied in f439bde



class O3DExROS2SimulationConfig(SimulationConfig):
binary_path: Path
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've already replied #415 (comment), sorry, I missed this comment.

@MagdalenaKotynia MagdalenaKotynia changed the base branch from development to feat/simbench February 26, 2025 08:37
MagdalenaKotynia and others added 6 commits February 26, 2025 09:38
Co-authored-by: Jakub Matejczyk <jakub.matejczyk@robotec.ai>
Co-authored-by: Jakub Matejczyk <jakub.matejczyk@robotec.ai>
Co-authored-by: Jakub Matejczyk <jakub.matejczyk@robotec.ai>
Co-authored-by: Jakub Matejczyk <jakub.matejczyk@robotec.ai>
Co-authored-by: Kacper Dąbrowski <kacper.dabrowski@robotec.ai>
MagdalenaKotynia and others added 25 commits February 26, 2025 09:38
…suggest having something common with ROS2ARIConnector
…get rid of dependency of bridge interface from ros2
Signed-off-by: Piotr Jaroszek <piotr.jaroszek@robotec.ai>
@maciejmajek maciejmajek merged commit ff0585e into feat/simbench Feb 26, 2025
2 checks passed
@maciejmajek maciejmajek deleted the feat/benchmarking branch February 26, 2025 08:41
maciejmajek pushed a commit that referenced this pull request Mar 7, 2025
Signed-off-by: Kacper Dąbrowski <kacper.dabrowski@robotec.ai>
Signed-off-by: Piotr Jaroszek <piotr.jaroszek@robotec.ai>
Co-authored-by: Jakub Matejczyk <jakub.matejczyk@robotec.ai>
Co-authored-by: Kacper Dąbrowski <kacper.dabrowski@robotec.ai>
Co-authored-by: Piotr Jaroszek <10896036+pijaro@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants
0