For this assignment we wanted to make one hand follow the other. The goal is to create a system in which one hand is the “master” and the other is the “student,” such that the student attempts to copy the master until it is able to achieve the same movement as the master with stability and success.

To make the movement appear more organic, we added random noise to one of the arms. We also increased frequency and reduced damping ratio to give the appearance of more erratic movement. Combined, these effects created a “stable” arm and an “unstable” arm. Reducing the noise over multiple iterations created the effect of the student getting “better.”

The following is the modified code for the exercise:

###################
# In exercise4.py #
###################
def addRandomness(target, factor):
    noise = random.randint(-300, 300)
    return target + int(noise * (factor/100))

#################
# In ex4demo.py #
#################
def sequenceOne(self):

        self.write('1st down')
        
        self.send_cue('gains', 0.5, 1.0)        
        self.send_pose('reset')
        self.sleep_unless_stop(1)

        self.send_pose('lead1')
        self.sleep_unless_stop(1)

        self.send_pose('lead2')
        self.sleep_unless_stop(1)

        self.send_cue('gains', 0.6, 0.8)        
        self.sleep_unless_stop(1)

        self.send_pose('lead3')
        self.sleep_unless_stop(1)

        self.send_pose('lead4')
        self.sleep_unless_stop(1)

        self.write("1st & 3")
        return

    def sequenceTwo(self):

        self.write("2nd down")

        self.send_cue('gains', 0.5, 1.0)        
        self.send_pose('reset')
        self.sleep_unless_stop(1)

        self.send_pose('lead5')
        self.sleep_unless_stop(1)

        self.send_pose('lead6')
        self.sleep_unless_stop(1)

        self.send_cue('gains', 0.6, 0.8)
        self.sleep_unless_stop(1)

        self.send_cue('lead7')
        self.sleep_unless_stop(1)

        self.send_cue('lead8')
        self.sleep_unless_stop(1)

        self.write("2nd & 2")
        return

    def sequenceThree(self):

        self.write("3rd down")

        self.send_cue('gains', 0.5, 1.0)        
        self.send_pose('reset')
        self.sleep_unless_stop(1)

        self.send_pose('lead9')
        self.sleep_unless_stop(1)

        self.send_pose('lead10')
        self.sleep_unless_stop(1)

        self.send_cue('gains', 0.6, 0.8)        
        self.sleep_unless_stop(1)

        self.send_cue('lead11')
        self.sleep_unless_stop(1)

        self.send_cue('lead12')
        self.sleep_unless_stop(1)

        self.write("3rd & 1")
        return

    def sequenceFour(self):

        self.write("4th down")

        self.send_cue('gains', 0.5, 1.0)        
        self.send_pose('reset')
        self.sleep_unless_stop(1)

        self.send_pose('lead13')
        self.sleep_unless_stop(1)

        self.send_pose('lead14')
        self.sleep_unless_stop(1)

        self.send_cue('gains', 0.6, 0.8)
        self.sleep_unless_stop(1)

        self.send_cue('lead15')
        self.sleep_unless_stop(1)

        self.send_cue('lead16')
        self.sleep_unless_stop(1)

        self.write("4th & goal")
        return

    def sequence(self):

        self.write("Script starting.")
        timer = 0
        while(timer <= 1):
            self.write("new sequence")
            self.sequenceOne()
            timer += 1
        while(timer <= 3):
            self.write("new sequence")
            self.sequenceTwo()
            timer += 1
        while(timer <= 5):
            self.write("new sequence")
            self.sequenceThree()
            timer += 1
        while(timer <= 7):
            self.write("new sequence")
            self.sequenceFour()
            timer += 1
        self.write("goal")
        return