A Python library for Misty II development
Project description
Misty2py
Misty2py is a Python 3 library for Misty II development using Misty API.
Features
Misty2py can be used to develop complex skills (behaviours) for the Misty II robot utilising:
- actions via sending a
POST
orDELETE
requests to Misty's API; - informations via sending a
GET
request to Misty's API; - continuous streams of data via subscribing to event types on Misty's websockets.
Misty2py uses following concepts for easy of usage:
- action keywords - customisable python-styled keywords for endpoints of Misty's API that correspond to performing actions;
- information keywords - customisable python-styled keywords for endpoints of Misty's API that correspond to retrieving information;
- data shortcuts - customisable python-styled keywords for commonly used data that are supplied to Misty's API as the body of a
POST
request.
Usage
Getting started
- Start by making a new instance of
misty2py.robot
'sMisty
bymisty_robot = Misty("ip_address_here")
- Substitute
ip_address_here
with the IP address of your Misty. misty2py.utils.env_loader
module containsEnvLoader
class that can be used to load Misty's IP from the .env file in your project's home directory:- Create the
.env
file and writeMISTY_IP_ADDRESS="[ip_address_here]"
in it. - Initialise an
EnvLoader
object viaenv_loader = EnvLoader()
; this loads the environment variables. - Use
env_loader.get_ip()
to obtain the IP address.
- Create the
- Substitute
- Use the method
misty_robot.perform_action()
to tell Misty to perform an action. - Use the method
misty_robot.get_info()
to tell Misty to return information. - Use the method
misty_robot.event()
to initialise, obtain and stop continuous streams of data from Misty's event types.
Obtaining information
Obtaining digital information is handled by misty2py.robot::get_info
method.
misty2py.robot::get_info
has following arguments:
info_name
- required; the string information keyword corresponding to an endpoint in Misty's API;params
- optional; a dictionary of parameter name and parameter value pairs, defaults to{}
.
Performing actions
Performing physical and digital actions including removal of non-system files is handled by misty2py.robot::perform_action()
method.
misty2py.robot::perform_action()
has following arguments:
action_name
- required; the string action keyword corresponding to an endpoint in Misty's API;data
- optional; the data to pass to the request as a dictionary or a data shortcut (string), defaults to{}
.
Event types
To obtain event data in Misty's framework, it is required to subscribe to an event type on Misty's websocket server. Misty's websocket server then streams data to the websocket client, in this implementation via a separate thread. To access this data, misty2py.robot::get_event_data
method must be called with "get_data"
parameter from another thread. When data are no longer required to be streamed to the client, an event type can be unsubscribed to kill the event thread.
Subscription
Subscribe to an event via misty2py.robot::event
with the parameter "subscribe"
and following keyword arguments:
- `type` - *required;* event type string as documented in [Event Types Docs](https://docs.mistyrobotics.com/misty-ii/robot/sensor-data/ "Misty Robotics Event Types").
- `name` - *optional;* a custom event name string; must be unique.
- `return_property` - *optional;* the property to return from Misty's websockets; all properties are returned if return_property is not supplied.
- `debounce` - *optional;* the interval in ms at which new information is sent; defaults to 250.
- `len_data_entries` - *optional;* the maximum number of data entries to keep (discards in fifo style); defaults to 10.
- `event_emitter` - *optional;* an event emitter function which emits an event upon message recieval. Supplies the message content as an argument.
Accessing the data and the log
Access the data of an event or its log via misty2py.robot::event
with the parameter "get_data"
or "get_log"
and a keyword argument name
(the name of the event).
Unsubscribing
Unsubscribe from an event via misty2py.robot::event
with the parameter "unsubscribe"
and a keyword argument name
(the name of the event).
Basic example
import time
from misty2py.robot import Misty
from misty2py.utils.env_loader import EnvLoader
env_loader = EnvLoader
m = Misty(env_loader.get_ip())
d = m.event("subscribe", type = "BatteryCharge")
e_name = d.get("event_name")
time.sleep(1)
d = m.event("get_data", name = e_name)
d = m.event("unsubscribe", name = e_name)
Event emitter usage - example
import time
from pymitter import EventEmitter
from misty2py.robot import Misty
from misty2py.utils.env_loader import EnvLoader
env_loader = EnvLoader
m = Misty(env_loader.get_ip())
ee = EventEmitter()
event_name = "myevent_001"
@ee.on(event_name)
def listener(data):
print(data)
d = m.event("subscribe", type = "BatteryCharge", name = event_name, event_emitter = ee)
time.sleep(2)
d = m.event("unsubscribe", name = event_name)
Utilities
The sub-package misty2py.utils
contains utility modules, including:
-
misty2py.utils.base64
- contains base64 encoders and decoders.misty2py.utils.base64::content_to_base64
- encodes a string or a file into base64 string and either returns the encoded string or saves the encoded string into a file.misty2py.utils.base64::base64_to_content
- decodes a string or a file from base64 and either returns the decoded string or saves the decoded file.
-
misty2py.utils.colours
- contains colour-related utility functions.misty2py.utils.colours::parse_rgb_value
- parses and validates a potentially rgb value (a string or an integer).misty2py.utils.colours::rgb_values_to_dict
- turns integer or string triple of rgb values into the rgb dictionary form required by Misty API.misty2py.utils.colours::validate_rgb_dict
- validates an rgb dictionary.misty2py.utils.colours::get_rgb_from_unknown
- attempts to obtain an rgb dictionary from an unknown data content (possibly a data shortcut or a dictionary)misty2py.utils.colours::construct_transition_dict
- constructs the transition dictionary as required by Misty API from a dictionary of two colours supplied either as data shortcuts or rgb dictionaries.
-
misty2py.utils.env_loader
contains theEnvLoader
class which can be used to load environmental variables, specifically the IP address of the Misty robot.misty2py.utils.env_loader::EnvLoader.__init__
(akamisty2py.utils.env_loader.EnvLoader()
) - initialises theEnvLoader
, does not take any arguments.misty2py.utils.env_loader::EnvLoader.get_ip
- obtains the value of the environmental variableMISTY_IP_ADDRESS
if set, else returnsNone
.
-
misty2py.utils.generators
- contains generator functions.misty2py.utils.generators::get_random_string
- returns a randomn
characters long string of ASCII letters and digits
-
misty2py.utils.messages
- contains message parsing methods.misty2py.utils.messages::message_parser
- parses a message from misty2py json Dict reply to a string.misty2py.utils.messages::compose_str
- addspotential_str
tomain_str
ifpotential_str
is notNone
, else addsfallback
tomain_str
iffallback
is notNone
, else returnsmain_str
-
misty2py.utils.status
- contains the classStatus
which can be used to track the execution state of a script.misty2py.utils.status::Status.__init__
(akamisty2py.utils.status.Status()
) - initialisation that takes optional parametersinit_status
(str),init_data
(str) andinit_time
(float).misty2py.utils.status::Status.update_data_time
- setsdata
to the value ofdet_data
(str) andtime
to the value ofdet_time
(float).misty2py.utils.status::Status.set_status
- setsstatus
to the value ofdet_status
(str).misty2py.utils.status::Status.set_time
- setstime
to the value ofdet_time
(float)misty2py.utils.status::Status.get_data_time
- returns thedata
andtime
in a tuple.misty2py.utils.status::Status.get_status
- returns thestatus
.
-
misty2py.utils.utils
- contains generally useful functions that do not fall into any of the above categories.misty2py.utils.utils::query_dict_with_fallback
- safely queries a dictionary and if the key does not exist or the value has inappropriate type, returns the fallback value.
Keywords and shortcuts
List of supported action keywords
led
for post request toapi/led
endpointled_trans
for post request toapi/led/transition
endpointnotification_settings
for post request toapi/notification/settings
endpointaudio_upload
for post requestapi/audio
to endpointaudio_play
for post request toapi/audio/play
endpointaudio_pause
for post request toapi/audio/pause
endpointaudio_stop
for post request toapi/audio/stop
endpointaudio_delete
for delete request toapi/audio
endpointaudio_record_start
for post request toapi/audio/record/start
endpointaudio_record_stop
for post request toapi/audio/record/stop
endpointaudio_disable
for post request toapi/services/audio/disable
endpointaudio_enable
for post request toapi/services/audio/enable
endpointimage_upload
for post request toapi/images
endpointimage_show
for post request toapi/images/display
endpointimage_settings
for post request toapi/images/settings
endpointimage_delete
for delete request toapi/images
endpointtext_show
for post request toapi/text/display
endpointtext_settings
for post request toapi/text/settings
endpointvideo_upload
for post request toapi/videos
endpointvideo_show
for post request toapi/videos/display
endpointvideo_settings
for post request toapi/videos/settings
endpointvideo_delete
for delete request toapi/videos
endpointblink_mapping_delete
for delete request toapi/blink/images
endpointslam_enable
for post request toapi/services/slam/enable
endpointslam_disable
for post request toapi/services/slam/disable
endpointslam_sensors_reset
for post request toapi/slam/reset
endpointslam_mapping_start
for post request toapi/slam/map/start
endpointslam_mapping_stop
for post request toapi/slam/map/stop
endpointslam_map_current
for post request toapi/slam/map/current
endpointslam_map_rename
for post request toapi/slam/map/rename
endpointslam_infrared_settings
for post request toapi/slam/settings/ir
endpointslam_visible_settings
for post request toapi/slam/settings/visible
endpointslam_map_delete
for delete request toapi/slam/map
endpointslam_docking_locate_start
for post request toapi/slam/docking/start
endpointslam_docking_locate_stop
for post request toapi/slam/docking/stop
endpointstreaming_slam_start
for post request toapi/slam/streaming/start
endpointstreaming_slam_stop
for post request toapi/slam/streaming/stop
endpointslam_track_start
for post request toapi/slam/track/start
endpointslam_track_stop
for post request toapi/slam/track/stop
endpointrecording_start
for post request toapi/videos/recordings/start
endpointrecording_stop
for post request toapi/videos/recordings/stop
endpointrecording_rename
for post request toapi/videos/recordings/rename
endpointrecording_delete
for delete request toapi/videos/recordings
endpointface_detection_start
for post request toapi/faces/detection/start
endpointface_detection_stop
for post request toapi/faces/detection/stop
endpointface_recognition_start
for post request toapi/faces/recognition/start
endpointface_recognition_stop
for post request toapi/faces/recognition/stop
endpointface_train_start
for post request toapi/faces/training/start
endpointface_train_cancel
for post request toapi/faces/training/cancel
endpointface_delete
for delete request toapi/faces
endpointskill_upload
for post request toapi/skills
endpointskill_start
for post request toapi/skills/start
endpointskills_reload
for post request toapi/skills/reload
endpointskill_load
for post request toapi/skills/load
endpointskill_cancel
for post request toapi/skills/cancel
endpointskill_delete
for delete request toapi/skills
endpointwifi_add
for post request toapi/networks/create
endpointwifi_connect
for post request toapi/networks
endpointwifi_delete
for delete request toapi/networks
endpointwifi_hotspot_start
for post request toapi/networks/hotspot/start
endpointwifi_hotspot_stop
for post request toapi/networks/hotspot/stop
endpointwrite_serial
for post request toapi/serial
endpointevent_listener
for post request toapi/skills/event
endpointwebsite_show
for post request toapi/webviews/display
endpointwebsite_settings
for post request toapi/webviews/settings
endpointblink_on
for post request toapi/blink
endpointblink_settings
for post request toapi/blink/settings
endpointdisplay_settings
for post request toapi/display/settings
endpointflashlight_on
for post request toapi/flashlight
endpointspeak
for post request toapi/tts/speak
endpointspeak_stop
for post request toapi/tts/stop
endpointspeech_capture
for post request toapi/audio/speech/capture
endpointdrive
for post request toapi/drive
endpointdrive_arc
for post request toapi/drive/arc
endpointdrive_heading
for post request toapi/drive/hdt
endpointdrive_time
for post request toapi/drive/time
endpointdrive_track
for post request toapi/drive/track
endpointdrive_stop
for post request toapi/drive/stop
endpointdrive_to_loc
for post request toapi/drive/coordinates
endpointdrive_on_path
for post request toapi/drive/path
endpointhalt
for post request toapi/halt
endpointarm_move
for post request toapi/arms
endpointarms_move
for post request toapi/arms/set
endpointhead_move
for post request toapi/head
endpointhazard_settings
for post request toapi/hazard/updatebasesettings
endpointstreaming_av_start
for post request toapi/avstreaming/start
endpointstreaming_av_stop
for post request toapi/avstreaming/stop
endpointstreaming_av_disable
for post request toapi/services/avstreaming/disable
endpointstreaming_av_enable
for post request toapi/services/avstreaming/enable
endpointkeyphrase_recognition_start
for post request toapi/audio/keyphrase/start
endpointkeyphrase_recognition_stop
for post request toapi/audio/keyphrase/stop
endpointupdate_allow
for post request toapi/system/update/allow
endpointupdate_perform
for post request toapi/system/update
endpointupdate_perform_targeted
for post request toapi/system/update/component
endpointupdate_prevent
for post request toapi/system/update/prevent
endpointerror_text_clear
for post request toapi/text/error/clear
endpointcamera_disable
for post request toapi/services/camera/disable
endpointcamera_enable
for post request toapi/services/camera/enable
endpointrestart
for post request toapi/reboot
endpointvolume_settings
for post request toapi/audio/volume
endpointlogs_settings
for post request toapi/logs/level
endpointwebsocket_settings
for post request toapi/websocket/version
endpointexternal_request
for post request toapi/request
endpoint
List of supported information keywords
audio_file
for get request toapi/audio
endpointaudio_list
for get request toapi/audio/list
endpointaudio_status
for get request toapi/services/audio
endpointimage_file
for get request toapi/images
endpointimage_list
for get request toapi/images/list
endpointvideo_file
for get request toapi/videos
endpointvideo_list
for get request toapi/videos/list
endpointav_status
for get request toapi/services/avstreaming
endpointsensor_values
for get request toapi/serial
endpointmap_file
for get request toapi/slam/map
endpointcurrent_map_id
for get request toapi/slam/map/current
endpointmap_id_list
for get request toapi/slam/map/ids
endpointslam_diagnostics
for get request toapi/slam/diagnostics
endpointslam_path
for get request toapi/slam/path
endpointslam_status
for get request toapi/slam/status
endpointslam_enabled
for get request toapi/services/slam
endpointpicture_depth
for get request toapi/cameras/depth
endpointpicture_fisheye
for get request toapi/cameras/fisheye
endpointpicture_rgb
for get request toapi/cameras/rgb
endpointfaces_known
for get request toapi/faces
endpointrecording_file
for get request toapi/videos/recordings
endpointrecording_list
for get request toapi/videos/recordings/list
endpointskills_running
for get request toapi/skills/running
endpointskills_known
for get request toapi/skills
endpointwifis_available
for get request toapi/networks/scan
endpointwifis_saved
for get request toapi/networks
endpointbattery_status
for get request toapi/battery
endpointcamera_status
for get request toapi/services/camera
endpointblink_settings
for get request toapi/blink/settings
endpointhazards_settings
for get request toapi/hazards/settings
endpointcamera_settings
for get request toapi/camera
endpointslam_visible_settings
for get request toapi/slam/settings/visible
endpointslam_infrared_settings
for get request toapi/slam/settings/ir
endpointupdate_settings
for get request toapi/system/update/settings
endpointdevice
for get request toapi/device
endpointhelp
for get request toapi/help
endpointlog
for get request toapi/logs
endpointlog_level
for get request toapi/logs/level
endpointupdate_available
for get request toapi/system/updates
endpointwebsockets
for get request toapi/websockets
endpointwebsocket_version
for get request toapi/websocket/version
List of supported data shortcuts
led_off
for{ "red": "0", "green": "0", "blue": "0" }
white_light
for{ "red": "255", "green": "255", "blue": "255" }
red_light
for{ "red": "255", "green": "0", "blue": "0" }
green_light
for{ "red": "0", "green": "255", "blue": "0" }
blue_light
for{ "red": "0", "green": "0", "blue": "255" }
yellow_light
for{ "red": "255", "green": "255", "blue": "0" }
cyan_light
for{ "red": "0", "green": "255", "blue": "255" }
magenta_light
for{ "red": "255", "green": "0", "blue": "255" }
orange_light
for{ "red": "255", "green": "125", "blue": "0" }
lime_light
for{ "red": "125", "green": "255", "blue": "0" }
aqua_light
for{ "red": "0", "green": "255", "blue": "125" }
azure_light
for{ "red": "0", "green": "125", "blue": "255" }
violet_light
for{ "red": "125", "green": "0", "blue": "255" }
pink_light
for{ "red": "255", "green": "0", "blue": "125" }
low_volume
for{ "Volume": "5" }
image_admiration
for{"FileName": "e_Admiration.jpg"}
image_aggressiveness
for{"FileName": "e_Aggressiveness.jpg"}
image_amazement
for{"FileName": "e_Amazement.jpg"}
image_anger
for{"FileName": "e_Anger.jpg"}
image_concerned
for{"FileName": "e_ApprehensionConcerned.jpg"}
image_contempt
for{"FileName": "e_Contempt.jpg"}
image_content_left
for{"FileName": "e_ContentLeft.jpg"}
image_content_right
for{"FileName": "e_ContentRight.jpg"}
image_content_default
for{"FileName": "e_DefaultContent.jpg"}
image_disgust
for{"FileName": "e_Disgust.jpg"}
image_disoriented
for{"FileName": "e_Disoriented.jpg"}
image_hilarious
for{"FileName": "e_EcstacyHilarious.jpg"}
image_starry_eyed
for{"FileName": "e_EcstacyStarryEyed.jpg"}
image_fear
for{"FileName": "e_Fear.jpg"}
image_grief
for{"FileName": "e_Grief.jpg"}
image_joy_1
for{"FileName": "e_Joy.jpg"}
image_joy_2
for{"FileName": "e_Joy2.jpg"}
image_goofy_1
for{"FileName": "e_JoyGoofy.jpg"}
image_goofy_2
for{"FileName": "e_JoyGoofy2.jpg"}
image_goofy_3
for{"FileName": "e_JoyGoofy3.jpg"}
image_love
for{"FileName": "e_Love.jpg"}
image_rage_1
for{"FileName": "e_Rage.jpg"}
image_rage_2
for{"FileName": "e_Rage2.jpg"}
image_rage_3
for{"FileName": "e_Rage3.jpg"}
image_rage_4
for{"FileName": "e_Rage4.jpg"}
image_remorse
for{"FileName": "e_RemorseShame.jpg"}
image_sadness
for{"FileName": "e_Sadness.jpg"}
image_sleping_1
for{"FileName": "e_Sleeping.jpg"}
image_sleeping_2
for{"FileName": "e_SleepingZZZ.jpg"}
image_sleepy_1
for{"FileName": "e_Sleepy.jpg"}
image_sleepy_2
for{"FileName": "e_Sleepy2.jpg"}
image_sleepy_3
for{"FileName": "e_Sleepy3.jpg"}
image_sleepy_4
for{"FileName": "e_Sleepy4.jpg"}
image_surprise
for{"FileName": "e_Surprise.jpg"}
image_system_black_screen
for{"FileName": "e_SystemBlackScreen.jpg"}
image_system_blink_large
for{"FileName": "e_SystemBlinkLarge.jpg"}
image_system_blink_standard
for{"FileName": "e_SystemBlinkStandard.jpg"}
image_system_camera
for{"FileName": "e_SystemCamera.jpg"}
image_system_flash
for{"FileName": "e_SystemFlash.jpg"}
image_system_gear_prompt
for{"FileName": "e_SystemGearPrompt.jpg"}
image_system_logo_prompt
for{"FileName": "e_SystemLogoPrompt.jpg"}
image_terror_1
for{"FileName": "e_Terror.jpg"}
image_terror_2
for{"FileName": "e_Terror2.jpg"}
image_terror_left
for{"FileName": "e_TerrorLeft.jpg"}
image_terror_right
for{"FileName": "e_TerrorRight.jpg"}
sound_acceptance
for{ "FileName": "s_Acceptance.wav" }
sound_amazement_1
for{ "FileName": "s_Amazement.wav" }
sound_amazement_2
for{ "FileName": "s_Amazement2.wav" }
sound_anger_1
for{ "FileName": "s_Anger.wav" }
sound_anger_2
for{ "FileName": "s_Anger2.wav" }
sound_anger_3
for{ "FileName": "s_Anger3.wav" }
sound_anger_4
for{ "FileName": "s_Anger4.wav" }
sound_annoyance_1
for{ "FileName": "s_Annoyance.wav" }
sound_annoyance_2
for{ "FileName": "s_Annoyance2.wav" }
sound_annoyance_3
for{ "FileName": "s_Annoyance3.wav" }
sound_annoyance_4
for{ "FileName": "s_Annoyance4.wav" }
sound_awe_1
for{ "FileName": "s_Awe.wav" }
sound_awe_2
for{ "FileName": "s_Awe2.wav" }
sound_awe_3
for{ "FileName": "s_Awe3.wav" }
sound_boredom
for{ "FileName": "s_Boredom.wav" }
sound_disapproval
for{ "FileName": "s_Disapproval.wav" }
sound_disgust_1
for{ "FileName": "s_Disgust.wav" }
sound_disgust_2
for{ "FileName": "s_Disgust2.wav" }
sound_disgust_3
for{ "FileName": "s_Disgust3.wav" }
sound_disoriented_1
for{ "FileName": "s_DisorientedConfused.wav" }
sound_disoriented_2
for{ "FileName": "s_DisorientedConfused2.wav" }
sound_disoriented_3
for{ "FileName": "s_DisorientedConfused3.wav" }
sound_disoriented_4
for{ "FileName": "s_DisorientedConfused4.wav" }
sound_disoriented_5
for{ "FileName": "s_DisorientedConfused5.wav" }
sound_disoriented_6
for{ "FileName": "s_DisorientedConfused6.wav" }
sound_distraction
for{ "FileName": "s_Distraction.wav" }
sound_ecstacy_1
for{ "FileName": "s_Ecstacy.wav" }
sound_ecstacy_2
for{ "FileName": "s_Ecstacy2.wav" }
sound_fear
for{ "FileName": "s_Fear.wav" }
sound_grief_1
for{ "FileName": "s_Grief.wav" }
sound_grief_2
for{ "FileName": "s_Grief2.wav" }
sound_grief_3
for{ "FileName": "s_Grief3.wav" }
sound_grief_4
for{ "FileName": "s_Grief4.wav" }
sound_joy_1
for{ "FileName": "s_Joy.wav" }
sound_joy_2
for{ "FileName": "s_Joy2.wav" }
sound_joy_3
for{ "FileName": "s_Joy3.wav" }
sound_joy_4
for{ "FileName": "s_Joy4.wav" }
sound_loathing
for{ "FileName": "s_Loathing.wav" }
sound_love
for{ "FileName": "s_Love.wav" }
sound_phrase_bye_bye
for{ "FileName": "s_PhraseByeBye.wav" }
sound_phrase_evil
for{ "FileName": "s_PhraseEvilAhHa.wav" }
sound_phrase_hello
for{ "FileName": "s_PhraseHello.wav" }
sound_phrase_no
for{ "FileName": "s_PhraseNoNoNo.wav" }
sound_phrase_oopsy
for{ "FileName": "s_PhraseOopsy.wav" }
sound_phrase_ow
for{ "FileName": "s_PhraseOwOwOw.wav" }
sound_phrase_oww
for{ "FileName": "s_PhraseOwwww.wav" }
sound_phrase_uh
for{ "FileName": "s_PhraseUhOh.wav" }
sound_rage
for{ "FileName": "s_Rage.wav" }
sound_sadness_1
for{ "FileName": "s_Sadness.wav" }
sound_sadness_2
for{ "FileName": "s_Sadness2.wav" }
sound_sadness_3
for{ "FileName": "s_Sadness3.wav" }
sound_sadness_4
for{ "FileName": "s_Sadness4.wav" }
sound_sadness_5
for{ "FileName": "s_Sadness5.wav" }
sound_sadness_6
for{ "FileName": "s_Sadness6.wav" }
sound_sadness_7
for{ "FileName": "s_Sadness7.wav" }
sound_sleepy_1
for{ "FileName": "s_Sleepy.wav" }
sound_sleepy_2
for{ "FileName": "s_Sleepy2.wav" }
sound_sleepy_3
for{ "FileName": "s_Sleepy3.wav" }
sound_sleepy_4
for{ "FileName": "s_Sleepy4.wav" }
sound_sleepy_snore
for{ "FileName": "s_SleepySnore.wav" }
sound_camera_shutter
for{ "FileName": "s_SystemCameraShutter.wav" }
sound_failure
for{ "FileName": "s_SystemFailure.wav" }
sound_success
for{ "FileName": "s_SystemSuccess.wav" }
sound_wake
for{ "FileName": "s_SystemWakeWord.wav" }
Adding custom keywords and shortcuts
Custom keywords and shortcuts can be passed to a Misty object while declaring a new instance by using the optional arguments:
custom_info
for custom information keywords (a dictionary with keys being the information keywords and values being the endpoints),custom_actions
for custom action keywords (a dictionary with keys being the action keywords and values being a dictionary{"endpoint" : "edpoint_value", "method" : "method_value"}
wheremethod_value
is eitherpost
ordelete
),custom_data
for custom data shortcuts (a dictionary with keys being the data shortcuts and values being the dictionary of data values).
An example:
custom_allowed_infos = {
"hazards_settings": "api/hazards/settings"
}
custom_allowed_data = {
"amazement": {
"FileName": "s_Amazement.wav"
},
"red": {
"red": "255",
"green": "0",
"blue": "0"
}
}
custom_allowed_actions = {
"audio_play" : {
"endpoint" : "api/audio/play",
"method" : "post"
},
"delete_audio" : {
"endpoint" : "api/audio",
"method" : "delete"
}
}
misty_robot = Misty("0.0.0.0",
custom_info=custom_allowed_infos,
custom_actions=custom_allowed_actions,
custom_data=custom_allowed_data)
Skills
The sub-package misty2py.skills
contains relatively simple skills developed with misty2py library, which can be used in more complex skills. The skills sub-package currently contains:
template
file - a template for developing a skill with Misty2py.battery_printer
module - a skill that prints Misty's battery status every 250 ms in the terminal for the duration specified as the second CLI argument in seconds (optional, defaults to 2 seconds).listening_expression
module - a simple expression that makes Misty appear to be listening.angry_expression
- a simple expression that makes Misty appear to be angry.hey_misty
module - a skill of Misty reacting to the "Hey Misty" keyphrase.free_memory
module - a skill that removes non-system audio, video, image and recording files from Misty's memory.remote_control
module - a skill that lets you control your Misty via a keyboard (please note that Misty is not a remote control race car so the controllability and responsiveness is not on the level of the typical remotelly controlled devices).explore
module - a skill that enables SLAM mapping.face_recognition
- a skill that greets people upon face detection with their name if known and prompts a face training session if their face (and therefore their name) is not known.
Running Misty2py from source
-
If this is your first time using
misty2py
from source, do following:- Copy
.env.example
to.env
. - Replace the placeholder values in the new
.env
file. - Run
poetry install
to obtain all dependencies.
- Copy
-
Run the desired script via
poetry run python -m [name]
where[name]
is the placeholder for the module location (in Python notation). -
If the scripts run but your Misty does not seem to respond, you have most likely provided an incorrect IP address for
MISTY_IP_ADDRESS
in.env
.
Pytests
This repository contains several parametrised unit tests under the pytest library that can be found in the directory tests
. The test coverage was not yet inspected.
Instructions for running the pytests
-
if this is your first time using misty2py from source, follow instructions in Running Misty2py from source.
-
run pytests via
poetry run python -m pytest
Planned future features
- a new question answering skill
- refining sample skills:
- explore
- greeting
- support for
EventConditions
in event subscriptions - further documentation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.