diff --git a/rviz_default_plugins/CMakeLists.txt b/rviz_default_plugins/CMakeLists.txt
index 868184054..e09499914 100644
--- a/rviz_default_plugins/CMakeLists.txt
+++ b/rviz_default_plugins/CMakeLists.txt
@@ -66,11 +66,10 @@ if(${QT_VERSION} VERSION_LESS 5.15.0)
   endfunction()
 endif()
 
-find_package(geometry_msgs REQUIRED)
-
-find_package(gz_math_vendor REQUIRED)
-find_package(gz-math REQUIRED)
+find_package(eigen3_cmake_module REQUIRED)
+find_package(Eigen3 REQUIRED)
 
+find_package(geometry_msgs REQUIRED)
 find_package(image_transport REQUIRED)
 find_package(interactive_markers REQUIRED)
 find_package(laser_geometry REQUIRED)
@@ -278,7 +277,7 @@ target_link_libraries(rviz_default_plugins PUBLIC
 )
 
 target_link_libraries(rviz_default_plugins PRIVATE
-  gz-math::core
+  Eigen3::Eigen
 )
 
 # Causes the visibility macros to use dllexport rather than dllimport,
diff --git a/rviz_default_plugins/package.xml b/rviz_default_plugins/package.xml
index b8353775c..11dbad18e 100644
--- a/rviz_default_plugins/package.xml
+++ b/rviz_default_plugins/package.xml
@@ -25,9 +25,11 @@
   William Woodall
 
   ament_cmake_ros
+  eigen3_cmake_module
 
   qtbase5-dev
   rviz_ogre_vendor
+  eigen
 
   rviz_ogre_vendor
 
@@ -38,7 +40,6 @@
   rviz_ogre_vendor
 
   geometry_msgs
-  gz_math_vendor
   image_transport
   interactive_markers
   laser_geometry
diff --git a/rviz_default_plugins/src/rviz_default_plugins/robot/robot_link.cpp b/rviz_default_plugins/src/rviz_default_plugins/robot/robot_link.cpp
index f84d4b306..5da0920c2 100644
--- a/rviz_default_plugins/src/rviz_default_plugins/robot/robot_link.cpp
+++ b/rviz_default_plugins/src/rviz_default_plugins/robot/robot_link.cpp
@@ -52,11 +52,8 @@
 #include   // NOLINT cpplint cannot handle include order here
 #include   // NOLINT: cpplint is unable to handle the include order here
 
-#include 
-#include 
-#include 
-#include 
-#include 
+#include   // NOLINT cpplint cannot handle include order here
+#include   // NOLINT cpplint cannot handle include order here
 
 #include "resource_retriever/retriever.hpp"
 
