Exemplo n.º 1
0
 def run(self):
     """Play the forward motion and loop on the walking cycle."""
     walk = Motion('forward.motion')
     walk.setLoop(True)
     walk.play()
     while True:
         # # This motor is not controlled by forward.motion.
         # self.RHipYawPitch.setPosition(-1)
         # print walk.getTime()  # display the current time of the forward.motion
         if walk.getTime() == 1360:  # we reached the end of forward.motion
             walk.setTime(360)  # loop back to the beginning of the walking sequence
         # Perform a simulation step, quit if the simulation is over.
         if self.step(self.timeStep) == -1:
             break
Exemplo n.º 2
0
class Nao(Robot):
    PHALANX_MAX = 8

    # load motion files
    def loadMotionFiles(self):
        self.handWave = Motion('../../motions/HandWave.motion')
        self.forwards = Motion('../../motions/Forwards50.motion')
        self.backwards = Motion('../../motions/Backwards.motion')
        self.sideStepLeft = Motion('../../motions/SideStepLeft.motion')
        self.sideStepRight = Motion('../../motions/SideStepRight.motion')
        self.turnLeft60 = Motion('../../motions/TurnLeft60.motion')
        self.turnRight60 = Motion('../../motions/TurnRight60.motion')

    def startMotion(self, motion):
        # interrupt current motion
        if self.currentlyPlaying:
            self.currentlyPlaying.stop()

        # start new motion
        motion.play()
        self.currentlyPlaying = motion

    # the accelerometer axes are oriented as on the real robot
    # however the sign of the returned values may be opposite
    def printAcceleration(self):
        acc = self.accelerometer.getValues()
        print('----------accelerometer----------')
        print('acceleration: [ x y z ] = [%f %f %f]' %
              (acc[0], acc[1], acc[2]))

    # the gyro axes are oriented as on the real robot
    # however the sign of the returned values may be opposite
    def printGyro(self):
        vel = self.gyro.getValues()
        print('----------gyro----------')
        # z value is meaningless due to the orientation of the Gyro
        print('angular velocity: [ x y ] = [%f %f]' % (vel[0], vel[1]))

    def printGps(self):
        p = self.gps.getValues()
        print('----------gps----------')
        print('position: [ x y z ] = [%f %f %f]' % (p[0], p[1], p[2]))

    # the InertialUnit roll/pitch angles are equal to naoqi's AngleX/AngleY
    def printInertialUnit(self):
        rpy = self.inertialUnit.getRollPitchYaw()
        print('----------inertial unit----------')
        print('roll/pitch/yaw: [%f %f %f]' % (rpy[0], rpy[1], rpy[2]))

    def printFootSensors(self):
        newtons = 0.0
        fsv = []  # force sensor values

        fsv.append(self.fsr[0].getValues())
        fsv.append(self.fsr[1].getValues())

        l = []
        r = []

        newtonsLeft = 0
        newtonsRight = 0

        # The coefficients were calibrated against the real
        # robot so as to obtain realistic sensor values.
        l.append(fsv[0][2] / 3.4 + 1.5 * fsv[0][0] +
                 1.15 * fsv[0][1])  # Left Foot Front Left
        l.append(fsv[0][2] / 3.4 + 1.5 * fsv[0][0] -
                 1.15 * fsv[0][1])  # Left Foot Front Right
        l.append(fsv[0][2] / 3.4 - 1.5 * fsv[0][0] -
                 1.15 * fsv[0][1])  # Left Foot Rear Right
        l.append(fsv[0][2] / 3.4 - 1.5 * fsv[0][0] +
                 1.15 * fsv[0][1])  # Left Foot Rear Left

        r.append(fsv[1][2] / 3.4 + 1.5 * fsv[1][0] +
                 1.15 * fsv[1][1])  # Right Foot Front Left
        r.append(fsv[1][2] / 3.4 + 1.5 * fsv[1][0] -
                 1.15 * fsv[1][1])  # Right Foot Front Right
        r.append(fsv[1][2] / 3.4 - 1.5 * fsv[1][0] -
                 1.15 * fsv[1][1])  # Right Foot Rear Right
        r.append(fsv[1][2] / 3.4 - 1.5 * fsv[1][0] +
                 1.15 * fsv[1][1])  # Right Foot Rear Left

        for i in range(0, len(l)):
            l[i] = max(min(l[i], 25), 0)
            r[i] = max(min(r[i], 25), 0)
            newtonsLeft += l[i]
            newtonsRight += r[i]

        print('----------foot sensors----------')
        print('+ left ---- right +')
        print('+-------+ +-------+')
        print('|'  + str(round(l[0],1)) + \
              '  ' + str(round(l[1],1)) + \
              '| |'+ str(round(r[0],1)) + \
              '  ' + str(round(r[1],1)) + \
              '|  front')
        print('| ----- | | ----- |')
        print('|'  + str(round(l[3],1)) + \
              '  ' + str(round(l[2],1)) + \
              '| |'+ str(round(r[3],1)) + \
              '  ' + str(round(r[2],1)) + \
              '|  back')
        print('+-------+ +-------+')
        print('total: %f Newtons, %f kilograms' \
              % ((newtonsLeft + newtonsRight), ((newtonsLeft + newtonsRight)/9.81)))

    def printFootBumpers(self):
        ll = self.lfootlbumper.getValue()
        lr = self.lfootrbumper.getValue()
        rl = self.rfootlbumper.getValue()
        rr = self.rfootrbumper.getValue()
        print('----------foot bumpers----------')
        print('+ left ------ right +')
        print('+--------+ +--------+')
        print('|' + str(ll) + '  ' + str(lr) + '| |' + str(rl) + '  ' +
              str(rr) + '|')
        print('|        | |        |')
        print('|        | |        |')
        print('+--------+ +--------+')

    def printUltrasoundSensors(self):
        dist = []
        for i in range(0, len(self.us)):
            dist.append(self.us[i].getValue())

        print('-----ultrasound sensors-----')
        print('left: %f m, right %f m' % (dist[0], dist[1]))

    def printCameraImage(self, camera):
        scaled = 2  # defines by which factor the image is subsampled
        width = camera.getWidth()
        height = camera.getHeight()

        # read rgb pixel values from the camera
        image = camera.getImage()

        print('----------camera image (gray levels)---------')
        print('original resolution: %d x %d, scaled to %d x %f' \
              % (width, height, width/scaled, height/scaled))

        for y in range(0, height / scaled):
            line = ''
            for x in range(0, width / scaled):
                gray = camera.imageGetGray(
                    image, width, x * scaled, y *
                    scaled) * 9 / 255  # between 0 and  instead of 0 and 255
                line = line + str(int(gray))
            print(line)

    def setAllLedsColor(self, rgb):
        # these leds take RGB values
        for i in range(0, len(self.leds)):
            self.leds[i].set(rgb)

        # ear leds are single color (blue)
        # and take values between 0 - 255
        self.leds[5].set(rgb & 0xFF)
        self.leds[6].set(rgb & 0xFF)

    def setHandsAngle(self, angle):
        for i in range(0, self.PHALANX_MAX):
            clampedAngle = angle
            if clampedAngle > self.maxPhalanxMotorPosition[i]:
                clampedAngle = self.maxPhalanxMotorPosition[i]
            elif clampedAngle < self.minPhalanxMotorPosition[i]:
                clampedAngle = self.minPhalanxMotorPosition[i]

            if len(self.rphalanx) > i and self.rphalanx[i] is not None:
                self.rphalanx[i].setPosition(clampedAngle)
            if len(self.lphalanx) > i and self.lphalanx[i] is not None:
                self.lphalanx[i].setPosition(clampedAngle)

    def printHelp(self):
        print('----------nao_demo_python----------')
        print('Use the keyboard to control the robots (one at a time)')
        print('(The 3D window need to be focused)')
        print('[Up][Down]: move one step forward/backwards')
        print('[<-][->]: side step left/right')
        print('[Shift] + [<-][->]: turn left/right')
        print('[U]: print ultrasound sensors')
        print('[A]: print accelerometers')
        print('[G]: print gyros')
        print('[S]: print gps')
        print('[I]: print inertial unit (roll/pitch/yaw)')
        print('[F]: print foot sensors')
        print('[B]: print foot bumpers')
        print('[Home][End]: print scaled top/bottom camera image')
        print('[PageUp][PageDown]: open/close hands')
        print('[7][8][9]: change all leds RGB color')
        print('[0]: turn all leds off')
        print('[H]: print this help message')

    def findAndEnableDevices(self):
        # get the time step of the current world.
        self.timeStep = int(self.getBasicTimeStep())

        # camera
        self.cameraTop = self.getCamera("CameraTop")
        self.cameraBottom = self.getCamera("CameraBottom")
        self.cameraTop.enable(4 * self.timeStep)
        self.cameraBottom.enable(4 * self.timeStep)

        # accelerometer
        self.accelerometer = self.getAccelerometer('accelerometer')
        self.accelerometer.enable(4 * self.timeStep)

        # gyro
        self.gyro = self.getGyro('gyro')
        self.gyro.enable(4 * self.timeStep)

        # gps
        self.gps = self.getGPS('gps')
        self.gps.enable(4 * self.timeStep)

        # inertial unit
        self.inertialUnit = self.getInertialUnit('inertial unit')
        self.inertialUnit.enable(self.timeStep)

        # ultrasound sensors
        self.us = []
        usNames = ['Sonar/Left', 'Sonar/Right']
        for i in range(0, len(usNames)):
            self.us.append(self.getDistanceSensor(usNames[i]))
            self.us[i].enable(self.timeStep)

        # foot sensors
        self.fsr = []
        fsrNames = ['LFsr', 'RFsr']
        for i in range(0, len(fsrNames)):
            self.fsr.append(self.getTouchSensor(fsrNames[i]))
            self.fsr[i].enable(self.timeStep)

        # foot bumpers
        self.lfootlbumper = self.getTouchSensor('LFoot/Bumper/Left')
        self.lfootrbumper = self.getTouchSensor('LFoot/Bumper/Right')
        self.rfootlbumper = self.getTouchSensor('RFoot/Bumper/Left')
        self.rfootrbumper = self.getTouchSensor('RFoot/Bumper/Right')
        self.lfootlbumper.enable(self.timeStep)
        self.lfootrbumper.enable(self.timeStep)
        self.rfootlbumper.enable(self.timeStep)
        self.rfootrbumper.enable(self.timeStep)

        # there are 7 controlable LED groups in Webots
        self.leds = []
        self.leds.append(self.getLED('ChestBoard/Led'))
        self.leds.append(self.getLED('RFoot/Led'))
        self.leds.append(self.getLED('LFoot/Led'))
        self.leds.append(self.getLED('Face/Led/Right'))
        self.leds.append(self.getLED('Face/Led/Left'))
        self.leds.append(self.getLED('Ears/Led/Right'))
        self.leds.append(self.getLED('Ears/Led/Left'))

        # get phalanx motor tags
        # the real Nao has only 2 motors for RHand/LHand
        # but in Webots we must implement RHand/LHand with 2x8 motors
        self.lphalanx = []
        self.rphalanx = []
        self.maxPhalanxMotorPosition = []
        self.minPhalanxMotorPosition = []
        for i in range(0, self.PHALANX_MAX):
            self.lphalanx.append(self.getMotor("LPhalanx%d" % (i + 1)))
            self.rphalanx.append(self.getMotor("RPhalanx%d" % (i + 1)))

            # assume right and left hands have the same motor position bounds
            self.maxPhalanxMotorPosition.append(
                self.rphalanx[i].getMaxPosition())
            self.minPhalanxMotorPosition.append(
                self.rphalanx[i].getMinPosition())

        # shoulder pitch motors
        self.RShoulderPitch = self.getMotor("RShoulderPitch")
        self.LShoulderPitch = self.getMotor("LShoulderPitch")

        # keyboard
        self.keyboard = self.getKeyboard()
        self.keyboard.enable(10 * self.timeStep)

    def __init__(self):
        Robot.__init__(self)
        self.currentlyPlaying = False

        # initialize stuff
        self.findAndEnableDevices()
        self.loadMotionFiles()
        self.printHelp()

    def run(self):
        self.handWave.setLoop(True)
        self.handWave.play()

        # until a key is pressed
        key = -1
        while robot.step(self.timeStep) != -1:
            key = self.keyboard.getKey()
            if key > 0:
                break

        self.handWave.setLoop(False)

        while True:
            key = self.keyboard.getKey()

            if key == Keyboard.LEFT:
                self.startMotion(self.sideStepLeft)
            elif key == Keyboard.RIGHT:
                self.startMotion(self.sideStepRight)
            elif key == Keyboard.UP:
                self.startMotion(self.forwards)
            elif key == Keyboard.DOWN:
                self.startMotion(self.backwards)
            elif key == Keyboard.LEFT | Keyboard.SHIFT:
                self.startMotion(self.turnLeft60)
            elif key == Keyboard.RIGHT | Keyboard.SHIFT:
                self.startMotion(self.turnRight60)
            elif key == ord('A'):
                self.printAcceleration()
            elif key == ord('G'):
                self.printGyro()
            elif key == ord('S'):
                self.printGps()
            elif key == ord('I'):
                self.printInertialUnit()
            elif key == ord('F'):
                self.printFootSensors()
            elif key == ord('B'):
                self.printFootBumpers()
            elif key == ord('U'):
                self.printUltrasoundSensors()
            elif key == Keyboard.HOME:
                self.printCameraImage(self.cameraTop)
            elif key == Keyboard.END:
                self.printCameraImage(self.cameraBottom)
            elif key == Keyboard.PAGEUP:
                self.setHandsAngle(0.96)
            elif key == Keyboard.PAGEDOWN:
                self.setHandsAngle(0.0)
            elif key == ord('7'):
                self.setAllLedsColor(0xff0000)  # red
            elif key == ord('8'):
                self.setAllLedsColor(0x00ff00)  # green
            elif key == ord('9'):
                self.setAllLedsColor(0x0000ff)  # blue
            elif key == ord('0'):
                self.setAllLedsColor(0x000000)  # off
            elif key == ord('H'):
                self.printHelp()

            if robot.step(self.timeStep) == -1:
                break
