{"id":13800762,"url":"https://github.com/ros2/rmw_iceoryx","last_synced_at":"2025-10-08T05:09:15.606Z","repository":{"id":36493626,"uuid":"217642734","full_name":"ros2/rmw_iceoryx","owner":"ros2","description":"rmw implementation for iceoryx","archived":false,"fork":false,"pushed_at":"2025-05-12T09:51:10.000Z","size":588,"stargazers_count":171,"open_issues_count":17,"forks_count":26,"subscribers_count":13,"default_branch":"iron","last_synced_at":"2025-08-20T16:49:18.921Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ros2.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-10-26T02:04:21.000Z","updated_at":"2025-07-15T07:06:13.000Z","dependencies_parsed_at":"2023-02-14T16:16:49.840Z","dependency_job_id":"84c88a5e-4c58-4de6-81bf-95f14b959c3d","html_url":"https://github.com/ros2/rmw_iceoryx","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/ros2/rmw_iceoryx","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros2%2Frmw_iceoryx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros2%2Frmw_iceoryx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros2%2Frmw_iceoryx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros2%2Frmw_iceoryx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ros2","download_url":"https://codeload.github.com/ros2/rmw_iceoryx/tar.gz/refs/heads/iron","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ros2%2Frmw_iceoryx/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278891753,"owners_count":26063858,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-08T02:00:06.501Z","response_time":56,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-04T00:01:16.029Z","updated_at":"2025-10-08T05:09:15.592Z","avatar_url":"https://github.com/ros2.png","language":"C++","funding_links":[],"categories":["Packages"],"sub_categories":["RMW (ROS middleware)"],"readme":"![Integration build and tests](https://github.com/ros2/rmw_iceoryx/workflows/Integration%20build%20rmw_iceoryx/badge.svg)\n![Linting](https://github.com/ros2/rmw_iceoryx/workflows/Lint%20rmw_iceoryx/badge.svg)\n![Iceoryx build and tests](https://github.com/ros2/rmw_iceoryx/workflows/Build%20iceoryx/badge.svg)\n\nInstallation\n============\n\nThe following instructions show you how to install the iceoryx rmw implementation.\nThe installation of rmw_iceoryx is pretty straight forward as [iceoryx](https://github.com/eclipse/iceoryx) is available in [ros2.repos](https://github.com/ros2/ros2/blob/master/ros2.repos).\nAll provided packages can be built with colcon so that you can easily build rmw_iceoryx within your ROS 2 workspace.\nrmw_iceoryx is using the [rosidl_typesupport_introspection](https://github.com/ros2/rosidl) which allows for building iceoryx on top of an existing ROS 2 workspace or even debian installation as no ROS 2 messages have to be built again.\n\nTo install rmw_iceoryx in a ROS 2 workspace with the latest ROS version, just execute the steps below:\n\n```bash\nmkdir -p ~/iceoryx_ws/src\ncd $_\n# LATEST_ROS_VERSION could be e.g. iron\ngit clone --branch LATEST_ROS_VERSION https://github.com/ros2/rmw_iceoryx.git\n```\n\nFor alternative installation instructions and more details about iceoryx's internals, please see [iceoryx's GitHub repo](https://github.com/eclipse/iceoryx).\n\nrmw_iceoryx is compatible with ROS 2 starting with Eloquent release.\nAssuming you have ROS 2 installed correctly, you can compile the iceoryx workspace with colcon:\n\n```bash\ncd ~/iceoryx_ws/\nsource /opt/ros/LATEST_ROS_VERSION/setup.bash  # alternatively source your own ROS 2 workspace\nrosdep update\nrosdep install --from-paths src --ignore-src --rosdistro LATEST_ROS_VERSION -y\ncolcon build\n# or with more options\ncolcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=OFF\n```\n\nThat's it! You've installed iceoryx and are ready to rumble.\n\nWorking with rmw_iceoryx_cpp\n============================\n\nGetting Started\n---------------\n\niceoryx is based on shared memory and features a shared memory management application called RouDi.\nRouDi is a daemon taking care of allocating enough space within the shared memory each node and is responsible for transporting messages between these nodes.\n\nBefore starting any iceoryx application, we therefore have to start the daemon.\n\n```bash\n./iceoryx_ws/install/iceoryx_posh/bin/iox-roudi  # /iceoryx_ws/install/bin/iox-roudi if you installed with as a merged workspace\n```\n\nYou can then use rmw_iceoryx_cpp just like any other available rmw implementation.\nIn order to specify the rmw implementation, you have to set the environment variable `RMW_IMPLEMENTATION` to `rmw_iceoryx_cpp`.\n\nTo run the ROS 2 c++ demo nodes with iceoryx, you can thus execute the following command:\n\n```bash\nsource ~/iceoryx_ws/install/setup.bash\nRMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp talker\n```\n\nIn another terminal, you can then subscribe to the talker as always:\n\n```bash\nsource ~/iceoryx_ws/install/setup.bash\nRMW_IMPLEMENTATION=rmw_iceoryx_cpp ros2 run demo_nodes_cpp listener\n```\n\nZero Copy - The True Power\n--------------------------\n\nTo exploit iceoryx's full potential, we want to leverage the zero copy transport mechanism it provides.\nFor this to work, we have to take one step back and look at the details of what it means to enable zero copy data transport.\n\nThe basic zero copy workflow works as depicted in the picture below:\n![](docs/ros2_loan_messages.png)\n\nStep 1 `loan_message()`) A publisher asks rmw_iceoryx_cpp to loan a message from it.\nrmw_iceoryx_cpp allocates the appropriate message in its shared memory and loans it to the publisher.\n\nStep 2 `publish()`) The publisher can fill in the data into the loaned message.\nWhen calling publish, the loaned message will be returned to the middleware and the publisher has no longer ownership over the message.\n\nStep 3 `take_loaned_message()`) A subscription wants to take a message from the middleware.\nrmw_iceoryx_cpp gives a loaned message to the subscription which can execute their respective callbacks.\n\nStep 4 `return_loaned_message()`) A subscription callback is finished and the loaned message is getting returned to the middleware.\n\nStarting from ROS 2 Eloquent, these features are implemented within rclcpp.\nAn application using these new features is shown in the code snippet below.\nFor a fully working implementation, please have a look at [this demo node](https://github.com/ros2/demos/blob/master/demo_nodes_cpp/src/topics/talker_loaned_message.cpp).\n\n```c++\nauto non_pod_pub_ = node-\u003ecreate_publisher\u003cstd_msgs::msg::String\u003e(\"/chatter\", 1);\n// Ask the publisher to loan a String message\nauto non_pod_loaned_msg = non_pod_pub_-\u003eborrow_loaned_message();\nnon_pod_loaned_msg.get().data = \"Hello World\";\n// Return ownership of that string message\nnon_pod_pub_-\u003epublish(std::move(non_pod_loaned_msg));\n```\n\nThe code above has one problem though: How can the middleware allocate enough memory for the string message?\nThe middleware can't possibly know the size of the string the user wants to put into that message.\n\nThat being said, in order to enable a true zero copy data transport we have to limit ourselves to fixed size data structures.\nThe picture below tries to illustrate the difference between a fixed size message and a dynamically resizable message.\n![](docs/fixed_size_messages.png)\n\nThe plain old datatype (POD) on the left side is very well suited for zero copy data transport as its size is definitely defined (on compile time).\nThe message definition shown on the right size is not made for zero copy transport as its size might vary during runtime and rmw_iceoryx_cpp can't determine how much memory should be allocated in the shared memory.\n\nThus, in order to make our demo work with zero copy, we can alternatively send a float64, as its size is clearly defined.\n\n```c++\nauto pod_pub_ = node-\u003ecreate_publisher\u003cstd_msgs::msg::Float64\u003e(\"/float\", 1);\n// Ask the publisher to loan a Float64 message\nauto pod_loaned_msg = pod_pub_-\u003eborrow_loaned_message();\npod_loaned_msg.get().data = 123.456f;\n// Return ownership of that Float64 message\npod_pub_-\u003epublish(std::move(pod_loaned_msg));\n```\n\nIf you'd like to play around with the zero copy transport, we recommend to checkout the [fixed size image transport demo](https://github.com/karsten1987/fixed_size_ros2_demo), which illustrates how iceoryx can be used to publish and subscribe up to even 4K images without having to copy them.\n\nLimitations\n===========\n\nrmw_iceoryx_cpp is currently under heavy development.\nUnfortunately, not all features are yet fully fleshed out.\n\n| ROS 2 command/feature | Status                             |\n|-----------------------|------------------------------------|\n| `ros2 topic list`     | :heavy_check_mark:                 |\n| `ros2 topic echo`     | :heavy_check_mark:                 |\n| `ros2 topic type`     | :heavy_check_mark:                 |\n| `ros2 topic info`     | :heavy_check_mark:                 |\n| `ros2 topic hz`       | :heavy_check_mark:                 |\n| `ros2 topic bw`       | :heavy_check_mark:                 |\n| `ros2 node list`      | :heavy_check_mark:                 |\n| `ros2 node info`      | :heavy_check_mark:                 |\n| `ros2 interface *`    | :heavy_check_mark:                 |\n| `ros2 service *`      | :heavy_check_mark:                 |\n| `ros2 param list`     | :x:                                |\n| `rqt_graph`           | :heavy_check_mark:                 |\n| `rqt_top`             | :heavy_check_mark:                 |\n| `rqt_console`         | :heavy_check_mark:                 |\n| `rqt_plot`            | :heavy_check_mark:                 |\n| `rviz2`               | :heavy_check_mark:                 |\n| `ros2 bag`            | :grey_question:                    |\n| urdf                  | :grey_question:                    |\n| tf2                   | :grey_question:                    |\n| RMW Pub/Sub Events    | :x:                                |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fros2%2Frmw_iceoryx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fros2%2Frmw_iceoryx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fros2%2Frmw_iceoryx/lists"}