16-264: Humaniods

Si Yang Ng

 

Tennis

01/14/06

Updates

 

  • I have updated the tennis program to read for racket bounces and also to calculate the orientation of the racket. Below are the methods used in greater detail.
  • tennis011406.zip

 

 

Reading for racket bounces

 

  • I used the Y-axis as the basis to check for racket bounces (although I still have some doubts)
  • It is a little hard without reference of the actual axis / positions used but after plotting out the X Y Z against frame count graphs, the X-axis plot seemed the most erractic
  • Here is the Ball’s X position against Frame Count plot. Note, the graphs actual size are pretty large so the re-sized pictures may look odd, right click, view image and enlarge it for best effects

  • Below is the Ball’s Y Position Against Time Plot:

  • And finally below is the Ball’s Z-axis against Frame Count Plot

  • Note that I set the last few hundred frames to 0 on these graphs to more clearly show the changes in the positions. In the actual program, there is no need to set these frames to 0 or truncate them because they either extend to negative or positive infinity. (No change in gradient => no bounce detected)
  • Furthermore my reason for choosing the Y axis as a reference to check for racket bounce is that Y-axis gradient changes seem more consistent with that of the Z-axis’
  • It would be logical to think that after every floor bounce there would be a racket bounce. Although we would see that my program may not be entirely accurate
  • Suppose the X-axis is parallel to the player’s body, this could explain the ball’s X coord relatively less changes in direction. (sorry for poor English here). (If the player is playing in a room for motion capture, it would make sense for him/her to keep shooting straight so as to minimize his/her own body movement; if so, he/she would be hitting the ball such that the ball flies perpendicular to the body, i.e. no change relative to the x-axis)

 

Racket Orientation

  • I used a point and a perpendicular vector to represent the racket orientation.
  • Taking RAC_1, RAC_2 and RAC_3 as 3 points in a vector space, I calculated the mid-point of these 3 points
  • Next I calculated the 2 vectors from RAC2 to RAC1 and RAC3 respectively and then I find the cross product of the 2 vectors
  • This vector and the point than defines the plane of the racket
  • I’m not sure if this is the method you want for displaying the orientation
  • Below are some sample output:

Frame: 52 to 54, Time: 0.102000 to 0.106000: Racket Bounce

             Racket Pos: Vector: (382.706763, -769.732629, 609.400357) + (17715.583231i, -60006.758401j, 24947.337662k)

Frame: 708 to 710, Time: 1.414000 to 1.418000: Racket Bounce

             Racket Pos: Vector: (377.106708, -965.626420, 501.806283) + (4802.681087i, -64671.266829j, 19316.220093k)

Frame: 1076 to 1078, Time: 2.150000 to 2.154000: Racket Bounce

             Racket Pos: Vector: (541.154025, -388.261034, 721.799090) + (7539.975996i, -59027.014082j, -31601.340658k)

Frame: 1285 to 1287, Time: 2.568000 to 2.572000: Racket Bounce

             Racket Pos: Vector: (197.243857, -167.236107, 1666.295625) + (61013.162291i, 13916.863375j, -22776.314576k)

Frame: 1627 to 1629, Time: 3.252000 to 3.256000: Floor Bounce

             Racket Pos: Point: (-111.305895, -1042.721984, 1435.363196) + (-43963.607042i, 39592.467230j, 31293.372659k)

Frame: 1627 to 1629, Time: 3.252000 to 3.256000: Racket Bounce

             Racket Pos: Vector: (-111.305895, -1042.721984, 1435.363196) + (-43963.607042i, 39592.467230j, 31293.372659k)

Frame: 2517 to 2519, Time: 5.032000 to 5.036000: Floor Bounce

             Racket Pos: Point: (-234.500993, -1556.289567, 1060.908982) + (-47574.379013i, 17151.866700j, 44106.672692k)

Frame: 2517 to 2519, Time: 5.032000 to 5.036000: Racket Bounce

             Racket Pos: Vector: (-234.500993, -1556.289567, 1060.908982) + (-47574.379013i, 17151.866700j, 44106.672692k)

Frame: 3325 to 3327, Time: 6.648000 to 6.652000: Floor Bounce

             Racket Pos: Point: (-71.349644, -1034.662957, 1498.044727) + (-23402.905855i, 52339.036993j, 34441.616345k)