Exemplo n.º 3
0
class Nao(Robot):
    PHALANX_MAX = 8

    def startMindwave(self):
        self.outfile = "data_eeg.csv"
        p = subprocess.Popen([sys.executable, 'nao_mindwave_reader.py'],
                             stdout=subprocess.PIPE,
                             stderr=subprocess.STDOUT)

    # load motion files
    def loadMotionFiles(self):
        self.handWave = Motion('../../motions/HandWave.motion')
        self.forwards = Motion('../../motions/Forwards50.motion')
        self.backwards = Motion('../../motions/Backwards.motion')
        self.sideStepLeft = Motion('../../motions/SideStepLeft.motion')
        self.sideStepRight = Motion('../../motions/SideStepRight.motion')
        self.turnLeft60 = Motion('../../motions/TurnLeft60.motion')
        self.turnRight60 = Motion('../../motions/TurnRight60.motion')

    def startMotion(self, motion):
        # interrupt current motion
        if self.currentlyPlaying:
            self.currentlyPlaying.stop()

        # start new motion
        motion.play()
        self.currentlyPlaying = motion

    def setAllLedsColor(self, rgb):
        # these leds take RGB values
        for i in range(0, len(self.leds)):
            self.leds[i].set(rgb)

        # ear leds are single color (blue)
        # and take values between 0 - 255
        self.leds[5].set(rgb & 0xFF)
        self.leds[6].set(rgb & 0xFF)

    def setHandsAngle(self, angle):
        for i in range(0, self.PHALANX_MAX):
            clampedAngle = angle
            if clampedAngle > self.maxPhalanxMotorPosition[i]:
                clampedAngle = self.maxPhalanxMotorPosition[i]
            elif clampedAngle < self.minPhalanxMotorPosition[i]:
                clampedAngle = self.minPhalanxMotorPosition[i]

            if len(self.rphalanx) > i and self.rphalanx[i] is not None:
                self.rphalanx[i].setPosition(clampedAngle)
            if len(self.lphalanx) > i and self.lphalanx[i] is not None:
                self.lphalanx[i].setPosition(clampedAngle)

    def findAndEnableDevices(self):
        # get the time step of the current world.
        self.timeStep = int(self.getBasicTimeStep())

        # camera
        self.cameraTop = self.getCamera("CameraTop")
        self.cameraBottom = self.getCamera("CameraBottom")
        self.cameraTop.enable(4 * self.timeStep)
        self.cameraBottom.enable(4 * self.timeStep)

        # accelerometer
        self.accelerometer = self.getAccelerometer('accelerometer')
        self.accelerometer.enable(4 * self.timeStep)

        # gyro
        self.gyro = self.getGyro('gyro')
        self.gyro.enable(4 * self.timeStep)

        # gps
        self.gps = self.getGPS('gps')
        self.gps.enable(4 * self.timeStep)

        # inertial unit
        self.inertialUnit = self.getInertialUnit('inertial unit')
        self.inertialUnit.enable(self.timeStep)

        # ultrasound sensors
        self.us = []
        usNames = ['Sonar/Left', 'Sonar/Right']
        for i in range(0, len(usNames)):
            self.us.append(self.getDistanceSensor(usNames[i]))
            self.us[i].enable(self.timeStep)

        # foot sensors
        self.fsr = []
        fsrNames = ['LFsr', 'RFsr']
        for i in range(0, len(fsrNames)):
            self.fsr.append(self.getTouchSensor(fsrNames[i]))
            self.fsr[i].enable(self.timeStep)

        # foot bumpers
        self.lfootlbumper = self.getTouchSensor('LFoot/Bumper/Left')
        self.lfootrbumper = self.getTouchSensor('LFoot/Bumper/Right')
        self.rfootlbumper = self.getTouchSensor('RFoot/Bumper/Left')
        self.rfootrbumper = self.getTouchSensor('RFoot/Bumper/Right')
        self.lfootlbumper.enable(self.timeStep)
        self.lfootrbumper.enable(self.timeStep)
        self.rfootlbumper.enable(self.timeStep)
        self.rfootrbumper.enable(self.timeStep)

        # there are 7 controlable LED groups in Webots
        self.leds = []
        self.leds.append(self.getLED('ChestBoard/Led'))
        self.leds.append(self.getLED('RFoot/Led'))
        self.leds.append(self.getLED('LFoot/Led'))
        self.leds.append(self.getLED('Face/Led/Right'))
        self.leds.append(self.getLED('Face/Led/Left'))
        self.leds.append(self.getLED('Ears/Led/Right'))
        self.leds.append(self.getLED('Ears/Led/Left'))

        # get phalanx motor tags
        # the real Nao has only 2 motors for RHand/LHand
        # but in Webots we must implement RHand/LHand with 2x8 motors
        self.lphalanx = []
        self.rphalanx = []
        self.maxPhalanxMotorPosition = []
        self.minPhalanxMotorPosition = []
        for i in range(0, self.PHALANX_MAX):
            self.lphalanx.append(self.getMotor("LPhalanx%d" % (i + 1)))
            self.rphalanx.append(self.getMotor("RPhalanx%d" % (i + 1)))

            # assume right and left hands have the same motor position bounds
            self.maxPhalanxMotorPosition.append(
                self.rphalanx[i].getMaxPosition())
            self.minPhalanxMotorPosition.append(
                self.rphalanx[i].getMinPosition())

        # shoulder pitch motors
        self.RShoulderPitch = self.getMotor("RShoulderPitch")
        self.LShoulderPitch = self.getMotor("LShoulderPitch")

        # keyboard
        self.keyboard = self.getKeyboard()
        self.keyboard.enable(10 * self.timeStep)

    def __init__(self):
        Robot.__init__(self)
        self.currentlyPlaying = False
        # initialize stuff
        self.findAndEnableDevices()
        self.loadMotionFiles()
        self.startMindwave()

    def getWaves(self):
        poorSignalLevel = blinkStrength = attention = meditation = 0
        with open(self.outfile, 'rb') as f:
            lines = f.readlines()
        f.close()
        last5 = np.genfromtxt(lines[-3:], delimiter=',')
        poorSignalLevel = last5[:, 0]
        blinkStrength = last5[:, 1]
        attention = last5[:, 2]
        meditation = last5[:, 3]
        poors = sum(poorSignalLevel > 0)
        blinks = sum(blinkStrength > 40)
        att = sum(attention > 50)
        med = sum(meditation < 40)
        #print(str(blinks)+","+str(att))
        return poors, blinks, att, med

    def run(self):
        #self.handWave.setLoop(True)
        self.handWave.play()
        self.handWave.setLoop(False)
        turnAround = True

        while True:
            poorSignalLevel, blink_count, attention_count, meditation_count = self.getWaves(
            )

            if poorSignalLevel > 0:
                self.setAllLedsColor(0xff0000)  # red
                print("poor signal!!!")
            elif (blink_count > 0) and turnAround:
                print("turn around")
                self.setAllLedsColor(0x00ff00)  # green
                while turnAround:
                    for k in range(3 * self.timeStep):
                        self.startMotion(self.turnRight60)
                        robot.step(self.timeStep)
                    poorSignalLevel, blink_count, attention_count, meditation_count = self.getWaves(
                    )
                    if blink_count > 0:
                        print("exit loop")
                        turnAround = False
            elif attention_count > 0:
                print("go forward")
                turnAround = True
                self.setAllLedsColor(0x0000ff)  # blue
                for k in range(3 * self.timeStep):
                    self.startMotion(self.forwards)
                    robot.step(self.timeStep)
            elif meditation_count > 0:
                self.setAllLedsColor(0x000000)  # off
                #print("i am not cool")

            if robot.step(self.timeStep) == -1:
                break

        self.sock.close()
