Repository Summary

Description The ComponentContainer and Executor that assign a dedicated thread for each callback group.
Checkout URI https://github.com/tier4/callback_isolated_executor.git
VCS Type git
VCS Version main
Last Updated 2025-09-24
Dev Status UNKNOWN
Released UNRELEASED
Tags linux middleware real-time scheduler ros2 ros2-humble
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

README

callback_isolated_executor

The ComponentContainer and Executor that assign a dedicated thread for each callback group. This repository continues development from https://github.com/sykwer/callback_isolated_executor, which provides the implementation for this paper.

If you find CallbackIsolatedExecutor is useful in your research, please consider citing:

  • T. Ishikawa-Aso, A. Yano, T. Azumi, and S. Kato, “Work in Progress: Middleware-Transparent Callback Enforcement in Commoditized Component-Oriented Real-Time Systems,” in Proc. of 31st IEEE Real-Time and Embedded Technology and Applications Symposium (RTAS), 2025, pp. 426–429.
BibTeX ```bibtex @inproceedings{ishikawa2025work, title={Work in Progress: Middleware-Transparent Callback Enforcement in Commoditized Component-Oriented Real-Time Systems}, author={Ishikawa-Aso, Takahiro and Yano, Atsushi and Azumi, Takuya and Kato, Shinpei}, booktitle={Proc. of 31st IEEE Real-Time and Embedded Technology and Applications Symposium (RTAS)}, pages={426--429}, year={2025}, organization={IEEE} } ```

Supported Environments

CallbackIsolatedExecutor is currently available in the following environments. This reflects the current status, and support is expected to expand in the future.

Category Supported Versions / Notes
ROS 2 Humble (only with rclcpp client library)
Linux Distribution Ubuntu 22.04 (Jammy Jellyfish)

Build and Install

$ git clone https://github.com/tier4/callback_isolated_executor.git
$ cd callback_isolated_executor
$ source /opt/ros/humble/setup.bash
$ colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release
$ source install/setup.bash

Set capability for the configurator executable to issue the syscalls like sched_setscheduler(2).

$ sudo setcap cap_sys_nice+ep ./build/cie_thread_configurator/thread_configurator_node

After elevating the priviridge level, part of dynamic linking functionality gets disabled for the security reason. To deal with it, add a file with the following content under the /etc/ld.so.conf.d/ directory. The file name has to be *.conf.

/opt/ros/humble/lib
/opt/ros/humble/lib/x86_64-linux-gnu
/path/to/callback_isolated_executor/install/cie_config_msgs/lib

To enable the configuration, type the command below.

$ sudo ldconfig

Why ldconfig changed? When specific permissions are granted to an ELF binary using setcap, for security reasons, environment variables like `LD_PRELOAD` and `LD_LIBRARY_PATH` are ignored. While setting `RUNPATH` on the binary comes to mind as a solution, `RUNPATH` does not easily handle recursive dynamic linking. In such cases, modifying `/etc/ld.so.conf.d/` is the only option.

Kernel Boot Parameter

According to the Linux Kernel documentation, setting the affinity for SCHED_DEADLINE tasks requires the use of cgroup v1 features. To use cgroup v1, it is necessary to disable cgroup v2 by specifying systemd.unified_cgroup_hierarchy=0 in the kernel boot parameters.

To change the kernel boot parameters, edit /etc/default/grub and add the parameter to GRUB_CMDLINE_LINUX_DEFAULT:

GRUB_CMDLINE_LINUX_DEFAULT="... systemd.unified_cgroup_hierarchy=0 ..."

To apply these changes, run the following commands. After rebooting, the features of cgroup v1 will be available:

$ sudo update-grub
$ sudo reboot

Usage

Step1: Rewrite your app

When running a node within ComponentContainerCallbackIsolated, you don’t need to modify the node’s implementation. However, if starting the node directly from the main function without using ComponentContainer, you need to modify the node’s implementation as shown below and rebuild it. Refer to the source code in the cie_sample_application package to understand how to modify your app.

Option1: Launch without ComponentContainer

If you are launching a node directly from the main function without using a ComponentContainer, change the name of the Executor.

```xml <?xml version=”1.0”?> <?xml-model href=”http://download.ros.org/schema/package_format3.xsd” schematypens=”http://www.w3.org/2001/XMLSchema”?>

... callback_isolated_executor File truncated at 100 lines [see the full file](https://github.com/tier4/callback_isolated_executor/tree/main/README.md)
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble
Repo symbol

callback_isolated_executor repository

linux middleware real-time scheduler ros2 ros2-humble