Frame: 3563 to 3565, Time: 7.124000 to 7.128000: Racket Bounce

             Racket Pos: Vector: (-492.284578, -335.552871, 691.394523) + (7175.772020i, 53647.057132j, 40096.157461k)

Frame: 4195 to 4197, Time: 8.388000 to 8.392000: Floor Bounce

             Racket Pos: Point: (684.880526, -1231.755923, 1271.478391) + (-44607.980999i, -26345.646265j, 42427.517212k)

Frame: 4195 to 4197, Time: 8.388000 to 8.392000: Racket Bounce

             Racket Pos: Vector: (684.880526, -1231.755923, 1271.478391) + (-44607.980999i, -26345.646265j, 42427.517212k)

Frame: 4492 to 4494, Time: 8.982000 to 8.986000: Racket Bounce

             Racket Pos: Vector: (1213.768145, -438.638747, 735.832743) + (13244.255496i, -54830.463535j, -31128.762018k)

Frame: 5142 to 5144, Time: 10.282000 to 10.286000: Floor Bounce

             Racket Pos: Point: (-93.848738, -1076.427970, 1527.063516) + (-54093.578997i, 15977.723740j, 35432.593172k)

Frame: 5142 to 5144, Time: 10.282000 to 10.286000: Racket Bounce

             Racket Pos: Vector: (-93.848738, -1076.427970, 1527.063516) + (-54093.578997i, 15977.723740j, 35432.593172k)

Frame: 5977 to 5979, Time: 11.952000 to 11.956000: Floor Bounce

             Racket Pos: Point: (247.110495, -967.218396, 736.295313) + (18469.797703i, -51807.974654j, 38486.505567k)

Frame: 5977 to 5979, Time: 11.952000 to 11.956000: Racket Bounce

             Racket Pos: Vector: (247.110495, -967.218396, 736.295313) + (18469.797703i, -51807.974654j, 38486.505567k)

Frame: 6841 to 6843, Time: 13.680000 to 13.684000: Floor Bounce

             Racket Pos: Point: (394.003587, -1135.584147, 1413.315082) + (-29845.448166i, 39954.711855j, 44848.631454k)

Frame: 7076 to 7078, Time: 14.150000 to 14.154000: Racket Bounce

             Racket Pos: Vector: (486.071510, -174.340249, 837.955765) + (-11869.511483i, 48045.619406j, 41367.454689k)

Frame: 7778 to 7780, Time: 15.554000 to 15.558000: Floor Bounce

             Racket Pos: Point: (539.341399, -728.061914, 796.206464) + (18287.232530i, -55151.235510j, 33981.300844k)

Frame: 7778 to 7780, Time: 15.554000 to 15.558000: Racket Bounce

             Racket Pos: Vector: (539.341399, -728.061914, 796.206464) + (18287.232530i, -55151.235510j, 33981.300844k)

Frame: 8028 to 8030, Time: 16.054000 to 16.058000: Racket Bounce

             Racket Pos: Vector: (589.535314, -458.197276, 922.357189) + (857.495433i, -50068.008381j, -24629.801778k)

Frame: 8598 to 8600, Time: 17.194000 to 17.198000: Floor Bounce

             Racket Pos: Point: (-348.462324, -942.721189, 1475.021938) + (-34965.928214i, 40655.786080j, 39851.724540k)

Frame: 8835 to 8837, Time: 17.668000 to 17.672000: Racket Bounce

             Racket Pos: Vector: (-1018.054742, -92.070636, 811.321770) + (17326.216658i, 54716.826157j, 34433.976078k)

Frame: 9395 to 9397, Time: 18.788000 to 18.792000: Floor Bounce

             Racket Pos: Point: (879.564079, -935.176550, 1426.970788) + (-46023.428194i, -38698.640874j, 28704.059831k)

Frame: 9625 to 9627, Time: 19.248000 to 19.252000: Racket Bounce

             Racket Pos: Vector: (1335.023832, -200.647171, 739.490244) + (3034.681387i, -54361.473523j, -27864.253765k)

Frame: 10258 to 10260, Time: 20.514000 to 20.518000: Floor Bounce

             Racket Pos: Point: (427.964230, -1184.739519, 1442.730934) + (-26021.177010i, 32904.550933j, 52223.643515k)

