diff --git a/driver_mpu9250/src/ros_node.cpp b/driver_mpu9250/src/ros_node.cpp
index 2c26b76d749ef3458b46f26a2836fe85be87f949..5cc76d89901828fc8a9f6eedb212de1109efdfcd 100644
--- a/driver_mpu9250/src/ros_node.cpp
+++ b/driver_mpu9250/src/ros_node.cpp
@@ -67,6 +67,9 @@ ros_node::ros_node(driver *driver, int argc, char **argv)
         ros::shutdown();
     }
 
+    // Set up services.
+    ros_node::m_service_calibrate_gyroscope = ros_node::m_node->advertiseService("imu/calibrate_gyroscope", &ros_node::service_calibrate_gyroscope, this);
+
     // Perform initial gyroscope calibration.
     ros_node::calibrate_gyroscope(500);
 }
@@ -182,6 +185,11 @@ void ros_node::data_callback(driver::data data)
     message_gyro.x = static_cast<double>(data.gyro_x) * M_PI / 180.0;
     message_gyro.y = static_cast<double>(data.gyro_y) * M_PI / 180.0;
     message_gyro.z = static_cast<double>(data.gyro_z) * M_PI / 180.0;
+    // If gyroscope calibration is running, add uncalibrate data to window.
+    if(ros_node::f_gyroscope_calibrating)
+    {
+        ros_node::m_gyroscope_calibration_window.push_back({message_gyro.x, message_gyro.y, message_gyro.z});
+    }
     // Apply calibration.
     ros_node::m_calibration_gyroscope.calibrate(message_gyro.x, message_gyro.y, message_gyro.z);
     // Publish message.