VEX Inertial Sensor C++ API

Note

pros::IMU can also be used to refer to pros::Imu

pros::Imu

Constructor(s)

pros::Imu(const std::uint8_t port)
1
2
3
4
5
6
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}
Parameters  
port The V5 port number from 1-21

Functions

reset

Calibrate IMU.

This takes approximately 2 seconds, and is blocking until the IMU status is set properly if “blocking” is false (by default). By default, this function will only block until IMU status is set, and not blocking while the IMU is resetting if “blocking” is false.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
std::int32_t reset(bool blocking = false)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  int time = pros::millis();
  int iter = 0;
  while (imu_sensor.is_calibrating()) {
    printf("IMU calibrating... %d\n", iter);
    iter += 10;
    pros::delay(10);
  }
  /*
    to avoid the while loop use this:
    imu_sensor.reset(true);
    (the print statement below won't print right value if this was used)
  */

  // should print about 2000 ms
  printf("IMU is done calibrating (took %d ms)\n", iter - time);
}
Parameters  
blocking If true, the function is blocking during the reset phase. (optional, will be false by default)

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


get_rotation

Get the total number of degrees the Inertial Sensor has spun about the z-axis.

This value is theoretically unbounded. Clockwise rotations are represented with positive degree values, while counterclockwise rotations are represented with negative ones.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
double get_rotation( )
1
2
3
4
5
6
7
8
9
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
                printf("IMU get rotation: %f degrees\n", imu_sensor.get_rotation());
                pros::delay(20);
  }
}

Returns: The degree value or PROS_ERR_F if the operation failed, setting errno.


get_heading

Get the Inertial Sensor’s heading relative to the initial direction of its x-axis.

This value is bounded by [0,360). Clockwise rotations are represented with positive degree values, while counterclockwise rotations are represented with negative ones.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
double get_heading ( )
1
2
3
4
5
6
7
8
9
#define IMU_PORT 1

void opcontrol() {
  while (true) {
        pros::Imu imu_sensor(IMU_PORT);
                printf("IMU get heading: %f degrees\n", imu_sensor.get_heading());
                pros::delay(20);
  }
}

Returns: The degree value or PROS_ERR_F if the operation failed, setting errno.


get_quaternion

Get a quaternion representing the Inertial Sensor’s orientation.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
pros::c::quaternion_s_t get_quaternion( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
                pros::c::quaternion_s_t qt = imu_sensor.get_quaternion();
                printf("IMU quaternion: {x: %f, y: %f, z: %f, w: %f}\n", qt.x, qt.y, qt.z, qt.w);
                pros::delay(20);
  }
}

Returns: The quaternion representing the sensor’s orientation. If the operation failed, all the quaternion’s members are filled with PROS_ERR_F and errno is set.


get_euler

Get the Euler angles representing the Inertial Sensor’s orientation.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
pros::c::euler_s_t get_euler( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
                pros::c::euler_s_t eu = imu_sensor.get_euler();
          printf("IMU euler angles: {pitch: %f, roll: %f, yaw: %f}\n", eu.pitch, eu.roll, eu.yaw);
                pros::delay(20);
  }
}

Returns: The Euler angles representing the sensor’s orientation. If the operation failed, all the structure’s members are filled with PROS_ERR_F and errno is set.


get_pitch

Get the Inertial Sensor’s pitch angle bounded by (-180,180).

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
double get_pitch( )
1
2
3
4
5
6
7
8
9
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
                printf("IMU pitch: %f\n", imu_sensor.get_pitch());
                pros::delay(20);
  }
}

Returns: The pitch angle, or PROS_ERR_F if the operation failed, setting errno.


get_roll

Get the Inertial Sensor’s roll angle bounded by (-180,180).

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
double get_roll ( )
1
2
3
4
5
6
7
8
9
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
    printf("IMU roll: %f\n", imu_sensor.get_roll());
                pros::delay(20);
  }
}

Returns: The roll angle, or PROS_ERR_F if the operation failed, setting errno.


get_yaw

Get the Inertial Sensor’s yaw angle bounded by (-180,180).

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
double get_yaw ( )
1
2
3
4
5
6
7
8
9
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
                printf("IMU yaw: %f\n", imu_sensor.get_yaw());
                pros::delay(20);
  }
}

Returns: The yaw angle, or PROS_ERR_F if the operation failed, setting errno.


get_gyro_rate

Get the Inertial Sensor’s raw gyroscope values.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
pros::c::imu_gyro_s_t get_gyro_rate( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
                pros::c::imu_gyro_s_t gyro = imu_sensor.get_gyro_rate();
                printf("IMU gyro values: {x: %f, y: %f, z: %f}\n", gyro.x, gyro.y, gyro.z);
                pros::delay(20);
  }
}

Returns: The raw gyroscope values. If the operation failed, all the structure’s members are filled with PROS_ERR_F and errno is set.


tare_rotation

Resets the current reading of the Inertial Sensor’s rotation to zero.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t tare_rotation( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
}

void opcontrol() {
  int time = pros::millis();
  int iter = 0;
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::tare_rotation(IMU_PORT);
    }
    pros::delay(20);
  }
}

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


tare_heading

Resets the current reading of the Inertial Sensor’s heading to zero.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t tare_heading( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  int time = pros::millis();
  int iter = 0;
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::tare_heading(IMU_PORT);
    }
    pros::delay(20);
  }
}

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


tare_pitch

Resets the current reading of the Inertial Sensor’s pitch to zero.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t tare_pitch( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  int time = pros::millis();
  int iter = 0;
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::tare_pitch(IMU_PORT);
    }
    pros::delay(20);
  }
}

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


tare_yaw

