#here is my full script
from java.lang import String
import threading
import time
import random
from org.myrobotlab.net import BareBonesBrowserLaunch
##
import urllib, urllib2
import json
from datetime import datetime
#######################
import io
import itertools
import textwrap
import codecs
import socket
import os
import shutil
import hashlib
import subprocess
import csv
from subprocess import Popen, PIPE
from time import sleep
#############################################################
# All bot specific hardware configuration goes here.
leftPort = "COM4"
rightPort = "COM3"
neoPort = "COM6"
gesturesPath = "C:\mrl\ProgramAB_bots\gestures"
aimlPath = "C:\mrl\ProgramAB"
aimlBotName = "inmoovWebKit"
aimlUserName = "Stephen"
lang="EN"
Voice="cmu-slt-hsmm" # Default female for MarySpeech
#Voice="cmu-bdl-hsmm" # Default male for MarySpeech
voiceType = Voice
############################################################
global human
global inmoov
global weathervar
global walkingThread
#############################################################
# helper function help debug the recognized text from webkit/sphinx
######################################################################
def heard(data):
print "Speech Recognition Data:"+str(data)
######################################################################
#
# MAIN ENTRY POINT - Start and wire together all the services.
#
######################################################################
# Create ProgramAB chat bot ( This is the inmoov "brain" )
######################################################################
#Starting Arduino Service
arduino = Runtime.createAndStart("arduino","Arduino")
arduino.connect("neoPort")
#Starting NeoPixel Service
neopixel = Runtime.createAndStart("neopixel","NeoPixel")
#neopixel.attach(arduino, pin, number of pixel)
neopixel.attach(arduino, 6, 16)
#Animation Names:
#"Color Wipe"
#"Larson Scanner" Knight Rider
#"Theater Chase"
#"Theater Chase Rainbow"
#"Rainbow"
#"Rainbow Cycle"
#"Flash Random"
#"Ironman"
#speed: 1-65535 1=full speed, 2=2x slower than 1, 10=10x slower than 1
def pixoff():
#turn off all the pixels
for pixel in range (1,neopixel.numPixel + 1):
neopixel.setPixel(pixel, 0, 0, 0) #setPixel(pixel, red, green, blue)
neopixel.writeMatrix() #send the pixel data to the Neopixel hardware
def pixred():
for loop in range(0,10): #do 10 loop
for pixel in range(1, neopixel.numPixel +1):
neopixel.setPixel(pixel, 255, 255, 255) #set the pixel to RGB
neopixel.writeMatrix()
sleep(0.03) #give a bit of delay before next step
neopixel.setPixel(pixel, 0, 0, 0) #turn off the pixel
neopixel.writeMatrix()
### starting an animation ##############
#neopixel.setAnimation("Animation Name", red, green, blue, speed) #RGB!!!
neopixel.setAnimation("Theater Chase", 255, 255, 255, 1) #running Theater Chase with color blue at full speed
inmoovWebKit = Runtime.createAndStart("inmoovWebKit", "ProgramAB")
inmoovWebKit.setPath(aimlPath)
inmoovWebKit.startSession(aimlUserName, aimlBotName)
######################################################################
# Html filter to clean the output from programab. (just in case)
htmlfilter = Runtime.createAndStart("htmlfilter", "HtmlFilter")
######################################################################
# mouth service, speech synthesis
mouth = Runtime.createAndStart("i01.mouth", "MarySpeech")
mouth.setVoice(voiceType)
#mouth.setAudioEffects("F0Add(f0Add=90.0)+TractScaler(amount=1.2)")
######################################################################
# the "ear" of the inmoov
ear = Runtime.createAndStart("i01.ear", "WebkitSpeechRecognition")
ear.addListener("publishText", python.name, "heard");
ear.addMouth(mouth)
WebkitSpeechRecognitionFix = Runtime.start("WebkitSpeechRecognitionFix","Clock")
WebkitSpeechRecognitionFix.setInterval(1000)
WebkitSpeechRecognitionFix.startClock()
######################################################################
# MRL Routing webkitspeechrecognition/ear -> program ab -> htmlfilter -> mouth
######################################################################
ear.addTextListener(inmoovWebKit)
inmoovWebKit.addTextListener(htmlfilter)
htmlfilter.addTextListener(mouth)
######################################################################
#Gets the battery level
level = Runtime.getBatteryLevel()
######################################################################
# CREATE the InMoov services and set Min/Max/Mapping/Rest
######################################################################
i01 = Runtime.create("i01", "InMoov")
##############
head = Runtime.create("i01.head","InMoovHead")
##############
# tweaking default settings of jaw
#head.jaw.setMinMax(105,160)
head.jaw.map(0,180,105,160)
# tweaking default settings of eyes
head.eyeX.map(0,180,75,105)
head.eyeY.map(0,180,110,180)
# tweaking default settings of head
head.neck.map(0,180,10,170) #capable 0-180
head.rothead.map(0,180,170,30)
##############
torso = Runtime.create("i01.torso", "InMoovTorso")
# tweaking default torso settings
torso.topStom.map(0,180,80,130)
torso.midStom.map(0,180,120,30) #130
##############
leftHand = Runtime.create("i01.leftHand","InMoovHand")
# tweaking default settings of left hand
leftHand.thumb.map(0,180,0,180)
leftHand.index.map(0,180,0,180)
leftHand.majeure.map(0,180,0,180)
leftHand.ringFinger.map(0,180,0,180)
leftHand.pinky.map(0,180,0,180)
leftHand.wrist.map(0,180,120,180)
###############
leftArm = Runtime.create("i01.leftArm","InMoovArm")
#tweak defaults LeftArm
leftArm.bicep.map(0,180,0,80)
leftArm.rotate.map(0,180,40,160)
leftArm.shoulder.map(0,180,30,160)
leftArm.omoplate.map(0,180,0,70)
################
rightHand = Runtime.create("i01.rightHand","InMoovHand")
# tweaking defaults settings of right hand
rightHand.thumb.map(0,180,0,180)
rightHand.index.map(0,180,0,180)
rightHand.majeure.map(0,180,0,180)
rightHand.ringFinger.map(0,180,0,180)
rightHand.pinky.map(0,180,0,180)
rightHand.wrist.map(0,180,90,0)
#################
rightArm = Runtime.create("i01.rightArm","InMoovArm")
# tweak default RightArm
rightArm.bicep.map(0,180,6,95)
rightArm.rotate.map(0,180,40,160)
rightArm.shoulder.map(0,180,160,30)
rightArm.omoplate.map(0,180,0,70)
# InMoov has a forward servo, i'm adding
forwardServo = Runtime.create("forwardServo","Servo")
######################################################################
# Now START the services that have been created and initialized
######################################################################
i01 = Runtime.start("i01","InMoov")
i01.setMute(False)
######################################################################
##################
# Start the Head and Mouth
##################
i01.startHead(leftPort)
i01.startMouthControl(leftPort)
i01.mouthControl.setmouth(0,180) #105close, 160open
i01.startMouth()
i01.mouth = mouth
##################
# Start the Arms
##################
i01.startRightArm(rightPort)
i01.startRightHand(rightPort)
i01.startLeftArm(leftPort)
i01.startLeftHand(leftPort)
i01.startTorso(leftPort)
##################
# Start OpenCV
##################
#opencv = i01.startOpenCV()
##################
# Start the PIR Sensor
##################
#i01.startPIR(leftPort,23)
#def input():
# print 'python object is ', msg_clock_pulse
# pin = msg_i01_right_publishPin.data[0]
# print 'pin data is ', pin.pin, pin.value
# if (pin.value == 1):
# i01.mouth.speak("I was dreaming")
# powerup()
# resting()
i01.speakBlocking("It feels good to be alive.")
neopixel.animationStop()
######################################################################
# Launch the web gui and create the webkit speech recognition gui in CHROME
#################################################################
webgui.autoStartBrowser(False)
webgui.startService()
BareBonesBrowserLaunch.openURL("http://localhost:8888/#service/i01.ear")
######################################################################
# END MAIN SERVICE SETUP SECTION
######################################################################
ear.setLanguage("en-EN")
python.subscribe(ear.getName(),"publishText")
ear.addCommand("relax", "python", "resting")
##################
# set default speeds */sec
##################
rightArm.bicep.setVelocity(50)
rightArm.rotate.setVelocity(50)
rightArm.shoulder.setVelocity(50)
rightArm.omoplate.setVelocity(50)
leftArm.bicep.setVelocity(50)
leftArm.rotate.setVelocity(50)
leftArm.shoulder.setVelocity(50)
leftArm.omoplate.setVelocity(50)
rightHand.thumb.setVelocity(55)
rightHand.index.setVelocity(75)
rightHand.majeure.setVelocity(75)
rightHand.ringFinger.setVelocity(75)
rightHand.pinky.setVelocity(75)
rightHand.wrist.setVelocity(75)
leftHand.thumb.setVelocity(55)
leftHand.index.setVelocity(75)
leftHand.majeure.setVelocity(75)
leftHand.ringFinger.setVelocity(75)
leftHand.pinky.setVelocity(75)
leftHand.wrist.setVelocity(75)
head.rothead.setVelocity(75)
head.neck.setVelocity(75)
head.eyeX.setVelocity(30)
head.eyeY.setVelocity(30)
torso.topStom.setVelocity(75)
torso.midStom.setVelocity(75)
##################
# def command movements
##################
python.subscribe(ear.getName(),"onRecognized")
def onRecognized(text):
if DEBUG==1:
print "onRecognized : ",text
### RIGHT ARM ############################## [ # ] denotes anatomical neutral
def rightArmBic(myVar):
rightArm.bicep.moveTo(myVar)
### EXTENSION <-- [0] * 25 * 45 * 70 * 90 * 110 * 135 * 155 * 180 --> FLEXION
def rightArmRot(myVar):
rightArm.rotate.moveTo(myVar)
### INTERNAL ROT <-- 0 * 25 * 45 * [70] * 90 * 110 * 135 * 155 * 180 --> EXTERNAL ROT
def rightArmSho(myVar):
rightArm.shoulder.moveTo(myVar)
### NEUTRAL <-- [0] * 25 * 45 * 70 * 90 * 110 * 135 * 155 * 180 --> FWD FLEXION
def rightArmOmo(myVar):
rightArm.omoplate.moveTo(myVar)
### ADDUCTION <-- [0] * 25 * 45 * 70 * 90 * 110 * 135 * 155 * 180 --> ABDUCTION
def RightWrist(myVar):
rightHand.wrist.moveTo(myVar)
### PRONATION <-- 0 * 25 * 45 * 70 * [90] * 110 * 135 * 155 * 180 --> SUPINATION
### LEFT ARM ##############################
def leftArmBic(myVar):
leftArm.bicep.moveTo(myVar)
### EXTENSION <-- [0] * 25 * 45 * 70 * 90 * 110 * 135 * 155 * 180 --> FLEXION
def leftArmRot(myVar):
leftArm.rotate.moveTo(myVar)
### INTERNAL ROT <-- 0 * 25 * 45 * [70] * 90 * 110 * 135 * 155 * 180 --> EXTERNAL ROT
def leftArmSho(myVar):
leftArm.shoulder.moveTo(myVar)
### NEUTRAL <-- [0] * 25 * 45 * 70 * 90 * 110 * 135 * 155 * 180 --> FWD FLEXION
def leftArmOmo(myVar):
leftArm.omoplate.moveTo(myVar)
### ADDUCTION <-- [0] * 25 * 45 * 70 * 90 * 110 * 135 * 155 * 180 --> ABDUCTION
def leftWrist(myVar):
leftHand.wrist.moveTo(myVar)
### PRONATION <-- 0 * 25 * 45 * 70 * [90] * 110 * 135 * 155 * 180 --> SUPINATION
### HEAD ##############################
def headTurn(myVar):
head.rothead.moveTo(myVar)
### HEAD LEFT <-- 0 * 25 * 45 * 70 * [90] * 110 * 135 * 155 * 180 --> HEAD RIGHT
def headVert(myVar):
head.neck.moveTo(myVar)
### HEAD DOWN <-- 0 * 25 * 45 * 70 * [90] * 110 * 135 * 155 * 180 --> HEAD UP
### EYES ##############################
def eyesleft():
head.eyeX.moveTo(0)
def eyesright():
head.eyeX.moveTo(180)
def eyesstraight():
head.eyeX.moveTo(90)
head.eyeY.moveTo(90)
def eyesup():
head.eyeY.moveTo(0)
def eyesdown():
head.eyeY.moveTo(180)
### TORSO ##############################
def torsoLean(myVar):
torso.topStom.moveTo(myVar)
### LEAN LEFT <-- 0 * 23 * 45 * 67 * [90] * 112 * 135 * 147 * 180 --> LEAN RIGHT
def torsoTurn(myVar):
torso.midStom.moveTo(myVar)
### TURN LEFT <-- 0 * 23 * 45 * 67 * [90] * 112 * 135 * 147 * 180 --> TURN RIGHT
def standstraight():
torsoLean(90)
torsoTurn(90)
######################################################################
# Helper functions and various gesture definitions
######################################################################
def autoHeadTest():
#neopixel.setAnimation("Rainbow", 255, 255, 255, 1)
ear.pauseListening()
i01.setHeadSpeed(0.5,0.5)
mouth.speakBlocking("Testing my head and neck functions")
### HEAD LEFT <-- 0 * 25 * 45 * 70 * [90] * 110 * 135 * 155 * 180 --> HEAD RIGHT
### HEAD DOWN <-- 0 * 25 * 45 * 70 * [90] * 110 * 135 * 155 * 180 --> HEAD UP
#test max
mouth.speakBlocking("Looking low and left")
headVert(0)
headTurn(0)
sleep(1)
mouth.speakBlocking("Looking high and left")
headVert(180)
sleep(1)
mouth.speakBlocking("Back to neutral")
headVert(90)
headTurn(90)
sleep(1)
mouth.speakBlocking("Looking low and right")
headVert(0)
headTurn(180)
sleep(1)
mouth.speakBlocking("Looking high and right")
headVert(180)
sleep(1)
mouth.speakBlocking("Back to neutral")
headVert(90)
headTurn(90)
sleep(1)
#test mid
mouth.speakBlocking("Looking kind of low and left")
headVert(45)
headTurn(45)
sleep(1)
mouth.speakBlocking("Looking kind of high and left")
headVert(135)
sleep(1)
mouth.speakBlocking("Back to neutral")
headVert(90)
headTurn(90)
sleep(1)
mouth.speakBlocking("Looking kind of low and right")
headVert(45)
headTurn(135)
sleep(1)
mouth.speakBlocking("Looking kind of high and right")
headVert(135)
sleep(1)
mouth.speakBlocking("Back to neutral")
headVert(90)
headTurn(90)
mouth.speakBlocking("Testing my head and neck functions is complete")
#neopixel.animationStop()
ear.resumeListening()
i01.loadGestures(gesturesPath)
about jaw you can try , after
about jaw you can try , after the map :
start / end speaking callbacks.
Hi Mayaway,
The way mouth control works is by subscribing to 2 events from the speech synthesis service. The publishStartSpeaking and publishEndSpeaking events tell mouth control when the robot starts playing the audio and finishes playing the audio. These events trigger the mouth control to annimate the jaw servo.
So,, I looked at the code and it's a bit confusing, and there might be a bug there. I suspect the issue is really that these methods aren't being properly subscribed to in your script.
you could try something like the following:
i01.mouthControl.setMouth(i01.mouth)
I see in the MarySpeech service that this will trigger the subscribtion to the publishStartSpeaking .. but I don't see that it subscribes to publishEndSpeaking.
So... long story short that might help / fix it.. but the true solution is to make sure that the mouth control service subscribes to these 2 events from the mouth / speech synthesis service...
I hope this helps explain a little bit more about what's going on here.
Good luck!
-Kevin
Here is all of the mouth code
Here is all of the mouth code condensed:
mouth = Runtime.createAndStart("i01.mouth", "MarySpeech")
mouth.setVoice(voiceType)
ear.addMouth(mouth)
htmlfilter.addTextListener(mouth)
# insert here ?
i01.startMouthControl(leftPort)
i01.mouthControl.setmouth(0,180) #105close, 160open
i01.startMouth()
i01.mouth = mouth
So I'm guessing (since there is no documentation) that I might "# insert here?" (above)
i01.mouthControl.setMouth(i01.mouth)
and since 'mouth'='i01.mouth' I should be able to just enter
i01.mouthControl.setMouth(mouth)
I have NO IDEA how to subscribe to publishEndSpeaking nor that I even need to, or that it even exists!!! (and how would I? )
In other news:
I continue to be baffled by a total loss of verbal control as if all Gesture and/or AIML files are simply not there.
My paths and folder names are spot on. Could there be a bug in one of the files that breaks the works?
I can't see any.
The NoWorky process is a compete mystery. My notification "Sending NoWorky" never provides an indication that it is complete.
What should happen? Then what happens next if you actually get one? We must have to pre-arrange the send so you know what you are looking at?
and who is looking? I get that it's all volunteer, work for free, open source, and all this must be part of the down side...
I'm on a clean install of Win7, Chrome, Java, MRL just for running the InMoov...
Thanks! It's a weird pleasure to be on the user end of the experience as I am part of the dev team for a large project as well.
It gives me insights to how our users feel about dev cycles, changes and all. How would they know what we've done!
setMouth
i01.mouth.setMouth(i01.mouth) ERROR::: Object Has No Attribute setMouth!!!
I think I'm done. I'm heading over to EZ-Robot were all this is, well, easy...
S~