| branch | HEAD v2 |
pkg_ws_2 (ROS/ROS2 packages) |
|---|---|---|
| CI status |
|
|
| package |
|
- Links
- Introduction
- Minimal example
- Visitors
- Supported types
- Dependencies and compilation
- Related software
- Documentation (Doxygen): https://asherikov.github.io/ariles/2/
- GitHub: https://github.com/asherikov/ariles
- Legacy 1.x.x version: https://github.com/asherikov/ariles/tree/head_1 (migration guide https://asherikov.github.io/ariles/2/md_doc_migration_1to2.html)
Loosely speaking, ariles is a C++ reflection library, i.e., it provides
meta-programming APIs for implementation of class visitors (processors). It
also provides a number of (de)serializers based on these APIs, e.g., YAML,
JSON, XML, ROS parameter server, ROS2 parameters; and serialization
wrappers for some types, e.g., STL containers, smart pointers, Eigen
matrices, etc.
-
Parsing and generation of configuration files. Unlike some common serialization libraries, e.g.,
boost::serialization,arilestries to be flexible while parsing by:- silently ignoring unused entries (if possible),
- ignoring ordering of entries (if possible),
- not discriminating attributes from childs in
XML, - optionally ignoring missing entries.
-
Conversion between different formats, for example,
YAML<->ROSparameter server. Note that the conversion is not data-agnostic, i.e., the complete data structure must be represented in C++ code. -
Flattening of a class hierarchy to a list of name-value pairs (string-double), which is useful for collection of time-series data.
-
Exporting of numerical data to an
Octavescript for debugging purposes. -
Implemetation of parsers for specific data formats, e.g.,
URDF.
Class [./tests/api_v2/types/minimal.h]:
class Configurable : public ariles2::DefaultBase
{
#define ARILES2_DEFAULT_ID "ConfigurableEntryName" // optional, defaults to 'ariles'
#define ARILES2_ENTRIES(v) \
ARILES2_TYPED_ENTRY(v, integer_member, int)
#include ARILES2_INITIALIZE
};
Serialization:
Configurable configurable;
configurable.integer_member = 10;
ariles2::apply<ariles2::yaml_cpp::Writer>("config.yaml", configurable);
ariles2::apply<ariles2::yaml_cpp::Writer>(std::cout, configurable);
Result:
ConfigurableEntryName:
integer_member: 10
Deserialization:
ariles2::apply<ariles2::yaml_cpp::Reader>("config.yaml", configurable);
Conversion:
// read class from a file
ariles2::apply<ariles2::yaml_cpp::Reader>("config.yaml", configurable);
// dump class to ROS parameter server
ariles2::apply<ariles2::rosparam::Writer>(nh, configurable, "/some_namespace/");
Note that ROS/ROS2 compatible packages are available in a separate branch https://github.com/asherikov/ariles/tree/pkg_ws_2.
See demo for more exaples: https://asherikov.github.io/ariles/2/DEMO.html
[./tests/api_v2/demo_api_v2.cpp]
ariles includes a number of optional visitors that support various data
representation formats, in particular:
-
YAMLviayaml-cpp: https://asherikov.github.io/ariles/2/group__yaml__cpp.html. -
msgpackviamsgpack-c: https://asherikov.github.io/ariles/2/group__msgpack.html. -
JSONviaRapidJSON, with optional Jsonnet preprocessing: https://asherikov.github.io/ariles/2/group__rapidjson.html and https://asherikov.github.io/ariles/2/group__jsonnet.html. -
XMLviaPugiXML: https://asherikov.github.io/ariles/2/group__pugixml.html -
Octavescript, output only, no dependencies: https://asherikov.github.io/ariles/2/group__octave.html -
ROSparameter server, via standardROSlibs: https://asherikov.github.io/ariles/2/group__rosparam.html -
A set of flattened key-value pairs, output only, no dependencies: https://asherikov.github.io/ariles/2/group__namevalue2.html
-
graphvizdot files for diagram generation: https://asherikov.github.io/ariles/2/group__graphviz.html -
ROS2parameters, via standardrclcpplib: https://asherikov.github.io/ariles/2/group__ros2param.htmlROS2parameters is not designed to fully reflect yaml structure as explained here ros2/rcl#463, so whilearilescan dump and read anything, there are certain workarounds in place that are described in more details in theROS2demo [./tests/api_v2/demo_api_v2_ros2.cpp] https://asherikov.github.io/ariles/2/DEMO_ROS2.html.
There are also a few utility visitors, e.g.,
comparefor class comparison;copytofor copying data to non-arilesclasses;copyfromfor copying data from non-arilesclasses.
The complete list of modules is available at https://asherikov.github.io/ariles/2/modules.html
ariles provides serialization wrappers for the follwing types:
- Fundametal types: integers, floats, booleans.
- Some STL classes (WIP):
std::string,std::vector,std::map,std::pair,std::shared_ptr,std::unique_ptr. Eigentypes: matrices, transforms, quaternions.Boostclasses:boost::optional,boost::movelib::unique_ptr.boost::shared_ptr.- Better enums -> https://github.com/aantron/better-enums.
cmake>= 3.13C++17compatible compilerboost
Visitors and corresponding dependencies can be enabled or disabled via cmake options, the same applies to data types which depend on external libraries.
ROS1/ROS2 compatible packages are provided in pkg_ws_2 branch of the main
repository -> https://github.com/asherikov/ariles/tree/pkg_ws_2.
-
https://github.com/PickNikRobotics/rosparam_shortcuts: a set of wrapper functions to read individual parameters from ROS parameter server. This tool serves pretty much the same purpose as
ariles2::rosparam::Reader, but its functionality is more limited. -
https://billyquith.github.io/ponder/: C++14 reflection library, supports serialization to XML and JSON. Unlike
arilesit is more focused on reflection per se rather than applications, for example, it allows to set value by string name of a class member, handles class methods, etc.Ponderdoes not rely as much on preprocessor macro, but is more verbose. -
https://github.com/bytemaster/boost_reflect: discontinued C++ reflection library, similar to
ponder. Partially inspiredariles2.x.x API. -
https://github.com/apolukhin/magic_get (aka
pfr): C++14 library providing tuple like methods for aggregate initializable structures. Addresses a somewhat different but related problem. -
Serialization libraries, e.g.,
boost::serialization, https://github.com/USCiLab/cereal. -
A library with similar functionality in C++17 https://github.com/injae/serdepp.
ariles2::namevalueariles2::Any