How to calibrate a 6dof IMU

Hi, I am asking again for this problem. I didn't find any kind of library for my sensor. I have an Imu integrated inside an Arduino Uno wifi rev 2. It is an LSM6DS3 and it has an accelerometer and a gyroscope. The only task that I was able to do is to use this code, which allows me to see roll, pitch and yaw. This is the file.h: src/MadgwickAHRS.h

// LSM6DS3_Arduino_Rotation - LSM6DS3_Arduino_Rotation.ino
//
// Description:
// Retrieves motion data from the on-board LSM6DS3 IMU of the Arduino Uno WiFi
// Rev2 using the Arduino_LSM6DS3 library and displays rotation angles (roll,
// pitch, and yaw) in the Serial Monitor.
//
// Created by John Woolsey on 01/28/2020.
// Copyright (c) 2019 Woolsey Workshop.  All rights reserved.


// Includes
#include <Arduino_LSM6DS3.h>
#include <MadgwickAHRS.h>


// Defines
#define SAMPLE_RATE 10  // in Hz


// Constructors
Madgwick filter;  // Madgwick algorithm for roll, pitch, and yaw calculations


void setup() {
   Serial.begin(57600); 
   IMU.begin(); // initialize serial bus (Serial Monitor)

   filter.begin(SAMPLE_RATE);  // initialize Madgwick filter
}


void loop() {
   static unsigned long previousTime = millis();
   unsigned long currentTime = millis();
   if (currentTime - previousTime >= 1000/SAMPLE_RATE) {
      // printValues();
      printRotationAngles();
      previousTime = millis();
   }
}


// Prints IMU values.
void printValues() {
   char buffer[8];    // string buffer for use with dtostrf() function
   float ax, ay, az;  // accelerometer values
   float gx, gy, gz;  // gyroscope values

   // Retrieve and print IMU values
   if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable()
      && IMU.readAcceleration(ax, ay, az) && IMU.readGyroscope(gx, gy, gz)) {
//      Serial.print("ax = ");  Serial.print(dtostrf(ax, 4, 1, buffer));  Serial.print(" g, ");
//      Serial.print("ay = ");  Serial.print(dtostrf(ay, 4, 1, buffer));  Serial.print(" g, ");
//      Serial.print("az = ");  Serial.print(dtostrf(az, 4, 1, buffer));  Serial.print(" g, ");
//      Serial.print("gx = ");  Serial.print(dtostrf(gx, 7, 1, buffer));  Serial.print(" °/s, ");
//      Serial.print("gy = ");  Serial.print(dtostrf(gy, 7, 1, buffer));  Serial.print(" °/s, ");
//      Serial.print("gz = ");  Serial.print(dtostrf(gz, 7, 1, buffer));  Serial.println(" °/s");
   }
}


// Prints rotation angles (roll, pitch, and yaw) calculated using the
// Madgwick algorithm.
// Note: Yaw is relative, not absolute, based on initial starting position.
// Calculating a true yaw (heading) angle requires an additional data source,
// such as a magnometer.
void printRotationAngles() {
   char buffer[5];    // string buffer for use with dtostrf() function
   float ax, ay, az;  // accelerometer values
   float gx, gy, gz;  // gyroscope values

   if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable()
      && IMU.readAcceleration(ax, ay, az) && IMU.readGyroscope(gx, gy, gz)) {
      filter.updateIMU(gx, gy, gz, ax, ay, az);  // update roll, pitch, and yaw values

      // Print rotation angles
       Serial.print(dtostrf(filter.getRoll(), 4, 0, buffer)); //Serial.print("Roll = "); Serial.print(" °, ");
        Serial.print(dtostrf(filter.getPitch(), 4, 0, buffer)); //Serial.print("Pitch = ");Serial.print(" °, ");
     Serial.println(dtostrf(filter.getYaw(), 4, 0, buffer));   //Serial.print("Yaw = "); Serial.println(" °");
   }
}

By the way I can see a drift behaviour. This is the reason why of this post. Indeed, I would like to understand how is it possible to go from roll, pitch and yaw to a right orientation referred to a global system

The rate gyro is the source of the drift, and it must be calibrated.

Since the drift is temperature sensitive, the calibration will never be perfect. For a stable 3D orientation, you need a 9DOF sensor that includes a horizontal reference (e.g. magnetometer).

Is there a way to avoid the magnetometer and get the right instantaneus orientation of IMU referring to the ground system? I saw the direction cosine Matrix. Could It Be an alternative? By the way how can I calibrate a gyro? With the accelorometer i can take off the offset. But here, in the gyroscope of LSM6DS3?

Try searching with the phrase "calibrate gyro".

Is there a way to avoid the magnetometer

Any horizontal reference that can be sensed will serve.