Frame: 10258 to 10260, Time: 20.514000 to 20.518000: Racket Bounce

             Racket Pos: Vector: (427.964230, -1184.739519, 1442.730934) + (-26021.177010i, 32904.550933j, 52223.643515k)

Frame: 11032 to 11034, Time: 22.062000 to 22.066000: Floor Bounce

             Racket Pos: Point: (574.540491, -753.730739, 1412.075640) + (-17095.828490i, -53863.293984j, 35995.830238k)

Frame: 11327 to 11329, Time: 22.652000 to 22.656000: Racket Bounce

             Racket Pos: Vector: (-194.963667, -31.831405, 554.129958) + (-36912.207191i, -39022.168455j, -15775.405111k)

Frame: 11946 to 11948, Time: 23.890000 to 23.894000: Floor Bounce

             Racket Pos: Point: (-347.968497, -1192.527602, 770.618697) + (-42003.871114i, -20109.134244j, 48110.350793k)

Frame: 11946 to 11948, Time: 23.890000 to 23.894000: Racket Bounce

             Racket Pos: Vector: (-347.968497, -1192.527602, 770.618697) + (-42003.871114i, -20109.134244j, 48110.350793k)

Frame: 12733 to 12735, Time: 25.464000 to 25.468000: Floor Bounce

             Racket Pos: Point: (303.018811, -816.398410, 1192.335001) + (-16265.542102i, -63281.882662j, 15666.408708k)

Frame: 12733 to 12735, Time: 25.464000 to 25.468000: Racket Bounce

             Racket Pos: Vector: (303.018811, -816.398410, 1192.335001) + (-16265.542102i, -63281.882662j, 15666.408708k)

Frame: 12989 to 12991, Time: 25.976000 to 25.980000: Racket Bounce

             Racket Pos: Vector: (932.315967, -476.456049, 685.416108) + (9753.905462i, -60986.600326j, -27975.587740k)

Frame: 13597 to 13599, Time: 27.192000 to 27.196000: Floor Bounce

             Racket Pos: Point: (-114.289889, -1337.565440, 1474.313596) + (-28367.643914i, 44867.092649j, 40538.462168k)

Frame: 13866 to 13868, Time: 27.730000 to 27.734000: Racket Bounce

             Racket Pos: Vector: (-1111.479950, -85.175811, 680.028949) + (16286.009199i, 49097.764579j, 41563.296124k)

Frame: 14328 to 14330, Time: 28.654000 to 28.658000: Floor Bounce

             Racket Pos: Point: (538.366111, -534.682941, 756.897072) + (-786.338368i, -24952.519884j, 62172.983878k)

Frame: 14658 to 14660, Time: 29.314000 to 29.318000: Floor Bounce

             Racket Pos: Point: (543.549319, -343.291184, 289.564051) + (-26333.960324i, -33106.630641j, 49154.658900k)

Frame: 15359 to 15361, Time: 30.716000 to 30.720000: Floor Bounce

             Racket Pos: Point: (985.532147, -1483.531030, 845.543643) + (-11871.770995i, -35474.588222j, 56145.895488k)

Frame: 15359 to 15361, Time: 30.716000 to 30.720000: Racket Bounce

             Racket Pos: Vector: (985.532147, -1483.531030, 845.543643) + (-11871.770995i, -35474.588222j, 56145.895488k)

Frame: 16157 to 16159, Time: 32.312000 to 32.316000: Floor Bounce

             Racket Pos: Point: (-11.836670, -1376.955512, 1493.715323) + (-22666.827631i, 41914.782765j, 46590.073812k)

Frame: 16398 to 16400, Time: 32.794000 to 32.798000: Racket Bounce

             Racket Pos: Vector: (-1019.793195, -295.888623, 731.879022) + (3698.557000i, 48559.257999j, 42272.107013k)

Frame: 17030 to 17032, Time: 34.058000 to 34.062000: Floor Bounce

             Racket Pos: Point: (576.723015, -1197.912792, 1331.430262) + (-44255.966545i, -29039.351869j, 40855.554621k)

Frame: 17293 to 17295, Time: 34.584000 to 34.588000: Racket Bounce

             Racket Pos: Vector: (1094.501428, -324.596886, 715.802301) + (44742.139912i, -17473.920318j, 2745.028174k)

Frame: 17877 to 17879, Time: 35.752000 to 35.756000: Floor Bounce

             Racket Pos: Point: (96.283864, -1112.273741, 1580.745153) + (-50826.865387i, 32281.547548j, 28737.784920k)

