{"id":13753687,"url":"https://github.com/chalmers-revere/opendlv","last_synced_at":"2025-05-09T21:35:32.149Z","repository":{"id":93402244,"uuid":"47192659","full_name":"chalmers-revere/opendlv","owner":"chalmers-revere","description":"OpenDLV - A modern microservice-based software ecosystem powered by libcluon to make vehicles autonomous.","archived":true,"fork":false,"pushed_at":"2024-04-25T11:58:29.000Z","size":84638,"stargazers_count":80,"open_issues_count":3,"forks_count":16,"subscribers_count":22,"default_branch":"new","last_synced_at":"2024-08-03T09:05:47.761Z","etag":null,"topics":["aarch64","amd64","applanix","armhf","autonomous-driving","cpp14","docker","gps","h264","libcluon","lidar","microservice","nmea","opendlv","openh264","oxts-gps","self-driving-car","trimble-gps","velodyne","video4linux"],"latest_commit_sha":null,"homepage":"http://opendlv.org","language":"CMake","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chalmers-revere.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-12-01T13:54:42.000Z","updated_at":"2024-08-03T09:05:48.471Z","dependencies_parsed_at":"2024-01-17T15:02:58.709Z","dependency_job_id":"aef65562-6278-478e-83d6-ccc112c7a019","html_url":"https://github.com/chalmers-revere/opendlv","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chalmers-revere%2Fopendlv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chalmers-revere%2Fopendlv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chalmers-revere%2Fopendlv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chalmers-revere%2Fopendlv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chalmers-revere","download_url":"https://codeload.github.com/chalmers-revere/opendlv/tar.gz/refs/heads/new","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224884615,"owners_count":17386121,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aarch64","amd64","applanix","armhf","autonomous-driving","cpp14","docker","gps","h264","libcluon","lidar","microservice","nmea","opendlv","openh264","oxts-gps","self-driving-car","trimble-gps","velodyne","video4linux"],"created_at":"2024-08-03T09:01:27.346Z","updated_at":"2024-11-16T06:30:35.949Z","avatar_url":"https://github.com/chalmers-revere.png","language":"CMake","funding_links":[],"categories":["docker"],"sub_categories":[],"readme":"Moved to https://git.opendlv.org.\n\n# OpenDLV has moved to its own GitLab environment at [git.opendlv.org/explore](https://git.opendlv.org/explore). Tutorials were also added att [opendlv.org/learn.html](https://opendlv.org/learn.html).\n\n## OpenDLV - A modern microservice-based software ecosystem for self-driving vehicles.\n\nOpenDLV is a modern open source software environment to support the development and\ntesting of self-driving vehicles driven by the following design principles:\n\n* Implemented using high quality and modern C++14 with a strong focus is on code clarity, portability, and performance.\n* Based entirely on [microservices](https://martinfowler.com/articles/microservices.html).\n* Strong focus on deployment and ease of use: All our microservices are automatically built on Docker hub: We provide *turn-key* solutions with Docker images for `amd64`, `armhf`, and `aarch64`\n* Realized with [libcluon](https://github.com/chrberger/libcluon) - the world's first and only single-file, header-only middleware for distributed systems for robotic applications.\n* CI-Status: [![Build Status](https://travis-ci.org/chalmers-revere/opendlv.svg?branch=new)](https://travis-ci.org/chalmers-revere/opendlv)\n* License: [![License: GPLv3](https://img.shields.io/badge/license-GPL--3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.txt)\n\n## Table of Contents\n* [What is an OpenDLV session?](#what-is-an-opendlv-session)\n* [Dependencies](#dependencies)\n* [Usage](#usage)\n* [Build from sources on the example of Ubuntu 16.04 LTS](#build-from-sources-on-the-example-of-ubuntu-1604-lts)\n* [License](#license)\n* [Publications](#publications)\n\n## What is an OpenDLV session?\n\nApplications based on OpenDLV are grouped in UDP multicast sessions\nbelonging to IPv4 address `225.0.0.X`, where X is from the within the range\n`[1,254]`. All microservices belonging to the same UDP multicast group are\nable to communicate with each other; thus, two applications running in different\nUDP multicast sessions do not see each other and are completely separated.\n\nThe actual UDP multicast session is selected using the commandline parameter\n`--cid=111`, where `111` would define the UDP multicast address `225.0.0.111`.\nMicroservices exchange data using the message [`Envelope`](https://github.com/chrberger/libcluon/blob/master/libcluon/resources/cluonDataStructures.odvd#L23-L30)\nthat contains besides the actual message to send further meta information\nlike sent and received timestamp and the point in time when the contained\nmessage was actually sampled. All messages are encoded in\nGoogle's [Protobuf](https://developers.google.com/protocol-buffers/) data\nformat ([example](https://wandbox.org/permlink/rXayIZxXyVDt5Jgn)) that has\nbeen adjusted to preserve forwards and backwards compatibility using\n[libcluon](https://wandbox.org/permlink/rXayIZxXyVDt5Jgn)'s native implementation\nof Protobuf.\n\nAn `Envelope` contains in its field `serializedData` the actually message\nto be exchanged that is encoded in Protobuf. Furthermore, the `Envelope`\nitself is also encoded in Protobuf but prepended with the byte sequence\n`0x0D 0xA4` as magic number, followed by three bytes `0xXX 0xYY 0xZZ`\ndescribing the length in bytes of the Protobuf-encoded `Envelope`. The\nsequence `0xA4 0xXX 0xYY 0xZZ` is encoded in little endian and `0xZZ`\nis usually 0 in practice.\n\nAs participants in a UDP multicast session automatically receive any exchanged\n`Envelope`s, a receiver can differentiate what message to expect by checking\n`Envelope`'s field [dataType](https://github.com/chrberger/libcluon/blob/master/libcluon/resources/cluonDataStructures.odvd#L24),\nwhich is referring to a message identifier (for instance, `Envelope`'s\n[message identifier](https://github.com/chrberger/libcluon/blob/master/libcluon/resources/cluonDataStructures.odvd#L23)\nis 1).\n\nOpenDLV's microservices conform to the [OpenDLV Standard Message Set](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/master/opendlv.odvd) that enables exchangeability across\nhardware/software interfaces to decouple high-level application logic from\nlow-level device drivers. For instance, OpenDLV's hardware/software interface to\naccess an *Applanix GPS unit* is called [opendlv-device-gps-pos](https://github.com/chalmers-revere/opendlv-device-gps-pos)\naccording to Applanix' internal data format POS that is used across several\nunits in their product portfolio. The microservice [opendlv-device-gps-pos](https://github.com/chalmers-revere/opendlv-device-gps-pos)\nprovides GPS information in messages [`GeodeticWgs84Reading`](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/master/opendlv.odvd#L137-L140)\nand [`GeodeticHeadingReading`](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/master/opendlv.odvd#L133-L135).\n\nAs the microservices for the various GPS units (like, for instance Trimble and\nApplanix) all broadcast the aforementioned messages, the hardware units can be\nexchanged transparently for the high-level application logic. However, when\nseveral GPS units shall be operated in parallel, it is necessary to distinguish\nbetween them. Therefore, the commandline parameter `--id=Y` can be provided,\nwhere Y is a positive number to differentiate between messages of the\nsame type. At the receiving end, the value Y is made available in `Envelope`'s\nfield `senderStamp`. As an example, when using an Applanix unit next to a\nTrimble unit, the respective microservices could be supplied with the suffixes\n`--id=1` and `--id=2`.\n\n## Dependencies\nYou need a C++14-compliant compiler to compile this project as it ships the following dependencies as part of the source distribution:\n\n* [libcluon](https://github.com/chrberger/libcluon) - [![License: GPLv3](https://img.shields.io/badge/license-GPL--3-blue.svg\n)](https://www.gnu.org/licenses/gpl-3.0.txt)\n* [Unit Test Framework Catch2](https://github.com/catchorg/Catch2/releases/tag/v2.1.2) - [![License: Boost Software License v1.0](https://img.shields.io/badge/License-Boost%20v1-blue.svg)](http://www.boost.org/LICENSE_1_0.txt)\n\nFor building [cluon-rec2fuse](https://github.com/chrberger/cluon-rec2fuse), [libfuse](https://github.com/libfuse/libfuse) is required.\n\n## Usage\nWe are providing the following microservices as multi-platform (amd64/x86_64, armhf, aarch64) Docker images:\n\n### OpenDLV.OS\n\nComplete ArchLinux-based [OpenDLV OS](https://github.com/chalmers-revere/opendlv.os) Operating System (start here if you want to initialize a blank computing unit - *WARNING!* All data will be erased!)\n\n### Hardware/Software Interfaces:\n---\n#### **Gamepad** (such as PS3 or PS4 controllers): [![opendlv-device-gamepad](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-gamepad\")](https://github.com/chalmers-revere/opendlv-device-gamepad) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gamepad-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gamepad-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gamepad-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gamepad-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-gamepad.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-gamepad)\n* Provides: [device-specific messages](https://github.com/chalmers-revere/opendlv-device-gamepad/blob/master/src/actuationrequestmessage.odvd)\n* Command to run with Docker for PS3 controllers: `docker run --rm -ti --init --net=host --device /dev/input/js0 chalmersrevere/opendlv-device-gamepad-multi:v0.0.10 --device=/dev/input/js0 --axis_leftright=0 --axis_updown=3 --freq=100 --acc_min=0 --acc_max=50 --dec_min=0 --dec_max=-10 --steering_min=-10 --steering_max=10 --steering_max_rate=5.0 --cid=111 --verbose`\n* Command to run with Docker for PS4 controllers: `docker run --rm -ti --init --net=host --device /dev/input/js0 chalmersrevere/opendlv-device-gamepad-multi:v0.0.10 --device=/dev/input/js0 --axis_leftright=0 --axis_updown=4 --freq=100 --acc_min=0 --acc_max=50 --dec_min=0 --dec_max=-10 --steering_min=-10 --steering_max=10 --steering_max_rate=5.0 --cid=111 --verbose`\n* Section for `docker-compose.yml` for PS3 controllers:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-ps3controller:\n        container_name: dev-ps3controller\n        image: chalmersrevere/opendlv-device-gamepad-multi:v0.0.10\n        restart: on-failure\n        network_mode: \"host\"\n        devices:\n        - \"/dev/input/js0:/dev/input/js0\"\n        command: \"--device=/dev/input/js0 --axis_leftright=0 --axis_updown=3 --freq=100 --acc_min=0 --acc_max=50 --dec_min=0 --dec_max=-10 --steering_min=-10 --steering_max=10 --steering_max_rate=5.0 --cid=111\"\n```\n* Section for `docker-compose.yml` for PS4 controllers:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-ps4controller:\n        container_name: dev-ps4controller\n        image: chalmersrevere/opendlv-device-gamepad-multi:v0.0.10\n        restart: on-failure\n        network_mode: \"host\"\n        devices:\n        - \"/dev/input/js0:/dev/input/js0\"\n        command: \"--device=/dev/input/js0 --axis_leftright=0 --axis_updown=4 --freq=100 --acc_min=0 --acc_max=50 --dec_min=0 --dec_max=-10 --steering_min=-10 --steering_max=10 --steering_max_rate=5.0 --cid=111\"\n```\n---\n### GPS devices\n\n#### **Applanix POS GPS/INSS** units: [![opendlv-device-gps-pos](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-gps-pos\")](https://github.com/chalmers-revere/opendlv-device-gps-pos) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-pos-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-pos-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-pos-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-pos-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-gps-pos.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-gps-pos)\n* Provides: [Latitude/Longitude (OpenDLV Standard Message Set v0.9.1)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/0b85a1c4b151258c21b2368295a3c203232675e9/opendlv.odvd#L137-L140)\n* Provides: [Heading (OpenDLV Standard Message Set v0.9.1)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/0b85a1c4b151258c21b2368295a3c203232675e9/opendlv.odvd#L133-L135)\n* Provides: [device-specific messages](https://github.com/chalmers-revere/opendlv-device-gps-pos/blob/master/src/pos-message-set.odvd)\n* Command to run with Docker: `docker run --init --rm --net=host chalmersrevere/opendlv-device-gps-pos-multi:v0.0.11 --pos_ip=192.168.1.77 --pos_port=5602 --cid=111 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-gps-pos:\n        container_name: dev-gps-pos\n        image: chalmersrevere/opendlv-device-gps-pos-multi:v0.0.11\n        restart: on-failure\n        network_mode: \"host\"\n        command: \"--pos_ip=10.42.42.40 --pos_port=5602 --cid=111\"\n```\n---\n#### **OxTS GPS/INSS** units: [![opendlv-device-gps-ncom](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-gps-ncom\")](https://github.com/chalmers-revere/opendlv-device-gps-ncom) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-ncom-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-ncom-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-ncom-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-ncom-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-gps-ncom.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-gps-ncom)\n* Provides: [Latitude/Longitude (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L145-L148)\n* Provides: [Altitude (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L89-L91)\n* Provides: [Heading (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L141-L143)\n* Provides: [Latitude/Longitude/Altitude/Heading (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L267-L272)\n* Provides: [GroundSpeed (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L129-L131)\n* Provides: [Acceleration X/Y/Z (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L71-L75)\n* Provides: [Angular Velocity X/Y/Z (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L77-L81)\n* Provides: [Equilibrioception (OpenDLV Standard Message Set v0.9.5)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/fb11778810a37d76d45e83e52ea054dac2e2a350/opendlv.odvd#L274-L281)\n* Command to run with Docker: `docker run --init --rm --net=host chalmersrevere/opendlv-device-gps-ncom-multi:v0.0.17 --ncom_ip=0.0.0.0 --ncom_port=3000 --cid=111 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-gps-ncom:\n        container_name: dev-gps-ncom\n        image: chalmersrevere/opendlv-device-gps-ncom-multi:v0.0.17\n        restart: on-failure\n        network_mode: \"host\"\n        command: \"--ncom_ip=0.0.0.0 --ncom_port=3000 --cid=111\"\n```\n---\n#### **PEAK CAN GPS** units: [![opendlv-device-gps-peak](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-gps-peak\")](https://github.com/chalmers-revere/opendlv-device-gps-peak) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-peak-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-peak-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-peak-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-peak-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-gps-peak.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-gps-peak)\n* Provides: [Latitude/Longitude (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L145-L148)\n* Provides: [Altitude (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L89-L91)\n* Provides: [Heading (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L141-L143)\n* Provides: [GroundSpeed (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L129-L131)\n* Provides: [Temperature (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L97-L99)\n* Provides: [AccelerationReading (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L71-L75)\n* Provides: [AngularVelocityReading (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L77-L81)\n* Provides: [MagneticFieldReading (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L83-L87)\n* Provides: [device-specific messages](https://github.com/chalmers-revere/opendlv-device-gps-peak/blob/master/src/peak-can.odvd)\n* Command to run with Docker: `docker run --init --rm --net=host --privileged chalmersrevere/opendlv-device-gps-peak-multi:v0.0.8 --can=can0 --cid=111 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-gps-peak:\n        container_name: dev-gps-peak\n        image: chalmersrevere/opendlv-device-gps-peak-multi:v0.0.8\n        restart: on-failure\n        network_mode: \"host\"\n        privileged: true\n        command: \"--can=can0 --cid=111\"\n```\n---\n#### **Trimble GPS/INSS** units: [![opendlv-device-gps-nmea](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-gps-nmea\")](https://github.com/chalmers-revere/opendlv-device-gps-nmea) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-nmea-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-nmea-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-nmea-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-gps-nmea-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-gps-nmea.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-gps-nmea)\n* Provides: [Latitude/Longitude (OpenDLV Standard Message Set v0.9.1)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/0b85a1c4b151258c21b2368295a3c203232675e9/opendlv.odvd#L137-L140)\n* Provides: [Heading (OpenDLV Standard Message Set v0.9.1)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/0b85a1c4b151258c21b2368295a3c203232675e9/opendlv.odvd#L133-L135)\n* Command to run with Docker to connect to an NMEA stream provided from a given TCP server: `docker run --init --rm --net=host chalmersrevere/opendlv-device-gps-nmea-multi:v0.0.14 --nmea_ip=10.42.42.112 --nmea_port=9999 --cid=111 --verbose`\n* Command to run with Docker to let an NMEA stream reach this microservice with UDP (this application is listening for incoming UDP packets): `docker run --init --rm --net=host chalmersrevere/opendlv-device-gps-nmea-multi:v0.0.14 --udp --nmea_ip=0.0.0.0 --nmea_port=9999 --cid=111 --verbose`\n* Section for `docker-compose.yml` (to connect to a TCP server):\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-gps-nmea:\n        container_name: dev-gps-nmea\n        image: chalmersrevere/opendlv-device-gps-nmea-multi:v0.0.14\n        restart: on-failure\n        network_mode: \"host\"\n        command: \"--nmea_ip=10.42.42.112 --nmea_port=9999 --cid=111\"\n```\n* Section for `docker-compose.yml` (to let this microservice listen for UDP packets):\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-gps-nmea:\n        container_name: dev-gps-nmea\n        image: chalmersrevere/opendlv-device-gps-nmea-multi:v0.0.14\n        restart: on-failure\n        network_mode: \"host\"\n        command: \"--udp --nmea_ip=0.0.0.0 --nmea_port=9999 --cid=111\"\n```\n---\n### LIDAR devices\n\n#### **Velodyne HDL32e** lidar units: [![opendlv-device-lidar-hdl32e](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-lidar-hdl32e\")](https://github.com/chalmers-revere/opendlv-device-lidar-hdl32e) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-hdl32e-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-hdl32e-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-hdl32e-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-hdl32e-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-hdl32e.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-hdl32e)\n* Provides: [PointCloudReading (OpenDLV Standard Message Set v0.9.1)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/0b85a1c4b151258c21b2368295a3c203232675e9/opendlv.odvd#L152-L158)\n* Command to run with Docker: `docker run --init --rm --net=host chalmersrevere/opendlv-device-lidar-hdl32e-multi:v0.0.14 --hdl32e_ip=0.0.0.0 --hdl32e_port=2368 --cid=111 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-lidar-hdl32e:\n        container_name: dev-lidar-hdl32e\n        image: chalmersrevere/opendlv-device-lidar-hdl32e-multi:v0.0.14\n        restart: on-failure\n        network_mode: \"host\"\n        command: \"--hdl32e_ip=0.0.0.0 --hdl32e_port=2368 --nogpstime --cid=111\"\n```\n---\n#### **Velodyne VLP32c** lidar units: [![opendlv-device-lidar-vlp32c](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-lidar-vlp32c\")](https://github.com/chalmers-revere/opendlv-device-lidar-vlp32c) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp32c-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp32c-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp32c-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp32c-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-vlp32c.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-vlp32c)\n* Provides: [PointCloudReading (OpenDLV Standard Message Set v0.9.7)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/bd5007e7723654563c388129a96a70b559f7fef6/opendlv.odvd#L165-L172)\n* Command to run with Docker: `docker run --init --rm --net=host chalmersrevere/opendlv-device-lidar-vlp32c-multi:v0.0.3 --vlp32c_ip=0.0.0.0 --vlp32c_port=2368 --cid=111 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-lidar-vlp32c:\n        container_name: dev-lidar-vlp32c\n        image: chalmersrevere/opendlv-device-lidar-vlp32c-multi:v0.0.3\n        restart: on-failure\n        network_mode: \"host\"\n        command: \"--vlp32c_ip=0.0.0.0 --vlp32c_port=2368 --cid=111\"\n```\n---\n#### **Velodyne VLP16** lidar units: [![opendlv-device-lidar-vlp16](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-lidar-vlp16\")](https://github.com/chalmers-revere/opendlv-device-lidar-vlp16) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp16-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp16-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp16-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-vlp16-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-vlp16.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-vlp16)\n* Provides: [PointCloudReading (OpenDLV Standard Message Set v0.9.1)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/0b85a1c4b151258c21b2368295a3c203232675e9/opendlv.odvd#L152-L158)\n* Command to run with Docker: `docker run --init --rm --net=host chalmersrevere/opendlv-device-lidar-vlp16-multi:v0.0.10 --vlp16_ip=0.0.0.0 --vlp16_port=2368 --cid=111 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-lidar-vlp16c:\n        container_name: dev-lidar-vlp16c\n        image: chalmersrevere/opendlv-device-lidar-vlp16-multi:v0.0.10\n        restart: on-failure\n        network_mode: \"host\"\n        command: \"--vlp16_ip=0.0.0.0 --vlp16_port=2368 --cid=111\"\n```\n#### **RPLidar** lidar units: [![opendlv-device-lidar-rplidar](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-lidar-rplidar\")](https://github.com/chalmers-revere/opendlv-device-lidar-rplidar) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-rplidar-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-rplidar-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-rplidar-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-lidar-rplidar-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-rplidar.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-lidar-rplidar)\n* Provides: [PointCloudReading (OpenDLV Standard Message Set v0.9.9)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/6c6ac1f893ab181bbcd7c8a913ad117067fd6f4c/opendlv.odvd#L165-L178)\n* Command to run with Docker: `docker run --init --rm --net=host chalmersrevere/opendlv-device-lidar-rplidar-multi:v0.0.4 --device=/dev/ttyUSB0 --cid=111 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-lidar-rplidar:\n        container_name: dev-lidar-rplidar\n        image: chalmersrevere/opendlv-device-lidar-rplidar-multi:v0.0.4\n        restart: on-failure\n        network_mode: \"host\"\n        devices:\n        - \"/dev/ttyUSB0:/dev/ttyUSB0\"\n        command: \"--device=/dev/ttyUSB0 --cid=111\"\n```\n---\n### Ultrasound devices\n\n#### SRF08 devices connected via I2C bus: [![opendlv-device-ultrasonic-srf08](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-ultrasonic-srf08\")](https://github.com/chalmers-revere/opendlv-device-ultrasonic-srf08) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-ultrasonic-srf08-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-ultrasonic-srf08-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-ultrasonic-srf08-armhf/tags/)\n* Provides: [PointCloudReading](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/master/opendlv.odvd#L165-L171)\n* Command to run with Docker: `docker run --rm -ti --net=host --privileged --device=/dev/i2c-1 chalmersrevere/opendlv-device-ultrasonic-srf08-multi:v0.0.10 opendlv-device-ultrasonic-srf08 --dev=/dev/i2c-1 --bus-address=112 --cid=111 --freq=5 --id=0`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-ultrasonic-srf08:\n        container_name: dev-ultrasonic-srf08\n        image: chalmersrevere/opendlv-device-ultrasonic-srf08-multi:v0.0.10\n        restart: on-failure\n        network_mode: \"host\"\n        privileged: true\n        devices:\n        - \"/dev/i2c-1:/dev/i2c-1\"\n        command: \"opendlv-device-ultrasonic-srf08 --dev=/dev/i2c-1 --bus-address=112 --cid=111 --freq=5 --range=100 --gain=1 --id=0 --cid=111\"\n```\n---\n### Camera devices and video processing\n\nOpenDLV contains a highly modular and easy-to-use framework to grab video frames from various cameras, share them via shared memory, and encode/decode them into h264 frames to broadcast into an OD4Session for OpenDLV. The microservices are divided into video sources (e.g., [opendlv-device-camera-v4l](https://github.com/chalmers-revere/opendlv-device-camera-v4l), [opendlv-device-camera-opencv](https://github.com/chalmers-revere/opendlv-device-camera-opencv), [opendlv-device-camera-ueye](https://github.com/chalmers-revere/opendlv-device-camera-ueye)), or [opendlv-device-camera-rpi](https://github.com/chalmers-revere/opendlv-device-camera-rpi)) and video sinks (e.g., [opendlv-video-h264-encoder](https://github.com/chalmers-revere/opendlv-video-h264-encoder)) to process incoming video frames. Video sinks provide frames in two image formats: [I420-encoded image](https://wiki.videolan.org/YUV/#I420) and ARGB. The former format can be directly used for video compression (e.g., h264 encoding), while the latter can be directly used for image detection algorithms ([opendlv-examples](https://github.com/chalmers-revere/opendlv-examples)).\n\n#### **Video4Linux** cameras (e.g., /dev/video0): [![opendlv-device-camera-v4l](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-camera-v4l\")](https://github.com/chalmers-revere/opendlv-device-camera-v4l) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-v4l-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-v4l-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-v4l-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-v4l-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-camera-v4l.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-camera-v4l)\n* This microservice interfaces with a Video4Linux-supported camera and provides both, an [I420-encoded image](https://wiki.videolan.org/YUV/#I420) and an ARGB-encoded image residing in two separate shared memory areas. Other OpenDLV microservices can attach to this shared memory area for further processing (for instance [opendlv-video-h264-encoder](https://github.com/chalmers-revere/opendlv-video-h264-encoder)).\n* The following image formats are supported:\n  * MJPEG\n  * YUYV422\n* Command to run with Docker: `docker run --rm -ti --init --ipc=host -v /tmp:/tmp -e DISPLAY=$DISPLAY --device /dev/video0 chalmersrevere/opendlv-device-camera-v4l-multi:v0.0.8 --camera=/dev/video0 --width=640 --height=480 --freq=20 --verbose`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-camera-v4l:\n        container_name: dev-camera-v4l\n        image: chalmersrevere/opendlv-device-camera-v4l-multi:v0.0.8\n        restart: on-failure\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        devices:\n        - \"/dev/video0:/dev/video0\"\n        command: \"--camera=/dev/video0 --width=640 --height=480 --freq=20\"\n```\n#### **OpenCV-supported** cameras: [![opendlv-device-camera-opencv](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-camera-opencv\")](https://github.com/chalmers-revere/opendlv-device-camera-opencv) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-opencv-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-opencv-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-opencv-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-opencv-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-camera-opencv.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-camera-opencv)\n* This microservice interfaces with an OpenCV-supported camera and provides both, an [I420-encoded image](https://wiki.videolan.org/YUV/#I420) and an ARGB-encoded image residing in two separate shared memory areas. Other OpenDLV microservices can attach to this shared memory area for further processing (for instance [opendlv-video-h264-encoder](https://github.com/chalmers-revere/opendlv-video-h264-encoder)). This microservice also allows to interface with network-attached cameras (i.e., those providing an MJPEG stream for example).\n* Command to run with Docker: `docker run --rm -ti --init --ipc=host -e DISPLAY=$DISPLAY --device /dev/video0 -v /tmp:/tmp chalmersrevere/opendlv-device-camera-opencv-multi:v0.0.11 --camera=/dev/video0 --width=640 --height=480 --freq=20`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-camera-opencv:\n        container_name: dev-camera-opencv\n        image: chalmersrevere/opendlv-device-camera-opencv-multi:v0.0.11\n        restart: on-failure\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        devices:\n        - \"/dev/video0:/dev/video0\"\n        command: \"--camera=/dev/video0 --width=640 --height=480 --freq=20\"\n```\n#### **RaspberryPi** camera: [![opendlv-device-camera-rpi](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-camera-rpi\")](https://github.com/chalmers-revere/opendlv-device-camera-rpi) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-rpi-armhf/tags/)\n* This microservice interfaces with an RPi camera and provides both, an [I420-encoded image](https://wiki.videolan.org/YUV/#I420) and an ARGB-encoded image residing in two separate shared memory areas. Other OpenDLV microservices can attach to this shared memory area for further processing (for instance [opendlv-video-h264-encoder](https://github.com/chalmers-revere/opendlv-video-h264-encoder)).\n* Command to run with Docker: `docker run --rm -ti --init --ipc=host -e DISPLAY=$DISPLAY --device /dev/video0 -v /tmp:/tmp chalmersrevere/opendlv-device-camera-rpi-armhf:v0.0.6 --width=640 --height=480 --freq=20`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-camera-rpi:\n        container_name: dev-camera-rpi\n        image: chalmersrevere/opendlv-device-camera-rpi-armhf:v0.0.6\n        restart: on-failure\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        command: \"--width=640 --height=480 --freq=20\"\n```\n#### **IDS uEye** cameras: [![opendlv-device-camera-ueye](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-camera-ueye\")](https://github.com/chalmers-revere/opendlv-device-camera-ueye) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-ueye-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-ueye-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-ueye-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-device-camera-ueye-aarch64/tags/) [![Build Status](https://travis-ci.org/chalmers-revere/opendlv-device-camera-ueye.svg?branch=master)](https://travis-ci.org/chalmers-revere/opendlv-device-camera-ueye)\n* This microservice interfaces with an IDS uEye camera and provides both, an [I420-encoded image](https://wiki.videolan.org/YUV/#I420) and an ARGB-encoded image residing in two separate shared memory areas. Other OpenDLV microservices can attach to this shared memory area for further processing (for instance [opendlv-video-h264-encoder](https://github.com/chalmers-revere/opendlv-video-h264-encoder)).\n* Command to run with Docker: `docker run --rm -ti --init --ipc=host -v /tmp:/tmp --pid=host -v /var/run:/var/run -e DISPLAY=$DISPLAY chalmersrevere/opendlv-device-camera-ueye-multi:v0.0.5 --width=752 --height=480 --pixel_clock=10 --freq=20`\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    dev-camera-ueye:\n        container_name: dev-camera-ueye\n        image: chalmersrevere/opendlv-device-camera-ueye-multi:v0.0.5\n        restart: on-failure\n        ipc: \"host\"\n        pid: \"host\"\n        volumes:\n        - /tmp:/tmp\n        - /var/run:/var/run\n        command: \"--width=752 --height=480 --pixel_clock=10 --freq=20\"\n```\n#### **Pylon-based GiGE** cameras (ie., Basler): [![opendlv-device-camera-pylon](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-device-camera-pylon\")](https://github.com/chalmers-revere/opendlv-device-camera-pylon):\n* This microservice interfaces with a pylon-based GiGE camera (eg., Basler cameras) and provides both, an [I420-encoded image](https://wiki.videolan.org/YUV/#I420) and an ARGB-encoded image residing in two separate shared memory areas. Other OpenDLV microservices can attach to this shared memory area for further processing (for instance [opendlv-video-h264-encoder](https://github.com/chalmers-revere/opendlv-video-h264-encoder)).\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    device-camera-pylon-amd64:\n        build:\n            context: https://github.com/chalmers-revere/opendlv-device-camera-pylon.git\n            dockerfile: Dockerfile.amd64\n        restart: on-failure\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        command: \"--camera=0 --width=640 --height=480\"\n```\n---\n#### [opendlv-video-h264-encoder](https://github.com/chalmers-revere/opendlv-video-h264-encoder) to encode video frames from a shared memory into h264 frames (OpenH264 Video Codec provided by Cisco Systems, Inc.) as [ImageReading (OpenDLV Standard Message Set v0.9.6)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/40f0cdb83632c3d122d2f35e028331494313330f/opendlv.odvd#L150-L155):\n* This microservice attaches to an I420-encoded image residing in a shared memory area to encode it into an h264 frame to be broadcasted to other OpenDLV microservices.\n* During the Docker-ized build process for this microservice, Cisco's binary library is downloaded from Cisco's webserver and installed on the user's computer due to legal implications arising from the patents around the [AVC/h264 format](http://www.mpegla.com/main/programs/avc/pages/intro.aspx).\n* End user's notice according to [AVC/H.264 Patent Portfolio License Conditions](https://www.openh264.org/BINARY_LICENSE.txt):\n**When you are using this software and build scripts from this repository, you are agreeing to and obeying the terms under which Cisco is making the binary library available.**\n* Section for `docker-compose.yml`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    video-h264-encoder-amd64:\n        build:\n            context: https://github.com/chalmers-revere/opendlv-video-h264-encoder.git\n            dockerfile: Dockerfile.amd64\n        restart: on-failure\n        network_mode: \"host\"\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        command: \"--cid=111 --name=video0.i420 --width=640 --height=480\"\n```\n\n#### [opendlv-video-h264-decoder](https://github.com/chalmers-revere/opendlv-video-h264-decoder.git) to decode h264 video frames from an [ImageReading (OpenDLV Standard Message Set v0.9.6)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/40f0cdb83632c3d122d2f35e028331494313330f/opendlv.odvd#L150-L155) into a shared memory (OpenH264 Video Codec provided by Cisco Systems, Inc.):\n* During the Docker-ized build process for this microservice, Cisco's binary library is downloaded from Cisco's webserver and installed on the user's computer due to legal implications arising from the patents around the [AVC/h264 format](http://www.mpegla.com/main/programs/avc/pages/intro.aspx).\n* End user's notice according to [AVC/H.264 Patent Portfolio License Conditions](https://www.openh264.org/BINARY_LICENSE.txt):\n**When you are using this software and build scripts from this repository, you are agreeing to and obeying the terms under which Cisco is making the binary library available.**\n* Section for `docker-compose.yml`:\n ```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    video-h264-decoder-amd64:\n        container_name: video-h264-decoder-amd64\n        build:\n            context: https://github.com/chalmers-revere/opendlv-video-h264-decoder.git\n            dockerfile: Dockerfile.amd64\n        restart: on-failure\n        network_mode: \"host\"\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        environment:\n        - DISPLAY=${DISPLAY}\n        command: \"--cid=111 --name=imageData\"\n```\n\n#### [opendlv-video-x264-encoder](https://github.com/chalmers-revere/opendlv-video-x264-encoder) to encode video frames from a shared memory into h264 frames as [ImageReading (OpenDLV Standard Message Set v0.9.6)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/40f0cdb83632c3d122d2f35e028331494313330f/opendlv.odvd#L150-L155):\n* This microservice attaches to an I420-encoded image residing in a shared memory area to encode it into an h264 frame to be broadcasted to other OpenDLV microservices.\n* Due to legal implications arising from the patents around the [AVC/h264 format](http://www.mpegla.com/main/programs/avc/pages/intro.aspx), we are not distributing binaries or Docker images but only provide build instructions that can be easily integrated with a `docker-compose.yml` file.\n* Section for `docker-compose.yml` to build for `amd64`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    video-x264-encoder-amd64:\n        container_name: video-x264-encoder-amd64\n        build:\n            context: https://github.com/chalmers-revere/opendlv-video-x264-encoder.git\n            dockerfile: Dockerfile.amd64\n        restart: on-failure\n        network_mode: \"host\"\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        command: \"--cid=111 --name=video0.i420 --width=640 --height=480\"\n```\n* Section for `docker-compose.yml` to build for `armhf`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    video-x264-encoder-armhf:\n        container_name: video-x264-encoder-armhf\n        build:\n            context: https://github.com/chalmers-revere/opendlv-video-x264-encoder.git\n            dockerfile: Dockerfile.armhf\n        restart: on-failure\n        network_mode: \"host\"\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        command: \"--cid=111 --name=video0.i420 --width=640 --height=480\"\n```\n* Section for `docker-compose.yml` to build for `aarch64`:\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    video-x264-encoder-aarch64:\n        container_name: video-x264-encoder-aarch64\n        build:\n            context: https://github.com/chalmers-revere/opendlv-video-x264-encoder.git\n            dockerfile: Dockerfile.aarch64\n        restart: on-failure\n        network_mode: \"host\"\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        command: \"--cid=111 --name=video0.i420 --width=640 --height=480\"\n```\n\n#### [opendlv-video-vpx-encoder](https://github.com/chalmers-revere/opendlv-video-vpx-encoder.git) to encode video frames from a shared memory into VP8 or VP9 frames as [ImageReading (OpenDLV Standard Message Set v0.9.6)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/40f0cdb83632c3d122d2f35e028331494313330f/opendlv.odvd#L150-L155): [![opendlv-video-vpx-encoder](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-video-vpx-encoder\")](https://github.com/chalmers-revere/opendlv-video-vpx-encoder) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-encoder-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-encoder-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-encoder-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-encoder-aarch64/tags/)\n* Command to run with Docker: `docker run --rm -ti --init --net=host --ipc=host -v /tmp:/tmp chalmersrevere/opendlv-video-vpx-encoder-multi:v0.0.7 --cid=111 --name=video0.i420 --width=640 --height=480 --vp8`\n* Section for `docker-compose.yml`:\n ```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    video-vpx-encoder:\n        container_name: video-vpx-encoder\n        image: chalmersrevere/opendlv-video-vpx-encoder-multi:v0.0.7\n        restart: on-failure\n        network_mode: \"host\"\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        environment:\n        - DISPLAY=${DISPLAY}\n        command: \"--cid=111 --name=video0.i420 --width=640 --height=480 --vp8\"\n```\n\n#### [opendlv-video-vpx-decoder](https://github.com/chalmers-revere/opendlv-video-vpx-decoder.git) to decode h264 video frames from an [ImageReading (OpenDLV Standard Message Set v0.9.6)](https://github.com/chalmers-revere/opendlv.standard-message-set/blob/40f0cdb83632c3d122d2f35e028331494313330f/opendlv.odvd#L150-L155) into a shared memory: [![opendlv-video-vpx-decoder](https://raw.githubusercontent.com/encharm/Font-Awesome-SVG-PNG/master/black/png/24/github.png \"opendlv-video-vpx-decoder\")](https://github.com/chalmers-revere/opendlv-video-vpx-decoder) [![Docker (multi)](https://img.shields.io/badge/Docker-multi-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-decoder-multi/tags/) [![Docker (amd64)](https://img.shields.io/badge/Docker-amd64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-decoder-amd64/tags/) [![Docker (armhf)](https://img.shields.io/badge/Docker-armhf-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-decoder-armhf/tags/) [![Docker (aarch64)](https://img.shields.io/badge/Docker-aarch64-blue.svg)](https://hub.docker.com/r/chalmersrevere/opendlv-video-vpx-decoder-aarch64/tags/)\n* Command to run with Docker: `docker run --rm -ti --init --net=host --ipc=host -v /tmp:/tmp -e DISPLAY=$DISPLAY chalmersrevere/opendlv-video-vpx-decoder-multi:v0.0.7 --cid=253 --name=video0.arg0 --verbose`\n* Section for `docker-compose.yml`:\n ```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    video-vpx-decoder:\n        container_name: video-vpx-decoder\n        image: chalmersrevere/opendlv-video-vpx-decoder-multi:v0.0.7\n        restart: on-failure\n        network_mode: \"host\"\n        ipc: \"host\"\n        volumes:\n        - /tmp:/tmp\n        environment:\n        - DISPLAY=${DISPLAY}\n        command: \"--cid=111 --name=imageData\"\n```\n---\n### Streaming Tools:\n#### [cluon-record](https://github.com/chrberger/cluon-record) to record Envelopes from a running OD4Session with remote control start/stop for recordings; the remote control can be triggered from OpenDLV Vehicle View:\n* Example for a `docker-compose.yml`:\n ```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n     cluon-record:\n        container_name: cluon-record\n        image: chrberger/cluon-record-multi:v0.0.1\n        restart: on-failure\n        network_mode: \"host\"\n        volumes:\n        - ~/recordings:/recordings\n        working_dir: /recordings\n        command: \"--cid=111 --remote\"\n\n---\n### Data Post Processing:\n#### [rec2csv-png](https://github.com/chalmers-revere/rec2csv-png) to extract messages as .csv and h264 frames as separate .png files from a .rec file from a recorded OpenDLV session (OpenH264 Video Codec provided by Cisco Systems, Inc.):\n* Example for a `docker-compose.yml`:\n ```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n     rec2csv_png:\n        container_name: rec2csv_png\n        build:\n            context: https://github.com/chalmers-revere/rec2csv-png.git\n            dockerfile: Dockerfile.amd64\n        restart: on-failure\n        volumes:\n        - .:/opt/data\n        working_dir: /opt/data\n        command: \"--rec=YourRecording.rec --odvd=YourMessageSpec.odvd\"\n```\n        \n#### [cluon-rec2fuse](https://github.com/chrberger/cluon-rec2fuse) to *mount* a recording file to a folder and dynamically map its content as .csv files: \n```\n  docker run --rm -ti -v $PWD/myrecording.rec:/opt/input.rec \\\n                    -v $PWD/opendlv.odvd:/opt/odvd \\\n                    -v $PWD/mnt:/opt/output:shared \\\n                    --cap-add SYS_ADMIN \\\n                    --cap-add MKNOD \\\n                    --security-opt apparmor:unconfined \\\n                    --device=/dev/fuse \\\n                    -v /etc/passwd:/etc/passwd:ro \\\n                    -v /etc/group:/etc/group \\\n                    chrberger/cluon-rec2fuse-amd64:v0.0.104 \\\n                    /bin/sh -c \"chown $UID:$UID /opt/output \u0026\u0026 \\\n                    su -s /bin/sh $USER -c 'cluon-rec2fuse --rec=/opt/input.rec --odvd=/opt/odvd -f /opt/output' \\\n                    \u0026\u0026 tail -f /dev/null\"\n```\n\n---\n### Visualizations:\n#### [cluon-livefeed](https://github.com/chrberger/cluon-livefeed) to display any messages exchanged in the communication session 111 on console: `docker run --rm -ti --init --net=host chrberger/cluon-livefeed-multi:v0.0.122 --cid=111`\n\n#### [opendlv-signal-viewer](https://github.com/chalmers-revere/opendlv-signal-viewer) to view any messages from the OpenDLV Standard Message Set exchanged in the communication session 111 (after starting this microservice, point your web-browser to the computer's IP address, port 8080): `docker run --rm --net=host -p 8080:8080 chalmersrevere/opendlv-signal-viewer-multi:v0.0.8 --cid=111`\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    signal-viewer:\n        container_name: signal-viewer\n        image: chalmersrevere/opendlv-signal-viewer-multi:v0.0.8\n        restart: on-failure\n        network_mode: \"host\"\n        ports:\n        - \"8080:8080\"\n        command: \"--cid=111\"\n```\n![screenshot from signal viewer](https://raw.githubusercontent.com/chalmers-revere/opendlv-signal-viewer/master/signal-viewer.gif)\n\n#### [opendlv-vehicle-view](https://github.com/chalmers-revere/opendlv-vehicle-view) to view vehicle messages from the OpenDLV Standard Message Set exchanged in the communication session 111 (after starting this microservice, point your web-browser to the computer's IP address, port 8081): `docker run --rm --net=host --name=opendlv-vehicle-view -v ~/recordings:/opt/vehicle-view/recordings -v /var/run/docker.sock:/var/run/docker.sock -p 8081:8081 chalmersrevere/opendlv-vehicle-view-multi:v0.0.60`\n```yml\nversion: '2' # Must be present exactly once at the beginning of the docker-compose.yml file\nservices:    # Must be present exactly once at the beginning of the docker-compose.yml file\n    vehicle-view:\n        container_name: opendlv-vehicle-view\n        image: chalmersrevere/opendlv-vehicle-view-multi:v0.0.60\n        restart: on-failure\n        network_mode: \"host\"\n        volumes:\n        - ~/recordings:/opt/vehicle-view/recordings\n        - /var/run/docker.sock:/var/run/docker.sock\n        ports:\n        - \"8081:8081\"\n```\n![screenshot from vehicle view](https://raw.githubusercontent.com/chalmers-revere/opendlv-vehicle-view/master/vehicle-view-animated.gif)\n\n\n## Build from sources on the example of Ubuntu 16.04 LTS\nTo build this software, you need cmake, C++14 or newer, and make. Having these\npreconditions, update the contained submodules first.\n\n```\ngit submodule update --init --recursive\ngit submodule update --remote --merge\ngit submodule status\n```\n\nNow, you can change into the various sub-folders and run `cmake` and `make` as follows:\n\n```\nmkdir build \u0026\u0026 cd build\ncmake -D CMAKE_BUILD_TYPE=Release ..\nmake \u0026\u0026 make test \u0026\u0026 make install\n```\n\n\n## License\n\n* This project is released under the terms of the GNU GPLv3 License.\n\n\n## Publications\n\nThe following list contains publications related to the OpenDLV Software Ecosystem:\n\n* O. Benderius, C. Berger, V. Malmsten Lundgren: [\"The Best Rated Human-Machine Interface Design for Autonomous Vehicles in the 2016 Grand Cooperative Driving Challenge\"](http://ieeexplore.ieee.org/abstract/document/8057581/).\n* H. Yin, C. Berger: [\"When to use what data set for your self-driving car algorithm: An overview of publicly available driving datasets\"](https://www.researchgate.net/publication/320475411_When_to_use_what_data_set_for_your_self-driving_car_algorithm_An_overview_of_publicly_available_driving_datasets)\n* F. Giaimo, C. Berger, C. Kirchner: [\"Considerations About Continuous Experimentation for Resource-Constrained Platforms in Self-driving Vehicles\"](https://link.springer.com/chapter/10.1007/978-3-319-65831-5_6)\n* H. Yin, C. Berger: [\"Mastering data complexity for autonomous driving with adaptive point clouds for urban environments\"](http://ieeexplore.ieee.org/document/7995901/)\n* C. Berger, B. Nguyen, O. Benderius: [\"Containerized Development and Microservices for Self-Driving Vehicles: Experiences \u0026 Best Practices\"](http://ieeexplore.ieee.org/abstract/document/7958428/)\n* F. Giaimo, C. Berger: [\"Design Criteria to Architect Continuous Experimentation for Self-Driving Vehicles\"](http://ieeexplore.ieee.org/document/7930218/)\n* P. Masek, M. Thulin, H. Andrade, C. Berger, O. Benderius: [\"Systematic Evaluation of Sandboxed Software Deployment for Real-time Software on the Example of a Self-Driving Heavy Vehicle\"](https://arxiv.org/abs/1608.06759)\n* C. Berger: [\"An Open Continuous Deployment Infrastructure for a Self-driving Vehicle Ecosystem\"](https://link.springer.com/chapter/10.1007/978-3-319-39225-7_14)\n* F. Giaimo, C. Berger, I. Crnkovic: [\"\nContinuous Experimentation on Cyber-Physical Systems: Challenges and Opportunities\"](https://dl.acm.org/citation.cfm?id=2962709)\n* H. Yin, F. Giaimo, H. Andrade, C. Berger, I. Crnkovic: [\"Adaptive Message Restructuring Using Model-Driven Engineering\"](https://link.springer.com/chapter/10.1007/978-3-319-32467-8_67)\n* H. Andrade, F. Giaimo, C. Berger, I. Crnkovic: [\"Systematic evaluation of three data marshalling approaches for distributed software systems\"](https://dl.acm.org/citation.cfm?id=2846705)\n* F. Giaimo, H. Andrade, C. Berger, I. Crnkovic: [\"Improving Bandwidth Efficiency with Self-Adaptation for Data Marshalling on the Example of a Self-Driving Miniature Car\"](https://dl.acm.org/citation.cfm?id=2797454)\n* C. Berger: [\"Accelerating Regression Testing for Scaled Self-Driving Cars with Lightweight Virtualization - A Case Study\"](http://ieeexplore.ieee.org/document/7173936/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchalmers-revere%2Fopendlv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchalmers-revere%2Fopendlv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchalmers-revere%2Fopendlv/lists"}