Compare commits

...
Author SHA1 Message Date
Pablo Garrido 5c248aea28 Initial PoC
Signed-off-by: Pablo Garrido <pablogs9@gmail.com>
2022-05-30 12:10:19 +02:00
Pablo Garrido 4a750220d2 3.0.2 2022-05-25 09:09:39 +02:00
Pablo Garrido b5a0d0b6ee Update changelog 2022-05-25 09:09:27 +02:00
Antonio Cuadros 114a043ee2 Revert test humble release (#142) 2022-05-24 11:11:32 +02:00
Antonio CuadrosandPablo Garrido b0ebf5ab3f Humble release (#135)
* Modify CI

* Update

Signed-off-by: Pablo Garrido <pablogs9@gmail.com>

* Update

Signed-off-by: Pablo Garrido <pablogs9@gmail.com>

* Update .github/workflows/ci.yml

* Update .github/workflows/ci.yml

* Modify CI

* Update to ubuntu latest

* Use pre-release repository

* Use ubuntu-20.04

* Fix

* Revert changes

Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
2022-05-20 12:35:11 +02:00
mergify[bot]andAntonio Cuadros d91c98ab6e Add snap issue to README (#131) (#132)
(cherry picked from commit 0d4fcf8547)

Co-authored-by: Antonio Cuadros <49162117+Acuadros95@users.noreply.github.com>
2022-04-19 14:57:19 +02:00
Pablo Garrido 9ed4bb3c15 3.0.1 2022-03-25 11:15:37 +01:00
Pablo Garrido 489dbddced Update changelog
Signed-off-by: Pablo Garrido <pablogs9@gmail.com>
2022-03-25 11:15:30 +01:00
mergify[bot]andPablo Garrido ed0402c2dd Add services to graph manager (#127) (#129)
Signed-off-by: Pablo Garrido <pablogs9@gmail.com>
(cherry picked from commit 6d67807737)

Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
2022-03-22 10:26:24 +01:00
mergify[bot]andPablo Garrido 5780038fcc Add used missing includes (#116) (#124)
* Signed-off-by: Pablo Garrido <pablogs9@gmail.com>

* Update CI

Signed-off-by: Pablo Garrido <pablogs9@gmail.com>
(cherry picked from commit 2326a201bc)

Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
2022-03-17 08:47:50 +01:00
mergify[bot]andAntonio Cuadros 57bdfc5463 Add system logger flag (#118) (#119)
* Add system logger flag

* Add flag to superbuild

(cherry picked from commit 90545b7184)

Co-authored-by: Antonio Cuadros <49162117+Acuadros95@users.noreply.github.com>
2022-01-27 15:35:26 +01:00
mergify[bot]andPablo Garrido 1f1b5842c6 Add condition variable include (#113) (#114)
Signed-off-by: Pablo Garrido <pablogs9@gmail.com>

Update

Signed-off-by: Pablo Garrido <pablogs9@gmail.com>
(cherry picked from commit 07c460a327)

Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
2022-01-14 08:21:30 +01:00
mergify[bot]andRoland Schwan 6d2d47490a pass system name to xrceagent (#110) (#112)
(cherry picked from commit 8aea206b93)

Co-authored-by: Roland Schwan <RSchwan@users.noreply.github.com>
2022-01-12 12:43:38 +01:00
mergify[bot]andPablo Garrido 61b1e6fc8c Fix memory leak in FastDDS datawriter (#107) (#109)
Signed-off-by: Pablo Garrido <pablogs9@gmail.com>
(cherry picked from commit ff2ae91877)

Co-authored-by: Pablo Garrido <pablogs9@gmail.com>
2021-12-22 10:23:17 +01:00
Your Name d7dab5c671 3.0.0 2021-09-13 12:17:47 +02:00
Pablo Garrido e85eccb7c0 Changelog 2021-09-13 12:14:35 +02:00
Your Name ac9f09b656 1.0.1 2021-09-13 11:45:28 +02:00
Pablo Garrido 7ffd5f0bb6 Changelog 2021-09-13 11:45:14 +02:00
Pablo Garrido ceb1a1436c Remove XRCE dependency and add superbuild (#97)
Update package info


Update


Fix xrceagent paths

Update


Revert "Bump version"

This reverts commit 7b6b713041405a21d701952ef1eb2e8faab2802e.

Initial
2021-09-13 10:39:52 +02:00
mergify[bot]andmecarill c98705319f Fixed launch file by using a list for arguments. Ensures order of items is kept. (#93) (#94)
Co-authored-by: mecarill <mihkailkennerley@gmail.com>
(cherry picked from commit fe1b3ade97)

Co-authored-by: mecarill <62688286+mecarill@users.noreply.github.com>
2021-08-25 09:14:01 +02:00
Antonio Cuadros d149bb7018 Modify argument type (#91) 2021-08-23 13:52:17 +02:00
Pablo Garrido 646ca52aab Fix graph manager datawriters behaviour (#84)
* Fix graph manager datawriters


Fixes


Fix


Fix destruction

* Revert "Fix graph manager datawriters"

This reverts commit 2847a2ebc3.

* Initial
2021-07-09 13:36:31 +02:00
Pablo Garrido 95fecd77ae Graph manager: Fix participant mask for listener callbacks (#81) 2021-07-08 15:21:01 +02:00
Pablo GarridoandYour Name 69f17c28a8 Fix agent launch (#78)
Co-authored-by: Your Name <you@example.com>
2021-07-05 10:49:11 +02:00
Pablo Garrido f6a2aa3b60 Fix graph manager node namespaces (#75)
* Fix graph manager node namespaces

* Update
2021-07-02 13:28:22 +02:00
Pablo Garrido a623308505 Fix graph manager node namespaces (#72) 2021-07-02 09:44:20 +02:00
Pablo Garrido e133754746 Fix Rolling agent (#61)
* Initial

* Remove deprecated FastDDS entities methods


Remove headers

* Add conversion functions
2021-06-21 16:15:47 +02:00
13 changed files with 515 additions and 220 deletions
+24 -25
View File
@@ -3,36 +3,35 @@ name: CI micro-ROS Agent
on: on:
pull_request: pull_request:
branches: branches:
- '**' - 'humble'
schedule:
- cron: '33 6 * * *'
jobs: jobs:
microros_agent_ci: microros_agent_ci:
runs-on: ubuntu-20.04 runs-on: ubuntu-latest
container: microros/base:foxy strategy:
fail-fast: false
matrix:
os: [ ubuntu-20.04 ]
ros_distribution: [ humble ]
include:
- docker_image: ubuntu:jammy
ros_distribution: humble
container:
image: ubuntu:jammy
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: ros-tooling/setup-ros@0.3.2
with: with:
path: urosagent use-ros2-testing: false
required-ros-distributions: ${{ matrix.ros_distribution }}
- name: Download dependencies - name : Download and install dependencies
run: | run: |
apt update apt-get install ros-${{ matrix.ros_distribution }}-micro-ros-msgs
cd /uros_ws apt-get install ros-${{ matrix.ros_distribution }}-rmw-fastrtps-cpp
. /opt/ros/$ROS_DISTRO/setup.sh - uses : ros-tooling/action-ros-ci@0.2.5
. install/local_setup.sh with:
rosdep update package-name: "micro_ros_agent"
ros2 run micro_ros_setup create_agent_ws.sh target-ros2-distro: ${{ matrix.ros_distribution }}
- name: Patch branch
run: |
rm -rf /uros_ws/src/uros/micro-ROS-Agent/*
cp -R urosagent/* /uros_ws/src/uros/micro-ROS-Agent/
- name: Build
run: |
cd /uros_ws
. /opt/ros/$ROS_DISTRO/setup.sh
. install/local_setup.sh
ros2 run micro_ros_setup build_agent.sh
+1
View File
@@ -55,3 +55,4 @@ see the file [3rd-party-licenses.txt](3rd-party-licenses.txt).
Please notice the following issues/limitations: Please notice the following issues/limitations:
* There is an unknown issue when dealing with serial ports shared with the micro-ROS agent running inside a Docker. Sometimes it works with a remarkable packet loss. * There is an unknown issue when dealing with serial ports shared with the micro-ROS agent running inside a Docker. Sometimes it works with a remarkable packet loss.
* There is an known issues with serial port communication on micro-ros-agent snap version. It is recommended to use the dockerized version or build it from source.
+31
View File
@@ -2,6 +2,37 @@
Changelog for package micro-ros_agent Changelog for package micro-ros_agent
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3.0.2 (2022-05-25)
------------------
3.0.1 (2022-03-25)
------------------
* Add services to graph manager (`#127 <https://github.com/micro-ROS/micro-ROS-Agent/issues/127>`_) (`#129 <https://github.com/micro-ROS/micro-ROS-Agent/issues/129>`_)
* Add used missing includes (`#116 <https://github.com/micro-ROS/micro-ROS-Agent/issues/116>`_) (`#124 <https://github.com/micro-ROS/micro-ROS-Agent/issues/124>`_)
* Add system logger flag (`#118 <https://github.com/micro-ROS/micro-ROS-Agent/issues/118>`_) (`#119 <https://github.com/micro-ROS/micro-ROS-Agent/issues/119>`_)
* Add condition variable include (`#113 <https://github.com/micro-ROS/micro-ROS-Agent/issues/113>`_) (`#114 <https://github.com/micro-ROS/micro-ROS-Agent/issues/114>`_)
* pass system name to xrceagent (`#110 <https://github.com/micro-ROS/micro-ROS-Agent/issues/110>`_) (`#112 <https://github.com/micro-ROS/micro-ROS-Agent/issues/112>`_)
* Fix memory leak in FastDDS datawriter (`#107 <https://github.com/micro-ROS/micro-ROS-Agent/issues/107>`_) (`#109 <https://github.com/micro-ROS/micro-ROS-Agent/issues/109>`_)
3.0.0 (2021-09-13)
------------------
1.0.1 (2021-09-13)
------------------
* Remove XRCE dependency and add superbuild (`#97 <https://github.com/micro-ROS/micro-ROS-Agent/issues/97>`_)
* Fixed launch file by using a list for arguments. Ensures order of items is kept. (`#93 <https://github.com/micro-ROS/micro-ROS-Agent/issues/93>`_) (`#94 <https://github.com/micro-ROS/micro-ROS-Agent/issues/94>`_)
* Modify argument type (`#91 <https://github.com/micro-ROS/micro-ROS-Agent/issues/91>`_)
* Fix graph manager datawriters behaviour (`#84 <https://github.com/micro-ROS/micro-ROS-Agent/issues/84>`_)
* Graph manager: Fix participant mask for listener callbacks (`#81 <https://github.com/micro-ROS/micro-ROS-Agent/issues/81>`_)
* Fix agent launch (`#78 <https://github.com/micro-ROS/micro-ROS-Agent/issues/78>`_)
* Fix graph manager node namespaces (`#75 <https://github.com/micro-ROS/micro-ROS-Agent/issues/75>`_)
* Fix Rolling agent (`#61 <https://github.com/micro-ROS/micro-ROS-Agent/issues/61>`_)
* Add multi domain graph manager (`#69 <https://github.com/micro-ROS/micro-ROS-Agent/issues/69>`_)
* Add ros2 launch capabilities and example launch file (`#47 <https://github.com/micro-ROS/micro-ROS-Agent/issues/47>`_)
* Snap build for the micro-ROS-Agent (`#43 <https://github.com/micro-ROS/micro-ROS-Agent/issues/43>`_)
* Create graph manager after checking passed CLI arguments and launch xrce-dds server (`#41 <https://github.com/micro-ROS/micro-ROS-Agent/issues/41>`_)
* Contributors: Antonio Cuadros, Jose Antonio Moral, Pablo Garrido, mergify[bot]
0.0.1 (2019-04-24) 0.0.1 (2019-04-24)
----------------- -----------------
* Initial release * Initial release
+9
View File
@@ -19,7 +19,16 @@ option(UROSAGENT_GENERATE_PROFILE
) )
set(CMAKE_C_CLANG_TIDY clang-tidy -checks=*) set(CMAKE_C_CLANG_TIDY clang-tidy -checks=*)
option(MICROROSAGENT_SUPERBUILD "Enable superbuild compilation." ON)
option(UAGENT_USE_SYSTEM_LOGGER "Force use of system installed spdlog logger on superbuild." OFF)
if(NOT MICROROSAGENT_SUPERBUILD)
project(micro_ros_agent LANGUAGES CXX) project(micro_ros_agent LANGUAGES CXX)
else()
project(uagent_superbuild NONE)
include(${PROJECT_SOURCE_DIR}/cmake/SuperBuild.cmake)
return()
endif()
find_package(ament_cmake REQUIRED) find_package(ament_cmake REQUIRED)
find_package(microxrcedds_agent REQUIRED) find_package(microxrcedds_agent REQUIRED)
+68
View File
@@ -0,0 +1,68 @@
# Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima).
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
include(ExternalProject)
unset(_deps)
enable_language(C)
enable_language(CXX)
unset(xrceagent_DIR CACHE)
find_package(xrceagent 2 EXACT QUIET)
if(NOT xrceagent_FOUND)
ExternalProject_Add(xrceagent
GIT_REPOSITORY
https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
GIT_TAG
ros2
PREFIX
${PROJECT_BINARY_DIR}/agent
INSTALL_DIR
${CMAKE_INSTALL_PREFIX}
CMAKE_CACHE_ARGS
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
-DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_EXE_LINKER_FLAGS}
-DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_SHARED_LINKER_FLAGS}
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
-DCMAKE_SYSTEM_NAME:STRING=${CMAKE_SYSTEM_NAME}
-DUAGENT_USE_SYSTEM_FASTDDS:BOOL=ON
-DUAGENT_USE_SYSTEM_FASTCDR:BOOL=ON
-DUAGENT_USE_SYSTEM_LOGGER:BOOL=${UAGENT_USE_SYSTEM_LOGGER}
-DUAGENT_CED_PROFILE:BOOL=OFF
-DUAGENT_P2P_PROFILE:BOOL=OFF
-DUAGENT_BUILD_EXECUTABLE:BOOL=OFF
-DUAGENT_ISOLATED_INSTALL:BOOL=OFF
)
endif()
# Main project.
ExternalProject_Add(micro_ros_agent
SOURCE_DIR
${PROJECT_SOURCE_DIR}
BINARY_DIR
${CMAKE_CURRENT_BINARY_DIR}
CMAKE_CACHE_ARGS
-DMICROROSAGENT_SUPERBUILD:BOOL=OFF
INSTALL_COMMAND
""
DEPENDS
xrceagent
)
+5
View File
@@ -20,6 +20,10 @@
#include <uxr/agent/middleware/utils/Callbacks.hpp> #include <uxr/agent/middleware/utils/Callbacks.hpp>
#include <agent/graph_manager/graph_manager.hpp> #include <agent/graph_manager/graph_manager.hpp>
#include <map>
#include <memory>
// TODO(jamoralp): class Documentation // TODO(jamoralp): class Documentation
namespace uros { namespace uros {
namespace agent { namespace agent {
@@ -42,6 +46,7 @@ private:
eprosima::uxr::AgentInstance& xrce_dds_agent_instance_; eprosima::uxr::AgentInstance& xrce_dds_agent_instance_;
std::map<eprosima::fastdds::dds::DomainId_t, std::shared_ptr<graph_manager::GraphManager>> graph_manager_map_; std::map<eprosima::fastdds::dds::DomainId_t, std::shared_ptr<graph_manager::GraphManager>> graph_manager_map_;
std::string namespace_remapping = "";
std::shared_ptr<graph_manager::GraphManager> find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id); std::shared_ptr<graph_manager::GraphManager> find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id);
}; };
@@ -12,6 +12,9 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
#ifndef _UROS_AGENT_GRAPH_MANAGER_HPP
#define _UROS_AGENT_GRAPH_MANAGER_HPP
#include "fastrtps/Domain.h" #include "fastrtps/Domain.h"
#include <fastrtps/TopicDataType.h> #include <fastrtps/TopicDataType.h>
#include "fastrtps/attributes/ParticipantAttributes.h" #include "fastrtps/attributes/ParticipantAttributes.h"
@@ -58,8 +61,10 @@
#include <agent/graph_manager/graph_typesupport.hpp> #include <agent/graph_manager/graph_typesupport.hpp>
#include <agent/utils/demangle.hpp> #include <agent/utils/demangle.hpp>
#ifndef _UROS_AGENT_GRAPH_MANAGER_HPP #include <condition_variable>
#define _UROS_AGENT_GRAPH_MANAGER_HPP #include <string>
#include <memory>
#include <map>
namespace uros { namespace uros {
namespace agent { namespace agent {
@@ -75,7 +80,7 @@ public:
/** /**
* @brief Default constructor. * @brief Default constructor.
*/ */
GraphManager(eprosima::fastdds::dds::DomainId_t domain_id); GraphManager(eprosima::fastdds::dds::DomainId_t domain_id, std::string namespace_remapping);
/** /**
* @brief Default destructor. * @brief Default destructor.
@@ -89,28 +94,22 @@ public:
/** /**
* @brief Adds a DDS participant to the graph tree. * @brief Adds a DDS participant to the graph tree.
* @param participant Pointer to the participant to be added to the graph. * @param participant eprosima::fastdds::dds::DomainParticipant to be added.
*/ * @param from_microros if this participant has been added from micro-ROS.
void add_participant(
const eprosima::fastdds::dds::DomainParticipant* participant);
/**
* @brief Adds a DDS participant to the graph tree.
* @param guid rtps::GUID_t of the participant to be added.
* @param node_name Name of the ROS 2 node associated to the given participant.
* @param enclave ROS 2 enclave. * @param enclave ROS 2 enclave.
*/ */
void add_participant( void add_participant(
const eprosima::fastrtps::rtps::GUID_t& guid, const eprosima::fastdds::dds::DomainParticipant* participant,
const std::string& node_name, bool from_microros = true,
const std::string& enclave); const std::string& enclave = "/");
/** /**
* @brief Removes a DDS participant from the graph tree. * @brief Removes a DDS participant from the graph tree.
* @param guid rtps::GUID_t of the participant to be removed. * @param participant eprosima::fastdds::dds::DomainParticipant to be removed.
*/ */
void remove_participant( void remove_participant(
const eprosima::fastrtps::rtps::GUID_t& guid); const eprosima::fastdds::dds::DomainParticipant* participant,
bool from_microros = true);
/** /**
* @brief Adds a DDS datawriter to the graph tree. * @brief Adds a DDS datawriter to the graph tree.
@@ -138,21 +137,6 @@ public:
const eprosima::fastrtps::rtps::GUID_t& participant_guid, const eprosima::fastrtps::rtps::GUID_t& participant_guid,
const eprosima::fastdds::dds::DataWriterQos& writer_qos); const eprosima::fastdds::dds::DataWriterQos& writer_qos);
/**
* @brief Adds a DDS datawriter to the graph tree.
* @param datawriter_guid rtps::GUID_t of the datawriter to be added.
* @param topic_name Name of the topic to which the datawriter sends information to.
* @param type_name Type name of the sent topic.
* @param participant_guid rtps::GUID_t of the participant which owns this datawriter.
* @param writer_qos QOS of the datawriter to be included into the graph tree.
*/
void add_datawriter(
const eprosima::fastrtps::rtps::GUID_t& datawriter_guid,
const std::string& topic_name,
const std::string& type_name,
const eprosima::fastrtps::rtps::GUID_t& participant_guid,
const eprosima::fastdds::dds::WriterQos& writer_qos);
/** /**
* @brief Removes a DDS datawriter from the graph tree. * @brief Removes a DDS datawriter from the graph tree.
* @param datawriter_guid rtps::GUID_t of the datawriter to be removed. * @param datawriter_guid rtps::GUID_t of the datawriter to be removed.
@@ -186,21 +170,6 @@ public:
const eprosima::fastrtps::rtps::GUID_t& participant_guid, const eprosima::fastrtps::rtps::GUID_t& participant_guid,
const eprosima::fastdds::dds::DataReaderQos& reader_qos); const eprosima::fastdds::dds::DataReaderQos& reader_qos);
/**
* @brief Adds a DDS datareader to the graph tree.
* @param datareader_guid rtps::GUID_t of the datareader to be added.
* @param topic_name Name of the topic to which the datareader sends information to.
* @param type_name Type name of the sent topic.
* @param participant_guid rtps::GUID_t of the participant which owns this datareader.
* @param writer_qos QOS of the datareader to be included into the graph tree.
*/
void add_datareader(
const eprosima::fastrtps::rtps::GUID_t& datareader_guid,
const std::string& topic_name,
const std::string& type_name,
const eprosima::fastrtps::rtps::GUID_t& participant_guid,
const eprosima::fastdds::dds::ReaderQos& reader_qos);
/** /**
* @brief Removes a DDS datareader from the graph tree. * @brief Removes a DDS datareader from the graph tree.
* @param datareader_guid rtps::GUID_t of the datareader to be removed. * @param datareader_guid rtps::GUID_t of the datareader to be removed.
@@ -292,14 +261,28 @@ private:
*/ */
void update_node_entities_info(); void update_node_entities_info();
/**
* @brief Retrieves node name and namespace from
* participant.
* @param participant_name DDS participant name.
* @param node_name ROS2 Node name.
* @param namespace ROS2 Node namespace.
*/
void get_name_and_namespace(
std::string participant_name,
std::string& node_name,
std::string& node_namespace);
eprosima::fastdds::dds::DomainId_t domain_id_; eprosima::fastdds::dds::DomainId_t domain_id_;
std::string namespace_remapping_;
bool graph_changed_; bool graph_changed_;
bool display_on_change_; bool display_on_change_;
const char * enclave_;
std::thread microros_graph_publisher_; std::thread microros_graph_publisher_;
std::mutex mtx_; std::mutex mtx_;
std::condition_variable cv_; std::condition_variable cv_;
eprosima::fastdds::dds::DataWriterQos datawriter_qos_;
rmw_dds_common::GraphCache graphCache_; rmw_dds_common::GraphCache graphCache_;
std::unique_ptr<ParticipantListener> participant_listener_; std::unique_ptr<ParticipantListener> participant_listener_;
std::unique_ptr<DatareaderListener> datareader_listener_; std::unique_ptr<DatareaderListener> datareader_listener_;
@@ -311,9 +294,14 @@ private:
std::unique_ptr<eprosima::fastdds::dds::Subscriber> subscriber_; std::unique_ptr<eprosima::fastdds::dds::Subscriber> subscriber_;
std::unique_ptr<eprosima::fastdds::dds::Topic> ros_discovery_topic_; std::unique_ptr<eprosima::fastdds::dds::Topic> ros_discovery_topic_;
std::unique_ptr<eprosima::fastdds::dds::Topic> ros_to_microros_graph_topic_; std::unique_ptr<eprosima::fastdds::dds::Topic> ros_to_microros_graph_topic_;
std::unique_ptr<eprosima::fastdds::dds::DataWriter> ros_discovery_datawriter_;
std::unique_ptr<eprosima::fastdds::dds::DataWriter> ros_to_microros_graph_datawriter_; std::unique_ptr<eprosima::fastdds::dds::DataWriter> ros_to_microros_graph_datawriter_;
std::unique_ptr<eprosima::fastdds::dds::DataReader> ros_discovery_datareader_; std::unique_ptr<eprosima::fastdds::dds::DataReader> ros_discovery_datareader_;
// Store a auxiliary publishers and datawriter for each participant created in micro-ROS
std::map<
const eprosima::fastdds::dds::DomainParticipant*,
std::unique_ptr<eprosima::fastdds::dds::DataWriter>
> micro_ros_graph_datawriters_;
}; };
} // namespace graph_manager } // namespace graph_manager
@@ -7,6 +7,6 @@ def generate_launch_description():
package='micro_ros_agent', package='micro_ros_agent',
executable='micro_ros_agent', executable='micro_ros_agent',
name='micro_ros_agent', name='micro_ros_agent',
arguments={'udp4 --port 8888 -v6'} arguments=["udp4", "-p", "8888", "-v6"]
) )
]) ])
+4 -4
View File
@@ -2,9 +2,10 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"> <package format="3">
<name>micro_ros_agent</name> <name>micro_ros_agent</name>
<version>0.0.1</version> <version>3.0.2</version>
<description>DDS-XCRE agent implementation </description> <description>micro-ROS Agent package</description>
<maintainer email="borjaouterelo@eprosima.com">Borja Outerelo</maintainer> <maintainer email="pablogarrido@eprosima.com">Pablo Garrido</maintainer>
<maintainer email="antoniocuadros@eprosima.com">Antonio Cuadros</maintainer>
<license>Apache License 2.0</license> <license>Apache License 2.0</license>
<buildtool_depend>ament_cmake</buildtool_depend> <buildtool_depend>ament_cmake</buildtool_depend>
@@ -14,7 +15,6 @@
<test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend> <test_depend>ament_lint_common</test_depend>
<depend>microxrcedds_agent</depend>
<depend>rmw</depend> <depend>rmw</depend>
<depend>rcutils</depend> <depend>rcutils</depend>
<depend>rmw_fastrtps_shared_cpp</depend> <depend>rmw_fastrtps_shared_cpp</depend>
+148 -51
View File
@@ -17,6 +17,9 @@
#include <agent/Agent.hpp> #include <agent/Agent.hpp>
#include <utility>
#include <memory>
namespace uros { namespace uros {
namespace agent { namespace agent {
@@ -30,6 +33,17 @@ bool Agent::create(
char** argv) char** argv)
{ {
bool result = xrce_dds_agent_instance_.create(argc, argv); bool result = xrce_dds_agent_instance_.create(argc, argv);
// Find namespace remapping
for (int i = 0; i < argc; i++)
{
if (strcmp(argv[i], "--namespace-remapping") == 0 && i + 1 < argc)
{
namespace_remapping = argv[i + 1];
std::cout << "Remapping all entities to namespace " << namespace_remapping << std::endl;
}
}
if (result) if (result)
{ {
/** /**
@@ -40,12 +54,7 @@ bool Agent::create(
([&]( ([&](
const eprosima::fastdds::dds::DomainParticipant* participant) -> void const eprosima::fastdds::dds::DomainParticipant* participant) -> void
{ {
auto graph_manager_ = auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t(
participant->get_domain_id()
)
);
graph_manager_->add_participant(participant); graph_manager_->add_participant(participant);
}); });
xrce_dds_agent_instance_.add_middleware_callback( xrce_dds_agent_instance_.add_middleware_callback(
@@ -61,13 +70,8 @@ bool Agent::create(
([&]( ([&](
const eprosima::fastdds::dds::DomainParticipant* participant) -> void const eprosima::fastdds::dds::DomainParticipant* participant) -> void
{ {
auto graph_manager_ = auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t( graph_manager_->remove_participant(participant);
participant->get_domain_id()
)
);
graph_manager_->remove_participant(participant->guid());
}); });
xrce_dds_agent_instance_.add_middleware_callback( xrce_dds_agent_instance_.add_middleware_callback(
eprosima::uxr::Middleware::Kind::FASTDDS, eprosima::uxr::Middleware::Kind::FASTDDS,
@@ -84,20 +88,11 @@ bool Agent::create(
const eprosima::fastdds::dds::DomainParticipant* participant, const eprosima::fastdds::dds::DomainParticipant* participant,
const eprosima::fastdds::dds::DataWriter* datawriter) -> void const eprosima::fastdds::dds::DataWriter* datawriter) -> void
{ {
auto graph_manager_ = auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t(
participant->get_domain_id()
)
);
// TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed graph_manager_->add_datawriter(datawriter->guid(), participant, datawriter);
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
datawriter->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datawriter_guid =
iHandle2GUID(instance_handle);
graph_manager_->add_datawriter(datawriter_guid, participant, datawriter);
graph_manager_->associate_entity( graph_manager_->associate_entity(
datawriter_guid, participant, dds::xrce::OBJK_DATAWRITER); datawriter->guid(), participant, dds::xrce::OBJK_DATAWRITER);
}); });
xrce_dds_agent_instance_.add_middleware_callback( xrce_dds_agent_instance_.add_middleware_callback(
eprosima::uxr::Middleware::Kind::FASTDDS, eprosima::uxr::Middleware::Kind::FASTDDS,
@@ -115,18 +110,9 @@ bool Agent::create(
const eprosima::fastdds::dds::DataWriter* datawriter) -> void const eprosima::fastdds::dds::DataWriter* datawriter) -> void
{ {
auto graph_manager_ = auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t(
participant->get_domain_id()
)
);
// TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed graph_manager_->remove_datawriter(datawriter->guid());
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
datawriter->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datawriter_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle);
graph_manager_->remove_datawriter(datawriter_guid);
}); });
xrce_dds_agent_instance_.add_middleware_callback( xrce_dds_agent_instance_.add_middleware_callback(
@@ -144,11 +130,7 @@ bool Agent::create(
const eprosima::fastdds::dds::DomainParticipant* participant, const eprosima::fastdds::dds::DomainParticipant* participant,
const eprosima::fastdds::dds::DataReader* datareader) -> void const eprosima::fastdds::dds::DataReader* datareader) -> void
{ {
auto graph_manager_ = auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t(
participant->get_domain_id()
)
);
// TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed // TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle = const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
@@ -174,11 +156,7 @@ bool Agent::create(
const eprosima::fastdds::dds::DomainParticipant* participant, const eprosima::fastdds::dds::DomainParticipant* participant,
const eprosima::fastdds::dds::DataReader* datareader) -> void const eprosima::fastdds::dds::DataReader* datareader) -> void
{ {
auto graph_manager_ = auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t(
participant->get_domain_id()
)
);
// TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed // TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle = const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
@@ -192,6 +170,128 @@ bool Agent::create(
eprosima::uxr::Middleware::Kind::FASTDDS, eprosima::uxr::Middleware::Kind::FASTDDS,
eprosima::uxr::middleware::CallbackKind::DELETE_DATAREADER, eprosima::uxr::middleware::CallbackKind::DELETE_DATAREADER,
std::move(on_delete_datareader)); std::move(on_delete_datareader));
/**
* Add CREATE_REQUESTER callback.
*/
std::function<void (
const eprosima::fastdds::dds::DomainParticipant *,
const eprosima::fastdds::dds::DataWriter *,
const eprosima::fastdds::dds::DataReader *)> on_create_requester
([&](
const eprosima::fastdds::dds::DomainParticipant* participant,
const eprosima::fastdds::dds::DataWriter* datawriter,
const eprosima::fastdds::dds::DataReader * datareader) -> void
{
auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
graph_manager_->add_datawriter(datawriter->guid(), participant, datawriter);
graph_manager_->associate_entity(
datawriter->guid(), participant, dds::xrce::OBJK_DATAWRITER);
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle);
graph_manager_->add_datareader(datareader_guid, participant, datareader);
graph_manager_->associate_entity(
datareader_guid, participant, dds::xrce::OBJK_DATAREADER);
});
xrce_dds_agent_instance_.add_middleware_callback(
eprosima::uxr::Middleware::Kind::FASTDDS,
eprosima::uxr::middleware::CallbackKind::CREATE_REQUESTER,
std::move(on_create_requester));
/**
* Add DELETE_REQUESTER callback.
*/
std::function<void (
const eprosima::fastdds::dds::DomainParticipant *,
const eprosima::fastdds::dds::DataWriter *,
const eprosima::fastdds::dds::DataReader *)> on_delete_requester
([&](
const eprosima::fastdds::dds::DomainParticipant* participant,
const eprosima::fastdds::dds::DataWriter* datawriter,
const eprosima::fastdds::dds::DataReader * datareader) -> void
{
auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
graph_manager_->remove_datawriter(datawriter->guid());
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle);
graph_manager_->remove_datareader(datareader_guid);
});
xrce_dds_agent_instance_.add_middleware_callback(
eprosima::uxr::Middleware::Kind::FASTDDS,
eprosima::uxr::middleware::CallbackKind::DELETE_REQUESTER,
std::move(on_delete_requester));
/**
* Add CREATE_REPLIER callback.
*/
std::function<void (
const eprosima::fastdds::dds::DomainParticipant *,
const eprosima::fastdds::dds::DataWriter *,
const eprosima::fastdds::dds::DataReader *)> on_create_replier
([&](
const eprosima::fastdds::dds::DomainParticipant* participant,
const eprosima::fastdds::dds::DataWriter* datawriter,
const eprosima::fastdds::dds::DataReader * datareader) -> void
{
auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
graph_manager_->add_datawriter(datawriter->guid(), participant, datawriter);
graph_manager_->associate_entity(
datawriter->guid(), participant, dds::xrce::OBJK_DATAWRITER);
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle);
graph_manager_->add_datareader(datareader_guid, participant, datareader);
graph_manager_->associate_entity(
datareader_guid, participant, dds::xrce::OBJK_DATAREADER);
});
xrce_dds_agent_instance_.add_middleware_callback(
eprosima::uxr::Middleware::Kind::FASTDDS,
eprosima::uxr::middleware::CallbackKind::CREATE_REPLIER,
std::move(on_create_replier));
/**
* Add DELETE_REPLIER callback.
*/
std::function<void (
const eprosima::fastdds::dds::DomainParticipant *,
const eprosima::fastdds::dds::DataWriter *,
const eprosima::fastdds::dds::DataReader *)> on_delete_replier
([&](
const eprosima::fastdds::dds::DomainParticipant* participant,
const eprosima::fastdds::dds::DataWriter* datawriter,
const eprosima::fastdds::dds::DataReader * datareader) -> void
{
auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id());
graph_manager_->remove_datawriter(datawriter->guid());
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle);
graph_manager_->remove_datareader(datareader_guid);
});
xrce_dds_agent_instance_.add_middleware_callback(
eprosima::uxr::Middleware::Kind::FASTDDS,
eprosima::uxr::middleware::CallbackKind::DELETE_REPLIER,
std::move(on_delete_replier));
} }
return result; return result;
@@ -210,12 +310,9 @@ std::shared_ptr<graph_manager::GraphManager> Agent::find_or_create_graph_manager
return it->second; return it->second;
}else{ }else{
return graph_manager_map_.insert( return graph_manager_map_.insert(
std::pair< std::make_pair(
eprosima::fastdds::dds::DomainId_t,
std::shared_ptr<graph_manager::GraphManager>
>(
domain_id, domain_id,
std::make_shared<graph_manager::GraphManager>(domain_id) std::make_shared<graph_manager::GraphManager>(domain_id, namespace_remapping)
) )
).first->second; ).first->second;
} }
@@ -17,16 +17,20 @@
#include <agent/graph_manager/graph_manager.hpp> #include <agent/graph_manager/graph_manager.hpp>
#include <memory>
#include <string>
#include <utility>
#include <vector>
namespace uros { namespace uros {
namespace agent { namespace agent {
namespace graph_manager { namespace graph_manager {
GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id) GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id, std::string namespace_remapping)
// : eprosima::fastrtps::ParticipantListener()
: domain_id_(domain_id) : domain_id_(domain_id)
, namespace_remapping_(namespace_remapping)
, graph_changed_(false) , graph_changed_(false)
, display_on_change_(false) , display_on_change_(false)
, enclave_("/")
, mtx_() , mtx_()
, cv_() , cv_()
, graphCache_() , graphCache_()
@@ -37,23 +41,27 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id)
, microros_graph_info_typesupport_(std::make_unique< , microros_graph_info_typesupport_(std::make_unique<
eprosima::fastdds::dds::TypeSupport>(new graph_manager::MicrorosGraphInfoTypeSupport())) eprosima::fastdds::dds::TypeSupport>(new graph_manager::MicrorosGraphInfoTypeSupport()))
{ {
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_profiles();
// Create DomainParticipant // Create DomainParticipant
eprosima::fastdds::dds::DomainParticipantQos participant_qos = eprosima::fastdds::dds::DomainParticipantQos participant_qos =
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->get_default_participant_qos(); eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->get_default_participant_qos();
size_t length = snprintf(nullptr, 0, "enclave=%s;", enclave_) + 1; const char * enclave = "/";
size_t length = snprintf(nullptr, 0, "enclave=%s;", enclave) + 1;
participant_qos.user_data().resize(length); participant_qos.user_data().resize(length);
snprintf(reinterpret_cast<char *>(participant_qos.user_data().data_vec().data()), snprintf(reinterpret_cast<char *>(participant_qos.user_data().data_vec().data()),
length, "enclave=%s;", enclave_); length, "enclave=%s;", enclave);
participant_qos.name(enclave_); participant_qos.name(enclave);
participant_qos.wire_protocol().builtin.readerHistoryMemoryPolicy = participant_qos.wire_protocol().builtin.readerHistoryMemoryPolicy =
eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE; eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE;
participant_qos.wire_protocol().builtin.writerHistoryMemoryPolicy = participant_qos.wire_protocol().builtin.writerHistoryMemoryPolicy =
eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE; eprosima::fastrtps::rtps::PREALLOCATED_WITH_REALLOC_MEMORY_MODE;
eprosima::fastdds::dds::StatusMask par_mask = eprosima::fastdds::dds::StatusMask::none();
participant_.reset(eprosima::fastdds::dds::DomainParticipantFactory::get_instance()-> participant_.reset(eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->
create_participant(domain_id_, participant_qos, participant_listener_.get())); create_participant(domain_id_, participant_qos, participant_listener_.get(), par_mask));
// Register participant within typesupport // Register participant within typesupport
participant_->register_type(*participant_info_typesupport_); participant_->register_type(*participant_info_typesupport_);
@@ -77,28 +85,26 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id)
eprosima::fastdds::dds::TOPIC_QOS_DEFAULT)); eprosima::fastdds::dds::TOPIC_QOS_DEFAULT));
// Create datawriters // Create datawriters
eprosima::fastdds::dds::DataWriterQos datawriter_qos = datawriter_qos_ =
eprosima::fastdds::dds::DATAWRITER_QOS_DEFAULT; eprosima::fastdds::dds::DATAWRITER_QOS_DEFAULT;
datawriter_qos.history().kind = datawriter_qos_.history().kind =
eprosima::fastdds::dds::HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; eprosima::fastdds::dds::HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS;
datawriter_qos.history().depth = 1; datawriter_qos_.history().depth = 1;
datawriter_qos.endpoint().history_memory_policy = datawriter_qos_.endpoint().history_memory_policy =
eprosima::fastrtps::rtps::MemoryManagementPolicy::PREALLOCATED_WITH_REALLOC_MEMORY_MODE; eprosima::fastrtps::rtps::MemoryManagementPolicy::PREALLOCATED_WITH_REALLOC_MEMORY_MODE;
datawriter_qos.publish_mode().kind = datawriter_qos_.publish_mode().kind =
eprosima::fastdds::dds::PublishModeQosPolicyKind::ASYNCHRONOUS_PUBLISH_MODE; eprosima::fastdds::dds::PublishModeQosPolicyKind::ASYNCHRONOUS_PUBLISH_MODE;
datawriter_qos.reliability().kind = datawriter_qos_.reliability().kind =
eprosima::fastdds::dds::ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS; eprosima::fastdds::dds::ReliabilityQosPolicyKind::RELIABLE_RELIABILITY_QOS;
datawriter_qos.durability().kind = datawriter_qos_.durability().kind =
eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS; eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS;
ros_discovery_datawriter_.reset( eprosima::fastdds::dds::DataWriterQos ros_to_microros_datawriter_qos_ = datawriter_qos_;
publisher_->create_datawriter(ros_discovery_topic_.get(), datawriter_qos)); ros_to_microros_datawriter_qos_.history().kind =
eprosima::fastdds::dds::HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS;
datawriter_qos.history().kind =
eprosima::fastdds::dds::HistoryQosPolicyKind::KEEP_ALL_HISTORY_QOS;
ros_to_microros_graph_datawriter_.reset( ros_to_microros_graph_datawriter_.reset(
publisher_->create_datawriter(ros_to_microros_graph_topic_.get(), datawriter_qos)); publisher_->create_datawriter(ros_to_microros_graph_topic_.get(), ros_to_microros_datawriter_qos_));
// Create datareaders // Create datareaders
@@ -292,34 +298,57 @@ inline void GraphManager::publish_microros_graph()
} }
void GraphManager::add_participant( void GraphManager::add_participant(
const eprosima::fastdds::dds::DomainParticipant* participant) const eprosima::fastdds::dds::DomainParticipant* participant,
{ bool from_microros,
const eprosima::fastdds::dds::DomainParticipantQos qos = participant->get_qos();
this->add_participant(participant->guid(), qos.name().to_string(), enclave_);
}
void GraphManager::add_participant(
const eprosima::fastrtps::rtps::GUID_t& guid,
const std::string& node_name,
const std::string& enclave) const std::string& enclave)
{ {
const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", guid); const eprosima::fastdds::dds::DomainParticipantQos qos = participant->get_qos();
const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", participant->guid());
graphCache_.add_participant(gid, enclave); graphCache_.add_participant(gid, enclave);
if (node_name != enclave) // Do not add root node // Do not add root node and
// do not announce non-micro-ROS participants
if (qos.name().to_string() != "/" && from_microros)
{ {
std::string isolated_node_name, isolated_namespace;
get_name_and_namespace(qos.name().to_string(), isolated_node_name, isolated_namespace);
isolated_namespace = namespace_remapping_ + isolated_namespace;
rmw_dds_common::msg::ParticipantEntitiesInfo info = rmw_dds_common::msg::ParticipantEntitiesInfo info =
graphCache_.add_node(gid, node_name, enclave_); graphCache_.add_node(gid, isolated_node_name, isolated_namespace);
ros_discovery_datawriter_->write(static_cast<void *>(&info));
auto it = micro_ros_graph_datawriters_.find(participant);
if (it == micro_ros_graph_datawriters_.end())
{
// Create datawriter
std::unique_ptr<eprosima::fastdds::dds::DataWriter> datawriter;
datawriter.reset(publisher_->create_datawriter(ros_discovery_topic_.get(), datawriter_qos_));
it = micro_ros_graph_datawriters_.insert(
std::make_pair(participant, std::move(datawriter))).first;
}
it->second->write(static_cast<void *>(&info));
} }
} }
void GraphManager::remove_participant( void GraphManager::remove_participant(
const eprosima::fastrtps::rtps::GUID_t& guid) const eprosima::fastdds::dds::DomainParticipant* participant,
bool from_microros)
{ {
const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", guid); const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", participant->guid());
graphCache_.remove_participant(gid); graphCache_.remove_participant(gid);
if (from_microros)
{
rmw_dds_common::msg::ParticipantEntitiesInfo info;
rmw_dds_common::convert_gid_to_msg(&gid, &info.gid);
auto it = micro_ros_graph_datawriters_.find(participant);
it->second->write(static_cast<void *>(&info));
}
micro_ros_graph_datawriters_.erase(participant);
} }
void GraphManager::add_datawriter( void GraphManager::add_datawriter(
@@ -329,7 +358,10 @@ void GraphManager::add_datawriter(
{ {
const std::string& topic_name = datawriter->get_topic()->get_name(); const std::string& topic_name = datawriter->get_topic()->get_name();
const std::string& type_name = datawriter->get_topic()->get_type_name(); const std::string& type_name = datawriter->get_topic()->get_type_name();
this->add_datawriter(datawriter_guid, topic_name, type_name,
auto remapped_topic_name = namespace_remapping_ + "/" + topic_name;
this->add_datawriter(datawriter_guid, remapped_topic_name, type_name,
participant->guid(), datawriter->get_qos()); participant->guid(), datawriter->get_qos());
} }
@@ -346,25 +378,9 @@ void GraphManager::add_datawriter(
"rmw_fastrtps_cpp", participant_guid); "rmw_fastrtps_cpp", participant_guid);
const rmw_qos_profile_t qos_profile = fastdds_qos_to_rmw_qos(writer_qos); const rmw_qos_profile_t qos_profile = fastdds_qos_to_rmw_qos(writer_qos);
graphCache_.add_entity(datawriter_gid, topic_name, auto remapped_topic_name = namespace_remapping_ + "/" + topic_name;
type_name, participant_gid, qos_profile, false);
}
void GraphManager::add_datawriter( graphCache_.add_entity(datawriter_gid, remapped_topic_name,
const eprosima::fastrtps::rtps::GUID_t& datawriter_guid,
const std::string& topic_name,
const std::string& type_name,
const eprosima::fastrtps::rtps::GUID_t& participant_guid,
const eprosima::fastdds::dds::WriterQos& writer_qos)
{
const rmw_gid_t datawriter_gid = rmw_fastrtps_shared_cpp::create_rmw_gid(
"rmw_fastrtps_cpp", datawriter_guid);
const rmw_gid_t participant_gid = rmw_fastrtps_shared_cpp::create_rmw_gid(
"rmw_fastrtps_cpp", participant_guid);
rmw_qos_profile_t qos_profile = rmw_qos_profile_unknown;
dds_qos_to_rmw_qos(writer_qos, &qos_profile);
graphCache_.add_entity(datawriter_gid, topic_name,
type_name, participant_gid, qos_profile, false); type_name, participant_gid, qos_profile, false);
} }
@@ -405,24 +421,6 @@ void GraphManager::add_datareader(
type_name, participant_gid, qos_profile, true); type_name, participant_gid, qos_profile, true);
} }
void GraphManager::add_datareader(
const eprosima::fastrtps::rtps::GUID_t& datareader_guid,
const std::string& topic_name,
const std::string& type_name,
const eprosima::fastrtps::rtps::GUID_t& participant_guid,
const eprosima::fastdds::dds::ReaderQos& reader_qos)
{
const rmw_gid_t datareader_gid = rmw_fastrtps_shared_cpp::create_rmw_gid(
"rmw_fastrtps_cpp", datareader_guid);
const rmw_gid_t participant_gid = rmw_fastrtps_shared_cpp::create_rmw_gid(
"rmw_fastrtps_cpp", participant_guid);
rmw_qos_profile_t qos_profile = rmw_qos_profile_unknown;
dds_qos_to_rmw_qos(reader_qos, &qos_profile);
graphCache_.add_entity(datareader_gid, topic_name,
type_name, participant_gid, qos_profile, true);
}
void GraphManager::remove_datareader( void GraphManager::remove_datareader(
const eprosima::fastrtps::rtps::GUID_t& datareader_guid) const eprosima::fastrtps::rtps::GUID_t& datareader_guid)
{ {
@@ -449,14 +447,20 @@ void GraphManager::associate_entity(
{ {
case dds::xrce::OBJK_DATAWRITER: case dds::xrce::OBJK_DATAWRITER:
{ {
std::string isolated_node_name, isolated_namespace;
get_name_and_namespace(qos.name().c_str(), isolated_node_name, isolated_namespace);
isolated_namespace = namespace_remapping_ + isolated_namespace;
info = graphCache_.associate_writer( info = graphCache_.associate_writer(
entity_gid, participant_gid, qos.name().c_str(), enclave_); entity_gid, participant_gid, isolated_node_name, isolated_namespace);
break; break;
} }
case dds::xrce::OBJK_DATAREADER: case dds::xrce::OBJK_DATAREADER:
{ {
std::string isolated_node_name, isolated_namespace;
get_name_and_namespace(qos.name().c_str(), isolated_node_name, isolated_namespace);
isolated_namespace = namespace_remapping_ + isolated_namespace;
info = graphCache_.associate_reader( info = graphCache_.associate_reader(
entity_gid, participant_gid, qos.name().c_str(), enclave_); entity_gid, participant_gid, isolated_node_name, isolated_namespace);
break; break;
} }
default: default:
@@ -464,7 +468,9 @@ void GraphManager::associate_entity(
break; break;
} }
} }
ros_discovery_datawriter_->write(static_cast<void *>(&info));
auto it = micro_ros_graph_datawriters_.find(participant);
it->second->write(static_cast<void *>(&info));
} }
@@ -549,13 +555,50 @@ void GraphManager::update_node_entities_info()
if (ros_discovery_datareader_->take_next_sample(&entities_info, &sample_info) == if (ros_discovery_datareader_->take_next_sample(&entities_info, &sample_info) ==
eprosima::fastrtps::types::ReturnCode_t::RETCODE_OK) eprosima::fastrtps::types::ReturnCode_t::RETCODE_OK)
{ {
if (sample_info.instance_state == eprosima::fastdds::dds::InstanceStateKind::ALIVE) if (sample_info.instance_state == eprosima::fastdds::dds::InstanceStateKind::ALIVE_INSTANCE_STATE)
{ {
graphCache_.update_participant_entities(entities_info); graphCache_.update_participant_entities(entities_info);
} }
} }
} }
void GraphManager::get_name_and_namespace(
std::string participant_name,
std::string& node_name,
std::string& node_namespace)
{
// Remove first / if exists
if (participant_name.rfind("/", 0) == 0)
{
participant_name.erase(participant_name.begin());
}
// Split node name in domain and node name
std::istringstream iss(participant_name);
std::vector<std::string> result;
std::string token;
while(std::getline(iss, token, '/'))
{
result.push_back(token);
}
if (result.size() > 1)
{
node_namespace = "/" + result[0];
for (size_t i = 1; i < result.size(); i++)
{
node_name.append(result[i] + "/");
}
node_name.pop_back();
}
else
{
node_name = participant_name;
node_namespace = "/";
}
}
GraphManager::ParticipantListener::ParticipantListener( GraphManager::ParticipantListener::ParticipantListener(
GraphManager* graph_manager) GraphManager* graph_manager)
: eprosima::fastdds::dds::DomainParticipantListener() : eprosima::fastdds::dds::DomainParticipantListener()
@@ -581,13 +624,13 @@ void GraphManager::ParticipantListener::on_participant_discovery(
const std::string enclave = const std::string enclave =
std::string(name_found->second.begin(), name_found->second.end()); std::string(name_found->second.begin(), name_found->second.end());
graphManager_from_->add_participant(participant->guid(), info.info.m_participantName.to_string(), enclave); graphManager_from_->add_participant(participant, false, enclave);
break; break;
} }
case eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::REMOVED_PARTICIPANT: case eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::REMOVED_PARTICIPANT:
case eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DROPPED_PARTICIPANT: case eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DROPPED_PARTICIPANT:
{ {
graphManager_from_->remove_participant(info.info.m_guid); graphManager_from_->remove_participant(participant, false);
break; break;
} }
default: default:
@@ -597,6 +640,52 @@ void GraphManager::ParticipantListener::on_participant_discovery(
} }
} }
static eprosima::fastdds::dds::DataWriterQos writer_qos_conversion(
const eprosima::fastdds::dds::WriterQos& writer_qos)
{
eprosima::fastdds::dds::DataWriterQos datawriter_qos;
datawriter_qos.durability(writer_qos.m_durability);
datawriter_qos.durability_service(writer_qos.m_durabilityService);
datawriter_qos.deadline(writer_qos.m_deadline);
datawriter_qos.latency_budget(writer_qos.m_latencyBudget);
datawriter_qos.liveliness(writer_qos.m_liveliness);
datawriter_qos.reliability(writer_qos.m_reliability);
datawriter_qos.destination_order(writer_qos.m_destinationOrder);
datawriter_qos.lifespan(writer_qos.m_lifespan);
datawriter_qos.user_data(writer_qos.m_userData);
datawriter_qos.ownership(writer_qos.m_ownership);
datawriter_qos.ownership_strength(writer_qos.m_ownershipStrength);
datawriter_qos.publish_mode(writer_qos.m_publishMode);
datawriter_qos.representation(writer_qos.representation);
datawriter_qos.data_sharing(writer_qos.data_sharing);
return datawriter_qos;
}
static eprosima::fastdds::dds::DataReaderQos reader_qos_conversion(
const eprosima::fastdds::dds::ReaderQos& reader_qos)
{
eprosima::fastdds::dds::DataReaderQos datareader_qos;
datareader_qos.durability(reader_qos.m_durability);
datareader_qos.deadline(reader_qos.m_deadline);
datareader_qos.latency_budget(reader_qos.m_latencyBudget);
datareader_qos.liveliness(reader_qos.m_liveliness);
datareader_qos.reliability(reader_qos.m_reliability);
datareader_qos.destination_order(reader_qos.m_destinationOrder);
datareader_qos.user_data(reader_qos.m_userData);
datareader_qos.ownership(reader_qos.m_ownership);
datareader_qos.time_based_filter(reader_qos.m_timeBasedFilter);
datareader_qos.lifespan(reader_qos.m_lifespan);
datareader_qos.durability_service(reader_qos.m_durabilityService);
eprosima::fastdds::dds::TypeConsistencyQos consistency;
consistency.type_consistency = reader_qos.type_consistency;
datareader_qos.type_consistency(consistency);
datareader_qos.data_sharing(reader_qos.data_sharing);
return datareader_qos;
}
template <> template <>
void GraphManager::ParticipantListener::process_discovery_info<eprosima::fastrtps::rtps::ReaderDiscoveryInfo>( void GraphManager::ParticipantListener::process_discovery_info<eprosima::fastrtps::rtps::ReaderDiscoveryInfo>(
const eprosima::fastrtps::rtps::ReaderDiscoveryInfo& reader_info) const eprosima::fastrtps::rtps::ReaderDiscoveryInfo& reader_info)
@@ -613,7 +702,7 @@ void GraphManager::ParticipantListener::process_discovery_info<eprosima::fastrtp
const std::string type_name = reader_info.info.typeName().to_string(); const std::string type_name = reader_info.info.typeName().to_string();
graphManager_from_->add_datareader(reader_info.info.guid(), topic_name, type_name, graphManager_from_->add_datareader(reader_info.info.guid(), topic_name, type_name,
iHandle2GUID(reader_info.info.RTPSParticipantKey()), reader_info.info.m_qos); iHandle2GUID(reader_info.info.RTPSParticipantKey()), reader_qos_conversion(reader_info.info.m_qos));
break; break;
} }
default: default:
@@ -640,7 +729,7 @@ void GraphManager::ParticipantListener::process_discovery_info<eprosima::fastrtp
const std::string type_name = writer_info.info.typeName().to_string(); const std::string type_name = writer_info.info.typeName().to_string();
graphManager_from_->add_datawriter(writer_info.info.guid(), topic_name, type_name, graphManager_from_->add_datawriter(writer_info.info.guid(), topic_name, type_name,
iHandle2GUID(writer_info.info.RTPSParticipantKey()), writer_info.info.m_qos); iHandle2GUID(writer_info.info.RTPSParticipantKey()), writer_qos_conversion(writer_info.info.m_qos));
break; break;
} }
default: default:
@@ -656,7 +745,6 @@ void GraphManager::ParticipantListener::on_subscriber_discovery(
eprosima::fastrtps::rtps::ReaderDiscoveryInfo&& info) eprosima::fastrtps::rtps::ReaderDiscoveryInfo&& info)
{ {
process_discovery_info<eprosima::fastrtps::rtps::ReaderDiscoveryInfo>(info); process_discovery_info<eprosima::fastrtps::rtps::ReaderDiscoveryInfo>(info);
// graphManager_from_->associate_entity(info.info.guid(), participant, dds::xrce::OBJK_DATAREADER);
} }
void GraphManager::ParticipantListener::on_publisher_discovery( void GraphManager::ParticipantListener::on_publisher_discovery(
@@ -664,7 +752,6 @@ void GraphManager::ParticipantListener::on_publisher_discovery(
eprosima::fastrtps::rtps::WriterDiscoveryInfo&& info) eprosima::fastrtps::rtps::WriterDiscoveryInfo&& info)
{ {
process_discovery_info<eprosima::fastrtps::rtps::WriterDiscoveryInfo>(info); process_discovery_info<eprosima::fastrtps::rtps::WriterDiscoveryInfo>(info);
// graphManager_from_->associate_entity(info.info.guid(), participant, dds::xrce::OBJK_DATAWRITER);
} }
GraphManager::DatareaderListener::DatareaderListener( GraphManager::DatareaderListener::DatareaderListener(
@@ -17,6 +17,8 @@
#include <agent/graph_manager/graph_typesupport.hpp> #include <agent/graph_manager/graph_typesupport.hpp>
#include <string>
namespace uros { namespace uros {
namespace agent { namespace agent {
namespace graph_manager { namespace graph_manager {
@@ -41,7 +43,7 @@ ParticipantEntitiesInfoTypeSupport::ParticipantEntitiesInfoTypeSupport()
ss << "dds_::" << message_name << "_"; ss << "dds_::" << message_name << "_";
this->setName(ss.str().c_str()); this->setName(ss.str().c_str());
bool full_bounded = true; char full_bounded;
m_typeSize = 4 + callbacks_->max_serialized_size(full_bounded); m_typeSize = 4 + callbacks_->max_serialized_size(full_bounded);
} }
@@ -133,7 +135,7 @@ MicrorosGraphInfoTypeSupport::MicrorosGraphInfoTypeSupport()
ss << "dds_::" << message_name << "_"; ss << "dds_::" << message_name << "_";
this->setName(ss.str().c_str()); this->setName(ss.str().c_str());
bool full_bounded = true; char full_bounded;
m_typeSize = 4 + callbacks_->max_serialized_size(full_bounded); m_typeSize = 4 + callbacks_->max_serialized_size(full_bounded);
} }
+8
View File
@@ -14,6 +14,9 @@
#include <agent/Agent.hpp> #include <agent/Agent.hpp>
#include <string>
#include <vector>
int main(int argc, char** argv) int main(int argc, char** argv)
{ {
uros::agent::Agent micro_ros_agent; uros::agent::Agent micro_ros_agent;
@@ -27,6 +30,11 @@ int main(int argc, char** argv)
std::vector<std::string> params; std::vector<std::string> params;
for (int i = 0; i < argc; ++i) for (int i = 0; i < argc; ++i)
{ {
if(strcmp("--ros-args", argv[i]) == 0)
{
argc = i;
break;
}
params.emplace_back(std::string(argv[i])); params.emplace_back(std::string(argv[i]));
} }