|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |
Launch files
Messages
Services
Plugins
Recent questions tagged libmiti at Robotics Stack Exchange
|
libmiti package from miti_sdk repolibmiti miti_bridge |
ROS Distro
|
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
Additional Links
Maintainers
- MITI Contributors
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
ServerOptionsrun on that thread and must not block it. Hand longer work to another thread, and answer through theServiceResponderor the parameterreplythe 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 noTCP_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 fromAssetOptions::packages[name], andfile:///...from insideAssetOptions::roots. -
..cannot lead out of a package or a root. - Inside a package, symlinks are followed:
colcon build --symlink-installinstalls 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.stlnamesC:\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 asMODEL~1.STLformodel.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 for package libmiti
0.1.2 (2026-11-04)
- Builds with MSVC on Windows x64.
file:///C:/dir/a.stlnamesC:\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, ascolcon build --symlink-installinstalls them, are served...still cannot lead out of a package, andfile://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
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| miti_bridge |