diff --git a/src/shared/sensors/VN100/VN100Spi.cpp b/src/shared/sensors/VN100/VN100Spi.cpp
index 81184a37dc6f14955d28d3ec20984c2976e9ceea..752eda5fe8aac1ee8e30d4eb598b28dc6d2bb9ac 100644
--- a/src/shared/sensors/VN100/VN100Spi.cpp
+++ b/src/shared/sensors/VN100/VN100Spi.cpp
@@ -111,35 +111,83 @@ bool VN100Spi::selfTest()
 
 VN100Data VN100Spi::sampleImpl()
 {
-    // TODO
+    D(assert(isInit && "init() was not called"));
+
+    // Reset any errors.
+    lastError = SensorErrors::NO_ERRORS;
+
+    VN100Data data;
+    data.accelerationTimestamp  = TimestampTimer::getTimestamp();
+    data.angularSpeedTimestamp  = data.accelerationTimestamp;
+    data.magneticFieldTimestamp = data.accelerationTimestamp;
+    data.pressureTimestamp      = data.accelerationTimestamp;
+    data.quaternionTimestamp    = data.accelerationTimestamp;
+    data.temperatureTimestamp   = data.accelerationTimestamp;
 
-    return VN100Data();
+    if (!getImuSample(data))
+    {
+        // An error occurred while gathering data
+        lastError = NO_NEW_DATA;
+        return lastSample;
+    }
+
+    if (!getQuaternionSample(data))
+    {
+        // An error occurred while gathering data
+        lastError = NO_NEW_DATA;
+        return lastSample;
+    }
+
+    return data;
 }
 
-AccelerometerData VN100Spi::readAcc()
+bool VN100Spi::getImuSample(VN100Data& data)
 {
-    AccelerometerData data;
+    uint8_t buf[VN100SpiDefs::IMU_SAMPLE_SIZE];
 
-    const int REG_ID       = 18;
-    const int PAYLOAD_SIZE = 12;  // 3 float (4 bytes) values
-    uint8_t buf[PAYLOAD_SIZE];
+    if (readRegister(VN100SpiDefs::REG_IMU_DATA, buf,
+                     VN100SpiDefs::IMU_SAMPLE_SIZE) != 0)
+    {
+        // An error occurred while reading data
+        return false;
+    }
 
-    data.accelerationTimestamp = TimestampTimer::getTimestamp();
+    // Get measurements from raw data
+    uint32_t* ptr       = (uint32_t*)buf;
+    data.magneticFieldX = extractMeasurement(ptr[0]);
+    data.magneticFieldY = extractMeasurement(ptr[1]);
+    data.magneticFieldZ = extractMeasurement(ptr[2]);
+    data.accelerationX  = extractMeasurement(ptr[3]);
+    data.accelerationY  = extractMeasurement(ptr[4]);
+    data.accelerationZ  = extractMeasurement(ptr[5]);
+    data.angularSpeedX  = extractMeasurement(ptr[6]);
+    data.angularSpeedY  = extractMeasurement(ptr[7]);
+    data.angularSpeedZ  = extractMeasurement(ptr[8]);
+    data.temperature    = extractMeasurement(ptr[9]);
+    data.pressure       = extractMeasurement(ptr[10]);
+
+    return true;
+}
 
-    if (readRegister(REG_ID, buf, PAYLOAD_SIZE) != 0)
+bool VN100Spi::getQuaternionSample(VN100Data& data)
+{
+    uint8_t buf[VN100SpiDefs::QUATERNION_SAMPLE_SIZE];
+
+    if (readRegister(VN100SpiDefs::REG_QUATERNION_DATA, buf,
+                     VN100SpiDefs::QUATERNION_SAMPLE_SIZE) != 0)
     {
-        // An error occurred
-        lastError = NO_NEW_DATA;
-        return AccelerometerData();
+        // An error occurred while reading data
+        return false;
     }
 
     // Get measurements from raw data
-    uint32_t* ptr      = (uint32_t*)buf;
-    data.accelerationX = extractMeasurement(ptr[0]);
-    data.accelerationY = extractMeasurement(ptr[1]);
-    data.accelerationZ = extractMeasurement(ptr[2]);
+    uint32_t* ptr    = (uint32_t*)buf;
+    data.quaternionX = extractMeasurement(ptr[0]);
+    data.quaternionY = extractMeasurement(ptr[1]);
+    data.quaternionZ = extractMeasurement(ptr[2]);
+    data.quaternionW = extractMeasurement(ptr[3]);
 
-    return data;
+    return true;
 }
 
 float VN100Spi::extractMeasurement(uint32_t rawData)