Frame: 17877 to 17879, Time: 35.752000 to 35.756000: Racket Bounce

             Racket Pos: Vector: (96.283864, -1112.273741, 1580.745153) + (-50826.865387i, 32281.547548j, 28737.784920k)

Frame: 18759 to 18761, Time: 37.516000 to 37.520000: Floor Bounce

             Racket Pos: Point: (305.066343, -1752.990300, 897.540034) + (-36423.578224i, -23778.259479j, 58078.419608k)

Frame: 18759 to 18761, Time: 37.516000 to 37.520000: Racket Bounce

             Racket Pos: Vector: (305.066343, -1752.990300, 897.540034) + (-36423.578224i, -23778.259479j, 58078.419608k)

Frame: 19619 to 19621, Time: 39.236000 to 39.240000: Floor Bounce

             Racket Pos: Point: (-120.162682, -1430.298086, 1456.502305) + (-41406.987096i, 32582.097082j, 40948.556460k)

Frame: 19619 to 19621, Time: 39.236000 to 39.240000: Racket Bounce

             Racket Pos: Vector: (-120.162682, -1430.298086, 1456.502305) + (-41406.987096i, 32582.097082j, 40948.556460k)

Frame: 20411 to 20413, Time: 40.820000 to 40.824000: Floor Bounce

             Racket Pos: Point: (-169.069650, -1608.682630, 1063.510529) + (-50735.170782i, 16934.969183j, 39957.059776k)

Frame: 20411 to 20413, Time: 40.820000 to 40.824000: Racket Bounce

             Racket Pos: Vector: (-169.069650, -1608.682630, 1063.510529) + (-50735.170782i, 16934.969183j, 39957.059776k)

Frame: 21332 to 21334, Time: 42.662000 to 42.666000: Floor Bounce

             Racket Pos: Point: (-146.220969, -2032.407231, 917.554947) + (-51565.629869i, -31623.961888j, 64093.403868k)

Frame: 21332 to 21334, Time: 42.662000 to 42.666000: Racket Bounce

             Racket Pos: Vector: (-146.220969, -2032.407231, 917.554947) + (-51565.629869i, -31623.961888j, 64093.403868k)

Frame: 22215 to 22217, Time: 44.428000 to 44.432000: Floor Bounce

             Racket Pos: Point: (-23.970240, -1745.897511, 901.739740) + (-30773.663955i, -32542.655009j, 48663.948776k)

Frame: 22215 to 22217, Time: 44.428000 to 44.432000: Racket Bounce

             Racket Pos: Vector: (-23.970240, -1745.897511, 901.739740) + (-30773.663955i, -32542.655009j, 48663.948776k)

Frame: 23047 to 23049, Time: 46.092000 to 46.096000: Floor Bounce

             Racket Pos: Point: (-3.024465, -1404.561170, 906.571927) + (-19601.710151i, -58642.554494j, 26817.815895k)

Frame: 23047 to 23049, Time: 46.092000 to 46.096000: Racket Bounce

             Racket Pos: Vector: (-3.024465, -1404.561170, 906.571927) + (-19601.710151i, -58642.554494j, 26817.815895k)

Frame: 23887 to 23889, Time: 47.772000 to 47.776000: Floor Bounce

             Racket Pos: Point: (100.093446, -889.687231, 1456.385219) + (3392.536427i, -67080.011936j, 6138.258877k)

Frame: 24170 to 24172, Time: 48.338000 to 48.342000: Racket Bounce

             Racket Pos: Vector: (627.509194, -410.300218, 616.242955) + (17577.815850i, -67864.485610j, -25336.689275k)

Frame: 24776 to 24778, Time: 49.550000 to 49.554000: Floor Bounce

             Racket Pos: Point: (-618.965175, -1145.030434, 1599.310337) + (-34577.456233i, 56359.102382j, 8384.393564k)

Frame: 24776 to 24778, Time: 49.550000 to 49.554000: Racket Bounce

             Racket Pos: Vector: (-618.965175, -1145.030434, 1599.310337) + (-34577.456233i, 56359.102382j, 8384.393564k)

Frame: 25679 to 25681, Time: 51.356000 to 51.360000: Floor Bounce

             Racket Pos: Point: (-1200.085125, -1202.818926, 914.631498) + (-41697.968000i, 52575.139888j, 682.669703k)

