Compare commits

..
Author SHA1 Message Date
Antonio cuadros 80d4778af0 Update graph destructor 2021-07-28 12:30:23 +02:00
Antonio cuadros a0ce74a157 Keep graph manager alive until destruction 2021-07-28 10:03:08 +02:00
Antonio cuadros b0d4f46f8a Add clear to graph manager 2021-07-28 07:52:00 +02:00
Antonio cuadros a5e14eab70 Backport from galactic 2021-07-27 13:17:27 +02:00
20 changed files with 350 additions and 532 deletions
+24 -24
View File
@@ -3,36 +3,36 @@ name: CI micro-ROS Agent
on: on:
pull_request: pull_request:
branches: branches:
- 'foxy' - '**'
schedule:
- cron: '33 6 * * *'
jobs: jobs:
microros_agent_ci: microros_agent_ci:
runs-on: ubuntu-20.04 runs-on: ubuntu-20.04
strategy: container: microros/base:foxy
fail-fast: false
matrix:
os: [ ubuntu-20.04 ]
ros_distribution: [ foxy ]
include:
- docker_image: ubuntu:20.04
ros_distribution: foxy
container:
image: ubuntu:20.04
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- uses: ros-tooling/setup-ros@0.3.2
with: with:
use-ros2-testing: false path: urosagent
required-ros-distributions: ${{ matrix.ros_distribution }}
- name : Download and install dependencies
run: |
apt-get install ros-${{ matrix.ros_distribution }}-micro-ros-msgs
apt-get install ros-${{ matrix.ros_distribution }}-rmw-fastrtps-cpp
- uses : ros-tooling/action-ros-ci@0.2.5
with:
package-name: "micro_ros_agent"
target-ros2-distro: ${{ matrix.ros_distribution }}
- name: Download dependencies
run: |
apt update
cd /uros_ws
. /opt/ros/$ROS_DISTRO/setup.sh
. install/local_setup.sh
rosdep update
ros2 run micro_ros_setup create_agent_ws.sh
- 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
-54
View File
@@ -1,54 +0,0 @@
name: snap
on:
push:
tags:
- '*'
branches:
- foxy
pull_request:
branches:
- foxy
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
outputs:
snap-file: ${{ steps.build-snap.outputs.snap }}
steps:
- uses: actions/checkout@v2
with:
# full history for latest tag name
fetch-depth: 0
- uses: snapcore/action-build@v1
id: build-snap
with:
snapcraft-args: '--enable-experimental-extensions'
# Make sure the snap is installable
- run: |
sudo snap install --dangerous ${{ steps.build-snap.outputs.snap }}
# @todo Do some testing with the snap
- run: |
micro-ros-agent udp4
- uses: actions/upload-artifact@v3
with:
name: micro-ros-agent-snap
path: ${{ steps.build-snap.outputs.snap }}
publish:
if: github.ref == 'refs/heads/foxy' || startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
needs: build
steps:
- uses: actions/download-artifact@v3
with:
name: micro-ros-agent-snap
path: .
- uses: snapcore/action-publish@v1
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.STORE_LOGIN }}
with:
snap: ${{needs.build.outputs.snap-file}}
release: ${{ startsWith(github.ref, 'refs/tags/') && 'candidate' || 'edge'}}
-4
View File
@@ -33,7 +33,3 @@
# End of https://www.gitignore.io/api/qtcreator # End of https://www.gitignore.io/api/qtcreator
CMakeLists.txt.user CMakeLists.txt.user
# snaps
*.snap
-1
View File
@@ -55,4 +55,3 @@ 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.
-37
View File
@@ -2,43 +2,6 @@
Changelog for package micro-ros_agent Changelog for package micro-ros_agent
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1.5.4 (2022-09-28)
------------------
* Fix Datawriter destruction (`#169 <https://github.com/micro-ROS/micro-ROS-Agent/issues/169>`_) (`#171 <https://github.com/micro-ROS/micro-ROS-Agent/issues/171>`_)
* Synchronise predicate (`#160 <https://github.com/micro-ROS/micro-ROS-Agent/issues/160>`_) (`#167 <https://github.com/micro-ROS/micro-ROS-Agent/issues/167>`_)
1.5.3 (2022-06-13)
------------------
* Fix memory leak in graph manager (`#147 <https://github.com/micro-ROS/micro-ROS-Agent/issues/147>`_) (`#149 <https://github.com/micro-ROS/micro-ROS-Agent/issues/149>`_)
1.5.2 (2022-05-25)
------------------
1.5.1 (2022-03-25)
------------------
* Add services to graph manager (backport `#127 <https://github.com/micro-ROS/micro-ROS-Agent/issues/127>`_) (`#128 <https://github.com/micro-ROS/micro-ROS-Agent/issues/128>`_)
* Add used missing includes (`#116 <https://github.com/micro-ROS/micro-ROS-Agent/issues/116>`_)
* Add system logger flag (`#118 <https://github.com/micro-ROS/micro-ROS-Agent/issues/118>`_) (`#120 <https://github.com/micro-ROS/micro-ROS-Agent/issues/120>`_)
* Add condition variable include (`#113 <https://github.com/micro-ROS/micro-ROS-Agent/issues/113>`_) (`#115 <https://github.com/micro-ROS/micro-ROS-Agent/issues/115>`_)
* pass system name to xrceagent (`#110 <https://github.com/micro-ROS/micro-ROS-Agent/issues/110>`_) (`#111 <https://github.com/micro-ROS/micro-ROS-Agent/issues/111>`_)
* Fix memory leak in FastDDS datawriter (`#107 <https://github.com/micro-ROS/micro-ROS-Agent/issues/107>`_) (`#108 <https://github.com/micro-ROS/micro-ROS-Agent/issues/108>`_)
1.5.0 (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
+103 -38
View File
@@ -14,21 +14,15 @@
cmake_minimum_required(VERSION 3.5) cmake_minimum_required(VERSION 3.5)
option(BUILD_SHARED_LIBS "Control shared/static building." ON)
option(UBUILD_AGENT_EXECUTABLE "Control shared/static building." ON)
option(UROSAGENT_GENERATE_PROFILE option(UROSAGENT_GENERATE_PROFILE
"Generates agent.refs according to the .msgs provided in the .repos" OFF "Generates agent.refs according to the .msgs provided in the .repos" OFF
) )
set(CMAKE_C_CLANG_TIDY clang-tidy -checks=*) set(CMAKE_C_CLANG_TIDY clang-tidy -checks=*)
option(MICROROSAGENT_SUPERBUILD "Enable superbuild compilation." ON) project(micro_ros_agent LANGUAGES CXX)
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)
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)
@@ -50,15 +44,26 @@ find_package(ament_cmake_gtest REQUIRED)
find_package(micro_ros_msgs REQUIRED) find_package(micro_ros_msgs REQUIRED)
add_executable(${PROJECT_NAME} include(GNUInstallDirs)
src/main.cpp set(BIN_INSTALL_DIR ${CMAKE_INSTALL_BINDIR} CACHE PATH "Installation directory for binaries")
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR} CACHE PATH "Installation directory for C headers")
set(LIB_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR} CACHE PATH "Installation directory for libraries")
set(DATA_INSTALL_DIR ${CMAKE_INSTALL_DATADIR} CACHE PATH "Installation directory for data")
# Set source files
set(SRCS
src/agent/Agent.cpp src/agent/Agent.cpp
src/agent/graph_manager/graph_manager.cpp src/agent/graph_manager/graph_manager.cpp
src/agent/graph_manager/graph_typesupport.cpp src/agent/graph_manager/graph_typesupport.cpp
src/agent/utils/demangle.cpp src/agent/utils/demangle.cpp
) )
target_include_directories(${PROJECT_NAME} # Library
add_library(${PROJECT_NAME} ${SRCS})
target_include_directories(${PROJECT_NAME} BEFORE
PUBLIC
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
PRIVATE PRIVATE
include include
) )
@@ -83,27 +88,6 @@ target_link_libraries(${PROJECT_NAME}
$<$<BOOL:$<PLATFORM_ID:Linux>>:dl> $<$<BOOL:$<PLATFORM_ID:Linux>>:dl>
) )
target_compile_options(${PROJECT_NAME}
PRIVATE
$<$<C_COMPILER_ID:GNU>:-Wall>
$<$<C_COMPILER_ID:GNU>:-Wextra>
$<$<C_COMPILER_ID:GNU>:-pedantic>
)
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD
14
CXX_STANDARD_REQUIRED
YES
)
set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD
14
CXX_STANDARD_REQUIRED
YES
)
target_compile_options(${PROJECT_NAME} target_compile_options(${PROJECT_NAME}
PRIVATE PRIVATE
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wall> $<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wall>
@@ -111,23 +95,104 @@ target_compile_options(${PROJECT_NAME}
$<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wpedantic> $<$<OR:$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:Clang>>:-Wpedantic>
) )
ament_export_dependencies(microxrcedds_agent) set_target_properties(${PROJECT_NAME} PROPERTIES
CXX_STANDARD
ament_package() 14
CXX_STANDARD_REQUIRED
YES
)
# Install agent lib
install( install(
TARGETS TARGETS
${PROJECT_NAME} ${PROJECT_NAME}
EXPORT
${PROJECT_NAME}Targets
RUNTIME DESTINATION
${BIN_INSTALL_DIR}
LIBRARY DESTINATION
${LIB_INSTALL_DIR}
ARCHIVE DESTINATION
${LIB_INSTALL_DIR}
COMPONENT
libraries
)
# Install includes
install(
DIRECTORY
${PROJECT_SOURCE_DIR}/include/agent
DESTINATION
${INCLUDE_INSTALL_DIR}
FILES_MATCHING
PATTERN "*.hpp"
PATTERN "*.h"
)
# Export library
install(
EXPORT
${PROJECT_NAME}Targets
DESTINATION
${DATA_INSTALL_DIR}/${PROJECT_NAME}/cmake
)
# Package configuration
include(CMakePackageConfigHelpers)
configure_package_config_file(
${PROJECT_SOURCE_DIR}/cmake/Config.cmake.in
${PROJECT_BINARY_DIR}/cmake/config/${PROJECT_NAME}Config.cmake
INSTALL_DESTINATION
${DATA_INSTALL_DIR}/${PROJECT_NAME}/cmake
PATH_VARS
BIN_INSTALL_DIR
INCLUDE_INSTALL_DIR
LIB_INSTALL_DIR
DATA_INSTALL_DIR
)
install(
FILES
${PROJECT_BINARY_DIR}/cmake/config/${PROJECT_NAME}Config.cmake
DESTINATION
${DATA_INSTALL_DIR}/${PROJECT_NAME}/cmake
)
if(UBUILD_AGENT_EXECUTABLE)
add_executable(micro_ros_agent_bin
${SRCS}
src/main.cpp
)
target_include_directories(micro_ros_agent_bin
PRIVATE
$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
)
target_link_libraries(micro_ros_agent_bin ${PROJECT_NAME})
set_target_properties(micro_ros_agent_bin
PROPERTIES OUTPUT_NAME ${PROJECT_NAME})
install(
TARGETS
micro_ros_agent_bin
DESTINATION DESTINATION
lib/${PROJECT_NAME} lib/${PROJECT_NAME}
) )
install( install(
DIRECTORY DIRECTORY
launch launch
DESTINATION DESTINATION
share/${PROJECT_NAME} share/${PROJECT_NAME}
) )
endif()
ament_export_dependencies(microxrcedds_agent)
ament_package()
if(UROSAGENT_GENERATE_PROFILE) if(UROSAGENT_GENERATE_PROFILE)
set(_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/python") set(_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/python")
+32
View File
@@ -0,0 +1,32 @@
# Copyright 2016 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.
set(@PROJECT_NAME@_VERSION @PROJECT_VERSION@)
@PACKAGE_INIT@
if(MSVC OR MSVC_IDE)
set_and_check(@PROJECT_NAME@_BIN_DIR "@PACKAGE_BIN_INSTALL_DIR@")
endif()
set_and_check(@PROJECT_NAME@_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
set_and_check(@PROJECT_NAME@_LIB_DIR "@PACKAGE_LIB_INSTALL_DIR@")
set_and_check(@PROJECT_NAME@_DATA_DIR "@PACKAGE_DATA_INSTALL_DIR@")
foreach(d @_deps@)
list(GET d 0 _name)
list(GET d 1 _version)
find_package(${_name} ${_version} REQUIRED)
endforeach()
include(${@PROJECT_NAME@_DATA_DIR}/@PROJECT_NAME@/cmake/@PROJECT_NAME@Targets.cmake)
-68
View File
@@ -1,68 +0,0 @@
# 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
)
+23 -10
View File
@@ -20,21 +20,32 @@
#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 {
class Agent class Agent
{ {
public: private:
Agent(); Agent();
~Agent() = default; ~Agent()
{
stop();
}
Agent(const Agent &) = delete;
Agent(Agent &&) = delete;
Agent& operator =(
const Agent &) = delete;
Agent& operator =(
Agent &&) = delete;
public:
static Agent& getInstance();
bool create( bool create(
int argc, int argc,
@@ -42,12 +53,14 @@ public:
void run(); void run();
void stop();
private: private:
bool initialized = false;
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, graph_manager::GraphManager> graph_manager_map_;
std::shared_ptr<graph_manager::GraphManager> find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id); graph_manager::GraphManager* find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id);
}; };
} // namespace agent } // namespace agent
@@ -12,9 +12,6 @@
// 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"
@@ -61,10 +58,8 @@
#include <agent/graph_manager/graph_typesupport.hpp> #include <agent/graph_manager/graph_typesupport.hpp>
#include <agent/utils/demangle.hpp> #include <agent/utils/demangle.hpp>
#include <condition_variable> #ifndef _UROS_AGENT_GRAPH_MANAGER_HPP
#include <string> #define _UROS_AGENT_GRAPH_MANAGER_HPP
#include <memory>
#include <map>
namespace uros { namespace uros {
namespace agent { namespace agent {
@@ -87,6 +82,28 @@ public:
*/ */
~GraphManager() = default; ~GraphManager() = default;
void stop()
{
if (microros_graph_publisher_.joinable())
{
exit = true;
cv_.notify_one();
microros_graph_publisher_.join();
}
subscriber_->delete_datareader(ros_discovery_datareader_);
publisher_->delete_datawriter(ros_to_microros_graph_datawriter_);
participant_->delete_subscriber(subscriber_);
participant_->delete_publisher(publisher_);
// Delete topics
participant_->delete_topic(ros_discovery_topic_);
participant_->delete_topic(ros_to_microros_graph_topic_);
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->delete_participant(participant_);
}
/** /**
* @brief Implementation of the notification logic that updates the micro-ROS graph. * @brief Implementation of the notification logic that updates the micro-ROS graph.
*/ */
@@ -111,12 +128,6 @@ public:
const eprosima::fastdds::dds::DomainParticipant* participant, const eprosima::fastdds::dds::DomainParticipant* participant,
bool from_microros = true); bool from_microros = true);
/**
* @brief Getter for the graph cache.
* @return Reference to inner graph cache
*/
rmw_dds_common::GraphCache& get_graph_cache() { return graphCache_; }
/** /**
* @brief Adds a DDS datawriter to the graph tree. * @brief Adds a DDS datawriter to the graph tree.
* @param datawriter_guid rtps::GUID_t of the datawriter to be added. * @param datawriter_guid rtps::GUID_t of the datawriter to be added.
@@ -315,23 +326,23 @@ private:
std::thread microros_graph_publisher_; std::thread microros_graph_publisher_;
std::mutex mtx_; std::mutex mtx_;
std::condition_variable cv_; std::condition_variable cv_;
volatile bool exit = false;
eprosima::fastdds::dds::DataWriterQos datawriter_qos_; eprosima::fastdds::dds::DataWriterQos datawriter_qos_;
rmw_dds_common::GraphCache graphCache_; rmw_dds_common::GraphCache graphCache_;
std::unique_ptr<ParticipantListener> participant_listener_; ParticipantListener participant_listener_;
std::unique_ptr<DatareaderListener> datareader_listener_; DatareaderListener datareader_listener_;
std::unique_ptr<eprosima::fastdds::dds::TypeSupport> participant_info_typesupport_;
std::unique_ptr<eprosima::fastdds::dds::TypeSupport> microros_graph_info_typesupport_;
std::unique_ptr<eprosima::fastdds::dds::DomainParticipant> participant_;
std::unique_ptr<eprosima::fastdds::dds::Publisher> publisher_;
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_to_microros_graph_topic_;
std::unique_ptr<eprosima::fastdds::dds::DataWriter> ros_to_microros_graph_datawriter_;
std::unique_ptr<eprosima::fastdds::dds::DataReader> ros_discovery_datareader_;
eprosima::fastdds::dds::TypeSupport participant_info_typesupport_;
eprosima::fastdds::dds::TypeSupport microros_graph_info_typesupport_;
eprosima::fastdds::dds::DomainParticipant* participant_;
eprosima::fastdds::dds::Publisher* publisher_;
eprosima::fastdds::dds::Subscriber* subscriber_;
eprosima::fastdds::dds::Topic* ros_discovery_topic_;
eprosima::fastdds::dds::Topic* ros_to_microros_graph_topic_;
eprosima::fastdds::dds::DataWriter* ros_to_microros_graph_datawriter_;
eprosima::fastdds::dds::DataReader* ros_discovery_datareader_;
// Store a auxiliary publishers and datawriter for each participant created in micro-ROS // Store a auxiliary publishers and datawriter for each participant created in micro-ROS
std::map< std::map<
const eprosima::fastdds::dds::DomainParticipant*, const eprosima::fastdds::dds::DomainParticipant*,
@@ -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", "-p", "8888", "-v6"] arguments={"udp4", "-p", "8888", "-v6"}
) )
]) ])
+4 -4
View File
@@ -2,10 +2,9 @@
<?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>1.5.4</version> <version>0.0.1</version>
<description>micro-ROS Agent package</description> <description>DDS-XCRE agent implementation </description>
<maintainer email="pablogarrido@eprosima.com">Pablo Garrido</maintainer> <maintainer email="borjaouterelo@eprosima.com">Borja Outerelo</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>
@@ -15,6 +14,7 @@
<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>
+26 -157
View File
@@ -17,9 +17,6 @@
#include <agent/Agent.hpp> #include <agent/Agent.hpp>
#include <utility>
#include <memory>
namespace uros { namespace uros {
namespace agent { namespace agent {
@@ -28,13 +25,22 @@ Agent::Agent()
{ {
} }
Agent& Agent::getInstance()
{
static Agent instance;
return instance;
}
bool Agent::create( bool Agent::create(
int argc, int argc,
char** argv) char** argv)
{ {
bool result = xrce_dds_agent_instance_.create(argc, argv); bool result = xrce_dds_agent_instance_.create(argc, argv);
if (result)
if (result && !initialized)
{ {
initialized = true;
/** /**
* Add CREATE_PARTICIPANT callback. * Add CREATE_PARTICIPANT callback.
*/ */
@@ -169,149 +175,6 @@ 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());
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle_dw =
datawriter->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datawriter_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dw);
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_dr =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dr);
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());
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle_dw =
datawriter->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datawriter_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dw);
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_dr =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dr);
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());
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle_dw =
datawriter->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datawriter_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dw);
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_dr =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dr);
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());
// TODO(pablogs): Workaround for Fast-DDS bug #9977. Remove when fixed
const eprosima::fastrtps::rtps::InstanceHandle_t instance_handle_dw =
datawriter->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datawriter_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dw);
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_dr =
datareader->get_instance_handle();
const eprosima::fastrtps::rtps::GUID_t datareader_guid =
eprosima::fastrtps::rtps::iHandle2GUID(instance_handle_dr);
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;
@@ -319,23 +182,29 @@ bool Agent::create(
void Agent::run() void Agent::run()
{ {
return xrce_dds_agent_instance_.run(); xrce_dds_agent_instance_.run();
} }
std::shared_ptr<graph_manager::GraphManager> Agent::find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id) void Agent::stop()
{ {
xrce_dds_agent_instance_.stop();
auto it = graph_manager_map_.find(domain_id); for (auto & element : graph_manager_map_)
{
element.second.stop();
}
graph_manager_map_.clear();
}
graph_manager::GraphManager* Agent::find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id)
{
auto it = graph_manager_map_.find(domain_id);
if (it != graph_manager_map_.end()) { if (it != graph_manager_map_.end()) {
return it->second; return &it->second;
}else{ }else{
return graph_manager_map_.insert( return &graph_manager_map_.emplace(domain_id, domain_id).first->second;
std::make_pair(
domain_id,
std::make_shared<graph_manager::GraphManager>(domain_id)
)
).first->second;
} }
} }
@@ -17,11 +17,6 @@
#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 {
@@ -33,14 +28,14 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id)
, mtx_() , mtx_()
, cv_() , cv_()
, graphCache_() , graphCache_()
, participant_listener_(std::make_unique<ParticipantListener>(this)) , participant_listener_(this)
, datareader_listener_(std::make_unique<DatareaderListener>(this)) , datareader_listener_(this)
, participant_info_typesupport_(std::make_unique< , participant_info_typesupport_()
eprosima::fastdds::dds::TypeSupport>(new graph_manager::ParticipantEntitiesInfoTypeSupport())) , microros_graph_info_typesupport_()
, microros_graph_info_typesupport_(std::make_unique<
eprosima::fastdds::dds::TypeSupport>(new graph_manager::MicrorosGraphInfoTypeSupport()))
{ {
eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_profiles(); eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->load_profiles();
participant_info_typesupport_ = (eprosima::fastdds::dds::TypeSupport) new graph_manager::ParticipantEntitiesInfoTypeSupport();
microros_graph_info_typesupport_ = (eprosima::fastdds::dds::TypeSupport) new graph_manager::MicrorosGraphInfoTypeSupport();
// Create DomainParticipant // Create DomainParticipant
eprosima::fastdds::dds::DomainParticipantQos participant_qos = eprosima::fastdds::dds::DomainParticipantQos participant_qos =
@@ -59,29 +54,29 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id)
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(); eprosima::fastdds::dds::StatusMask par_mask = eprosima::fastdds::dds::StatusMask::none();
participant_.reset(eprosima::fastdds::dds::DomainParticipantFactory::get_instance()-> participant_ = eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->
create_participant(domain_id_, participant_qos, participant_listener_.get(), par_mask)); create_participant(domain_id_, participant_qos, &participant_listener_, par_mask);
// Register participant within typesupport // Register participant within typesupport
participant_->register_type(*participant_info_typesupport_); participant_->register_type(participant_info_typesupport_);
participant_->register_type(*microros_graph_info_typesupport_); participant_->register_type(microros_graph_info_typesupport_);
// Create publisher // Create publisher
publisher_.reset(participant_->create_publisher( publisher_ = participant_->create_publisher(
eprosima::fastdds::dds::PUBLISHER_QOS_DEFAULT)); eprosima::fastdds::dds::PUBLISHER_QOS_DEFAULT);
// Create subscriber // Create subscriber
subscriber_.reset(participant_->create_subscriber( subscriber_ = participant_->create_subscriber(
eprosima::fastdds::dds::SUBSCRIBER_QOS_DEFAULT)); eprosima::fastdds::dds::SUBSCRIBER_QOS_DEFAULT);
// Create topics // Create topics
ros_discovery_topic_.reset(participant_->create_topic("ros_discovery_info", ros_discovery_topic_ = participant_->create_topic("ros_discovery_info",
participant_info_typesupport_->get_type_name(), participant_info_typesupport_.get_type_name(),
eprosima::fastdds::dds::TOPIC_QOS_DEFAULT)); eprosima::fastdds::dds::TOPIC_QOS_DEFAULT);
ros_to_microros_graph_topic_.reset(participant_->create_topic("ros_to_microros_graph", ros_to_microros_graph_topic_ = participant_->create_topic("ros_to_microros_graph",
microros_graph_info_typesupport_->get_type_name(), microros_graph_info_typesupport_.get_type_name(),
eprosima::fastdds::dds::TOPIC_QOS_DEFAULT)); eprosima::fastdds::dds::TOPIC_QOS_DEFAULT);
// Create datawriters // Create datawriters
datawriter_qos_ = datawriter_qos_ =
@@ -101,9 +96,9 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id)
eprosima::fastdds::dds::DataWriterQos ros_to_microros_datawriter_qos_ = datawriter_qos_; eprosima::fastdds::dds::DataWriterQos ros_to_microros_datawriter_qos_ = datawriter_qos_;
ros_to_microros_datawriter_qos_.history().kind = ros_to_microros_datawriter_qos_.history().kind =
eprosima::fastdds::dds::HistoryQosPolicyKind::KEEP_LAST_HISTORY_QOS; eprosima::fastdds::dds::HistoryQosPolicyKind::KEEP_ALL_HISTORY_QOS;
ros_to_microros_graph_datawriter_.reset( ros_to_microros_graph_datawriter_ =
publisher_->create_datawriter(ros_to_microros_graph_topic_.get(), ros_to_microros_datawriter_qos_)); publisher_->create_datawriter(ros_to_microros_graph_topic_, ros_to_microros_datawriter_qos_);
// Create datareaders // Create datareaders
@@ -119,17 +114,15 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id)
datareader_qos.durability().kind = datareader_qos.durability().kind =
eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS; eprosima::fastdds::dds::DurabilityQosPolicyKind::TRANSIENT_LOCAL_DURABILITY_QOS;
ros_discovery_datareader_.reset( ros_discovery_datareader_ =
subscriber_->create_datareader(ros_discovery_topic_.get(), subscriber_->create_datareader(ros_discovery_topic_,
datareader_qos, datareader_listener_.get())); datareader_qos, &datareader_listener_);
// Set graph cache on change callback function // Set graph cache on change callback function
graphCache_.set_on_change_callback([this]() graphCache_.set_on_change_callback([this]()
{
{ {
std::unique_lock<std::mutex> lock(this->mtx_); std::unique_lock<std::mutex> lock(this->mtx_);
this->graph_changed_ = true; this->graph_changed_ = true;
}
this->cv_.notify_one(); this->cv_.notify_one();
}); });
@@ -144,9 +137,13 @@ inline void GraphManager::publish_microros_graph()
std::unique_lock<std::mutex> lock(mtx_); std::unique_lock<std::mutex> lock(mtx_);
cv_.wait(lock, [this]() cv_.wait(lock, [this]()
{ {
return this->graph_changed_; return this->graph_changed_ || exit;
}); });
graph_changed_ = false; }
if (exit)
{
break;
} }
if (display_on_change_) if (display_on_change_)
@@ -154,6 +151,7 @@ inline void GraphManager::publish_microros_graph()
std::cout << "Updated uros Graph: graph changed" << std::endl; std::cout << "Updated uros Graph: graph changed" << std::endl;
std::cout << graphCache_ << std::endl; std::cout << graphCache_ << std::endl;
} }
graph_changed_ = false;
micro_ros_msgs::msg::Graph graph_message; micro_ros_msgs::msg::Graph graph_message;
@@ -322,10 +320,11 @@ void GraphManager::add_participant(
if (it == micro_ros_graph_datawriters_.end()) if (it == micro_ros_graph_datawriters_.end())
{ {
// Create datawriter // Create datawriter
eprosima::fastdds::dds::DataWriter * datawriter = publisher_->create_datawriter(ros_discovery_topic_.get(), datawriter_qos_); eprosima::fastdds::dds::DataWriter* datawriter;
datawriter = publisher_->create_datawriter(ros_discovery_topic_, datawriter_qos_);
it = micro_ros_graph_datawriters_.insert( it = micro_ros_graph_datawriters_.insert(
std::make_pair(participant, datawriter)).first; std::make_pair(participant, std::move(datawriter))).first;
} }
it->second->write(static_cast<void *>(&info)); it->second->write(static_cast<void *>(&info));
@@ -345,6 +344,7 @@ void GraphManager::remove_participant(
rmw_dds_common::convert_gid_to_msg(&gid, &info.gid); rmw_dds_common::convert_gid_to_msg(&gid, &info.gid);
auto it = micro_ros_graph_datawriters_.find(participant); auto it = micro_ros_graph_datawriters_.find(participant);
it->second->write(static_cast<void *>(&info)); it->second->write(static_cast<void *>(&info));
publisher_->delete_datawriter(it->second); publisher_->delete_datawriter(it->second);
micro_ros_graph_datawriters_.erase(participant); micro_ros_graph_datawriters_.erase(participant);
} }
@@ -635,7 +635,7 @@ GraphManager::ParticipantListener::ParticipantListener(
} }
void GraphManager::ParticipantListener::on_participant_discovery( void GraphManager::ParticipantListener::on_participant_discovery(
eprosima::fastdds::dds::DomainParticipant* /* participant */, eprosima::fastdds::dds::DomainParticipant* participant,
eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info)
{ {
switch (info.status) switch (info.status)
@@ -652,15 +652,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());
const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", info.info.m_guid); graphManager_from_->add_participant(participant, false, enclave);
graphManager_from_->get_graph_cache().add_participant(gid, 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:
{ {
const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", info.info.m_guid); graphManager_from_->remove_participant(participant, false);
graphManager_from_->get_graph_cache().remove_participant(gid);
break; break;
} }
default: default:
@@ -17,8 +17,6 @@
#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 {
+1 -4
View File
@@ -14,12 +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 = micro_ros_agent.getInstance();
/** Bypass '--ros-args' flag, as we use our own CLI parser. /** Bypass '--ros-args' flag, as we use our own CLI parser.
* As a workaround for launch files, arguments will be passed from * As a workaround for launch files, arguments will be passed from
-19
View File
@@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles" >
<transport_descriptors>
<transport_descriptor>
<transport_id>CustomUdpTransport</transport_id>
<type>UDPv4</type>
</transport_descriptor>
</transport_descriptors>
<participant profile_name="participant_profile" is_default_profile="true">
<rtps>
<userTransports>
<transport_id>CustomUdpTransport</transport_id>
</userTransports>
<useBuiltinTransports>false</useBuiltinTransports>
</rtps>
</participant>
</profiles>
+1 -1
View File
@@ -24,4 +24,4 @@ if [ -n "$p2p_port" ]; then
set -- --p2p "$p2p_port" "$@" set -- --p2p "$p2p_port" "$@"
fi fi
exec "$SNAP/opt/ros/snap/lib/micro_ros_agent/micro_ros_agent" "$transport" "$@" exec "$SNAP/lib/micro_ros_agent/micro_ros_agent" "$transport" "$@"
+41 -23
View File
@@ -1,10 +1,12 @@
name: micro-ros-agent name: micro-ros-agent
adopt-info: uros-agent # parse metadata from the uros-agent part
base: core20 base: core20
version: git
summary: Bridge between Micro ROS client applications and ROS 2 summary: Bridge between Micro ROS client applications and ROS 2
description: | description: |
Micro-ROS, whose default implementation is based on eProsima's Micro-ROS, whose default implementation is based on eProsima's
Micro XRCE-DDS middleware, is composed of client applications which interact with the ROS 2 world by means of an Agent. This agent keeps tracks of the entities created by means of Micro XRCE-DDS middleware, is composed of client applications
which interact with the ROS 2 world by means of an Agent.
This agent keeps tracks of the entities created by means of
requests performed on the microcontroller side, and uses them requests performed on the microcontroller side, and uses them
to communicate with the ROS 2 dataspace. to communicate with the ROS 2 dataspace.
@@ -69,6 +71,16 @@ description: |
$ snap set micro-ros-agent device="device path" $ snap set micro-ros-agent device="device path"
If connecting the micro-ROS Agent using an IP based connection mode,
that is, `udp4`, `udp6`, `tcp4` or `tcp6`, care must be taken to
connect first the `micro-ros-agent-shm-netplug` plug.
This is due to the fact that ROS 2 Foxy is using Fast-DDS as the
default DDS middleware, and Fast-DDS comes with *shared memory transport*.
Thus, this plugin must be enabled, in order to gain access to the
`/dev/shm` folder from the snap image, prior to running it:
$ sudo snap connect micro-ros-agent:micro-ros-agent-shm-netplug
When using the snap with a serial device, some steps need to be taken When using the snap with a serial device, some steps need to be taken
in order to establish a successful connection: in order to establish a successful connection:
@@ -99,6 +111,7 @@ description: |
After this, you can execute your snap as usual, After this, you can execute your snap as usual,
using `sudo micro-ros-agent serial -d <serial-dev>`. using `sudo micro-ros-agent serial -d <serial-dev>`.
grade: stable
confinement: strict confinement: strict
architectures: architectures:
@@ -108,43 +121,48 @@ architectures:
- build-on: ppc64el - build-on: ppc64el
parts: parts:
uros-agent: uros-agent:
plugin: colcon plugin: colcon
source: . source: .
colcon-cmake-args: override-build: |
- -DMICROROSAGENT_SUPERBUILD=ON set +u
- --cmake-force-configure git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git -b $ROS_DISTRO
override-pull: | git clone https://github.com/eProsima/Micro-CDR.git -b $ROS_DISTRO
snapcraftctl pull git clone https://github.com/micro-ROS/micro_ros_msgs.git -b $ROS_DISTRO
git clone https://github.com/micro-ROS/rosidl_typesupport_microxrcedds.git -b $ROS_DISTRO
version="$(git describe --always --tags| sed -e 's/^v//;s/-/+git/;y/-/./')" git clone https://github.com/micro-ROS/rmw-microxrcedds.git -b $ROS_DISTRO
[ -n "$(echo $version | grep "+git")" ] && grade=devel || grade=stable git clone https://github.com/micro-ROS/micro-ROS-Agent.git -b $ROS_DISTRO
snapcraftctl set-version "$version" . /opt/ros/$ROS_DISTRO/setup.sh
snapcraftctl set-grade "$grade" colcon build --merge-install --install-base $SNAPCRAFT_PRIME --cmake-args "-DUAGENT_BUILD_EXECUTABLE=OFF -DUAGENT_USE_SYSTEM_FASTDDS=ON" --packages-up-to micro_ros_agent
set -u
build-packages: [make, gcc, g++, git] build-packages: [make, gcc, g++]
stage-packages: [ros-foxy-ros2launch] stage-packages: [ros-foxy-ros2launch]
runner: runner:
plugin: dump plugin: dump
source: snap/local/ source: snap/local/
organize: organize:
'micro-ros-agent-daemon': usr/bin/ '*': usr/bin/
'fastdds_no_shared_memory.xml': usr/share/
plugs:
micro-ros-agent-shm-netplug:
interface: system-files
allow-auto-connection: true
write:
- /dev/shm
apps: apps:
micro-ros-agent: micro-ros-agent:
command: opt/ros/snap/lib/micro_ros_agent/micro_ros_agent command: lib/micro_ros_agent/micro_ros_agent
environment: environment:
FASTRTPS_DEFAULT_PROFILES_FILE: ${SNAP}/usr/share/fastdds_no_shared_memory.xml LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib"
plugs: [network, network-bind, serial-port] plugs: [network, network-bind, serial-port, micro-ros-agent-shm-netplug]
extensions: [ros2-foxy] extensions: [ros2-foxy]
daemon: daemon:
command: usr/bin/micro-ros-agent-daemon command: usr/bin/micro-ros-agent-daemon
environment: environment:
FASTRTPS_DEFAULT_PROFILES_FILE: ${SNAP}/usr/share/fastdds_no_shared_memory.xml LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib"
daemon: simple daemon: simple
plugs: [network, network-bind, serial-port] plugs: [network, network-bind, serial-port, micro-ros-agent-shm-netplug]
extensions: [ros2-foxy]