From a1994da9a696ad83a5c7d819b55b2a9d9c6f0964 Mon Sep 17 00:00:00 2001 From: Nithya S Date: Sun, 1 Oct 2017 10:51:04 -0700 Subject: [PATCH 1/4] created TimeStats class and used it in DrivetrainHardware --- .../drivetrain/DrivetrainHardware.scala | 7 ++++ .../seventeen/drivetrain/TimeStats.java | 37 +++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala index 920c9b3..1a5f472 100644 --- a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala @@ -16,6 +16,8 @@ import squants.motion.{AngularVelocity, DegreesPerSecond} import squants.space.Degrees import squants.time.{Milliseconds, Seconds} import squants.{Angle, Each, Length, Time, Velocity} +import edu.wpi.first.wpilibj.Timer +import java.io.{File, PrintWriter} case class DrivetrainData(leftEncoderVelocity: AngularVelocity, rightEncoderVelocity: AngularVelocity, @@ -35,6 +37,9 @@ case class DrivetrainHardware(leftBack: CANTalon, leftFront: CANTalon, val wheelRadius = props.wheelDiameter / 2 val track = props.track + val tstats = new TimeStats(200, 500) + val t = new Timer() + val writer = new PrintWriter(new File(s"/home/lvuser/timelog")) val rootDataStream = Stream.periodic(period)( DrivetrainData( @@ -60,6 +65,8 @@ case class DrivetrainHardware(leftBack: CANTalon, leftFront: CANTalon, override lazy val turnVelocity: Stream[AngularVelocity] = rootDataStream.map(_.gyroVelocities).map(_.z) override lazy val turnPosition: Stream[Angle] = turnVelocity.integral + + tstats.Record(writer, t.get()) } object DrivetrainHardware { diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java new file mode 100644 index 0000000..d2b03b9 --- /dev/null +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java @@ -0,0 +1,37 @@ +package com.lynbrookrobotics.seventeen.drivetrain; +import java.io.File; +import java.io.PrintWriter; + +public class TimeStats { + double min, max, avg, sq; + long count, logcount, initcount; + double prev; + + public TimeStats(int l, int i) { + Reset(); + logcount = l; initcount = i; count = 0; prev = 0; avg = 0; sq = 0; + } + + public void Reset () { + min = 1E6; max = 0; + } + + public void Record (PrintWriter p, double timer) { + double duration = timer - prev; + if (count > initcount) { + if (duration > max) max = duration; + if (duration < min) min = duration; + double avgNew = (avg*(count-initcount) + duration) / (1.0 + count - initcount); + sq += (duration - avg) * (duration - avgNew); + avg = avgNew; + + if ((count % logcount) == 0) { + p.println("Max " + max + "; Min " + min + "; Avg " + + avg + "; Count " + count + "; stDev " + Math.sqrt(sq / (count - initcount))); + Reset(); + } + } + prev = timer; + count ++; + } +} \ No newline at end of file From 31749fc4c372c9498044f1faa3c471903d8b2c52 Mon Sep 17 00:00:00 2001 From: Nithya S Date: Sun, 1 Oct 2017 15:34:50 -0700 Subject: [PATCH 2/4] cleaned up code and added histogram --- .../drivetrain/DrivetrainHardware.scala | 7 +-- .../seventeen/drivetrain/Histogram.java | 61 +++++++++++++++++++ .../seventeen/drivetrain/TimeStats.java | 14 ++++- 3 files changed, 75 insertions(+), 7 deletions(-) create mode 100644 src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala index 1a5f472..764d77a 100644 --- a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala @@ -16,8 +16,6 @@ import squants.motion.{AngularVelocity, DegreesPerSecond} import squants.space.Degrees import squants.time.{Milliseconds, Seconds} import squants.{Angle, Each, Length, Time, Velocity} -import edu.wpi.first.wpilibj.Timer -import java.io.{File, PrintWriter} case class DrivetrainData(leftEncoderVelocity: AngularVelocity, rightEncoderVelocity: AngularVelocity, @@ -38,8 +36,6 @@ case class DrivetrainHardware(leftBack: CANTalon, leftFront: CANTalon, val wheelRadius = props.wheelDiameter / 2 val track = props.track val tstats = new TimeStats(200, 500) - val t = new Timer() - val writer = new PrintWriter(new File(s"/home/lvuser/timelog")) val rootDataStream = Stream.periodic(period)( DrivetrainData( @@ -65,8 +61,7 @@ case class DrivetrainHardware(leftBack: CANTalon, leftFront: CANTalon, override lazy val turnVelocity: Stream[AngularVelocity] = rootDataStream.map(_.gyroVelocities).map(_.z) override lazy val turnPosition: Stream[Angle] = turnVelocity.integral - - tstats.Record(writer, t.get()) + rootDataStream.originTimeStream.get.foreach((t: Time) => tstats.Record()) } object DrivetrainHardware { diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java new file mode 100644 index 0000000..903fd0c --- /dev/null +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java @@ -0,0 +1,61 @@ +package com.lynbrookrobotics.seventeen.drivetrain; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintWriter; +import edu.wpi.first.wpilibj.Timer; + +public class Histogram { + + protected final long[] histogram; + public final double min, max; + public final double interval; + public final int bins; + Timer t; PrintWriter p; + + public Histogram(final double min, final double max, final int bins) { + this.min = min; + this.max = max; + this.bins = bins; + interval = (max - min) / bins; + histogram = new long[bins + 2]; // bins and "less than min" and "greater than max" + t = new Timer(); + try { + p = new PrintWriter(new File("/home/lvuser/timelog")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public void Record() { + double value = t.get(); + if (value < min) histogram[0]++; + else if (value > max) histogram[bins + 1]++; + else histogram[1 + (int) ((value - min) / interval)]++; + } + + public String toString() { + final StringBuilder sb = new StringBuilder(); + sb.append("<"); + sb.append(min); + sb.append(" : "); + sb.append(histogram[0]); + sb.append('\n'); + + for (int i = 1; i < bins + 1; i++) { + sb.append((float) (min + (interval * (i - 1)))); + sb.append(" to "); + sb.append((float) (min + (interval * i))); + sb.append(" : "); + sb.append(histogram[i]); + sb.append('\n'); + } + + sb.append(">"); + sb.append(max); + sb.append(" : "); + sb.append(histogram[bins+1]); + sb.append('\n'); + + return sb.toString(); + } +} diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java index d2b03b9..23351a1 100644 --- a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java @@ -1,22 +1,34 @@ package com.lynbrookrobotics.seventeen.drivetrain; import java.io.File; +import java.io.FileNotFoundException; import java.io.PrintWriter; +import edu.wpi.first.wpilibj.Timer; + public class TimeStats { double min, max, avg, sq; long count, logcount, initcount; double prev; + Timer t; + PrintWriter p; public TimeStats(int l, int i) { Reset(); logcount = l; initcount = i; count = 0; prev = 0; avg = 0; sq = 0; + t = new Timer(); + try { + p = new PrintWriter(new File("/home/lvuser/timelog")); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } } public void Reset () { min = 1E6; max = 0; } - public void Record (PrintWriter p, double timer) { + public void Record () { + double timer = t.get(); double duration = timer - prev; if (count > initcount) { if (duration > max) max = duration; From 94b5e5e849e82b030b9a6848d87fabd9fdf3b7ef Mon Sep 17 00:00:00 2001 From: Paxelord Date: Mon, 2 Oct 2017 18:23:20 -0700 Subject: [PATCH 3/4] -m "made measure potassium time" --- .../seventeen/drivetrain/DrivetrainHardware.scala | 2 +- .../seventeen/drivetrain/Histogram.java | 7 +++---- .../seventeen/drivetrain/TimeStats.java | 12 +++++------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala index 764d77a..6b21f88 100644 --- a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala @@ -61,7 +61,7 @@ case class DrivetrainHardware(leftBack: CANTalon, leftFront: CANTalon, override lazy val turnVelocity: Stream[AngularVelocity] = rootDataStream.map(_.gyroVelocities).map(_.z) override lazy val turnPosition: Stream[Angle] = turnVelocity.integral - rootDataStream.originTimeStream.get.foreach((t: Time) => tstats.Record()) + rootDataStream.originTimeStream.get.foreach((t: Time) => tstats.record(t.toMilliseconds)) } object DrivetrainHardware { diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java index 903fd0c..bdd27d0 100644 --- a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/Histogram.java @@ -10,7 +10,7 @@ public class Histogram { public final double min, max; public final double interval; public final int bins; - Timer t; PrintWriter p; + PrintWriter p; public Histogram(final double min, final double max, final int bins) { this.min = min; @@ -18,7 +18,6 @@ public Histogram(final double min, final double max, final int bins) { this.bins = bins; interval = (max - min) / bins; histogram = new long[bins + 2]; // bins and "less than min" and "greater than max" - t = new Timer(); try { p = new PrintWriter(new File("/home/lvuser/timelog")); } catch (FileNotFoundException e) { @@ -26,8 +25,8 @@ public Histogram(final double min, final double max, final int bins) { } } - public void Record() { - double value = t.get(); + public void record(Double t) { + double value = t; if (value < min) histogram[0]++; else if (value > max) histogram[bins + 1]++; else histogram[1 + (int) ((value - min) / interval)]++; diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java index 23351a1..923527d 100644 --- a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/TimeStats.java @@ -9,13 +9,11 @@ public class TimeStats { double min, max, avg, sq; long count, logcount, initcount; double prev; - Timer t; PrintWriter p; public TimeStats(int l, int i) { - Reset(); + reset(); logcount = l; initcount = i; count = 0; prev = 0; avg = 0; sq = 0; - t = new Timer(); try { p = new PrintWriter(new File("/home/lvuser/timelog")); } catch (FileNotFoundException e) { @@ -23,12 +21,12 @@ public TimeStats(int l, int i) { } } - public void Reset () { + public void reset() { min = 1E6; max = 0; } - public void Record () { - double timer = t.get(); + public void record(double t) { + double timer = t; double duration = timer - prev; if (count > initcount) { if (duration > max) max = duration; @@ -40,7 +38,7 @@ public void Record () { if ((count % logcount) == 0) { p.println("Max " + max + "; Min " + min + "; Avg " + avg + "; Count " + count + "; stDev " + Math.sqrt(sq / (count - initcount))); - Reset(); + reset(); } } prev = timer; From 8fa9ca9eb4e92f0ff6e35ffcb59af92a4a2895dd Mon Sep 17 00:00:00 2001 From: Paxelord Date: Tue, 3 Oct 2017 13:08:23 -0700 Subject: [PATCH 4/4] implemented histogram --- .../seventeen/drivetrain/DrivetrainHardware.scala | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala index 6b21f88..89c1277 100644 --- a/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala +++ b/src/main/scala/com/lynbrookrobotics/seventeen/drivetrain/DrivetrainHardware.scala @@ -36,6 +36,7 @@ case class DrivetrainHardware(leftBack: CANTalon, leftFront: CANTalon, val wheelRadius = props.wheelDiameter / 2 val track = props.track val tstats = new TimeStats(200, 500) + val h = new Histogram(3000, 7000, 40) val rootDataStream = Stream.periodic(period)( DrivetrainData( @@ -61,7 +62,15 @@ case class DrivetrainHardware(leftBack: CANTalon, leftFront: CANTalon, override lazy val turnVelocity: Stream[AngularVelocity] = rootDataStream.map(_.gyroVelocities).map(_.z) override lazy val turnPosition: Stream[Angle] = turnVelocity.integral - rootDataStream.originTimeStream.get.foreach((t: Time) => tstats.record(t.toMilliseconds)) + + val handle = rootDataStream.originTimeStream.get.foreach((t: Time) => { + tstats.record(t.toMilliseconds) + }) + + val handle2 = rootDataStream.originTimeStream.get.sliding(2).foreach(times => { + h.record((times(1) - times(0)).toMilliseconds) + }) + } object DrivetrainHardware {