Skip to main content

An asyncio-focused library for webrtc robot control

Project description

RTCBot

PyPI npm Documentation Status Join the chat at https://gitter.im/rtcbot/community Tests

RTCBot'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.

The documentation includes tutorials that guide in developing your robot, starting from a basic connection between a Raspberry Pi and Browser, and encompass creating 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.

All communication happens through WebRTC, using Python 3's asyncio and the wonderful aiortc library, meaning that your robot can be controlled with low latency both from the browser and through Python, even when it is not connected to your local network.

The library is explained piece by piece in the documentation.

See Documentation & Tutorials

Installing

RTCBot relies on some Python libraries that will need to be compiled by pip, so you need to install their dependencies. The following commands will work on Ubuntu and Raspbian Buster:

sudo apt-get install build-essential python3-numpy python3-cffi python3-aiohttp \
        libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev \
        libswscale-dev libswresample-dev libavfilter-dev libopus-dev \
        libvpx-dev pkg-config libsrtp2-dev python3-opencv pulseaudio

And then install rtcbot:

sudo pip3 install rtcbot

For installation instructions for Windows and Mac, refer to the documentation

Example

This example uses RTCBot to live stream a webcam to the browser. For details, please look at the tutorials.

Python code that streams video to the browser:

from aiohttp import web
routes = web.RouteTableDef()

from rtcbot import RTCConnection, getRTCBotJS, CVCamera

camera = CVCamera()
# For this example, we use just one global connection
conn = RTCConnection()
conn.video.putSubscription(camera)

# Serve the RTCBot javascript library at /rtcbot.js
@routes.get("/rtcbot.js")
async def rtcbotjs(request):
    return web.Response(content_type="application/javascript", text=getRTCBotJS())

# This sets up the connection
@routes.post("/connect")
async def connect(request):
    clientOffer = await request.json()
    serverResponse = await conn.getLocalDescription(clientOffer)
    return web.json_response(serverResponse)

@routes.get("/")
async def index(request):
    with open("index.html", "r") as f:
        return web.Response(content_type="text/html", text=f.read())

async def cleanup(app):
    await conn.close()
    camera.close()

app = web.Application()
app.add_routes(routes)
app.on_shutdown.append(cleanup)
web.run_app(app)

Browser code (index.html) that displays the video stream:

<html>
  <head>
    <title>RTCBot: Video</title>
    <script src="/rtcbot.js"></script>
  </head>
  <body style="text-align: center;padding-top: 30px;">
    <video autoplay playsinline></video> <audio autoplay></audio>
    <p>
      Open the browser's developer tools to see console messages (CTRL+SHIFT+C)
    </p>
    <script>
      var conn = new rtcbot.RTCConnection();

      conn.video.subscribe(function (stream) {
        document.querySelector("video").srcObject = stream;
      });

      async function connect() {
        let offer = await conn.getLocalDescription();

        // POST the information to /connect
        let response = await fetch("/connect", {
          method: "POST",
          cache: "no-cache",
          body: JSON.stringify(offer),
        });

        await conn.setRemoteDescription(await response.json());

        console.log("Ready!");
      }
      connect();
    </script>
  </body>
</html>

Development

To use rtcbot code directly, clone the repository, and install the requirements:

pip install -r requirements.txt

Then, 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:

make js

This creates rtcbot/rtcbot.js, which is returned by rtcbot.getRTCBotJS().

After these two steps, you should be able to successfully import and use the library.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rtcbot-0.2.1.tar.gz (36.0 kB view details)

Uploaded Source

Built Distribution

rtcbot-0.2.1-py3-none-any.whl (42.0 kB view details)

Uploaded Python 3

File details

Details for the file rtcbot-0.2.1.tar.gz.

File metadata

  • Download URL: rtcbot-0.2.1.tar.gz
  • Upload date:
  • Size: 36.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.6.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for rtcbot-0.2.1.tar.gz
Algorithm Hash digest
SHA256 dcd90e3c7be62529dcd265eaf15c3fd3a0c1ff7e726e2705e782b41b8a57e9b3
MD5 155aae0cc26065df74a9c2828beef480
BLAKE2b-256 4af58466c14d0e0a8661ad447c15957d2a96641e0192d714b3978bb1a9b949ab

See more details on using hashes here.

File details

Details for the file rtcbot-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: rtcbot-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 42.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/49.6.0 requests-toolbelt/0.9.1 tqdm/4.48.2 CPython/3.8.5

File hashes

Hashes for rtcbot-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c368cf12d677d715f5da0d7cd4674d1c54e25ee8198e9799044261b33ba696ec
MD5 79dc92eb9b29c8a8d7c37c5516425707
BLAKE2b-256 95be0f3b1ba2c2b19bf2cd9104f082952e80a61ad1445258e5248ec0a496ed75

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page