Frame: 25679 to 25681, Time: 51.356000 to 51.360000: Racket Bounce

             Racket Pos: Vector: (-1200.085125, -1202.818926, 914.631498) + (-41697.968000i, 52575.139888j, 682.669703k)

Frame: 26290 to 26292, Time: 52.578000 to 52.582000: Floor Bounce

             Racket Pos: Point: (-63.820488, -1654.009662, 1213.274456) + (-66699.852101i, 720.837636j, 6608.150995k)

Frame: 26575 to 26577, Time: 53.148000 to 53.152000: Floor Bounce

             Racket Pos: Point: (160.746881, -1357.761036, 690.786712) + (-47308.674767i, -38035.303479j, 55773.367965k)

Frame: 26783 to 26785, Time: 53.564000 to 53.568000: Floor Bounce

             Racket Pos: Point: (190.721949, -752.711603, 186.735006) + (-18457.850841i, -54007.679058j, 34016.351198k)

Frame: 26783 to 26785, Time: 53.564000 to 53.568000: Racket Bounce

             Racket Pos: Vector: (190.721949, -752.711603, 186.735006) + (-18457.850841i, -54007.679058j, 34016.351198k)

Frame: 27454 to 27456, Time: 54.906000 to 54.910000: Floor Bounce

 

11/10/05

Aim

 

Word for Word from Prof Darrin :

 

·                A function that reads the file and places the information into data structures (arrays) for the ball and paddle markers
·                The position and orientation of the paddle (computed from the rac_1, rac_2, and rac_3 markers)
·                The frame number of all ball-floor hits (when the ball actually bounces off the floor, not just lying on the floor)
·                The frame number of all ball-racket hits (when the ball actually bounces off the racket, not just lying on the racket)
·                The frame numbers (from, to) that the ball is not in contact with other objects and is flying freely in space

 

 

Problems:

 

  • Data are incomplete.
    • When sensors are out of range, they are simply unrecorded. (Not as NaN or other values but simply missing)
    • As Such I may sometimes get 45 readings instead of the intended 48
  • Data needs to be filtered
    • Data contains many jittery components (described in a layman’s term)
    • We need to pass it through a low pass filter (Prof Darrin) such as Buttersworth
  • Our plan was to identify Ball-Floor Bounces because the other bounces are very similar. (In fact we stopped at ball floor bounces)
    • This problem can be simplified, given a set of accurate data, we can find the gradients between the ball’s Z coordinate and time.
    • If we have a sequence where the gradient changes from negative to positive, i.e. \ to / in space, we have a potential floor bounce. (We considered the case of positive to negative and decided that does not represent a bounce)
    • We further consider the actual Z value of the ball when this change occurs
    • If the Z-coordinate is near 0, we consider this a floor bounce
    • If the Z-coordinate represent a ball in mid-air, this is a likely candidate for racket bounce.
      • Admittedly this is not a good approach to recocgnize racket bounce, following a similar procedure but with respect to the X or Y axes (which ever is perpendicular to the player’s torso) would be a better choice)
  • Finding The Racket position would not be difficult once we have the Frame Numbers / Frame Time of the respective bounces

 

Interpolation And Filtering

  • After trying to interpolate the missing values in C, we eventually gave up and decided to use MatLab
  • The first order of business was then to convert tenni.trc into a form that is readable in Matlab.
    • Program: rnf.c does this
      • It takes in by default “./tennis_no_header.trc” and will match the missing data (with the previous line of data) and insert NaN in place of nothing
      • This new set is returned in “./tennis_nan.trc”
  • We can than import the values into matlab
  • In Matlab we called the following functions:
    • Inf(EACH_COORDINATE) (did this 48 times)
      • inf.m
      • inf does the following: interpolate missing data using cubic spline
      • Implement butterworth filter using [b, a] = butter(2, .1)
        • I believe the butterworth filter settings should tweaked
    • After this is done, I called out
      • out.m
      • out simply outputs the data into “./filtered_tennis.trc
  • At this point, we have a set of data that is ready for calculations.

 