@@ -880,46 +877,55 @@ void RobotLink::createMass(const urdf::LinkConstSharedPtr & link)
 
 void RobotLink::createInertia(const urdf::LinkConstSharedPtr & link)
 {
-  if (link->inertial) {
-    const gz::math::Vector3d i_xx_yy_zz(
-      link->inertial->ixx,
-      link->inertial->iyy,
-      link->inertial->izz);
-    const gz::math::Vector3d Ixyxzyz(
-      link->inertial->ixy,
+  if (!link->inertial) {
+    return;
+  }
+
+  const Eigen::Matrix3d inertia{(Eigen::Matrix3d{} << link->inertial->ixx, link->inertial->ixy,
       link->inertial->ixz,
-      link->inertial->iyz);
-    gz::math::MassMatrix3d mass_matrix(link->inertial->mass, i_xx_yy_zz, Ixyxzyz);
-
-    gz::math::Vector3d box_scale;
-    gz::math::Quaterniond box_rot;
-    if (!mass_matrix.EquivalentBox(box_scale, box_rot)) {
-      // Invalid inertia, load with default scale
-      if (link->parent_joint && link->parent_joint->type != urdf::Joint::FIXED) {
-        // Do not show error message for base link or static links
-        RVIZ_COMMON_LOG_ERROR_STREAM(
-          "The link " << link->name << " has unrealistic "
-            "inertia, so the equivalent inertia box will not be shown.\n");
-      }
-      return;
+      link->inertial->ixy, link->inertial->iyy, link->inertial->iyz,
+      link->inertial->ixz, link->inertial->iyz, link->inertial->izz).finished()};
+  const Eigen::SelfAdjointEigenSolver eigen_solver{inertia};
+  if (link->inertial->mass <= 0 || link->inertial->ixx <= 0 ||
+    link->inertial->ixx * link->inertial->iyy - std::pow(link->inertial->ixy, 2) <= 0 ||
+    inertia.determinant() <= 0 || eigen_solver.info() != Eigen::ComputationInfo::Success)
+  {
+    // Invalid inertia, load with default scale
+    if (link->parent_joint && link->parent_joint->type != urdf::Joint::FIXED) {
+      // Do not show error message for base link or static links
+      RVIZ_COMMON_LOG_ERROR_STREAM(
+        "The link " << link->name << " has unrealistic "
+          "inertia, so the equivalent inertia box will not be shown.\n");
     }
-    Ogre::Vector3 translate(
-      link->inertial->origin.position.x,
-      link->inertial->origin.position.y,
-      link->inertial->origin.position.z);
-
-    double x, y, z, w;
-    link->inertial->origin.rotation.getQuaternion(x, y, z, w);
-    Ogre::Quaternion originRotate(w, x, y, z);
-
-    Ogre::Quaternion rotate(box_rot.W(), box_rot.X(), box_rot.Y(), box_rot.Z());
-    Ogre::SceneNode * offset_node = inertia_node_->createChildSceneNode(
-      translate, originRotate * rotate);
-    inertia_shape_ = new Shape(Shape::Cube, scene_manager_, offset_node);
-
-    inertia_shape_->setColor(1, 0, 0, 1);
-    inertia_shape_->setScale(Ogre::Vector3(box_scale.X(), box_scale.Y(), box_scale.Z()));
-  }
+    return;
+  }
+
+  const Eigen::Vector3d & eigen_values{eigen_solver.eigenvalues()};
+  Eigen::Vector3d box_size{(eigen_values.y() + eigen_values.z() - eigen_values.x()),
+    (eigen_values.x() + eigen_values.z() - eigen_values.y()),
+    (eigen_values.x() + eigen_values.y() - eigen_values.z())};
+  box_size = (6 / link->inertial->mass * box_size).cwiseSqrt();
+  const Eigen::Vector3f box_size_float{box_size.cast()};
+
+  const Eigen::Quaternionf box_rotation_eigen{
+    Eigen::Quaterniond{eigen_solver.eigenvectors()}.cast()};
+  const Ogre::Quaternion box_rotation{box_rotation_eigen.w(), box_rotation_eigen.x(),
+    box_rotation_eigen.y(), box_rotation_eigen.z()};
+
+  const urdf::Pose & pose{link->inertial->origin};
+  const Ogre::Vector3 translation{static_cast(pose.position.x),
+    static_cast(pose.position.y),
+    static_cast(pose.position.z)};
+  const Ogre::Quaternion origin_rotation{static_cast(pose.rotation.w),
+    static_cast(pose.rotation.x), static_cast(pose.rotation.y),
+    static_cast(pose.rotation.z)};
+  const Ogre::Quaternion rotation{origin_rotation * box_rotation};
+  const Ogre::Vector3 scale{box_size_float.x(), box_size_float.y(), box_size_float.z()};
+
+  Ogre::SceneNode * offset_node = inertia_node_->createChildSceneNode(translation, rotation);
+  inertia_shape_ = new Shape(Shape::Cube, scene_manager_, offset_node);
+  inertia_shape_->setColor(1, 0, 0, 1);
+  inertia_shape_->setScale(scale);
 }
 
 void RobotLink::createSelection()