Skip to main content

A library for managing concurrent socketio, cv2, and pyserial processes. Useful for making robots or devices with Arduinos and Raspberry Pi.

Project description

REMIO

Documentation    |    License

Code Style Codecov branch PyPi version

Table of Contents

  1. Introduction
  2. Features
  3. Installation
  4. Development
  5. Simplejpeg API
  6. Simple MJPEG Server
  7. Multiple Cameras API
  8. Multiple Serial API
  9. Examples

Introduction

REMIO is a library for managing concurrent socketio, cv2, and pyserial processes. Useful for making robots or devices with Arduinos and Raspberry Pi. It was born in the context of remote laboratories, hence its name, where I used and developed several prototypes where the code began to redound. That's where I extracted the modules from this library. The hardware architecture that I used to employ was the following:

So I programmed the following architecture

Features

  • Multiple Camera API
  • Multiple Serial API
  • Event-driven programming API for Serial.
  • Event-driven programming API for Cameras.
  • MJPEG streamer with SocketIO

Installation

First you need to create a virtualenv:

python3 -m venv venv

Then you should active it:

source venv/bin/activate

After choose an option for install remio, for example using pip:

# Pypi source
pip install remio

# Github source
pip install "git+https://github.com/Hikki12/remio"

Or if you prefer, clone the repository:

git clone https://github.com/Hikki12/remio

cd remio

pip install .

Development

If you are a devolper, install the library as follows:

pip install -e .

Multiple Cameras API

import time
import cv2
from remio import Cameras


# Define devices
devices = {
    "webcam1": {
        "src": 0,
        "size": [400, 300],
        "fps": None,
        "reconnectDelay": 5,
        "backgroundIsEnabled": True,
        "emitterIsEnabled": False,
    },
    "webcam2": {
        "src": "http://192.168.100.70:3000/video/mjpeg",
        "size": [400, 300],
        "fps": None,
        "reconnectDelay": 5,
        "backgroundIsEnabled": True,
        "emitterIsEnabled": False,
    },
}

# Intialize Serial manager
camera = Cameras(devices=devices)

# Start device(s) connection on background
camera.startAll()

# Set a FPS speed to display image(s)
FPS = 20
T = 1 / FPS

while True:

    t0 = time.time()

    webcam1, webcam2 = camera.read(asDict=False)
    camera.clearAllFrames()  # to avoid repeated frames

    if webcam1 is not None:
        cv2.imshow("webcam1", webcam1)

    if webcam2 is not None:
        cv2.imshow("webcam2", webcam2)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

    t1 = time.time()

    # Get a fixed delay value (t1 - t0) + delay = T
    delay = abs(T - (t1 - t0))
    time.sleep(delay)


# Close all Windows
cv2.destroyAllWindows()

# Stop all Running devices
camera.stopAll()

Multiple Serial API

"""Multiple serial devices management."""
import time
from remio import Serials


# Define devices
devices = {
    "arduino1": {
        "port": "/dev/cu.usbserial-1440",
        "baudrate": 9600,
        "emitterIsEnabled": True,  # Enable on/emit callbacks
        "reconnectDelay": 5,
    },
    "arduino2": {
        "port": "COM2",
        "baudrate": 9600,
        "emitterIsEnabled": True,
        "reconnectDelay": 5,
    },
}

# Intialize Serial manager
serial = Serials(devices=devices)

# Configure callbacks
serial.on("connection", lambda status: print(f"serial connected: {status}"))

# Start device(s) connection on background
serial.startAll()


while True:
    print("Doing some tasks...")
    time.sleep(1)

Simplejpeg API

REMIO uses simplejpeg library for encode camera images. You could used its API as follows:

import time
from remio import Camera

# Initialize camera device
camera = Camera(src=0, fps=15, size=[800, 600], flipX=True)

while True:
    jpeg = camera.jpeg()
    time.sleep(1/10)

A simple MJPEG Server

You could server your camera image with the MJPEG server, with a few lines:

"""A simple MJPEG."""
from remio import Camera, MJPEGServer


encoderParams = {
    "quality": 90,
    "colorspace": "bgr",
    "colorsubsampling": "422",
    "fastdct": True,
}


# Initialize camera device
camera = Camera(src=0, fps=15, size=[800, 600], flipX=True, encoderParams=encoderParams)

# Configure MJPEG Server
server = MJPEGServer(
    camera=camera, ip="0.0.0.0", port=8080, endpoint="/video/mjpeg", fps=15
)

try:
    server.run(display_url=True, start_camera=True)
except KeyboardInterrupt:
    server.stop(stop_camera=True)
# The video must be accessible through the generated link
>> MJPEG server running on http://0.0.0.0:8080/video/mjpeg

Examples

You could see more examples here.

Resources

Copyright

Copyright (c) hikki12 2022
This library is released under the Apache 2.0 License.

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

remio-0.1.2.tar.gz (23.5 kB view details)

Uploaded Source

Built Distribution

remio-0.1.2-py3-none-any.whl (25.2 kB view details)

Uploaded Python 3

File details

Details for the file remio-0.1.2.tar.gz.

File metadata

  • Download URL: remio-0.1.2.tar.gz
  • Upload date:
  • Size: 23.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for remio-0.1.2.tar.gz
Algorithm Hash digest
SHA256 65f57e303fb5a1d1adfc08e6d452cd41608f48fe3adfd216492dfabf9497b17d
MD5 e8417b67b6e4513cde2f82b3cf3a226a
BLAKE2b-256 cb4d452e29a367ee5a5f19f4c5140f4ae9b15fa4ca6ab93d82efe63dd041588e

See more details on using hashes here.

File details

Details for the file remio-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: remio-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 25.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.1 CPython/3.9.13

File hashes

Hashes for remio-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fcbbfa4f84f9df2e719105b45b4b56744b73eaf1a5bb72f17a384b3ea82eddfb
MD5 3d265d333bb68705eb35be4fcfa9d6cd
BLAKE2b-256 4e31e775efeee25a9a281d9f64d81c290a3d21774f9e3ef3df1f50776ea14514

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