class Nao(Robot):
    PHALANX_MAX = 8

    # load motion files
    def loadMotionFiles(self):
        self.handWave = Motion('../../motions/HandWave.motion')
        self.forwards = Motion('../../motions/Forwards50.motion')
        self.backwards = Motion('../../motions/Backwards.motion')
        self.sideStepLeft = Motion('../../motions/SideStepLeft.motion')
        self.sideStepRight = Motion('../../motions/SideStepRight.motion')
        self.turnLeft60 = Motion('../../motions/TurnLeft60.motion')
        self.turnRight60 = Motion('../../motions/TurnRight60.motion')

    def startMotion(self, motion):
        # interrupt current motion
        # if self.currentlyPlaying:
        #     self.currentlyPlaying.stop()

        if (self.currentlyPlaying and self.currentlyPlaying != self.turnLeft60
                and self.currentlyPlaying != self.turnRight60):
            self.currentlyPlaying.stop()
            self.updateOdometry()
            motion.play()
            self.currentlyPlaying = motion
        else:
            motion.play()
            self.currentlyPlaying = motion
        # start new motion
        # motion.play()
        # self.currentlyPlaying = motion

    # the accelerometer axes are oriented as on the real robot
    # however the sign of the returned values may be opposite
    def printAcceleration(self):
        acc = self.accelerometer.getValues()
        print '----------accelerometer----------'
        print 'acceleration: [ x y z ] = [%f %f %f]' % (acc[0], acc[1], acc[2])

    # the gyro axes are oriented as on the real robot
    # however the sign of the returned values may be opposite
    def printGyro(self):
        vel = self.gyro.getValues()
        print '----------gyro----------'
        # z value is meaningless due to the orientation of the Gyro
        print 'angular velocity: [ x y ] = [%f %f]' % (vel[0], vel[1])

    def printGps(self):
        p = self.gps.getValues()
        print '----------gps----------'
        print 'position: [ x y z ] = [%f %f %f]' % (p[0], p[1], p[2])
        p = self.HeadPitchS.getValue()
        print '----------HeadPitchS----------'
        print 'HeadPitchS : %f' % p
        p = self.RElbowRollS.getValue()
        print '----------RElbowRollS----------'
        print 'RElbowRollS : %f' % p
        p = self.LElbowRollS.getValue()
        a = self.LElbowRollS.getType()
        print '----------LElbowRollS----------'
        print 'LElbowRollS : %f %f' % (p, a)
        p = self.RShoulderPitchS.getValue()
        print '----------RShoulderPitchS----------'
        print 'RShoulderPitchS : %f' % p
        p = self.RAnklePitchS.getValue()
        print '----------RAnklePitchS----------'
        print 'RAnklePitchS : %f' % p

    # the InertialUnit roll/pitch angles are equal to naoqi's AngleX/AngleY
    def printInertialUnit(self):
        rpy = self.inertialUnit.getRollPitchYaw()
        print '----------inertial unit----------'
        print 'roll/pitch/yaw: [%f %f %f]' % (rpy[0], rpy[1], rpy[2])

    def printFootSensors(self):
        newtons = 0.0
        fsv = []  # force sensor values

        fsv.append(self.fsr[0].getValues())
        fsv.append(self.fsr[1].getValues())

        #a = self.getMotor("HeadYaw")

        l = []
        r = []

        newtonsLeft = 0
        newtonsRight = 0

        # The coefficients were calibrated against the real
        # robot so as to obtain realistic sensor values.
        l.append(fsv[0][2] / 3.4 + 1.5 * fsv[0][0] +
                 1.15 * fsv[0][1])  # Left Foot Front Left
        l.append(fsv[0][2] / 3.4 + 1.5 * fsv[0][0] -
                 1.15 * fsv[0][1])  # Left Foot Front Right
        l.append(fsv[0][2] / 3.4 - 1.5 * fsv[0][0] -
                 1.15 * fsv[0][1])  # Left Foot Rear Right
        l.append(fsv[0][2] / 3.4 - 1.5 * fsv[0][0] +
                 1.15 * fsv[0][1])  # Left Foot Rear Left

        r.append(fsv[1][2] / 3.4 + 1.5 * fsv[1][0] +
                 1.15 * fsv[1][1])  # Right Foot Front Left
        r.append(fsv[1][2] / 3.4 + 1.5 * fsv[1][0] -
                 1.15 * fsv[1][1])  # Right Foot Front Right
        r.append(fsv[1][2] / 3.4 - 1.5 * fsv[1][0] -
                 1.15 * fsv[1][1])  # Right Foot Rear Right
        r.append(fsv[1][2] / 3.4 - 1.5 * fsv[1][0] +
                 1.15 * fsv[1][1])  # Right Foot Rear Left

        for i in range(0, len(l)):
            l[i] = max(min(l[i], 25), 0)
            r[i] = max(min(r[i], 25), 0)
            newtonsLeft += l[i]
            newtonsRight += r[i]

        print '----------foot sensors----------'
        print '+ left ---- right +'
        print '+-------+ +-------+'
        print '|'  + str(round(l[0],1)) + \
              '  ' + str(round(l[1],1)) + \
              '| |'+ str(round(r[0],1)) + \
              '  ' + str(round(r[1],1)) + \
              '|  front'
        print '| ----- | | ----- |'
        print '|'  + str(round(l[3],1)) + \
              '  ' + str(round(l[2],1)) + \
              '| |'+ str(round(r[3],1)) + \
              '  ' + str(round(r[2],1)) + \
              '|  back'
        print '+-------+ +-------+'
        print 'total: %f Newtons, %f kilograms' \
              % ((newtonsLeft + newtonsRight), ((newtonsLeft + newtonsRight)/9.81))

    def printFootBumpers(self):
        ll = self.lfootlbumper.getValue()
        lr = self.lfootrbumper.getValue()
        rl = self.rfootlbumper.getValue()
        rr = self.rfootrbumper.getValue()
        print '----------foot bumpers----------'
        print '+ left ------ right +'
        print '+--------+ +--------+'
        print '|' + str(ll) + '  ' + str(lr) + '| |' + str(rl) + '  ' + str(
            rr) + '|'
        print '|        | |        |'
        print '|        | |        |'
        print '+--------+ +--------+'

    def printUltrasoundSensors(self):
        dist = []
        for i in range(0, len(self.us)):
            dist.append(self.us[i].getValue())

        print '-----ultrasound sensors-----'
        print 'left: %f m, right %f m' % (dist[0], dist[1])

    def printCameraImage(self, camera):
        scaled = 2  # defines by which factor the image is subsampled
        width = camera.getWidth()
        height = camera.getHeight()

        # read rgb pixel values from the camera
        image = camera.getImage()
        focal = camera.getFov()
        print "field of view ",
        print focal
        print '----------camera image (gray levels)---------'
        print 'original resolution: %d x %d, scaled to %d x %f' \
              % (width, height, width/scaled, height/scaled)

        for y in range(0, height / scaled):
            line = ''
            for x in range(0, width / scaled):
                gray = camera.imageGetGray(
                    image, width, x * scaled, y *
                    scaled) * 9 / 255  # between 0 and  instead of 0 and 255
                line = line + str(int(gray))
            print line

    def setAllLedsColor(self, rgb):
        # these leds take RGB values
        for i in range(0, len(self.leds)):
            self.leds[i].set(rgb)

        # ear leds are single color (blue)
        # and take values between 0 - 255
        self.leds[5].set(rgb & 0xFF)
        self.leds[6].set(rgb & 0xFF)

    def setHandsAngle(self, angle):
        for i in range(0, self.PHALANX_MAX):
            clampedAngle = angle
            if clampedAngle > self.maxPhalanxMotorPosition[i]:
                clampedAngle = self.maxPhalanxMotorPosition[i]
            elif clampedAngle < self.minPhalanxMotorPosition[i]:
                clampedAngle = self.minPhalanxMotorPosition[i]

            if len(self.rphalanx) > i and self.rphalanx[i] is not None:
                self.rphalanx[i].setPosition(clampedAngle)
            if len(self.lphalanx) > i and self.lphalanx[i] is not None:
                self.lphalanx[i].setPosition(clampedAngle)

    def printHelp(self):
        print '----------nao_demo_python----------'
        print 'Use the keyboard to control the robots (one at a time)'
        print '(The 3D window need to be focused)'
        print '[Up][Down]: move one step forward/backwards'
        print '[<-][->]: side step left/right'
        print '[Shift] + [<-][->]: turn left/right'
        print '[U]: print ultrasound sensors'
        print '[A]: print accelerometers'
        print '[G]: print gyros'
        print '[S]: print gps'
        print '[I]: print inertial unit (roll/pitch/yaw)'
        print '[F]: print foot sensors'
        print '[B]: print foot bumpers'
        print '[Home][End]: print scaled top/bottom camera image'
        print '[PageUp][PageDown]: open/close hands'
        print '[7][8][9]: change all leds RGB color'
        print '[0]: turn all leds off'
        print '[H]: print this help message'

    def findAndEnableDevices(self):
        # get the time step of the current world.
        self.timeStep = int(self.getBasicTimeStep())

        # camera
        self.cameraTop = self.getCamera("CameraTop")
        self.cameraBottom = self.getCamera("CameraBottom")
        self.cameraTop.enable(4 * self.timeStep)
        self.cameraBottom.enable(4 * self.timeStep)

        # accelerometer
        self.accelerometer = self.getAccelerometer('accelerometer')
        self.accelerometer.enable(4 * self.timeStep)

        # gyro
        self.gyro = self.getGyro('gyro')
        self.gyro.enable(4 * self.timeStep)

        # gps
        self.gps = self.getGPS('gps')
        self.gps.enable(4 * self.timeStep)

        # inertial unit
        self.inertialUnit = self.getInertialUnit('inertial unit')
        self.inertialUnit.enable(self.timeStep)

        # ultrasound sensors
        self.us = []
        usNames = ['Sonar/Left', 'Sonar/Right']
        for i in range(0, len(usNames)):
            self.us.append(self.getDistanceSensor(usNames[i]))
            self.us[i].enable(self.timeStep)

        # foot sensors
        self.fsr = []
        fsrNames = ['LFsr', 'RFsr']
        for i in range(0, len(fsrNames)):
            self.fsr.append(self.getTouchSensor(fsrNames[i]))
            self.fsr[i].enable(self.timeStep)

        # foot bumpers
        self.lfootlbumper = self.getTouchSensor('LFoot/Bumper/Left')
        self.lfootrbumper = self.getTouchSensor('LFoot/Bumper/Right')
        self.rfootlbumper = self.getTouchSensor('RFoot/Bumper/Left')
        self.rfootrbumper = self.getTouchSensor('RFoot/Bumper/Right')
        self.lfootlbumper.enable(self.timeStep)
        self.lfootrbumper.enable(self.timeStep)
        self.rfootlbumper.enable(self.timeStep)
        self.rfootrbumper.enable(self.timeStep)

        # there are 7 controlable LED groups in Webots
        self.leds = []
        self.leds.append(self.getLED('ChestBoard/Led'))
        self.leds.append(self.getLED('RFoot/Led'))
        self.leds.append(self.getLED('LFoot/Led'))
        self.leds.append(self.getLED('Face/Led/Right'))
        self.leds.append(self.getLED('Face/Led/Left'))
        self.leds.append(self.getLED('Ears/Led/Right'))
        self.leds.append(self.getLED('Ears/Led/Left'))

        # get phalanx motor tags
        # the real Nao has only 2 motors for RHand/LHand
        # but in Webots we must implement RHand/LHand with 2x8 motors
        self.lphalanx = []
        self.rphalanx = []
        self.maxPhalanxMotorPosition = []
        self.minPhalanxMotorPosition = []
        for i in range(0, self.PHALANX_MAX):
            self.lphalanx.append(self.getMotor("LPhalanx%d" % (i + 1)))
            self.rphalanx.append(self.getMotor("RPhalanx%d" % (i + 1)))

            # assume right and left hands have the same motor position bounds
            self.maxPhalanxMotorPosition.append(
                self.rphalanx[i].getMaxPosition())
            self.minPhalanxMotorPosition.append(
                self.rphalanx[i].getMinPosition())

        #head
        self.HeadYaw = self.getMotor("HeadYaw")
        self.HeadPitch = self.getMotor("HeadPitch")

        #leftarm
        self.LShoulderPitch = self.getMotor("LShoulderPitch")
        self.LShoulderRoll = self.getMotor("LShoulderRoll")
        self.LElbowYaw = self.getMotor("LElbowYaw")
        self.LElbowRoll = self.getMotor("LElbowRoll")

        #shouldarm
        self.RShoulderPitch = self.getMotor("RShoulderPitch")
        self.RShoulderRoll = self.getMotor("RShoulderRoll")
        self.RElbowYaw = self.getMotor("RElbowYaw")
        self.RElbowRoll = self.getMotor("RElbowRoll")

        #left leg
        self.LHipYawPitch = self.getMotor("LHipYawPitch")
        self.LHipRoll = self.getMotor("LHipRoll")
        self.LHipPitch = self.getMotor("LHipPitch")
        self.LKneePitch = self.getMotor("LKneePitch")
        self.LAnklePitch = self.getMotor("LAnklePitch")
        self.LAnkleRoll = self.getMotor("LAnkleRoll")

        #right leg
        self.RHipYawPitch = self.getMotor("RHipYawPitch")
        self.RHipRoll = self.getMotor("RHipRoll")
        self.RHipPitch = self.getMotor("RHipPitch")
        self.RKneePitch = self.getMotor("RKneePitch")
        self.RAnklePitch = self.getMotor("RAnklePitch")
        self.RAnkleRoll = self.getMotor("RAnkleRoll")

        self.RElbowRollS = self.getPositionSensor("RElbowRollS")
        self.RElbowRollS.enable(self.timeStep)
        self.LElbowRollS = self.getPositionSensor("LElbowRollS")
        self.LElbowRollS.enable(self.timeStep)
        self.HeadPitchS = self.getPositionSensor("HeadPitchS")
        self.HeadPitchS.enable(self.timeStep)

        self.RShoulderPitchS = self.getPositionSensor("RShoulderPitchS")
        self.RShoulderPitchS.enable(self.timeStep)
        self.RAnklePitchS = self.getPositionSensor("RAnklePitchS")
        self.RAnklePitchS.enable(self.timeStep)

        # keyboard
        self.keyboard = self.getKeyboard()
        self.keyboard.enable(10 * self.timeStep)
        #self.gps esta retornando nan
        #possivel fix: passar as coordenadas direto e nao o objeto gps como referencia

        self.odometryProvider = None
        # values = self.gps.getValues()
        # print("Values: %f %f" % (values[0], values[2]))
        # values = self.gps.getValues()
        # self.odometryProvider = BasicOdometryProvider(float(values[0]), float(values[2]))
        self.lastOdometry = OdometryData(0, 0, 0)
        # self.particleFilter = ParticleFilter()

    def __init__(self):
        Robot.__init__(self)
        self.currentlyPlaying = False
        self.shouldTurn120Degrees = False
        self.turnsMade = 0

        # initialize stuff
        self.findAndEnableDevices()
        self.loadMotionFiles()
        self.printHelp()

    def testSocketColor(self):
        # s.send("RECEBEESSAPORRA")
        # image = np.array(self.cameraTop.getImageArray())
        # dump = pickle.dumps(image)
        # compactLen = struct.pack("i", len(dump))
        # s.send(compactLen)
        # s.send(dump)
        stringImage = "GPS"
        dump = pickle.dumps(stringImage)
        compactLen = struct.pack("i", len(dump))
        s.send(compactLen)
        s.send(dump)
        p = self.gps.getValues()
        dump = pickle.dumps(p)
        compactLen = struct.pack("i", len(dump))
        s.send(compactLen)
        s.send(dump)
        # p = [self.lastOdometry.x, self.lastOdometry.z, self.lastOdometry[2])
        stringImage = "IMAGE"
        dump = pickle.dumps(stringImage)
        compactLen = struct.pack("i", len(dump))
        s.send(compactLen)
        s.send(dump)
        image = np.array(self.cameraTop.getImageArray())
        dump = pickle.dumps(image)
        compactLen = struct.pack("i", len(dump))
        s.send(compactLen)
        s.send(dump)

    def updateOdometry(self):
        # self.currentlyPlaying = None
        # print("updateOdometry")
        if (self.currentlyPlaying == self.turnLeft60):
            #send message
            self.lastOdometry = self.odometryProvider.rotationUpdate(False)
        elif (self.currentlyPlaying == self.turnRight60):
            self.lastOdometry = self.odometryProvider.rotationUpdate(True)
        else:
            values = self.gps.getValues()
            self.lastOdometry = self.odometryProvider.linearMovementUpdate(
                float(values[0]), float(values[2]))
        self.currentlyPlaying = False
        # print(self.lastOdometry)
        # stringImage = "ODOMETRY"
        # dump = pickle.dumps(stringImage)
        # compactLen = struct.pack("i", len(dump))
        # s.send(compactLen)
        # s.send(dump)
        # data = [self.lastOdometry.x, self.lastOdometry.z, self.lastOdometry.angle]
        # dump = pickle.dumps(data)
        # compactLen = struct.pack("i", len(dump))
        # s.send(compactLen)
        # s.send(dump)
        # self.particleFilter.updateParticlesWithOdometry(self.lastOdometry)

    def automaticMovement(self, currentX, currentZ):
        if (self.turnsMade == 1):
            if (self.currentlyPlaying is False):
                self.startMotion(self.turnRight60)
                self.turnsMade = 2
        elif (self.turnsMade == 2):
            if (self.currentlyPlaying is False):
                self.turnsMade = 0
                self.startMotion(self.forwards)
        elif (currentX + 0.6 > 4.5 or currentX - 0.6 < -4.5
              or currentZ + 0.6 > 3.0 or currentZ - 0.6 < -3.0):
            #do two turns
            # self.currentlyPlaying.stop()
            self.startMotion(self.turnRight60)
            self.turnsMade = 1
        else:
            if (self.currentlyPlaying is False):
                self.startMotion(self.forwards)

    def run(self):
        shouldUseAutomaticMovement = True  #turn to False if you want to control robot movement
        self.handWave.setLoop(True)
        self.handWave.play()
        # until a key is pressed
        key = -1

        while robot.step(self.timeStep) != -1:
            key = self.keyboard.getKey()
            if key > 0:
                break
        self.handWave.setLoop(False)
        limitCounter = 0
        while True:
            # naive counter to avoid socket overload
            limitCounter = limitCounter + 1

            if self.odometryProvider is None:
                values = self.gps.getValues()
                # print(values)
                if values[0] == values[0]:
                    print("Initializing odometry")
                    self.odometryProvider = BasicOdometryProvider(
                        float(values[0]), float(values[2]))

            if (self.currentlyPlaying and self.currentlyPlaying.isOver()):
                self.updateOdometry()

            if (shouldUseAutomaticMovement is True):
                values = self.gps.getValues()
                if values[0] == values[0]:
                    self.automaticMovement(float(values[0]), float(values[2]))

            key = self.keyboard.getKey()
            key = False
            if (limitCounter > 1):
                self.testSocketColor()
                limitCounter = 0
            if key == Keyboard.LEFT:
                self.startMotion(self.sideStepLeft)
            elif key == Keyboard.RIGHT:
                self.startMotion(self.sideStepRight)
            elif key == Keyboard.UP:
                self.startMotion(self.forwards)
            elif key == Keyboard.DOWN:
                self.startMotion(self.backwards)
            elif key == Keyboard.LEFT | Keyboard.SHIFT:
                self.startMotion(self.turnLeft60)
            elif key == Keyboard.RIGHT | Keyboard.SHIFT:
                self.startMotion(self.turnRight60)
            elif key == ord('A'):
                self.testSocket()
            elif key == ord('G'):
                self.printGyro()
            elif key == ord('S'):
                self.printGps()
            elif key == ord('I'):
                self.printInertialUnit()
            elif key == ord('F'):
                self.printFootSensors()
            elif key == ord('B'):
                self.printFootBumpers()
            elif key == ord('U'):
                self.printUltrasoundSensors()
            elif key == Keyboard.HOME:
                self.printCameraImage(self.cameraTop)
            elif key == Keyboard.END:
                self.printCameraImage(self.cameraBottom)
            elif key == Keyboard.PAGEUP:
                self.setHandsAngle(0.96)
            elif key == Keyboard.PAGEDOWN:
                self.setHandsAngle(0.0)
            elif key == ord('7'):
                self.setAllLedsColor(0xff0000)  # red
            elif key == ord('8'):
                self.setAllLedsColor(0x00ff00)  # green
            elif key == ord('9'):
                self.setAllLedsColor(0x0000ff)  # blue
            elif key == ord('0'):
                self.setAllLedsColor(0x000000)  # off
            elif key == ord('H'):
                self.printHelp()

            if robot.step(self.timeStep) == -1:
                break
Exemplo n.º 5
0
"""nao_test controller."""
from controller import Robot, Motion
from time import sleep
import os

# create the Robot instance.
robot = Robot()

print(os.getcwd())
# get the time step of the current world.
timestep = int(robot.getBasicTimeStep())
# get motion file
handWave = Motion('../../motions/sample.motion')
handWave.setLoop(True)
# Main loop:
# nao move by using motion file
while robot.step(timestep) != -1:
    handWave.play()