From bae11bfc22cce35659eac5563a4fb802bdcd6924 Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Sun, 28 Jul 2019 19:14:10 +0100 Subject: [PATCH 1/4] adding roll pitch yaw example, including processing.org sketch --- examples/RollPitchYaw/RollPitchYaw.ino | 157 +++++++++++++++++++++++ examples/RollPitchYaw/RollPitchYaw3d.pde | 128 ++++++++++++++++++ examples/RollPitchYaw/RollPitchYaw3d.png | Bin 0 -> 94234 bytes 3 files changed, 285 insertions(+) create mode 100644 examples/RollPitchYaw/RollPitchYaw.ino create mode 100644 examples/RollPitchYaw/RollPitchYaw3d.pde create mode 100644 examples/RollPitchYaw/RollPitchYaw3d.png diff --git a/examples/RollPitchYaw/RollPitchYaw.ino b/examples/RollPitchYaw/RollPitchYaw.ino new file mode 100644 index 0000000..3439714 --- /dev/null +++ b/examples/RollPitchYaw/RollPitchYaw.ino @@ -0,0 +1,157 @@ +/** + * What is this file? + * This is an arduino example that calculates accurate roll,pitch,yaw from raw gyro/accelerometer data + * It has a calibration stage which removes most of the gyro drift and a complementary filter + * that combines gyro and accelerometer angles to produce roll/pitch angles that don't drift (like the gyro angle) and aren't noisy + * (like the accel angles). As there is no magnetic compass on the nano iot 33, it's not possible to 'complement' the yaw + * - hence yaw will drift and is 'relative'. + */ +#include +#include + +float accelX, accelY, accelZ, // units m/s/s i.e. accelZ if often 9.8 (gravity) + gyroX, gyroY, gyroZ, // units dps (degrees per second) + gyroDriftX, gyroDriftY, gyroDriftZ, // units dps + gyroRoll, gyroPitch, gyroYaw, // units degrees (expect major drift) + gyroCorrectedRoll, gyroCorrectedPitch, gyroCorrectedYaw, // units degrees (expect minor drift) + accRoll, accPitch, accYaw, // units degrees (roll and pitch noisy, yaw not possible) + complementaryRoll, complementaryPitch, complementaryYaw; // units degrees (excellent roll, pitch, yaw minor drift) + +long lastTime; +long lastInterval; + +void setup() { + + Serial.begin(1000000); + pinMode(LED_BUILTIN, OUTPUT); + + // this sketch will wait until something connects to serial! + // this could be 'arduino monitor', 'arduino plotter' or 'processing.org P3D client (see pde file)' + while (!Serial); + + if (!IMU.begin()) { + Serial.println("Failed to initialize IMU!"); + while (1); + } + + calibrateIMU(250, 250); + + lastTime = micros(); + +} + +/* + the gyro's x,y,z values drift by a steady amount. if we measure this when arduino is still + we can correct the drift when doing real measurements later +*/ +void calibrateIMU(int delayMillis, int calibrationMillis) { + + int calibrationCount = 0; + + delay(delayMillis); // to avoid shakes after pressing reset button + + float sumX, sumY, sumZ; + int startTime = millis(); + while (millis() < startTime + calibrationMillis) { + if (readIMU()) { + // in an ideal world gyroX/Y/Z == 0, anything higher or lower represents drift + sumX += gyroX; + sumY += gyroY; + sumZ += gyroZ; + + calibrationCount++; + } + } + + if (calibrationCount == 0) { + Serial.println("Failed to calibrate"); + } + + gyroDriftX = sumX / calibrationCount; + gyroDriftY = sumY / calibrationCount; + gyroDriftZ = sumZ / calibrationCount; + +} + +/** + * Read accel and gyro data. + * returns true if value is 'new' and false if IMU is returning old cached data + */ +bool readIMU() { + if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable() ){ + IMU.readAcceleration(accelX, accelY, accelZ); + IMU.readGyroscope(gyroX, gyroY, gyroZ); + return true; + } + return false; +} + +// the loop function runs over and over again forever +void loop() { + + if (readIMU()) { + long currentTime = micros(); + lastInterval = currentTime - lastTime; // expecting this to be ~104Hz +- 4% + lastTime = currentTime; + + doCalculations(); + printCalculations(); + + } + +} + +/** + * I'm expecting, over time, the Arduino_LSM6DS3.h will add functions to do most of this, + * but as of 1.0.0 this was missing. + */ +void doCalculations() { + accRoll = atan2(accelY, accelZ) * 180/M_PI; + accPitch = atan2(-accelX, sqrt(accelY*accelY + accelZ*accelZ)) * 180/M_PI; + + float lastFrequency = 1000000 / lastInterval; + gyroRoll = gyroRoll + (gyroX/lastFrequency); + gyroPitch = gyroPitch + (gyroY/lastFrequency); + gyroYaw = gyroYaw + (gyroZ/lastFrequency); + + gyroCorrectedRoll = gyroCorrectedRoll + ((gyroX - gyroDriftX)/lastFrequency); + gyroCorrectedPitch = gyroCorrectedPitch + ((gyroY - gyroDriftY)/lastFrequency); + gyroCorrectedYaw = gyroCorrectedYaw + ((gyroZ - gyroDriftZ)/lastFrequency); + + complementaryRoll = complementaryRoll + ((gyroX - gyroDriftX)/lastFrequency); + complementaryPitch = complementaryPitch + ((gyroY - gyroDriftY)/lastFrequency); + complementaryYaw = complementaryYaw + ((gyroZ - gyroDriftZ)/lastFrequency); + + complementaryRoll = 0.98*complementaryRoll + 0.02*accRoll; + complementaryPitch = 0.98*complementaryPitch + 0.02*accPitch; +} + +/** + * This comma separated format is best 'viewed' using 'arduino plotter' or processing.org client (see pde example) + */ +void printCalculations() { + Serial.print(gyroRoll); + Serial.print(','); + Serial.print(gyroPitch); + Serial.print(','); + Serial.print(gyroYaw); + Serial.print(','); + Serial.print(gyroCorrectedRoll); + Serial.print(','); + Serial.print(gyroCorrectedPitch); + Serial.print(','); + Serial.print(gyroCorrectedYaw); + Serial.print(','); + Serial.print(accRoll); + Serial.print(','); + Serial.print(accPitch); + Serial.print(','); + Serial.print(accYaw); + Serial.print(','); + Serial.print(complementaryRoll); + Serial.print(','); + Serial.print(complementaryPitch); + Serial.print(','); + Serial.print(complementaryYaw); + Serial.println(""); +} diff --git a/examples/RollPitchYaw/RollPitchYaw3d.pde b/examples/RollPitchYaw/RollPitchYaw3d.pde new file mode 100644 index 0000000..d4a53b8 --- /dev/null +++ b/examples/RollPitchYaw/RollPitchYaw3d.pde @@ -0,0 +1,128 @@ +/** + * What is this file? + * This is a processing.org sketch and is *NOT* loaded onto your arduino. + * Instead the processing development environment runs this sketch as a 3d application on your computer. + * The sketch connect to your arduino's serial port and reads the roll/pitch/yaw data and displays this + * as 3d models. This sketch assumes you've loaded RollPitchYaw.ino onto your nano iot 33 (or similar) board + * + * License LGPL2.1+ + */ + +import processing.serial.*; +import java.awt.event.KeyEvent; +import java.io.IOException; + +Serial arduino; + +float gyroRoll, gyroPitch, gyroYaw; // units degrees (expect major drift) +float gyroCorrectedRoll, gyroCorrectedPitch, gyroCorrectedYaw; // units degrees (expect minor drift) +float accRoll, accPitch, accYaw; // units degrees (roll and pitch noisy, yaw not possible) +float complementaryRoll, complementaryPitch, complementaryYaw; // units degrees (excellent roll, pitch, yaw minor drift) + + +// NOTE: You need to provide or discover a portName. Often it's at a fixed index (e.g. 0, 1) in the serial list. Or you may prefer to hardcode it. Look at commented lines below for examples. +//int portIndex = 0; +int portIndex = 1; + +String portName = Serial.list()[portIndex]; +//String portName = "/dev/ttyACM0"; // example Linux portname +//String portName = "COM1"; // example windows portname +//String portName = "/dev/tty.usbserial-XXX"; + + + +long lastDataTime = millis(); +boolean connected = false; + +void setup() { + + size (1600, 800, P3D); + arduino = new Serial(this, portName, 1000000); + } + +void draw() { + + if (millis() - lastDataTime > 1000 && connected == true) { + // we were connected, but have received no data for 1s. Lets reconnect + connected = false; + arduino.stop(); + // best to wait for serial port to free up + delay(250); + try{ + arduino = new Serial(this, portName, 1000000); + } catch (RuntimeException ex) { + // todo: look for better way to handle errors. the following is equivalent to 'retry'. + connected = true; + println(ex); + } + } + textSize(22); + translate(width/2, height/2, 0); + if (connected) { + background(0,150,0); // gray + text("Connected to: " + portName, -300, -300); + } else { + background(150,0,0); // red + text("Not connected to: " + portName + ", check portName/portIndex", -300, -300); + } + + drawBox("gyro (raw)\n","✓ has yaw\n× major drift", -450, gyroPitch, gyroRoll, gyroYaw); + drawBox("gyro (corrected)\n","✓ has yaw\n× minor drift", -150, gyroCorrectedPitch, gyroCorrectedRoll, gyroCorrectedYaw); + drawBox("accel (raw)\n","✓ zero drift\n× no yaw + noisy", 150, accPitch, accRoll, accYaw); + drawBox("complementary\n","✓great pitch/roll\n× minor yaw drift", 450, complementaryPitch, complementaryRoll, complementaryYaw); + +} + +/* This draws a moving 3d box representing roll/pitch/yaw including textual stats */ +void drawBox(String name, String description, int xShift, float pitch, float roll, float yaw) { + pushMatrix(); + // Rotate the object + translate(xShift,0,0); + rotateX(radians(-pitch)); + rotateZ(radians(-roll)); + rotateY(radians(yaw)); + + textSize(16); + + fill(0, 76, 183); + box (160, 40, 300); // Draw box + fill(255, 255, 255); + text(name, -60, 5, 151); + popMatrix(); + text( name + + description + + "\npitch: " + int(pitch) + + "\nroll: " + int(roll) + + "\nyaw: " + int(yaw) + , xShift -20, 200); + +} + + +void serialEvent (Serial myPort) { + + String data = myPort.readStringUntil('\n'); + // if you got any bytes other than the linefeed: + if (data != null) { + connected = true; + lastDataTime = millis(); + data = trim(data); + + String items[] = split(data, ','); + if (items.length > 1) { + //--- Roll,Pitch in degrees + gyroRoll = float(items[0]); + gyroPitch = float(items[1]); + gyroYaw = float(items[2]); + gyroCorrectedRoll = float(items[3]); + gyroCorrectedPitch = float(items[4]); + gyroCorrectedYaw = float(items[5]); + accRoll = float(items[6]); + accPitch = float(items[7]); + accYaw = float(items[8]); + complementaryRoll = float(items[9]); + complementaryPitch = float(items[10]); + complementaryYaw = float(items[11]); + } + } +} diff --git a/examples/RollPitchYaw/RollPitchYaw3d.png b/examples/RollPitchYaw/RollPitchYaw3d.png new file mode 100644 index 0000000000000000000000000000000000000000..5b575e957f15a0a12bfaa47824393f18252e9943 GIT binary patch literal 94234 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