Find Ground Bounces

  • Once we have filtered_tennis we can run our C program tennis.c
  • tennis.zip
  • by default, tennis.c takes in filtered_tennis.trc as the input
  • It would compute the Ball-Floor Bounces according the method described above
  • Below is an example plot of Ball-Z coordinates The rear 5 sec is truncated in this graph because using spline interpolation, although the results are much nicer, the rear end of the actual capture are all NaN values. In such a case spline interpolation results in a highly negative tail. Because this would not affect our gradient finding program, since there are no gradient changes, (and also we’re not really sure how to accurately change it) we have left the data as it is. Also the values are truncated in this graph to show more clearly the data which are valid.

  • The above plot is a Time (X-axis) against (Ball: Z-coord) Y-Axis
  • We will now show an example output from our program
    • Frame: 1627 to 1629, Time: 3.252000 to 3.256000: Floor Bounce
    • Frame: 2517 to 2519, Time: 5.032000 to 5.036000: Floor Bounce
    • Frame: 3325 to 3327, Time: 6.648000 to 6.652000: Floor Bounce
    • Frame: 4195 to 4197, Time: 8.388000 to 8.392000: Floor Bounce
    • Frame: 5142 to 5144, Time: 10.282000 to 10.286000: Floor Bounce
    • Frame: 5977 to 5979, Time: 11.952000 to 11.956000: Floor Bounce
    • Frame: 6841 to 6843, Time: 13.680000 to 13.684000: Floor Bounce
    • Frame: 7778 to 7780, Time: 15.554000 to 15.558000: Floor Bounce
    • Frame: 8598 to 8600, Time: 17.194000 to 17.198000: Floor Bounce
    • Frame: 9395 to 9397, Time: 18.788000 to 18.792000: Floor Bounce
    • Frame: 10258 to 10260, Time: 20.514000 to 20.518000: Floor Bounce
    • Frame: 11032 to 11034, Time: 22.062000 to 22.066000: Floor Bounce
    • Frame: 11946 to 11948, Time: 23.890000 to 23.894000: Floor Bounce
    • Frame: 12733 to 12735, Time: 25.464000 to 25.468000: Floor Bounce
    • Frame: 13597 to 13599, Time: 27.192000 to 27.196000: Floor Bounce
    • Frame: 14328 to 14330, Time: 28.654000 to 28.658000: Floor Bounce
    • Frame: 14658 to 14660, Time: 29.314000 to 29.318000: Floor Bounce
    • Frame: 15359 to 15361, Time: 30.716000 to 30.720000: Floor Bounce
    • Frame: 16157 to 16159, Time: 32.312000 to 32.316000: Floor Bounce
    • Frame: 17030 to 17032, Time: 34.058000 to 34.062000: Floor Bounce
    • Frame: 17877 to 17879, Time: 35.752000 to 35.756000: Floor Bounce
    • Frame: 18759 to 18761, Time: 37.516000 to 37.520000: Floor Bounce
    • Frame: 19619 to 19621, Time: 39.236000 to 39.240000: Floor Bounce
    • Frame: 20411 to 20413, Time: 40.820000 to 40.824000: Floor Bounce
    • Frame: 21332 to 21334, Time: 42.662000 to 42.666000: Floor Bounce
    • Frame: 22215 to 22217, Time: 44.428000 to 44.432000: Floor Bounce
    • Frame: 23047 to 23049, Time: 46.092000 to 46.096000: Floor Bounce
    • Frame: 23887 to 23889, Time: 47.772000 to 47.776000: Floor Bounce
    • Frame: 24776 to 24778, Time: 49.550000 to 49.554000: Floor Bounce
    • Frame: 25679 to 25681, Time: 51.356000 to 51.360000: Floor Bounce
    • Frame: 26290 to 26292, Time: 52.578000 to 52.582000: Floor Bounce
    • Frame: 26575 to 26577, Time: 53.148000 to 53.152000: Floor Bounce
    • Frame: 26783 to 26785, Time: 53.564000 to 53.568000: Floor Bounce
    • Frame: 27454 to 27456, Time: 54.906000 to 54.910000: Floor Bounce
    • Frame: 28334 to 28336, Time: 56.666000 to 56.670000: Floor Bounce
    • Frame: 29335 to 29337, Time: 58.668000 to 58.672000: Floor Bounce
  • The program quite accurately detects the gradient changes from negative to positive when Z is small.

 

Conclusion

  • The program only Identify floor bounces right now
  • I took too much time trying to interpolate the data when it could be easily implemented in Matlab