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