{ "info": { "author": "Daniel Kumor", "author_email": "daniel@dkumor.com", "bugtrack_url": null, "classifiers": [ "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.5" ], "description": "# RTCBot\n\n[![PyPI](https://img.shields.io/pypi/v/rtcbot.svg?style=flat-square)](https://pypi.org/project/rtcbot/)\n[![npm](https://img.shields.io/npm/v/rtcbot.svg?style=flat-square)](https://www.npmjs.com/package/rtcbot)\n[![Documentation Status](https://readthedocs.org/projects/rtcbot/badge/?version=latest&style=flat-square)](https://rtcbot.readthedocs.io/en/latest/?badge=latest)\n[![Join the chat at https://gitter.im/rtcbot/community](https://img.shields.io/gitter/room/dkumor/rtcbot.svg?style=flat-square)](https://gitter.im/rtcbot/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n![Tests](https://github.com/dkumor/rtcbot/workflows/tests/badge.svg)\n\nRTCBot's purpose is to provide a set of simple modules that help in developing remote-controlled robots in Python, with a focus on the Raspberry Pi.\n\nThe documentation includes tutorials that guide in developing your robot, starting from a basic connection between a Raspberry Pi and Browser, and encompass\ncreating a video-streaming robot controlled entirely over a 4G mobile connection, all the way to a powerful system that offloads complex computation to a desktop PC in real-time.\n\nAll communication happens through [WebRTC](https://en.wikipedia.org/wiki/WebRTC),\nusing Python 3's asyncio and the wonderful [aiortc](https://github.com/jlaine/aiortc) library,\nmeaning that your robot can be controlled with low latency both from the browser and through Python,\neven when it is not connected to your local network.\n\nThe library is explained piece by piece in [the documentation](https://rtcbot.readthedocs.io/en/latest/index.html).\n\n### [See Documentation & Tutorials](https://rtcbot.readthedocs.io/en/latest/index.html)\n\n## Installing\n\nRTCBot relies on some Python libraries that will need to be compiled by pip, so\nyou need to install their dependencies. The following commands will work on Ubuntu and Raspbian Buster:\n\n```bash\nsudo apt-get install build-essential python3-numpy python3-cffi python3-aiohttp \\\n libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev \\\n libswscale-dev libswresample-dev libavfilter-dev libopus-dev \\\n libvpx-dev pkg-config libsrtp2-dev python3-opencv pulseaudio\n```\n\nAnd then install rtcbot:\n```bash\nsudo pip3 install rtcbot\n```\n\nFor installation instructions for Windows and Mac, [refer to the documentation](https://rtcbot.readthedocs.io/en/latest/installing.html)\n\n## Example\n\nThis example uses RTCBot to live stream a webcam to the browser. For details, please look at [the tutorials](https://rtcbot.readthedocs.io/en/latest/examples/index.html).\n\nPython code that streams video to the browser:\n\n```python\nfrom aiohttp import web\nroutes = web.RouteTableDef()\n\nfrom rtcbot import RTCConnection, getRTCBotJS, CVCamera\n\ncamera = CVCamera()\n# For this example, we use just one global connection\nconn = RTCConnection()\nconn.video.putSubscription(camera)\n\n# Serve the RTCBot javascript library at /rtcbot.js\n@routes.get(\"/rtcbot.js\")\nasync def rtcbotjs(request):\n return web.Response(content_type=\"application/javascript\", text=getRTCBotJS())\n\n# This sets up the connection\n@routes.post(\"/connect\")\nasync def connect(request):\n clientOffer = await request.json()\n serverResponse = await conn.getLocalDescription(clientOffer)\n return web.json_response(serverResponse)\n\n@routes.get(\"/\")\nasync def index(request):\n with open(\"index.html\", \"r\") as f:\n return web.Response(content_type=\"text/html\", text=f.read())\n\nasync def cleanup(app):\n await conn.close()\n camera.close()\n\napp = web.Application()\napp.add_routes(routes)\napp.on_shutdown.append(cleanup)\nweb.run_app(app)\n```\n\nBrowser code (index.html) that displays the video stream:\n\n```html\n\n \n RTCBot: Video\n \n \n \n \n

\n Open the browser's developer tools to see console messages (CTRL+SHIFT+C)\n

\n \n \n\n```\n\n## Development\n\nTo use `rtcbot` code directly, clone the repository, and install the requirements:\n\n```\npip install -r requirements.txt\n```\n\nThen, you will need to perform the javascript build step, to prepare the browser code. This step requires both `make` and `npm` to be installed on your machine. To build the javascript, type in:\n\n```\nmake js\n```\n\nThis creates `rtcbot/rtcbot.js`, which is returned by `rtcbot.getRTCBotJS()`.\n\nAfter these two steps, you should be able to successfully import and use the library.\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/dkumor/rtcbot", "keywords": "", "license": "MIT", "maintainer": "", "maintainer_email": "", "name": "rtcbot", "package_url": "https://pypi.org/project/rtcbot/", "platform": "", "project_url": "https://pypi.org/project/rtcbot/", "project_urls": { "Homepage": "https://github.com/dkumor/rtcbot" }, "release_url": "https://pypi.org/project/rtcbot/0.1.0/", "requires_dist": [ "aiortc", "pyserial", "pyserial-asyncio", "numpy", "aiohttp", "soundcard", "inputs", "pynmea2" ], "requires_python": ">=3.5.0", "summary": "An asyncio-focused library for webrtc robot control", "version": "0.1.0" }, "last_serial": 5764532, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "93b7b0a027adf30cf7aaf88ac0371636", "sha256": "c3a6c4424bfd33e54f2e4102535a2581c1797711e3e92f9678b1b0349677c606" }, "downloads": -1, "filename": "rtcbot-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "93b7b0a027adf30cf7aaf88ac0371636", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.7.0", "size": 31746, "upload_time": "2019-03-10T22:21:47", "url": "https://files.pythonhosted.org/packages/4e/38/3057e4478fa2f0098bb9d6ff20f10a9931ee1925fcadc0b15897e04778c6/rtcbot-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "c69c3fe4482bb00585cba6dab58ef16b", "sha256": "39293152838cc294428b678f6771c420cba983b8e1b77c4cf3ef21bcb5d1cd34" }, "downloads": -1, "filename": "rtcbot-0.0.1.tar.gz", "has_sig": false, "md5_digest": "c69c3fe4482bb00585cba6dab58ef16b", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.7.0", "size": 24726, "upload_time": "2019-03-10T22:21:49", "url": "https://files.pythonhosted.org/packages/33/bc/abb6e30c196d86c4cb683137625be626fc4926ae757182775cce31c52f66/rtcbot-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "55c3bcabd28218f2ea1856f812f3d949", "sha256": "16c4ac3b5fc271c615671ac2d5c55f2c948e2e73c69201ec3e390022dd8c5a8e" }, "downloads": -1, "filename": "rtcbot-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "55c3bcabd28218f2ea1856f812f3d949", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 32167, "upload_time": "2019-03-12T07:49:40", "url": "https://files.pythonhosted.org/packages/84/f9/c7e197e342994d1efd1b34f1fffc6fdb5314b1fccef450661c8f1298a7d5/rtcbot-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f98de6517ad25c30755a4271a47d8ea6", "sha256": "938d70b3aef641654f1b1c7569aa9bb19592b251aadbb55007a63a9b73c65b10" }, "downloads": -1, "filename": "rtcbot-0.0.2.tar.gz", "has_sig": false, "md5_digest": "f98de6517ad25c30755a4271a47d8ea6", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 25449, "upload_time": "2019-03-12T07:49:41", "url": "https://files.pythonhosted.org/packages/17/79/17b65e465a00784fe25d12ecf32877deed8bb8dd22e9ebb3906e246fc9cb/rtcbot-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "9494140eb372f4b0bbb8a62f9fbace89", "sha256": "a2138c6e08edc722d02f150c4c9868bccdeff82e54b026acb2310171aedf72ca" }, "downloads": -1, "filename": "rtcbot-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "9494140eb372f4b0bbb8a62f9fbace89", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 32202, "upload_time": "2019-03-14T05:45:26", "url": "https://files.pythonhosted.org/packages/0f/70/06db4593aadff346bd3140d7c8c378ce104974009481c11705e845715a25/rtcbot-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "99457ce124a758e9c93378078a82302c", "sha256": "0b4ea98d39fca97dcd8d7b48159944513d9ad2ad5fcee844faed14993de1b443" }, "downloads": -1, "filename": "rtcbot-0.0.3.tar.gz", "has_sig": false, "md5_digest": "99457ce124a758e9c93378078a82302c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 25485, "upload_time": "2019-03-14T05:45:27", "url": "https://files.pythonhosted.org/packages/c6/f3/92444121db16296e8f00037d678f93e941ecc984910a826ccabf5c3852a7/rtcbot-0.0.3.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "ab322253b9918defab82253c7cc094e5", "sha256": "debc8c254ce27cf105b308f0c2b284fd600ced74f9bea3e5b526d09e729031c0" }, "downloads": -1, "filename": "rtcbot-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "ab322253b9918defab82253c7cc094e5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 34036, "upload_time": "2019-03-15T07:21:52", "url": "https://files.pythonhosted.org/packages/94/96/3c391b7c210ce8ab3b0e0a7f8a3a5659520f6b0c8e82dfb3fc9a1588c3ef/rtcbot-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "bb2ece06c06870a04e4151f6c8c5173e", "sha256": "b72c057300e93ec9b5157bad8f168e404b9d007691b97be07b791ee47da617ae" }, "downloads": -1, "filename": "rtcbot-0.0.4.tar.gz", "has_sig": false, "md5_digest": "bb2ece06c06870a04e4151f6c8c5173e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 27170, "upload_time": "2019-03-15T07:21:53", "url": "https://files.pythonhosted.org/packages/59/05/e2a4b3511381190ab81de70f5a01e00c15e923f8f9ed28bab2d1d839a4d5/rtcbot-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "3d989b3e14c9fad0f0cc807e78e5f0af", "sha256": "98cf6427e98e19944153125c94e7662e3121675e4d3d8be700f1da683cbd6c88" }, "downloads": -1, "filename": "rtcbot-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "3d989b3e14c9fad0f0cc807e78e5f0af", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 35538, "upload_time": "2019-03-20T05:36:08", "url": "https://files.pythonhosted.org/packages/71/a5/7448957be0278bf0ca7a685daa9266b7cc68f78cb169c44b7bf23503c8ff/rtcbot-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "664d150b5f4a1fa60e037a5d37f1385e", "sha256": "0c7bff6d11bc45f28bf84df81d6ecb2e49bfc893bdb19ac3e2c823964f44b21f" }, "downloads": -1, "filename": "rtcbot-0.0.5.tar.gz", "has_sig": false, "md5_digest": "664d150b5f4a1fa60e037a5d37f1385e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 29719, "upload_time": "2019-03-20T05:36:09", "url": "https://files.pythonhosted.org/packages/05/0a/eb8e53650f0d1593ca478e510eecd84a2513260b8dd838acc28c68f9d824/rtcbot-0.0.5.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "c843def762fff1a106b7d3d7c2cb3f44", "sha256": "1cf097375cac180c575577d7a9c0d9f3c283f99b27054629d47728dc93b14eb5" }, "downloads": -1, "filename": "rtcbot-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "c843def762fff1a106b7d3d7c2cb3f44", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 40458, "upload_time": "2019-03-23T06:47:31", "url": "https://files.pythonhosted.org/packages/19/af/34fbbb5dfc771cd4f225ff955e8c07f047a6be7495e91190e12bd043fe07/rtcbot-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7f7f855e02c0bfdbabab0cc0e56d965c", "sha256": "773cc87899e909eba26eed6b4833f5dfc17d826388747454b179e442ab1a2e37" }, "downloads": -1, "filename": "rtcbot-0.0.6.tar.gz", "has_sig": false, "md5_digest": "7f7f855e02c0bfdbabab0cc0e56d965c", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 33031, "upload_time": "2019-03-23T06:47:33", "url": "https://files.pythonhosted.org/packages/9e/a6/1cb69062c7a4f113f5c2cb8fb5ec77504f15b6d924ebe36be3a1db86496b/rtcbot-0.0.6.tar.gz" } ], "0.0.7": [ { "comment_text": "", "digests": { "md5": "6c03570c3b18cd3c4c95f0d439f7ecab", "sha256": "f6f852ea58cd9ed1ce9f4c088158ef5c10e813cd790e3aa754dd211bfe8b4990" }, "downloads": -1, "filename": "rtcbot-0.0.7-py3-none-any.whl", "has_sig": false, "md5_digest": "6c03570c3b18cd3c4c95f0d439f7ecab", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 40853, "upload_time": "2019-03-23T22:38:41", "url": "https://files.pythonhosted.org/packages/00/1a/2f1e68199033e144a9391747a656dcb5cafb76c065b6fd4d2197d17df00d/rtcbot-0.0.7-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "ddb1e9a17807de8edeb7a9c836c2657a", "sha256": "eb21981071a5ecb1332fb3f9407cbf866eb632ab65ce281037ec7e48c5a4bf81" }, "downloads": -1, "filename": "rtcbot-0.0.7.tar.gz", "has_sig": false, "md5_digest": "ddb1e9a17807de8edeb7a9c836c2657a", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 33341, "upload_time": "2019-03-23T22:38:42", "url": "https://files.pythonhosted.org/packages/a3/4d/d70fc13990098c3482082469fb56f938783578e43449be951e9c36163f60/rtcbot-0.0.7.tar.gz" } ], "0.0.8": [ { "comment_text": "", "digests": { "md5": "6518d527fbc9422e7a5de569abb23e35", "sha256": "7a95bd6684426e6e6569c7fb663537068db38d19bfd122e7e665c6a2e2ec8e52" }, "downloads": -1, "filename": "rtcbot-0.0.8-py3-none-any.whl", "has_sig": false, "md5_digest": "6518d527fbc9422e7a5de569abb23e35", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 41125, "upload_time": "2019-08-22T16:39:53", "url": "https://files.pythonhosted.org/packages/77/6e/e1cb9e34b8d8b3daa57714dc3bc1e9b9f7a0cf7d13605e7aef9c28a42557/rtcbot-0.0.8-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "8caa5d0f4299c50c1544d6779d843efd", "sha256": "bc564294f6c1b2fc0e89de100705de2ebb1b7eb23c194a6f24a1e40f3cffdd14" }, "downloads": -1, "filename": "rtcbot-0.0.8.tar.gz", "has_sig": false, "md5_digest": "8caa5d0f4299c50c1544d6779d843efd", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 33864, "upload_time": "2019-08-22T16:39:54", "url": "https://files.pythonhosted.org/packages/82/b0/a8bc86c5a05e5133afdec3f4c37100e43f44b133fc1bd2f2f98d43427a73/rtcbot-0.0.8.tar.gz" } ], "0.0.9": [ { "comment_text": "", "digests": { "md5": "a4a8a90d1f41cab57633e1e158d49e3c", "sha256": "e261c562454065b9ed7e46ed91e07ca5d25e87714c4e89efc87b40ffc98e2839" }, "downloads": -1, "filename": "rtcbot-0.0.9-py3-none-any.whl", "has_sig": false, "md5_digest": "a4a8a90d1f41cab57633e1e158d49e3c", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 41242, "upload_time": "2019-08-30T03:12:24", "url": "https://files.pythonhosted.org/packages/32/c0/3c0ff79e23ea3dd9a759300f6b146f296888aaca5daee926b02f0930c108/rtcbot-0.0.9-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e2d49812475652eee57923271947f6c7", "sha256": "4c9a3bf39c7e5ebb3dac9122edbf6b3572d11de59e27888dbb20b08ff7be6245" }, "downloads": -1, "filename": "rtcbot-0.0.9.tar.gz", "has_sig": false, "md5_digest": "e2d49812475652eee57923271947f6c7", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 33943, "upload_time": "2019-08-30T03:12:26", "url": "https://files.pythonhosted.org/packages/c5/d1/ded8b67bddd7b2038ff7afd5b410ec9e5cd91383b032f0ddd1bf8228d52b/rtcbot-0.0.9.tar.gz" } ], "0.1.0": [ { "comment_text": "", "digests": { "md5": "f9e1e5aedd5f3fede75a3c1a3563af97", "sha256": "705e4f5294af67330774e1a9c4269c71403f7cd137d6ce04b761ca832de7f0e0" }, "downloads": -1, "filename": "rtcbot-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f9e1e5aedd5f3fede75a3c1a3563af97", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 41590, "upload_time": "2019-08-31T15:04:44", "url": "https://files.pythonhosted.org/packages/e0/40/bcd811a306e4def105ea9b776d3ceaf009732ff45adebf86974b8e3a90a3/rtcbot-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b3ce60b98ded2fda505300386fd14db", "sha256": "03a7fc11bbe62db35cfcdbfb9b3fa1047667a49a38ec4d13ac879e0c792d4ac5" }, "downloads": -1, "filename": "rtcbot-0.1.0.tar.gz", "has_sig": false, "md5_digest": "4b3ce60b98ded2fda505300386fd14db", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 34580, "upload_time": "2019-08-31T15:04:46", "url": "https://files.pythonhosted.org/packages/09/39/7442aab4d7916c0e69d24e0c1474b14b2488c23ceac2267a137cfebcbdc2/rtcbot-0.1.0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "f9e1e5aedd5f3fede75a3c1a3563af97", "sha256": "705e4f5294af67330774e1a9c4269c71403f7cd137d6ce04b761ca832de7f0e0" }, "downloads": -1, "filename": "rtcbot-0.1.0-py3-none-any.whl", "has_sig": false, "md5_digest": "f9e1e5aedd5f3fede75a3c1a3563af97", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=3.5.0", "size": 41590, "upload_time": "2019-08-31T15:04:44", "url": "https://files.pythonhosted.org/packages/e0/40/bcd811a306e4def105ea9b776d3ceaf009732ff45adebf86974b8e3a90a3/rtcbot-0.1.0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "4b3ce60b98ded2fda505300386fd14db", "sha256": "03a7fc11bbe62db35cfcdbfb9b3fa1047667a49a38ec4d13ac879e0c792d4ac5" }, "downloads": -1, "filename": "rtcbot-0.1.0.tar.gz", "has_sig": false, "md5_digest": "4b3ce60b98ded2fda505300386fd14db", "packagetype": "sdist", "python_version": "source", "requires_python": ">=3.5.0", "size": 34580, "upload_time": "2019-08-31T15:04:46", "url": "https://files.pythonhosted.org/packages/09/39/7442aab4d7916c0e69d24e0c1474b14b2488c23ceac2267a137cfebcbdc2/rtcbot-0.1.0.tar.gz" } ] }