diff --git a/src/shared/sensors/VN100/VN100Spi.h b/src/shared/sensors/VN100/VN100Spi.h
index f5a779c3ee4b585f5816594dff132ca9063cd1e4..1a0ddcf8b9286ad9fc742c697557f7838610ff48 100644
--- a/src/shared/sensors/VN100/VN100Spi.h
+++ b/src/shared/sensors/VN100/VN100Spi.h
@@ -63,9 +63,6 @@ public:
      */
     VN100Data sampleImpl() override;
 
-    // TODO: remove this, only for testing.
-    AccelerometerData readAcc();
-
 private:
     /**
      * @brief Check the model number register.
@@ -81,6 +78,25 @@ private:
      */
     void sendDummyPacket();
 
+    /**
+     * @brief Get accelerometer, gyroscope, magnetometer, pressure and
+     * temperature measurements from the sensor.
+     *
+     * @param data The variable where measurements will be stored.
+     *
+     * @return True if the operation is successful, false otherwise.
+     */
+    bool getImuSample(VN100Data& data);
+
+    /**
+     * @brief Get quaternion measurements from the sensor.
+     *
+     * @param data The variable where measurements will be stored.
+     *
+     * @return True if the operation is successful, false otherwise.
+     */
+    bool getQuaternionSample(VN100Data& data);
+
     /**
      * @brief Extracts floating point measurement from the data received from
      * the sensor.
diff --git a/src/shared/sensors/VN100/VN100SpiDefs.h b/src/shared/sensors/VN100/VN100SpiDefs.h
index 3c62836a3392e0d64072552dbd0b991b2fcb268a..64e8c86027811ec6870aa37a34fad96e8591b51b 100644
--- a/src/shared/sensors/VN100/VN100SpiDefs.h
+++ b/src/shared/sensors/VN100/VN100SpiDefs.h
@@ -33,7 +33,9 @@ namespace VN100SpiDefs
  */
 enum Registers
 {
-    REG_MODEL_NUMBER = 1,
+    REG_MODEL_NUMBER    = 1,
+    REG_QUATERNION_DATA = 9,
+    REG_IMU_DATA        = 54,
 };
 
 /**
@@ -48,13 +50,23 @@ enum Commands
 /**
  * @brief The expected model number to be red from the sensor.
  */
-const char* MODEL_NUMBER = "VN-100";
+const char* const MODEL_NUMBER = "VN-100";
 
 /**
  * @brief Size of the buffer used to retrieve the model number from the sensor.
  */
 const int MODEL_NUMBER_SIZE = 24;
 
+/**
+ * @brief Size of the buffer used to retrieve imu data from the sensor.
+ */
+const int IMU_SAMPLE_SIZE = 44;
+
+/**
+ * @brief Size of the buffer used to retrieve quaternion data from the sensor.
+ */
+const int QUATERNION_SAMPLE_SIZE = 16;
+
 }  // namespace VN100SpiDefs
 
 }  // namespace Boardcore
diff --git a/src/tests/sensors/test-vn100-spi.cpp b/src/tests/sensors/test-vn100-spi.cpp
index f517c44607485792914f4f30c5e4a55b47067ac7..4334c78f5d3e60b84c18ad96a7e36d60c1cca774 100644
--- a/src/tests/sensors/test-vn100-spi.cpp
+++ b/src/tests/sensors/test-vn100-spi.cpp
@@ -62,12 +62,22 @@ int main()
 
     for (int i = 0; i < 100; ++i)
     {
-        AccelerometerData data = sensor.readAcc();
+        // AccelerometerData data = sensor.readAcc();
+        sensor.sample();
+        VN100Data sample = sensor.getLastSample();
 
         printf("sample %d:\n", i + 1);
-        printf("AccX: %f\n", data.accelerationX);
-        printf("AccY: %f\n", data.accelerationY);
-        printf("AccZ: %f\n\n", data.accelerationZ);
+        printf("acc: %llu, %.3f, %.3f, %.3f\n", sample.accelerationTimestamp,
+               sample.accelerationX, sample.accelerationY,
+               sample.accelerationZ);
+        printf("ang: %.3f, %.3f, %.3f\n", sample.angularSpeedX,
+               sample.angularSpeedY, sample.angularSpeedZ);
+        printf("mag: %.3f, %.3f, %.3f\n", sample.magneticFieldX,
+               sample.magneticFieldY, sample.magneticFieldZ);
+        printf("quat: %.3f, %.3f, %.3f, %.3f\n", sample.quaternionX,
+               sample.quaternionY, sample.quaternionZ, sample.quaternionW);
+        printf("press: %.3f\n", sample.pressure);
+        printf("temp: %.3f\n\n", sample.temperature);
 
         Thread::sleep(500);
     }