Summary
When using Isaac Sim with ROS2 and robot_localization’s dual EKF, my robot’s odometry and IMU data appear correct when moving along the +X axis, but when the robot is rotated to face +Y and commanded to move forward, the /odometry/local (EKF output) shows the robot moving backwards in Y (i.e., in the -Y direction). The same command works as expected in +X.
System Details
-
Isaac Sim Version: 4.5.0-rc.36+release.19112
-
ROS2 Version: (please specify, e.g., Humble/Foxy)
-
OS: Ubuntu 22.04 (Linux 6.8.0-60-generic)
-
Robot URDF: Custom (four_wheel_robot.urdf, X+ forward, Y left, Z up)
-
Simulation Script: Custom Python (four_wheel_robot.py), publishes /odometry/wheel, /imu/data, /fix_sim (GPS), and TF
Topic Description
Detailed Description
I am using NVIDIA Isaac Sim with ROS2 and the robot_localization dual EKF to fuse wheel odometry, IMU, and GPS data. My robot’s odometry and IMU data appear correct when moving along the +X axis, but when I rotate the robot to face +Y and command it to move forward, the /odometry/local (EKF output) shows the robot moving backwards in Y (i.e., in the -Y direction). The same command works as expected in +X.
I expect that when the robot is facing +Y and I send a forward command, /odometry/local should increase in +Y, matching /odometry/wheel and the robot’s actual movement in Isaac Sim and RViz. Instead, it decreases in Y.
Steps to Reproduce
-
Launch Isaac Sim and load my robot (URDF: X+ forward, Y left, Z up).
-
Start my custom Python script (four_wheel_robot.py) that publishes /odometry/wheel, /imu/data, /fix_sim (GPS), and TF.
-
Start the robot_localization dual EKF node, fusing /odometry/wheel, /imu/data, and /fix_sim.
-
In RViz, face the robot in the +X direction and send a forward command—robot moves forward in +X as expected.
-
Rotate the robot to face +Y in RViz and send a forward command—robot moves in -Y (backwards) in /odometry/local, even though /odometry/wheel and /imu/data look correct.
Error Messages
N/A (no explicit error messages; the issue is with the direction of motion in the EKF output)
Additional Information
What I’ve Tried
-
Ensured all topics (odometry, IMU, GPS) use the same frame: X forward, Y right, Z up (matching Isaac Sim).
-
Removed all Y-axis flips and yaw inversions from the code so that ROS and Isaac Sim use the same convention.
-
Odometry publisher: msg.pose.pose.position and msg.twist.twist.linear are both published in the robot’s local frame; orientation quaternion is published as received from Isaac Sim (no correction).
-
IMU publisher: orientation and linear acceleration are published as received from Isaac Sim (no correction).
-
TF tree: all frames are consistent and match the odometry/IMU conventions.
-
EKF configuration: dual EKF is configured to fuse /odometry/wheel, /imu/data, and /fix_sim.
Additional Context
-
When facing +X and moving forward, everything works as expected.
-
When facing +Y and moving forward, /odometry/local goes negative in Y (backwards), even though /odometry/wheel and /imu/data look correct.
-
The robot’s orientation in RViz matches the simulation, but the fused EKF output is wrong in Y.
-
I am unsure if the velocity in odometry should be published in the world frame or the robot’s local frame for the EKF to work correctly.
-
I would appreciate any advice or examples from others who have solved this, or clarification on the correct conventions for Isaac Sim + ROS2 EKF integration.