Package: mistyPy
mistyPyOfficial Python library to work with your Misty robot. Currently in BETARequirementspython >= 3.4requestswebsocket 0.52.0InstallingStep 1: Easy startIf you are already comfortable using Python, skip to step 2Install anaconda for python >= 3.4 versionhttps://www.anaconda.com/download/Enter the following in your terminalconda create -n <your_custom_environment_name> python=3.4 requestsNow your environment is setup. To activate your environment enter the below command in your terminal:Say you used the name 'misty_developer' in the conda create stepsource activate misty_developer
pip install mistyPy
pip install websocket-client==0.52.0skip step 2Note:
Everytime you open a new termial, enter 
source activate <your_custom_environment_name>Step 2: Self Setupuse the command after setting up python >= 3.4pip install mistyPy
pip install requests
pip install websocket-client==0.52.0Current supportAPIChanaging LED, Changing image on screen, Playing audio, Moving Head, Driving MistyWebSocketsBackpack string stream, Time of Flights, Face Recognition, Face Training, Face DetectionWriting your own python program for Mistyimport mistyPyConnecting to the robotSyntax: robot_name = mistyPy.Robot("Enter the robot IP here")
Name your misty- > let me call mine 'mia'mia = mistyPy.Robot("10.0.1.206")Now you can refer to your robot as miaChange LED colorSynatx: robot_name.changeLED(red,green,blue)mia.changeLED(0,200,255) # PurpleChange image on the screenSyntax: robot_name.changeImage("image_name.format")mia.changeImage("Happy.jpg")to get a list of all the images saved on your mistymia.printImageList()        # prints ["Happy.jpg","Confused.jpg","Angry.jpg" ....]
images = mia.getImageList() # Return list of saved image filesPlay saved audio fileSynatx: robot_name.playAudio("file_name.format")mia.playAudio("008-Ah.wav")to get a list of all the audio files saved on your mistymia.printAudioList()        # prints ["eeee.wav","Aaah.wav","nah.wav"....]
audios = mia.getAudioList() # returns list of saved audio filesBattery checkSynatx: output = robot_name.battery()charge_percentage = mia.battery()
print(charge_percentage)Move the headRoll, pitch and yaw values can range from -5 to 5One Command to control roll, pitch, and yawSyntax: robot_name.moveHead(roll_value, pitch_value, yaw_value, optional velocity_value)mia.moveHead(-1,-5,3)
mia.moveHead(-1,-5,3, velocity = 5)Individial command per axis (also can take an optional velocity argument)mia.headRoll(-1)
mia.headPitch(-5, velocity = 5)
mia.headYaw(3)Drive MistyThere are three modes to drive Mistydrive      : you tell the linear and angular speed and Misty keeps on drivingdriveTime  : you tell misty the speeds and also how long misty has to execute itdriveTrack : instead of telling misty linear and angular speed, you tell the speed of left and right wheels individuallySyntax: robot_name.drive(linear_velocity, angular_velocity)Syntax: robot_name.driveTime(linear_velocity, angular_velocity,time_in_milli_second)Syntax: robot_name.driveTrack(left_track_speed,right_track_speed)mia.drive(50,20)         # goes forward and turns
mia.driveTime(70,0,3000) # goes forward for three seconds
mia.driveTrack(50,-50)   # spins in the same placeNote:
velocity range -100 to 100Stop DrivingYou could either send a command with velocities 0 or use thisSyntax: robot_name.stop()mia.stop()Train a Face for Misty to recogniseSyntax: robot_name.learnFace(<name_of_person>)mia.learnFace("Ian")Misty takes 15 seconds to capture your face and another 15 seconds to process it!You would see a countdown printing in the terminalGet a list of the Learned FacesSyntax: robot_name.getLearnedFaces()mia.printLearnedFaces()       # prints [Ian, CP, John, Allison, Woo,....]
names = mia.getLearnedFaces() # returns the names of trained faces as a listDelete all Learned FacesSyntax: robot_name.clearLearnedFaces()mia.clearLearnedFaces()WebSockets - a brief intoConsider all the above commands as a short handshakes while websockets work like you keep holding hands for a long time. You could continuosly stream data with websockets. Comes in handy when working with sensors on Misty, Arduino/Raspberry backpacks.To start the handshake you got to subscribe to a topic--- Continuos data stream ---To end the handshake you got to unsubscribe from the same topic--- No more data ---Arduino/RaspberryPy backpackTo start the hanshake / to subscribe to the backpack (anything you send from arduino Serial.println("your_data") to Misty)Syntax: robot_name.subscribe("StringMessage")mia.subscribe("StringMessage")This streams all data into the function call 'backpack()'Syntax: robot_name.backpack()You could call this any number of times at any time instant to get the data steram from you arduinoLets say arduino is sending me temparature data in celcius and i want to turn my air cooler on at a threshold of 25˚Cwhile True:
    temp = mia.backpack()
    if int(temp) > 25:
        turn_on_air_cooler()
    else:
        passTo end the handshake / to unsubscribe from the backpack data streamSyntax: robot_name.unsubscribe("StringMessage")mia.unsubscribe("StringMessage")Time Of FlightsMisty has three time of flight sensors in the front and one on the back. They stream distance to obstacles in meters.To start handshake / subscribe to time of flight sensors dataSyntax: robot_name.subscribe("TimeOfFlight")mia.subscribe("TimeOfFlight")This streams all 4 time of flight sensor data into the function call 'time_of_flight()'Syntax: robot_name.time_of_flight()incoming_data = mia.time_of_flight()print(incoming_data) would print {'Left': 0.233, 'Center': 0.072, 'Right': 0.037, 'Back': 0.115}To get just the Left time of flight sensor dataprint(incoming_data["Left"])Say misty is driving backwards and you want to stop if the wall is just or closer than 10 cmmia.drive(-10,0)
while True:
    if mia.time_of_flight()["Back"] <= 0.010:
        mia.stop()
        breakComputer VisionTo start the Face Recognition / Face Detection you subscribe to the websocket firstSyntax: robot_name.subscribe("FaceRecognition")mia.subscribe("FaceRecognition")This streams all data into the function call 'faceRec()'Syntax: robot_name.faceRec()Once subscribed to Face Recognition you could call faceRec() anytime to pull the latest data from Mistywhile True:
    data = mia.faceRec()
    print(data)                     # {'personName' : 'Samanta', 'distance' : '95', 'elevation' : '6'} 
    name      = data["personName"]  # You could extract specific values of your interest like this
    distance  = data["distance"]    # units in mm
    elevation = data["elevation"]If a face is detected and the person is unknown the "personName" field would output "unknown_person"To stop Face Recognition / Face DetectionSyntax: robot_name.unsubscribe("FaceRecognition")mia.unsubscribe("FaceRecognition")