Middleware for Robotic Applications (MIRA) is a cross-platform, open-source software framework written in C++ that provides a middleware, several base functionalities and numerous tools for developing and testing distributed software modules. It also focuses on easy creation of complex, dynamic applications, while reusing these modules as plugins. The main purpose of MIRA is the development of robotic applications, but as it is designed to allow type safe data exchange between software modules using intra- and interprocess communication it is not limited to these kinds of applications.[1]
the used communication technique based on "channels" always allows non-blocking access to the transferred data [2]
for the user the communication is fully transparent no matter if the software modules are located within the same process, different processes or on different machines, the underlying transport layer will choose the fasted method for data transportation automatically[2]
MIRA is fully decentralized, hence there is no central server or central communication hub, making its communication more robust and allows its usage in multi-robot applications
Screenshot of MIRACenter
Robotic Application specific:
easy configuration of software modules via configuration files
parameters of algorithms can be modified live at runtime to speed up the debugging and development process
huge amounts of robot sensor data can be recorded in Tapes for later playback, here different codecs can be used to compress the data
Platforms
MIRA supports and was successfully tested on the following platforms:
CompanionAble - Integrated Cognitive Assistive & Domotic Companion Robotic System for Ability & Security[9]
Robot-Era - Implementation and integration of advanced robotic systems and intelligent environments in real scenarios for the ageing population[10]
Usability
Reflection/Serialization
classData{intvalue;std::map<std::string,std::list<int>>complex;Foo*ptr;template<typenameReflector>voidreflect(Reflector&r){r.member("Value",value,"an int member");r.member("Complex",complex,"a complex member");r.member("Pointer",ptr,"a pointer pointer");}};
arbitrary complex data types can be serialized by adding a simple reflect method to the class as shown above
after these minor changes, the objects of the class can be transported via inter-process communication, can be used as parameters in configuration files for software modules, can be recorded in "Tape" files, etc.
arbitrary methods can be turned into RPC methods by adding one line of code within the reflect() method. There is no need to write wrappers around the methods or to use meta description languages.