Running the bridge when CycloneDDS is configured to use SHM results in errors due to Iceoryx version mismatch.
The bridge tries to connect to iox-roudi 20 times with a period of 3 seconds (see RouDi logs), then fails with a fatal error.
$ zenoh-bridge-ros2dds
2025-10-15T15:31:23.627408Z INFO main ThreadId(01) zenoh_bridge_ros2dds: zenoh-bridge-ros2dds v1.5.1
2025-10-15T15:31:23.628224Z INFO main ThreadId(01) zenoh_bridge_ros2dds: Zenoh Config(Config { id: None, metadata: Null, mode: Some(Router), connect: ConnectConfig { timeout_ms: None, endpoints: Unique([]), exit_on_failure: None, retry: None }, listen: ListenConfig { timeout_ms: None, endpoints: Dependent(ModeValues { router: Some([tcp/[::]:7447]), peer: Some([tcp/[::]:0]), client: None }), exit_on_failure: None, retry: None }, open: OpenConf { return_conditions: ReturnConditionsConf { connect_scouted: None, declares: None } }, scouting: ScoutingConf { timeout: None, delay: None, multicast: ScoutingMulticastConf { enabled: None, address: None, interface: None, ttl: None, autoconnect: None, autoconnect_strategy: None, listen: None }, gossip: GossipConf { enabled: None, multihop: None, target: None, autoconnect: None, autoconnect_strategy: None } }, timestamping: TimestampingConf { enabled: Some(Unique(true)), drop_future_timestamp: None }, queries_default_timeout: None, routing: RoutingConf { router: RouterRoutingConf { peers_failover_brokering: None, linkstate: LinkstateConf { transport_weights: [] } }, peer: PeerRoutingConf { mode: None, linkstate: LinkstateConf { transport_weights: [] } }, interests: InterestsConf { timeout: None } }, aggregation: AggregationConf { subscribers: [], publishers: [] }, qos: QoSConfig { publication: PublisherQoSConfList([]), network: [] }, transport: TransportConf { unicast: TransportUnicastConf { open_timeout: 10000, accept_timeout: 10000, accept_pending: 100, max_sessions: 1000, max_links: 1, lowlatency: false, qos: QoSUnicastConf { enabled: true }, compression: CompressionUnicastConf { enabled: false } }, multicast: TransportMulticastConf { join_interval: Some(2500), max_sessions: Some(1000), qos: QoSMulticastConf { enabled: false }, compression: CompressionMulticastConf { enabled: false } }, link: TransportLinkConf { protocols: None, tx: LinkTxConf { sequence_number_resolution: U32, lease: 10000, keep_alive: 4, batch_size: 65535, queue: QueueConf { size: QueueSizeConf { control: 2, real_time: 2, interactive_high: 2, interactive_low: 2, data_high: 2, data: 2, data_low: 2, background: 2 }, congestion_control: CongestionControlConf { drop: CongestionControlDropConf { wait_before_drop: 1000, max_wait_before_drop_fragments: 50000 }, block: CongestionControlBlockConf { wait_before_close: 5000000 } }, batching: BatchingConf { enabled: true, time_limit: 1 }, allocation: QueueAllocConf { mode: Lazy } }, threads: 1 }, rx: LinkRxConf { buffer_size: 65535, max_message_size: 1073741824 }, tls: TLSConf { root_ca_certificate: None, listen_private_key: None, listen_certificate: None, enable_mtls: None, connect_private_key: None, connect_certificate: None, verify_name_on_connect: None, close_link_on_expiration: None, so_sndbuf: None, so_rcvbuf: None, root_ca_certificate_base64: None, listen_private_key_base64: None, listen_certificate_base64: None, connect_private_key_base64: None, connect_certificate_base64: None }, tcp: TcpConf { so_sndbuf: None, so_rcvbuf: None }, unixpipe: UnixPipeConf { file_access_mask: None } }, shared_memory: ShmConf { enabled: true, mode: Lazy, transport_optimization: LargeMessageTransportOpt { enabled: true, pool_size: 16777216, message_size_threshold: 3072 } }, auth: AuthConf { usrpwd: UsrPwdConf { user: None, password: None, dictionary_file: None }, pubkey: PubKeyConf { public_key_pem: None, private_key_pem: None, public_key_file: None, private_key_file: None, key_size: None, known_keys_file: None } } }, adminspace: AdminSpaceConf { enabled: true, permissions: PermissionsConf { read: true, write: false } }, namespace: None, downsampling: [], access_control: AclConfig { enabled: false, default_permission: Deny, rules: None, subjects: None, policies: None }, low_pass_filter: [], plugins_loading: PluginsLoading { enabled: true, search_dirs: LibSearchDirs([Spec(LibSearchSpec { kind: CurrentExeParent, value: None }), Path("."), Path("~/.zenoh/lib"), Path("/opt/homebrew/lib"), Path("/usr/local/lib"), Path("/usr/lib")]) }, plugins: Object {"ros2dds": Object {"domain": Number(218), "ros_localhost_only": Bool(false), "shm_enabled": Bool(false)}} })
2025-10-15T15:31:23.628386Z INFO main ThreadId(01) zenoh::net::runtime: Using ZID: ac8ff11f2453fa8ea416d07195ec73b2
2025-10-15T15:31:23.628891Z INFO main ThreadId(01) zenoh::api::loader: Starting required plugin "ros2dds"
2025-10-15T15:31:23.629341Z INFO main ThreadId(01) zenoh::api::loader: Successfully started plugin ros2dds from "__static_lib__"
2025-10-15T15:31:23.629366Z INFO main ThreadId(01) zenoh::api::loader: Finished loading plugins
2025-10-15T15:31:23.629420Z INFO tokio-runtime-worker ThreadId(05) zenoh_plugin_ros2dds: ROS2 plugin Config { namespace: "/", nodename: "zenoh_bridge_ros2dds", domain: 218, ros_localhost_only: false, ros_automatic_discovery_range: None, ros_static_peers: None, allowance: None, pub_max_frequencies: [], shm_enabled: false, transient_local_cache_multiplier: 10, queries_timeout: Some(QueriesTimeouts { default: 5.0, transient_local_subscribers: [], services: [], actions: Some(ActionsTimeouts { send_goal: [], cancel_goal: [], get_result: [(Regex(".*"), 300.0)] }) }), reliable_routes_blocking: true, pub_priorities: [], work_thread_num: 2, max_block_thread_num: 50, __required__: None, __path__: None }
2025-10-15T15:31:23.630354Z INFO main ThreadId(01) zenoh::net::runtime::orchestrator: Zenoh can be reached at: tcp/[fe80::3e6d:66ff:fe1f:5391]:7447
2025-10-15T15:31:23.630386Z INFO main ThreadId(01) zenoh::net::runtime::orchestrator: Zenoh can be reached at: tcp/192.168.144.2:7447
2025-10-15T15:31:23.630458Z INFO main ThreadId(01) zenoh::net::runtime::orchestrator: zenohd listening scout messages on 224.0.0.224:7446
2025-10-15 15:32:25.062 [ Fatal ]: Timeout registering at RouDi. Is RouDi running?
2025-10-15 15:32:25.063 [ Error ]: ICEORYX error! IPC_INTERFACE__REG_ROUDI_NOT_AVAILABLE
terminate called without an active exception
Describe the bug
Running the bridge when CycloneDDS is configured to use SHM results in errors due to Iceoryx version mismatch.
The bridge tries to connect to
iox-roudi20 times with a period of 3 seconds (see RouDi logs), then fails with a fatal error.Note
Running the bridge with SHM disabled works as expected.
The issue seems to be with the pinned version of
cyclors(v0.2.7, which BTW does not exist on the repo), that bundles Iceoryx at≈v2.0.3(not a tagged commit). Sincev0.3.0,cyclorsseems to point to the correct version of Iceoryx (v2.0.5).I've seen that #150 is bumping the version of
cyclorsto a more recent one, but it's been more than one year since the last update...RouDi logs:
zenoh-bridge-ros2dds logs:
$ zenoh-bridge-ros2dds 2025-10-15T15:31:23.627408Z INFO main ThreadId(01) zenoh_bridge_ros2dds: zenoh-bridge-ros2dds v1.5.1 2025-10-15T15:31:23.628224Z INFO main ThreadId(01) zenoh_bridge_ros2dds: Zenoh Config(Config { id: None, metadata: Null, mode: Some(Router), connect: ConnectConfig { timeout_ms: None, endpoints: Unique([]), exit_on_failure: None, retry: None }, listen: ListenConfig { timeout_ms: None, endpoints: Dependent(ModeValues { router: Some([tcp/[::]:7447]), peer: Some([tcp/[::]:0]), client: None }), exit_on_failure: None, retry: None }, open: OpenConf { return_conditions: ReturnConditionsConf { connect_scouted: None, declares: None } }, scouting: ScoutingConf { timeout: None, delay: None, multicast: ScoutingMulticastConf { enabled: None, address: None, interface: None, ttl: None, autoconnect: None, autoconnect_strategy: None, listen: None }, gossip: GossipConf { enabled: None, multihop: None, target: None, autoconnect: None, autoconnect_strategy: None } }, timestamping: TimestampingConf { enabled: Some(Unique(true)), drop_future_timestamp: None }, queries_default_timeout: None, routing: RoutingConf { router: RouterRoutingConf { peers_failover_brokering: None, linkstate: LinkstateConf { transport_weights: [] } }, peer: PeerRoutingConf { mode: None, linkstate: LinkstateConf { transport_weights: [] } }, interests: InterestsConf { timeout: None } }, aggregation: AggregationConf { subscribers: [], publishers: [] }, qos: QoSConfig { publication: PublisherQoSConfList([]), network: [] }, transport: TransportConf { unicast: TransportUnicastConf { open_timeout: 10000, accept_timeout: 10000, accept_pending: 100, max_sessions: 1000, max_links: 1, lowlatency: false, qos: QoSUnicastConf { enabled: true }, compression: CompressionUnicastConf { enabled: false } }, multicast: TransportMulticastConf { join_interval: Some(2500), max_sessions: Some(1000), qos: QoSMulticastConf { enabled: false }, compression: CompressionMulticastConf { enabled: false } }, link: TransportLinkConf { protocols: None, tx: LinkTxConf { sequence_number_resolution: U32, lease: 10000, keep_alive: 4, batch_size: 65535, queue: QueueConf { size: QueueSizeConf { control: 2, real_time: 2, interactive_high: 2, interactive_low: 2, data_high: 2, data: 2, data_low: 2, background: 2 }, congestion_control: CongestionControlConf { drop: CongestionControlDropConf { wait_before_drop: 1000, max_wait_before_drop_fragments: 50000 }, block: CongestionControlBlockConf { wait_before_close: 5000000 } }, batching: BatchingConf { enabled: true, time_limit: 1 }, allocation: QueueAllocConf { mode: Lazy } }, threads: 1 }, rx: LinkRxConf { buffer_size: 65535, max_message_size: 1073741824 }, tls: TLSConf { root_ca_certificate: None, listen_private_key: None, listen_certificate: None, enable_mtls: None, connect_private_key: None, connect_certificate: None, verify_name_on_connect: None, close_link_on_expiration: None, so_sndbuf: None, so_rcvbuf: None, root_ca_certificate_base64: None, listen_private_key_base64: None, listen_certificate_base64: None, connect_private_key_base64: None, connect_certificate_base64: None }, tcp: TcpConf { so_sndbuf: None, so_rcvbuf: None }, unixpipe: UnixPipeConf { file_access_mask: None } }, shared_memory: ShmConf { enabled: true, mode: Lazy, transport_optimization: LargeMessageTransportOpt { enabled: true, pool_size: 16777216, message_size_threshold: 3072 } }, auth: AuthConf { usrpwd: UsrPwdConf { user: None, password: None, dictionary_file: None }, pubkey: PubKeyConf { public_key_pem: None, private_key_pem: None, public_key_file: None, private_key_file: None, key_size: None, known_keys_file: None } } }, adminspace: AdminSpaceConf { enabled: true, permissions: PermissionsConf { read: true, write: false } }, namespace: None, downsampling: [], access_control: AclConfig { enabled: false, default_permission: Deny, rules: None, subjects: None, policies: None }, low_pass_filter: [], plugins_loading: PluginsLoading { enabled: true, search_dirs: LibSearchDirs([Spec(LibSearchSpec { kind: CurrentExeParent, value: None }), Path("."), Path("~/.zenoh/lib"), Path("/opt/homebrew/lib"), Path("/usr/local/lib"), Path("/usr/lib")]) }, plugins: Object {"ros2dds": Object {"domain": Number(218), "ros_localhost_only": Bool(false), "shm_enabled": Bool(false)}} }) 2025-10-15T15:31:23.628386Z INFO main ThreadId(01) zenoh::net::runtime: Using ZID: ac8ff11f2453fa8ea416d07195ec73b2 2025-10-15T15:31:23.628891Z INFO main ThreadId(01) zenoh::api::loader: Starting required plugin "ros2dds" 2025-10-15T15:31:23.629341Z INFO main ThreadId(01) zenoh::api::loader: Successfully started plugin ros2dds from "__static_lib__" 2025-10-15T15:31:23.629366Z INFO main ThreadId(01) zenoh::api::loader: Finished loading plugins 2025-10-15T15:31:23.629420Z INFO tokio-runtime-worker ThreadId(05) zenoh_plugin_ros2dds: ROS2 plugin Config { namespace: "/", nodename: "zenoh_bridge_ros2dds", domain: 218, ros_localhost_only: false, ros_automatic_discovery_range: None, ros_static_peers: None, allowance: None, pub_max_frequencies: [], shm_enabled: false, transient_local_cache_multiplier: 10, queries_timeout: Some(QueriesTimeouts { default: 5.0, transient_local_subscribers: [], services: [], actions: Some(ActionsTimeouts { send_goal: [], cancel_goal: [], get_result: [(Regex(".*"), 300.0)] }) }), reliable_routes_blocking: true, pub_priorities: [], work_thread_num: 2, max_block_thread_num: 50, __required__: None, __path__: None } 2025-10-15T15:31:23.630354Z INFO main ThreadId(01) zenoh::net::runtime::orchestrator: Zenoh can be reached at: tcp/[fe80::3e6d:66ff:fe1f:5391]:7447 2025-10-15T15:31:23.630386Z INFO main ThreadId(01) zenoh::net::runtime::orchestrator: Zenoh can be reached at: tcp/192.168.144.2:7447 2025-10-15T15:31:23.630458Z INFO main ThreadId(01) zenoh::net::runtime::orchestrator: zenohd listening scout messages on 224.0.0.224:7446 2025-10-15 15:32:25.062 [ Fatal ]: Timeout registering at RouDi. Is RouDi running? 2025-10-15 15:32:25.063 [ Error ]: ICEORYX error! IPC_INTERFACE__REG_ROUDI_NOT_AVAILABLE terminate called without an active exceptionTo reproduce
cargo)//CycloneDDS/Domain/SharedMemory/Enable).iox-roudiwithiox-roudi -l info.zenoh-bridge-ros2dds.System info
0.10.5-2jammy.20250701.042623(fromapt)rmw_cycloneddsversion:1.3.4-1jammy.20250824.154929(fromapt)2.0.5-1jammy.20250701.031507(fromapt)