Resets the current reading of the Inertial Sensor’s yaw to zero.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t tare_yaw( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  int time = pros::millis();
  int iter = 0;
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::tare_yaw(IMU_PORT);
    }
    pros::delay(20);
  }
}

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


tare_roll

Resets the current reading of the Inertial Sensor’s roll to zero.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t tare_roll( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  int time = pros::millis();
  int iter = 0;
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::tare_roll(IMU_PORT);
    }
    pros::delay(20);
  }
}

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


tare

Resets all 5 values of the Inertial Sensor to 0.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t tare( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::tare(IMU_PORT);
    }
    pros::delay(20);
  }
}

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


tare_euler

Reset all 3 euler values of the Inertial Sensor to 0.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t tare_euler( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu::tare(IMU_PORT);
    }
  }
  pros::delay(20);
}

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


set_heading

Sets the current reading of the Inertial Sensor’s heading to target value. Target will default to 360 if above 360 and default to 0 if below 0.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
std::int32_t set_heading(const double target)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::set_heading(IMU_PORT,45);
    }
    pros::delay(20);
  }
}
Parameters  
port The V5 port number from (1-21)
target The target value for the heading value to be set to.

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


set_rotation

Sets the current reading of the Inertial Sensor’s rotation to target value.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t set_rotation(const double target)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::set_rotation(IMU_PORT,45);
    }
    pros::delay(20);
  }
}
Parameters  
port The V5 port number from (1-21)
target The target value for the rotation value to be set to.

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


set_yaw

Sets the current reading of the Inertial Sensor’s yaw to target value. Will default to +/- 180 if target exceeds +/- 180.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t set_yaw(const double target)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::set_yaw(IMU_PORT,45);
    }
    pros::delay(20);
  }
}
Parameters  
port The V5 port number from (1-21)
target The target value for yaw value to be set to.

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


set_pitch

Sets the current reading of the Inertial Sensor’s pitch to target value.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t set_pitch(const double target )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::set_pitch(IMU_PORT,45);
    }
    pros::delay(20);
  }
}
Parameters  
port The V5 port number from (1-21)
target The target value for the pitch value to be set to.

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


set_roll

Sets the current reading of the Inertial Sensor’s roll to target value. Will default to +/- 180 if target exceeds +/- 180.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t set_roll(const double target )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::set_roll(IMU_PORT,45);
    }
    pros::delay(20);
  }
}
Parameters  
port The V5 port number from (1-21)
target The target value for the roll to be set to.

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


set_euler

Sets the current reading of the Inertial Sensor’s euler values to target euler values. Will default to +/- 180 if target exceeds +/- 180.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is still calibrating.
std::int32_t set_euler(const pros::c::euler_s_t target )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor(IMU_PORT);
  imu_sensor.reset();
}

void opcontrol() {
  while (true) {
    if(controller_get_digital(CONTROLLER_MASTER, E_CONTROLLER_DIGITAL_X)){
      imu_sensor::set_euler(IMU_PORT,{45,45,45});
    }
    pros::delay(20);
  }
}
Parameters  
port The V5 port number from (1-21)
target The target euler values for the euler values to be set to.

Returns: 1 if the operation was successful or PROS_ERR if the operation failed, setting errno.


get_accel

Get the Inertial Sensor’s raw accelerometer values.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
  • EAGAIN - The sensor is already calibrating.
pros::c::imu_gyro_s_t get_accel( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#define IMU_PORT 1

void opcontrol() {
  pros::Imu imu_sensor(IMU_PORT);
  while (true) {
                pros::c::imu_accel_s_t accel = imu_sensor.get_accel();
                printf("IMU accel values: {x: %f, y: %f, z: %f}\n", accel.x, accel.y, accel.z);
                pros::delay(20);
  }
}

Returns: The raw accelerometer values. If the operation failed, all the structure’s members are filled with PROS_ERR_F and errno is set.


get_status

Get the Inertial Sensor’s status.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
pros::c::imu_status_e_t get_status( )
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#define IMU_PORT 1

void initialize() {
        pros::Imu imu_sensor (IMU_PORT);
        imu_sensor.reset();
}

void opcontrol() {
        int time = pros::millis();
        int iter = 0;
        while (imu_sensor.get_status() & pros::c::E_IMU_STATUS_CALIBRATING) {
                printf("IMU calibrating... %d\n", iter);
                iter += 10;
                pros::delay(10);
        }
  // should print about 2000 ms
  printf("IMU is done calibrating (took %d ms)\n", iter - time);
}

Returns: The Inertial Sensor’s status code, or PROS_ERR if the operation failed, setting errno.


get_physical_orientation

Get the Inertial Sensor’s physical orientation.

This function uses the following values of errno when an error state is reached:

  • ENXIO - The given value is not within the range of V5 ports (1-21).
  • ENODEV - The port cannot be configured as an Inertial Sensor.
pros::c::imu_orientation_e_t get_physical_orientation( )
1
2
3
4
5
6
7
#define IMU_PORT 1

void initialize() {
        pros::Imu imu_sensor (IMU_PORT);
        imu_sensor.reset();
        printf("IMU Orinetation %d", imu_sensor.get_physical_orientation());
}

Returns: The Inertial Sensor’s physical orientation, or PROS_ERR if the operation failed, setting errno.

is_calibrating

Check whether the IMU is calibrating

bool is_calibrating( )
1
2
3
4
5
6
7
8
#define IMU_PORT 1

void initialize() {
  pros::Imu imu_sensor (IMU_PORT);
  if(imu_sensor.is_calibrating()){
    printf("imu_sensor is calibrating");
  }
}

Returns: true if the if the V5 Inertial Sensor is calibrating or false if it is not.