Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
jazzy

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro kilted showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro lyrical showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro rolling showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro github showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro galactic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro iron showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro melodic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange

No version for distro noetic showing humble. Known supported distros are highlighted in the buttons above.
Package symbol

libmiti package from miti_sdk repo

libmiti miti_bridge

ROS Distro
humble

Package Summary

Version 0.1.2
License MIT
Build type CMAKE
Use RECOMMENDED

Repository Summary

Description
Checkout URI https://github.com/hiran-t/MITI-sdk.git
VCS Type git
VCS Version main
Last Updated 2026-11-05
Dev Status DEVELOPED
Released UNRELEASED
Contributing Help Wanted (-)
Good First Issues (-)
Pull Requests to Review (-)

Package Description

Serves MITI over WebSocket with the MITI protocol. Plain CMake, no ROS dependency; the package.xml lets colcon and rosdep build it in a ROS workspace.

Additional Links

Maintainers

  • MITI Contributors

Authors

No additional authors.

libmiti

The C++ core of the MITI SDK. It serves MITI over WebSocket with the MITI protocol, and has no ROS dependency. miti_bridge will be built on it, and so can any program that wants to stream to MITI.

#include <miti/server.hpp>

miti::ServerOptions options;
options.name = "line-3";
options.port = 8765;
auto server = miti::Server::create(options);

auto status = server->add_channel(
  {"/robot/status", {"cdr", "acme_msgs/msg/Status", "ros2msg", status_definition}});
status->log(cdr_bytes, receive_time_ns);  // to every subscriber, shared, not copied

examples/conformance_server.cpp uses everything libmiti offers. It is a server that offers what the conformance fixture graph offers, without ROS, so the conformance suite checks libmiti against it.

Status, against the design

Done Not yet
The base protocol: channels, latched channels, subscriptions, client publishing (CDR), services, parameters, assets (read off the server’s thread), time Typed messages: planned
miti.subscriptionOptions: maxRate, delivery, priority and transform, with miti.subscriptionFormat TLS and authentication: later
Transforms: jpeg (TurboJPEG) and reduce (point clouds)  
miti.getSchema (the get_schema callback) and miti.stats  
The scheduler: control frames first, then priorities, round-robin, newest-wins for latest, a bounded queue for all, one frame in flight per connection  
Refusing handshakes that do not offer miti.bridge.v1  

Checked:

  • gtest: 54 tests of the scheduler, the wire format, asset paths, the transforms, and the server over a real WebSocket; on Windows 57, with its path rules.
  • Conformance: the suite passes against the example server, 33 checks, on Ubuntu and Windows. miti_bridge, built on libmiti, passes it on Humble and Jazzy.
  • Sanitizers: clean under AddressSanitizer with UndefinedBehaviorSanitizer, and under ThreadSanitizer.
  • Toolchains: builds without warnings, from Ubuntu 22.04 (GCC 11, Boost 1.74) to macOS (Clang, Boost 1.92) and Windows (MSVC at /W4, Boost 1.92). CI builds and checks it on Ubuntu 22.04 and 24.04, each on amd64 and arm64, and on Windows x64.

How it runs

Threads. A server has one thread of its own, and everything it does runs there.

  • Its methods, and a channel’s log, may be called from any thread: they hand their work to that thread.
  • Callbacks from ServerOptions run on that thread and must not block it. Hand longer work to another thread, and answer through the ServiceResponder or the parameter reply the callback was given. Both may be called from any thread.
  • A service call that no one answers fails with “No response” once the last copy of its responder is gone.
  • Transforms run on two threads of their own. Subscribers that ask for the same transform of a channel share one run, and a frame that arrives while the previous one is still being transformed waits in a single slot, where a newer frame replaces it.

Sending.

  • Each connection writes one frame at a time. Messages wait in its scheduler, where a newer one can still replace them, and not in the socket: the socket holds at most 128 KB unsent (TCP_NOTSENT_LOWAT, on Linux and macOS), and sends small messages at once (TCP_NODELAY). Windows has no TCP_NOTSENT_LOWAT; there the send buffer follows the connection’s ideal send backlog, about one bandwidth-delay product.
  • A message’s bytes are shared by every subscriber. Each connection writes only its own 13-byte header in front of them.

Assets.

  • package://name/... is served from AssetOptions::packages[name], and file:///... from inside AssetOptions::roots.
  • .. cannot lead out of a package or a root.
  • Inside a package, symlinks are followed: colcon build --symlink-install installs every file as a link into the source tree. A root’s files must really be inside it: there, symlinks are resolved before the check.
  • Only allowed extensions are served, up to a size limit.
  • On Windows, file:///C:/dir/a.stl names C:\dir\a.stl. A path whose root is not a drive, such as \\host\share, is refused before it is looked up, since looking would reach out to that host. A file’s 8.3 short name, such as MODEL~1.STL for model.stl_old, does not make it an asset: its long name must have an allowed extension too.
  • A URI with a NUL character is refused: the file system would stop at it, after the extension check.

Build

With pixi, from the repository root (the environment brings CMake, a compiler, Boost, nlohmann/json, TurboJPEG and GoogleTest):

pixi run -e core test                  # build, then run the gtests
pixi run -e core conformance-libmiti   # the conformance suite against the example server

On Windows the same tasks build with MSVC from the pixi environment; Visual Studio 2022’s C++ tools must be installed. Run conformance-libmiti from Git Bash.

Without pixi, install CMake, Ninja, pkg-config, a C++17 compiler, Boost 1.74 or newer, nlohmann/json 3.10 or newer, TurboJPEG and GoogleTest. On Ubuntu that is cmake ninja-build pkg-config g++ libboost-dev nlohmann-json3-dev libturbojpeg0-dev libgtest-dev. Then:

cmake -S core -B core/build -G Ninja && cmake --build core/build && ctest --test-dir core/build

cmake --install core/build --prefix /usr/local   # then find_package(libmiti) and link miti::miti

package.xml lets colcon and rosdep build libmiti in a ROS workspace as a plain CMake package.

CHANGELOG

Changelog for package libmiti

0.1.2 (2026-11-04)

  • Builds with MSVC on Windows x64. file:///C:/dir/a.stl names C:\dir\a.stl; a path whose root is not a drive, such as \\host\share, is refused before any lookup, and a file is judged by its long name, never by an 8.3 short name.
  • Asset URIs that contain a NUL character are refused, before any file is opened.
  • An asset's extension is read from a path that still exists; MSVC builds refused every asset.

0.1.1 (2026-11-03)

  • package:// files that are symlinks, as colcon build --symlink-install installs them, are served. .. still cannot lead out of a package, and file:// roots stay strict.

0.1.0 (2026-11-02)

  • First release: a WebSocket server for the MITI protocol (miti.bridge.v1), with a scheduler per subscription, JPEG and point cloud transforms, link statistics, and package and file assets.

Package Dependencies

No dependencies on ROS packages.

System Dependencies

Dependant Packages

Name Deps
miti_bridge

Launch files

No launch files found

Messages

No message files found.

Services

No service files found

Plugins

No plugins found.

Recent questions tagged libmiti at Robotics Stack Exchange