Tutorial: Misty =============== This tutorial begins where :doc:`quickstart` ended. This tutorial provides typical preparation for sharing a Misty_ robot via hardshare: 1. configure a proxy to the API of your Misty, 2. attach a camera to the workspace, 3. create a sandbox with example code, as shown in the figure below. .. image:: figures/screenshot-misty2sandbox-20201124.png .. highlight:: none Declare the add-on mistyproxy ----------------------------- For example, if the Misty robot is available on the local network at IP address 192.168.0.144, then:: hardshare config-addon -a mistyproxy --ip 192.168.0.144 To change the target address, use the same command with the new address. To get the address of the Misty robot as known to hardshare, :: hardshare config-addon -a mistyproxy -l Check details via the rerobots CLI ---------------------------------- You can check the details associated with your Misty robot deployment through the `rerobots CLI `_. The rerobots CLI requires an API token, much like the hardshare client. To find yours locally, :: hardshare config -l and notice the path under the section "found API tokens". Now call ``rerobots wdinfo`` to get details associated with your workspace deployment; for example, :: $ rerobots -t /home/scott/.rerobots/tokens/jwt.txt wdinfo 2d6039bc-7c83-4d46-8567-c8df4711c386 { "id": "2d6039bc-7c83-4d46-8567-c8df4711c386", "type": "user_provided", "type_version": 1, "supported_addons": [ "cmdsh", "mistyproxy" ], "desc": "", "region": "", "icounter": 33, "created": "2020-09-18 05:25:49.711260", "queuelen": 0, "addons_config": { "mistyproxy": { "ip": "192.168.0.144" } }, "cap": [ { "id": 46, "date_created": "2020-10-21 22:24:07.808679", "user": "scott", "wdeployment_id": "2d6039bc-7c83-4d46-8567-c8df4711c386", "capability": "CAP_INSTANTIATE", "param": null } ] } Stream video ------------ For most users, streaming video is most easily achieved with the command ``attach-camera`` as described in the section: :doc:`attach_camera`. After following those instructions, typically it suffices to:: hardshare attach-camera -d 0 to enable video streaming. Note that the camera is only active when there is an active instance with your hardshare client. In other words, the above command can succeed without you noticing any activity on your camera. When done, the ``cam`` add-on appears on your workspace deployment, which practically means that remote users will be able capture camera images or view a live stream like that at https://rerobots.net/sandbox/fixed_misty2 Make a sandbox -------------- At this stage, your workspace deployment with a Misty robot is ready for the kind of low-level access demonstrated in the tutorial at https://help.rerobots.net/tutorial_proxy_fixedmisty.html To provide a faster and simpler (and also more constrained) experience for remote users of your Misty, you can make a sandbox. A similar arrangement is shown in `the following video `_: .. raw:: html Go to your hardshare administrative panel at https://rerobots.net/hardshare and in the "Sandboxes" section, do "create new". Select the sandbox kind ``misty-py``. The sandbox kind ``misty-py`` presents a code editor in which you can place example code that is executed in an isolated, ephemeral Python environment on rerobots servers. The code can include ``{{ mistyhttps }}``, a template variable that is replaced with the ``mistyproxy`` URL generated for each instance. Other sandbox kinds are available for different language runtimes. For example, ``misty-java`` provides a Java runtime. Alternatively, the sandbox can present a Blockly_ editor if ``misty-blockly`` is selected. An example is shown in the video at https://vimeo.com/488264658 Example misty-py template ------------------------- .. highlight:: python :: import time import requests MPURL = '{{ mistyhttps }}' def drive_fwd(mpurl, duration): """Drive forward for given duration (ms) """ params = { 'LinearVelocity': 15, 'AngularVelocity': 0, 'TimeMS': duration, } res = requests.post(mpurl + '/api/drive/time', json=params) if not res.ok: print('response from POST /api/drive/time:', res.status_code, res.reason) # Drive forward for 2 seconds (2000 milliseconds) drive_fwd(mpurl, 2000) time.sleep(2) # Change the color of the chest LED to green # https://docs.mistyrobotics.com/misty-ii/rest-api/api-reference/#changeled res = requests.post(MPURL + '/api/led', json={ 'red': 0, 'green': 255, 'blue': 0, }) assert res.ok, 'response from POST /api/led: {} {}'.format(res.status_code, res.reason) # Tilt the head forward # https://docs.mistyrobotics.com/misty-ii/rest-api/api-reference/#movehead res = requests.post(MPURL + '/api/head', json={ 'Pitch': 20, 'Roll': 0, 'Yaw': 0, 'Velocity': 3, }) assert res.ok, 'response from POST /api/head: {} {}'.format(res.status_code, res.reason) # Sleep for 5 seconds to allow more time for human to observe results time.sleep(5) # Tilt the head back # https://docs.mistyrobotics.com/misty-ii/rest-api/api-reference/#movehead res = requests.post(MPURL + '/api/head', json={ 'Pitch': 0, 'Roll': 0, 'Yaw': 0, 'Velocity': 3, }) assert res.ok, 'response from POST /api/head: {} {}'.format(res.status_code, res.reason) # Change the color of the chest LED to purple # https://docs.mistyrobotics.com/misty-ii/rest-api/api-reference/#changeled res = requests.post(MPURL + '/api/led', json={ 'red': 255, 'green': 0, 'blue': 255, }) assert res.ok, 'response from POST /api/led: {} {}'.format(res.status_code, res.reason) # Move the arms # https://docs.mistyrobotics.com/misty-ii/rest-api/api-reference/#movearms res = requests.post(MPURL + '/api/arms/set', json={ 'LeftArmPosition': -20, 'RightArmPosition': -20, 'LeftArmVelocity': 40, 'RightArmVelocity': 40, }) assert res.ok, 'response from POST /api/arms/set: {} {}'.format(res.status_code, res.reason) # Sleep for 2 seconds to allow arms to complete motion time.sleep(2) res = requests.post(MPURL + '/api/arms/set', json={ 'LeftArmPosition': 90, 'RightArmPosition': 90, 'LeftArmVelocity': 40, 'RightArmVelocity': 40, }) assert res.ok, 'response from POST /api/arms/set: {} {}'.format(res.status_code, res.reason) Hosting more than 1 Misty ------------------------- To host more than 1 Misty robot, you must register additional workspace deployments: each ID should correspond to precisely 1 Misty:: hardshare register --permit-more Now ``hardshare config -l`` will show a list of multiple IDs. All commands given previously in this tutorial and in :doc:`quickstart` can be used again with the new ID by specifying it on the command-line. For example, if the new ID returned from the ``hardshare register`` command above is ``2d6039bc-7c83-4d46-8567-c8df4711c387`` and if IP address of the second Misty robot is ``192.168.1.11``, then:: hardshare addon-mistyproxy --add --ip 192.168.1.11 2d6039bc will declare the address. Notice that the above command has a prefix of the ID ``2d6039bc-7c83-4d46-8567-c8df4711c387``. For convenience, most ``hardshare`` commands accept a unique prefix where a workspace deployment ID is required. .. _Blockly: https://developers.google.com/blockly/ .. _Misty: https://www.mistyrobotics.com/