ba+Y=H3#4mE*0gT3V7dwnwF2 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 literal 0 HcmV?d00001 From 38c4dd2dc61f7bf3d24947fc18667026c99f67f3 Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Mon, 29 Jul 2019 19:56:17 +0100 Subject: [PATCH 2/4] suggested changes from pull request + moved processing,org example to processing folder as arduino editor was converting it to an ino --- examples/RollPitchYaw/RollPitchYaw.ino | 82 +++++++++--------- .../{ => processing}/RollPitchYaw3d.pde | 0 .../{ => processing}/RollPitchYaw3d.png | Bin 3 files changed, 41 insertions(+), 41 deletions(-) rename examples/RollPitchYaw/{ => processing}/RollPitchYaw3d.pde (100%) rename examples/RollPitchYaw/{ => processing}/RollPitchYaw3d.png (100%) diff --git a/examples/RollPitchYaw/RollPitchYaw.ino b/examples/RollPitchYaw/RollPitchYaw.ino index 3439714..71fee7b 100644 --- a/examples/RollPitchYaw/RollPitchYaw.ino +++ b/examples/RollPitchYaw/RollPitchYaw.ino @@ -1,17 +1,17 @@ /** - * What is this file? - * This is an arduino example that calculates accurate roll,pitch,yaw from raw gyro/accelerometer data - * It has a calibration stage which removes most of the gyro drift and a complementary filter - * that combines gyro and accelerometer angles to produce roll/pitch angles that don't drift (like the gyro angle) and aren't noisy - * (like the accel angles). As there is no magnetic compass on the nano iot 33, it's not possible to 'complement' the yaw - * - hence yaw will drift and is 'relative'. - */ + What is this file? + This is an arduino example that calculates accurate roll,pitch,yaw from raw gyro/accelerometer data + It has a calibration stage which removes most of the gyro drift and a complementary filter + that combines gyro and accelerometer angles to produce roll/pitch angles that don't drift (like the gyro angle) and aren't noisy + (like the accel angles). As there is no magnetic compass on the nano iot 33, it's not possible to 'complement' the yaw + - hence yaw will drift and is 'relative'. +*/ #include #include float accelX, accelY, accelZ, // units m/s/s i.e. accelZ if often 9.8 (gravity) - gyroX, gyroY, gyroZ, // units dps (degrees per second) - gyroDriftX, gyroDriftY, gyroDriftZ, // units dps + gyroX, gyroY, gyroZ, // units dps (degrees per second) + gyroDriftX, gyroDriftY, gyroDriftZ, // units dps gyroRoll, gyroPitch, gyroYaw, // units degrees (expect major drift) gyroCorrectedRoll, gyroCorrectedPitch, gyroCorrectedYaw, // units degrees (expect minor drift) accRoll, accPitch, accYaw, // units degrees (roll and pitch noisy, yaw not possible) @@ -26,7 +26,7 @@ void setup() { pinMode(LED_BUILTIN, OUTPUT); // this sketch will wait until something connects to serial! - // this could be 'arduino monitor', 'arduino plotter' or 'processing.org P3D client (see pde file)' + // this could be 'serial monitor', 'serial plotter' or 'processing.org P3D client' (see ./processing/RollPitchYaw3d.pde file) while (!Serial); if (!IMU.begin()) { @@ -35,17 +35,17 @@ void setup() { } calibrateIMU(250, 250); - + lastTime = micros(); } -/* - the gyro's x,y,z values drift by a steady amount. if we measure this when arduino is still +/* + the gyro's x,y,z values drift by a steady amount. if we measure this when arduino is still we can correct the drift when doing real measurements later */ void calibrateIMU(int delayMillis, int calibrationMillis) { - + int calibrationCount = 0; delay(delayMillis); // to avoid shakes after pressing reset button @@ -58,7 +58,7 @@ void calibrateIMU(int delayMillis, int calibrationMillis) { sumX += gyroX; sumY += gyroY; sumZ += gyroZ; - + calibrationCount++; } } @@ -73,12 +73,12 @@ void calibrateIMU(int delayMillis, int calibrationMillis) { } -/** - * Read accel and gyro data. - * returns true if value is 'new' and false if IMU is returning old cached data - */ +/** + Read accel and gyro data. + returns true if value is 'new' and false if IMU is returning old cached data +*/ bool readIMU() { - if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable() ){ + if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable() ) { IMU.readAcceleration(accelX, accelY, accelZ); IMU.readGyroscope(gyroX, gyroY, gyroZ); return true; @@ -88,7 +88,7 @@ bool readIMU() { // the loop function runs over and over again forever void loop() { - + if (readIMU()) { long currentTime = micros(); lastInterval = currentTime - lastTime; // expecting this to be ~104Hz +- 4% @@ -98,37 +98,37 @@ void loop() { printCalculations(); } - + } /** - * I'm expecting, over time, the Arduino_LSM6DS3.h will add functions to do most of this, - * but as of 1.0.0 this was missing. - */ + I'm expecting, over time, the Arduino_LSM6DS3.h will add functions to do most of this, + but as of 1.0.0 this was missing. +*/ void doCalculations() { - accRoll = atan2(accelY, accelZ) * 180/M_PI; - accPitch = atan2(-accelX, sqrt(accelY*accelY + accelZ*accelZ)) * 180/M_PI; + accRoll = atan2(accelY, accelZ) * 180 / M_PI; + accPitch = atan2(-accelX, sqrt(accelY * accelY + accelZ * accelZ)) * 180 / M_PI; float lastFrequency = 1000000 / lastInterval; - gyroRoll = gyroRoll + (gyroX/lastFrequency); - gyroPitch = gyroPitch + (gyroY/lastFrequency); - gyroYaw = gyroYaw + (gyroZ/lastFrequency); + gyroRoll = gyroRoll + (gyroX / lastFrequency); + gyroPitch = gyroPitch + (gyroY / lastFrequency); + gyroYaw = gyroYaw + (gyroZ / lastFrequency); - gyroCorrectedRoll = gyroCorrectedRoll + ((gyroX - gyroDriftX)/lastFrequency); - gyroCorrectedPitch = gyroCorrectedPitch + ((gyroY - gyroDriftY)/lastFrequency); - gyroCorrectedYaw = gyroCorrectedYaw + ((gyroZ - gyroDriftZ)/lastFrequency); + gyroCorrectedRoll = gyroCorrectedRoll + ((gyroX - gyroDriftX) / lastFrequency); + gyroCorrectedPitch = gyroCorrectedPitch + ((gyroY - gyroDriftY) / lastFrequency); + gyroCorrectedYaw = gyroCorrectedYaw + ((gyroZ - gyroDriftZ) / lastFrequency); - complementaryRoll = complementaryRoll + ((gyroX - gyroDriftX)/lastFrequency); - complementaryPitch = complementaryPitch + ((gyroY - gyroDriftY)/lastFrequency); - complementaryYaw = complementaryYaw + ((gyroZ - gyroDriftZ)/lastFrequency); + complementaryRoll = complementaryRoll + ((gyroX - gyroDriftX) / lastFrequency); + complementaryPitch = complementaryPitch + ((gyroY - gyroDriftY) / lastFrequency); + complementaryYaw = complementaryYaw + ((gyroZ - gyroDriftZ) / lastFrequency); - complementaryRoll = 0.98*complementaryRoll + 0.02*accRoll; - complementaryPitch = 0.98*complementaryPitch + 0.02*accPitch; + complementaryRoll = 0.98 * complementaryRoll + 0.02 * accRoll; + complementaryPitch = 0.98 * complementaryPitch + 0.02 * accPitch; } /** - * This comma separated format is best 'viewed' using 'arduino plotter' or processing.org client (see pde example) - */ + This comma separated format is best 'viewed' using 'serial plotter' or processing.org client (see ./processing/RollPitchYaw3d.pde example) +*/ void printCalculations() { Serial.print(gyroRoll); Serial.print(','); @@ -141,7 +141,7 @@ void printCalculations() { Serial.print(gyroCorrectedPitch); Serial.print(','); Serial.print(gyroCorrectedYaw); - Serial.print(','); + Serial.print(','); Serial.print(accRoll); Serial.print(','); Serial.print(accPitch); diff --git a/examples/RollPitchYaw/RollPitchYaw3d.pde b/examples/RollPitchYaw/processing/RollPitchYaw3d.pde similarity index 100% rename from examples/RollPitchYaw/RollPitchYaw3d.pde rename to examples/RollPitchYaw/processing/RollPitchYaw3d.pde diff --git a/examples/RollPitchYaw/RollPitchYaw3d.png b/examples/RollPitchYaw/processing/RollPitchYaw3d.png similarity index 100% rename from examples/RollPitchYaw/RollPitchYaw3d.png rename to examples/RollPitchYaw/processing/RollPitchYaw3d.png From c712531d7d1d408187b5431a077408dccce02263 Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Tue, 30 Jul 2019 20:32:45 +0100 Subject: [PATCH 3/4] moving processing to data folder --- .../{ => data}/processing/RollPitchYaw3d.pde | 0 .../{ => data}/processing/RollPitchYaw3d.png | Bin 2 files changed, 0 insertions(+), 0 deletions(-) rename examples/RollPitchYaw/{ => data}/processing/RollPitchYaw3d.pde (100%) rename examples/RollPitchYaw/{ => data}/processing/RollPitchYaw3d.png (100%) diff --git a/examples/RollPitchYaw/processing/RollPitchYaw3d.pde b/examples/RollPitchYaw/data/processing/RollPitchYaw3d.pde similarity index 100% rename from examples/RollPitchYaw/processing/RollPitchYaw3d.pde rename to examples/RollPitchYaw/data/processing/RollPitchYaw3d.pde diff --git a/examples/RollPitchYaw/processing/RollPitchYaw3d.png b/examples/RollPitchYaw/data/processing/RollPitchYaw3d.png similarity index 100% rename from examples/RollPitchYaw/processing/RollPitchYaw3d.png rename to examples/RollPitchYaw/data/processing/RollPitchYaw3d.png From 5eac7f5e6145c4747da27698faf3a548d2893a2b Mon Sep 17 00:00:00 2001 From: Owen Williams Date: Thu, 18 Jun 2020 17:38:11 +0100 Subject: [PATCH 4/4] Reduce the possibility of divide by zero error. --- examples/RollPitchYaw/RollPitchYaw.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/RollPitchYaw/RollPitchYaw.ino b/examples/RollPitchYaw/RollPitchYaw.ino index 71fee7b..9e4e54c 100644 --- a/examples/RollPitchYaw/RollPitchYaw.ino +++ b/examples/RollPitchYaw/RollPitchYaw.ino @@ -109,7 +109,7 @@ void doCalculations() { accRoll = atan2(accelY, accelZ) * 180 / M_PI; accPitch = atan2(-accelX, sqrt(accelY * accelY + accelZ * accelZ)) * 180 / M_PI; - float lastFrequency = 1000000 / lastInterval; + float lastFrequency = (float) 1000000.0 / lastInterval; gyroRoll = gyroRoll + (gyroX / lastFrequency); gyroPitch = gyroPitch + (gyroY / lastFrequency); gyroYaw = gyroYaw + (gyroZ / lastFrequency);