Isaac sim zed camera integration with goal to implement navigation ROS2

Help Needed: TF Issues with ZED Camera Integration in Isaac Sim

Hi everyone,

I’m working on a robotics project where I imported a robot model into Isaac Sim using the Onshape CAD importer (.usdc format). I’m now trying to integrate the ZED camera for navigation.

What’s working:

  • ZED ROS 2 wrapper is installed and running.
  • Isaac Sim streamer node is added.
  • I can successfully visualize stereo images and point cloud in RViz.
  • I’ve followed the available documentation and community examples.

The problem: The main issue starts when I try to use Nav2 for navigation. In RViz, I see TF flickering between the robot and the ZED camera.

TF Conflict:

  • Isaac Sim creates a correct TF chain: odom → base_link → robot parts.
  • But the ZED wrapper adds its own TF frames (like camera_center, zed_camera_left_frame) that appear to float in space.
  • These frames are not part of my robot’s USD file and there are no matching xform prims in the ZED USD provided by Stereolabs — but they are still published by the wrapper also can be seen in the launch file .

This leads to conflicts in the TF tree, causing flickering in RViz and unstable behavior in Nav2.

What I want:

  • I don’t want to rebuild the robot using URDF or XACRO.
  • I just want to:
    • Attach the ZED camera properly under base_link in Isaac Sim.
    • Make sure the TF tree is clean and consistent: odom → base_link → zed_camera_link.

I’ve tried:

  • Disabling TF broadcasting from the ZED wrapper.
  • Manually editing the ZED launch file and adding base_link as a parent in urfd_des.urdf.xacro under the wrapper
  • Turning off map → odom transform.(as nav2 AMCL will create this )

odom to base link isaac sim action graoh will do it

Still, I see invalid or duplicate TFs in RViz. I’m sure I followed the documentation carefully, but something’s still off.

My Questions: Has anyone faced similar TF problems when integrating the ZED camera in Isaac Sim (especially with Onshape-exported models)?

Can anyone suggest:

  • How to disable or remap the TFs published by the ZED wrapper?
  • How to ensure the ZED camera is correctly attached to the robot body in the TF tree?
  • How to verify in RViz that all TF joints are properly connected to base_link?

Any help or tips would be greatly appreciated. Thank you!

tried to add base_link(i expect the base_link of my_robot not any others) in zed_desc.urdf

<robot name="stereolabs_camera" xmlns:xacro="http://ros.org/wiki/xacro">
  <!-- Arguments -->
  <xacro:arg name="camera_name" default="zed" />
  <xacro:arg name="camera_model" default="zed" />
  <xacro:arg name="custom_baseline" default="0.0" />
  <xacro:arg name="enable_gnss" default="false" />
  <xacro:arg name="gnss_x" default="0.0" />
  <xacro:arg name="gnss_y" default="0.0" />
  <xacro:arg name="gnss_z" default="0.0" />
  <xacro:arg name="use_zed_localization" default="false" />

  <!-- Include ZED camera macro -->
  <xacro:include filename="$(find zed_wrapper)/urdf/zed_macro.urdf.xacro" />

  <!-- Instantiate the camera -->
  <xacro:zed_camera 
      name="$(arg camera_name)" 
      model="$(arg camera_model)" 
      custom_baseline="$(arg custom_baseline)" 
      enable_gnss="$(arg enable_gnss)">
    <origin xyz="$(arg gnss_x) $(arg gnss_y) $(arg gnss_z)" rpy="0 0 0"/>
  </xacro:zed_camera>

  <!-- Add joint connecting camera to base_link -->
  <xacro:if value="$(arg use_zed_localization)">
    <joint name="$(arg camera_name)_joint" type="fixed">
      <parent link="$(arg camera_name)_camera_link"/>
      <child link="base_link"/>
      <origin xyz="-0.12 0.0 -0.25" rpy="0 0 0"/>
    </joint>
  </xacro:if>

  <xacro:unless value="$(arg use_zed_localization)">
    <joint name="$(arg camera_name)_joint" type="fixed">
      <parent link="base_link"/>
      <child link="$(arg camera_name)_camera_link"/>
      <origin xyz="0.12 0.0 0.25" rpy="0 0 0"/>
    </joint>
  </xacro:unless>

</robot>

set this parameters in common_stero.yaml

pos_tracking:
            pos_tracking_enabled: true # True to enable positional tracking from start
            pos_tracking_mode: 'GEN_1' # Matches the ZED SDK setting: 'GEN_1', 'GEN_2'
            imu_fusion: false # enable/disable IMU fusion. When set to false, only the optical odometry will be used.
            publish_tf: false or true tried both # [overwritten by launch file options] publish `odom -> camera_link` TF
            publish_map_tf: false # [overwritten by launch file options] publish `map -> odom` TF
            map_frame: 'map'
            odometry_frame: 'odom'
            area_memory_db_path: ''

in launch file added this


  xacro_command.append(' ')
    xacro_command.append('use_zed_localization:=')
    xacro_command.append(use_zed_localization.perform(context))




'publish_urdf',
                default_value='true',
                description='Enable URDF processing and starts Robot State Published to propagate static TF.',
                choices=['true', 'false']),
            DeclareLaunchArgument(
                'publish_tf',
                default_value='true or false doesnt give the camera loction , ',
                description='Enable publication of the `odom -> camera_link` TF.',
                choices=['true', 'false']),
            DeclareLaunchArgument(
                'publish_map_tf',
                default_value='false',
                description='Enable publication of the `map -> odom` expect from nav2 launch

Hi @DevadasVijayanSheela
Welcome to the Stereolabs community.

The reasons of this problem are well explained in the tutorial that you linked.

If you want to use localization nodes from Nav2 you must set the use_zed_localization option to FALSE.

Nothing else is required.