When running the VisualSlamNode with as composed in the same component container with e.g. the camera driver, it would be desirable to enable intra-process comms to enable transmitting the camera data more efficiently. However, this is not possible in the latest version v2.1.0, because there is apparently some topic with a transient local QoS included in the intra-process topics. Previously in 0.31.0-dp (which we just upgraded from) using intra-process comms worked.
I did not have time to thoroughly investigate which topic causes this, but I suspect the publisher to /tf_static (I did check most of the topics and everything that I saw had a volatile durability, while /tf_static obviously will have the transient local one). I am not sure why this node would need to publish static transforms, but if it is needed, it would be good to exclude it from the intra-process stuff.
For reference, here is how my launch of the node essentially looks like (this is part of a quite large launch file, so I'm leaving out some other nodes etc that are irrelevant for this issue):
def generate_launch_description():
visual_slam_node = ComposableNode(
name="visual_slam_node",
namespace="camera_1",
package="isaac_ros_visual_slam",
plugin="nvidia::isaac_ros::visual_slam::VisualSlamNode",
extra_arguments=[{"use_intra_process_comms": True}], # including this line breaks the launch
parameters=[
{
"denoise_input_images": False,
"rectified_images": True,
"enable_imu_fusion": False,
"enable_debug_mode": False,
"debug_dump_path": "/tmp/elbrus_1",
"enable_slam_visualization": False,
"enable_localization_n_mapping": False,
"enable_landmarks_view": False,
"enable_observations_view": False,
"publish_map_to_odom_tf": False,
"publish_odom_to_base_tf": False,
"map_frame": "map",
"odom_frame": "odom",
"base_frame": "base_link",
"input_base_frame": "base_link",
"input_left_camera_frame": "camera_1_infra1_frame",
"input_right_camera_frame": "camera_1_infra2_frame",
"input_imu_frame": "camera_1_imu_optical_frame",
}
],
)
cam_container = ComposableNodeContainer(
name="camera_1_container",
namespace="camera_1",
package="rclcpp_components",
executable="component_container", # it does not matter which container you use for this
emulate_tty=True,
composable_node_descriptions=[visual_slam_node],
output={"both": {"screen", "log", "own_log"}},
arguments=["--ros-args", "--log-level", "info"],
)
return LaunchDescription([cam_container])
Here are the relevant parts of the logs that I see when launching with the above setup. Note the error about intraprocess communication only being allowed with volatile durability.
[INFO] [component_container_isolated-1]: process started with pid [82]
[component_container_isolated-1] [INFO] [1704372041.453758765] [camera_1.camera_1_container]: Load Library: /karelics_workspace/karelics_brain/package_ws/install/isaac_ros_visual_slam/lib/libvisual_slam_node.so
[component_container_isolated-1] [INFO] [1704372041.767271885] [camera_1.camera_1_container]: Found class: rclcpp_components::NodeFactoryTemplate<nvidia::isaac_ros::visual_slam::VisualSlamNode>
[component_container_isolated-1] [INFO] [1704372041.767408176] [camera_1.camera_1_container]: Instantiate class: rclcpp_components::NodeFactoryTemplate<nvidia::isaac_ros::visual_slam::VisualSlamNode>
[ERROR] [launch_ros.actions.load_composable_nodes]: Failed to load node 'visual_slam_node' of type 'nvidia::isaac_ros::visual_slam::VisualSlamNode' in container '/camera_1/camera_1_container': Component constructor threw an exception: intraprocess communication allowed only with volatile durability
[component_container_isolated-1] [ERROR] [1704372043.184402808] [camera_1.camera_1_container]: Component constructor threw an exception: intraprocess communication allowed only with volatile durability
When running the VisualSlamNode with as composed in the same component container with e.g. the camera driver, it would be desirable to enable intra-process comms to enable transmitting the camera data more efficiently. However, this is not possible in the latest version v2.1.0, because there is apparently some topic with a transient local QoS included in the intra-process topics. Previously in 0.31.0-dp (which we just upgraded from) using intra-process comms worked.
I did not have time to thoroughly investigate which topic causes this, but I suspect the publisher to
/tf_static(I did check most of the topics and everything that I saw had a volatile durability, while/tf_staticobviously will have the transient local one). I am not sure why this node would need to publish static transforms, but if it is needed, it would be good to exclude it from the intra-process stuff.For reference, here is how my launch of the node essentially looks like (this is part of a quite large launch file, so I'm leaving out some other nodes etc that are irrelevant for this issue):
Here are the relevant parts of the logs that I see when launching with the above setup. Note the error about intraprocess communication only being allowed with volatile durability.