Data from the "Rewarding the Original" trials

"Rewarding the Original" is a system/experimental protocol for exploring the spaces of motions usable for communication with a given user/input-device combination. It is described in:
Rewarding the Original: Explorations in Joint User-Sensor Systems, J. Williamson and R. Murray-Smith ACM SIGCHI'12 , 2012 PDF.

Abstract: This paper presents a systematic and general technique for establishing a set of motions suitable for use with sensor systems, by drawing performable and measurable motions directly from users. It uses reinforcement which rewards originality to induce users to explore the space of motions they can perform. A decomposition of movements into motion primitives is constructed, among which a meaningful originality metric can be defined. Because the originality measure is defined in terms of the sensed input, the resulting space contains only movements which can both be performed and sensed. We show how this can be used to evaluate the relative performance of different joint user-sensor systems, providing objective analyses of gesture lexicons with regard to the technical limitations of sensors and humans. In particular, we show how the space of motions varies across the arm for a body-mounted inertial sensor.


A video is available: motionexplorer.mp4 (high quality, MP4) or it can be seen on YouTube:


The data captured during the experiment is made available for other researchers to use as they wish. Please cite the above paper when making use of this data set. Unfortunately the recorded video data cannot be made available as it compromises subject anonymity.


Download the dataset: (ZIP format, 250Mb expanding to 650Mb)

This includes the raw sensor stream from the inertial sensor, the processed motion vectors and the status logs (which include logs of the feedback levels and the packet loss levels).

There were 20 participants in the trial; each has an anonymised two-letter tag. There is 18 minutes of data for each participant; 2 conditions with 3 sub-trials of 3 minute duration. The description of the data files is given in detail below.

Experimental procedure

The experimental procedure from the paper is reproduced below (see the paper for full technical details):

Experiment Structure

The inertial sensors are sampled synchronously at 32Hz; the sensor streams are filtered on the hardware to bandlimit them before decimating from an original sampling rate of 1024Hz. A 32Hz rate is sufficient to capture the details of most limb movement. At a 0.65s window length one motion primitive is therefore extracted from 21 samples of data (the window time is adjusted slightly to be exactly 21 samples in length). A bank of Savitsky-Golay filters are applied to the signal, each designed to estimate one smoothed derivative efficiently. These coefficients are concatenated into a single vector M with q = 9 x 4 = 36 dimensions, which represents the motion in sensor space.


The novelty detector captures data from a SHAKE SK7 inertial sensor, which provides 3-axis accelerometer, gyroscope and magnetometer outputs. The accelerometer, gyroscope and magnetometer measure in the range -6g 6g, -900 900 degrees/second and -0.2mT 0.2mT respectively, all with 12 bit resolution. The sensor is attached with an elastic band.


The exploration was carried out in two conditions: condition A, with the sensor attached to the dominant hand; and condition B, with the sensor attached to the arm just above the elbow.


The experiment was conducted in a laboratory. There were N = 20 participants, 16 male, 4 female, recruited from a pool of computer science students, with an age range of 1840. All participants gave informed consent. The SK7 sensor pack was affixed with an elastic strap to maintain a firm connection.
All participants completed both conditions in counterbalanced order. Each condition was conducted as a set of three subtrials, lasting three minutes, with a break between each. Each subtrial continued from the point the previous one left off, for a total of nine minutes of exploration in each condition. The conditions were broken into subtrials to combat fatigue from long performances. The implementation uses k = 5 nearest neighbours and a value of delta = 1.50 for the novelty cutoff.

Trial format

Each "sub-trial" creates a directory containing the data for that session. These directories are named XX_[hand|elbow]_n, where XX is the identifier for the participant, hand or elbow specifies where the sensor was mounted, and n can be 0, 1, or 2 in sequence.

Within each directory, there are six log files (all plain ASCII text files):
baselog.txt Records basic attributes about the trial (start/end times, etc.)
Text file, in key: value format, one item per line
  • start_time: "yyyy-mm-dd hh:mm:ss.dddddd" Start time of the trial
  • window: nn Sliding window length in samples (will be 21 in all examples)
  • order: n Polynomial order (will be 4 for all examples)
  • sample_rate: nn.nnnnn Sample rate, in Hz (32 for all examples)
  • cutoff: 16.000000 Cutoff for the lowpass filter (disabled if=Nyquist)
  • continutation: XX_[hand|elbow]_n The directory this log continues from, if there is one.
  • end_seconds: nnn Duration of the trial in seconds (will be 180 for all examples)
  • end_time: "yyyy-mm-dd hh:mm:ss.dddddd" End time of the trial
eventlog.txt Records overall "score" and feedback state (level of feedback output)
Text file, one row per log time, space separated. Format:
real_time trial_time rscore feedback_level score locked added vectors dummy
  • real_time "yyyy-mm-dd hh:mm:ss.dddddd" Wall clock time, as a quoted string
  • trial_time Time in seconds since start of trial
  • rscore Score of last vector (bigger = more original)
  • feedback_level Level of feedback, as a floating point number
  • score Smoothed score level
  • lock 0 normally, 1 if the system is "locked" due to sensor saturation
  • added 1 if the vector was added to the repertoire
  • vectors Total number of unique vectors so far
  • dummy Always 0
rawdata.txt Raw sensor stream, 32Hz sampled from accelerometer, magnetometer and gyroscope.
time sensor_clock ax ay az mx my mz gx gy gz drops
  • time time, in floating point seconds, since the start of the trial
  • sensor_clock timestamp from the sensor. Integer, runs from 0-255. Should increment by 1 every sample (except wrapping 255->0) -- if not a packet has been dropped
  • ax,ay,az Accelerometer values (in milliGs).
  • mx,my,mz Magnetometer values (in milliGauss).
  • gx,gy,gz Gyroscope values (in degrees/second * 10, so 3600 = one revolution per second).
  • drops Current packet drop estimator (smoothed). The processed motion vectors for each submovement. Each vector is a point in 36-dimensional space representing the movement.
Space separated floating point values, 36 values per line. Each vector is in the order it was added to repertoire. The vector is ordered:
[ax dax d2ax d3ax ay day ... az ... mx dmx d2mx ... gx ...]
where ax/gx/mx is the x-component of the accelerometer, gyroscope and magnetometer respectively, and dax means the first derivative of ax, d2ax means the second derivative etc.
vectors.cov The covariance matrix of the captured set of vectors (as a MATLAB-style text file).
A single text 36x36 matrix, which is the covariance of all the vectors for this subject. Internal parameters of the system, as a Python script file. Identical for all datasets and not very interesting for analysis!