matthewflynn_
matthewflynn_
DIIDevHeads IoT Integration Server
Created by matthewflynn_ on 10/10/2024 in #code-review
.Net Class for Invensnese ICM-20948
where
private double CalculatePitch(Vector3 acceleration) =>
Math.Atan2(acceleration.X, Math.Sqrt(acceleration.Y * acceleration.Y + acceleration.Z * acceleration.Z)) * (180.0 / Math.PI);

private double CalculateRoll(Vector3 acceleration) =>
Math.Atan2(acceleration.Y, Math.Sqrt(acceleration.X * acceleration.X + acceleration.Z * acceleration.Z)) * (180.0 / Math.PI);

private double CalculateYaw(Vector3 angularVelocity, double deltaTime, ref double previousYaw)
{
previousYaw += angularVelocity.Z * deltaTime;
return previousYaw;
}
private double CalculatePitch(Vector3 acceleration) =>
Math.Atan2(acceleration.X, Math.Sqrt(acceleration.Y * acceleration.Y + acceleration.Z * acceleration.Z)) * (180.0 / Math.PI);

private double CalculateRoll(Vector3 acceleration) =>
Math.Atan2(acceleration.Y, Math.Sqrt(acceleration.X * acceleration.X + acceleration.Z * acceleration.Z)) * (180.0 / Math.PI);

private double CalculateYaw(Vector3 angularVelocity, double deltaTime, ref double previousYaw)
{
previousYaw += angularVelocity.Z * deltaTime;
return previousYaw;
}
6 replies
DIIDevHeads IoT Integration Server
Created by matthewflynn_ on 10/10/2024 in #code-review
.Net Class for Invensnese ICM-20948
Also when getting the data i now get a sample of 10 values
public async Task<AccelerometerData> GetDataAsync()
{
if (_icm20948 == null)
{
throw new InvalidOperationException("ICM20948 is not initialized.");
}

int numReadings = 10;

Vector3 accelTotal = new Vector3(0, 0, 0);
Vector3 gyroTotal = new Vector3(0, 0, 0);

for (int i = 0; i < numReadings; i++)
{
var acceleration = _icm20948.GetAccelerometer();
var angularVelocity = _icm20948.GetGyroscope();

accelTotal += acceleration;
gyroTotal += angularVelocity;

await Task.Delay(10); // Small delay between readings
}

Vector3 accelAverage = accelTotal / numReadings;
Vector3 gyroAverage = gyroTotal / numReadings;

var pitch = CalculatePitch(accelAverage);
var roll = CalculateRoll(accelAverage);

var currentTime = DateTime.Now;
var deltaTime = (currentTime - _lastUpdate).TotalSeconds;
_lastUpdate = currentTime;

_previousYaw += gyroAverage.Z * deltaTime;
var yaw = _previousYaw;

_logger.LogInformation($"Data from ICM20948 is Pitch:{pitch}, Roll:{roll}, Yaw:{yaw}.");

return new AccelerometerData
{
Pitch = pitch,
Roll = roll,
Yaw = yaw
};
}
public async Task<AccelerometerData> GetDataAsync()
{
if (_icm20948 == null)
{
throw new InvalidOperationException("ICM20948 is not initialized.");
}

int numReadings = 10;

Vector3 accelTotal = new Vector3(0, 0, 0);
Vector3 gyroTotal = new Vector3(0, 0, 0);

for (int i = 0; i < numReadings; i++)
{
var acceleration = _icm20948.GetAccelerometer();
var angularVelocity = _icm20948.GetGyroscope();

accelTotal += acceleration;
gyroTotal += angularVelocity;

await Task.Delay(10); // Small delay between readings
}

Vector3 accelAverage = accelTotal / numReadings;
Vector3 gyroAverage = gyroTotal / numReadings;

var pitch = CalculatePitch(accelAverage);
var roll = CalculateRoll(accelAverage);

var currentTime = DateTime.Now;
var deltaTime = (currentTime - _lastUpdate).TotalSeconds;
_lastUpdate = currentTime;

_previousYaw += gyroAverage.Z * deltaTime;
var yaw = _previousYaw;

_logger.LogInformation($"Data from ICM20948 is Pitch:{pitch}, Roll:{roll}, Yaw:{yaw}.");

return new AccelerometerData
{
Pitch = pitch,
Roll = roll,
Yaw = yaw
};
}
6 replies
DIIDevHeads IoT Integration Server
Created by matthewflynn_ on 10/10/2024 in #code-review
.Net Class for Invensnese ICM-20948
I have added in bandwidth testing as well, so when setting up I am effectively calling;
var i2cSettings = new I2cConnectionSettings(i2cBusId, i2cAddress);
var i2cDevice = I2cDevice.Create(i2cSettings);
_icm20948 = new Icm20948(i2cDevice); // Initialize the ICM20948

// Set bandwidth for accelerometer and gyroscope
var result = _icm20948.FindOptimalBandwidthAsync().Result;

_icm20948.SetBandwidth(result.bestBandwidth, result.bestBandwidth);
var i2cSettings = new I2cConnectionSettings(i2cBusId, i2cAddress);
var i2cDevice = I2cDevice.Create(i2cSettings);
_icm20948 = new Icm20948(i2cDevice); // Initialize the ICM20948

// Set bandwidth for accelerometer and gyroscope
var result = _icm20948.FindOptimalBandwidthAsync().Result;

_icm20948.SetBandwidth(result.bestBandwidth, result.bestBandwidth);
6 replies
DIIDevHeads IoT Integration Server
Created by matthewflynn_ on 10/10/2024 in #code-review
.Net Class for Invensnese ICM-20948
I have updated my class with the following tweaks to the calibration: 1. Median adjustments 2. Moving average adjustments 3. low pass filter adjustments
6 replies
DIIDevHeads IoT Integration Server
Created by matthewflynn_ on 10/10/2024 in #code-review
.Net Class for Invensnese ICM-20948
Also here is a copy of the sample data I have.
6 replies