diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a92fb00..21fbfe2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,36 +3,35 @@ name: CI micro-ROS Agent on: pull_request: branches: - - '**' + - 'humble' + schedule: + - cron: '33 6 * * *' jobs: microros_agent_ci: - runs-on: ubuntu-20.04 - container: microros/base:rolling - - steps: - - uses: actions/checkout@v2 - with: - path: urosagent - - - name: Download dependencies - run: | - apt update - cd /uros_ws - . /opt/ros/$ROS_DISTRO/setup.sh - . install/local_setup.sh - rosdep update --rosdistro=$ROS_DISTRO - 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 \ No newline at end of file + runs-on: ubuntu-latest + 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: + - uses: actions/checkout@v4 + - uses: ros-tooling/setup-ros@0.7.13 + with: + use-ros2-testing: false + 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.4.3 + with: + package-name: "micro_ros_agent" + target-ros2-distro: ${{ matrix.ros_distribution }} diff --git a/micro_ros_agent/CHANGELOG.rst b/micro_ros_agent/CHANGELOG.rst index 499235d..05f301d 100644 --- a/micro_ros_agent/CHANGELOG.rst +++ b/micro_ros_agent/CHANGELOG.rst @@ -2,6 +2,25 @@ Changelog for package micro-ros_agent ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3.0.6 (2024-01-29) +------------------ +* Fix thread include (backport `#216 `_) (`#217 `_) + +3.0.5 (2023-06-06) +------------------ + +3.0.4 (2022-09-28) +------------------ +* Fix Datawriter destruction (`#169 `_) +* Synchronise predicate (`#160 `_) + +3.0.3 (2022-06-13) +------------------ +* Fix memory leak in graph manager (`#147 `_) + +3.0.2 (2022-05-25) +------------------ + 3.0.1 (2022-03-25) ------------------ * Add services to graph manager (`#127 `_) (`#129 `_) diff --git a/micro_ros_agent/cmake/SuperBuild.cmake b/micro_ros_agent/cmake/SuperBuild.cmake index bead827..46f4ed2 100644 --- a/micro_ros_agent/cmake/SuperBuild.cmake +++ b/micro_ros_agent/cmake/SuperBuild.cmake @@ -26,7 +26,7 @@ if(NOT xrceagent_FOUND) GIT_REPOSITORY https://github.com/eProsima/Micro-XRCE-DDS-Agent.git GIT_TAG - ros2 + v2.4.2 PREFIX ${PROJECT_BINARY_DIR}/agent INSTALL_DIR diff --git a/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp b/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp index 4365909..d9cf095 100644 --- a/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp +++ b/micro_ros_agent/include/agent/graph_manager/graph_manager.hpp @@ -65,6 +65,7 @@ #include #include #include +#include namespace uros { namespace agent { @@ -111,6 +112,12 @@ class GraphManager const eprosima::fastdds::dds::DomainParticipant* participant, 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. * @param datawriter_guid rtps::GUID_t of the datawriter to be added. @@ -299,7 +306,7 @@ class GraphManager // 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_; }; diff --git a/micro_ros_agent/package.xml b/micro_ros_agent/package.xml index a61a21e..23d6ec4 100644 --- a/micro_ros_agent/package.xml +++ b/micro_ros_agent/package.xml @@ -2,10 +2,10 @@ micro_ros_agent - 3.0.1 + 3.0.6 micro-ROS Agent package - Pablo Garrido - Antonio Cuadros + Eugenio Collado + Carlos Espinoza Apache License 2.0 ament_cmake diff --git a/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp b/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp index 2a85a91..5c9e9df 100644 --- a/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp +++ b/micro_ros_agent/src/agent/graph_manager/graph_manager.cpp @@ -126,8 +126,10 @@ GraphManager::GraphManager(eprosima::fastdds::dds::DomainId_t domain_id) // Set graph cache on change callback function graphCache_.set_on_change_callback([this]() { - std::unique_lock lock(this->mtx_); - this->graph_changed_ = true; + { + std::unique_lock lock(this->mtx_); + this->graph_changed_ = true; + } this->cv_.notify_one(); }); @@ -144,6 +146,7 @@ inline void GraphManager::publish_microros_graph() { return this->graph_changed_; }); + graph_changed_ = false; } if (display_on_change_) @@ -151,7 +154,6 @@ inline void GraphManager::publish_microros_graph() std::cout << "Updated uros Graph: graph changed" << std::endl; std::cout << graphCache_ << std::endl; } - graph_changed_ = false; micro_ros_msgs::msg::Graph graph_message; @@ -320,11 +322,10 @@ void GraphManager::add_participant( if (it == micro_ros_graph_datawriters_.end()) { // Create datawriter - std::unique_ptr datawriter; - datawriter.reset(publisher_->create_datawriter(ros_discovery_topic_.get(), datawriter_qos_)); + eprosima::fastdds::dds::DataWriter * datawriter = publisher_->create_datawriter(ros_discovery_topic_.get(), datawriter_qos_); it = micro_ros_graph_datawriters_.insert( - std::make_pair(participant, std::move(datawriter))).first; + std::make_pair(participant, datawriter)).first; } it->second->write(static_cast(&info)); @@ -344,8 +345,9 @@ void GraphManager::remove_participant( rmw_dds_common::convert_gid_to_msg(&gid, &info.gid); auto it = micro_ros_graph_datawriters_.find(participant); it->second->write(static_cast(&info)); + publisher_->delete_datawriter(it->second); + micro_ros_graph_datawriters_.erase(participant); } - micro_ros_graph_datawriters_.erase(participant); } void GraphManager::add_datawriter( @@ -597,7 +599,7 @@ GraphManager::ParticipantListener::ParticipantListener( } void GraphManager::ParticipantListener::on_participant_discovery( - eprosima::fastdds::dds::DomainParticipant* participant, + eprosima::fastdds::dds::DomainParticipant* /* participant */, eprosima::fastrtps::rtps::ParticipantDiscoveryInfo&& info) { switch (info.status) @@ -614,13 +616,15 @@ void GraphManager::ParticipantListener::on_participant_discovery( const std::string enclave = std::string(name_found->second.begin(), name_found->second.end()); - graphManager_from_->add_participant(participant, false, enclave); + const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", info.info.m_guid); + graphManager_from_->get_graph_cache().add_participant(gid, enclave); break; } case eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::REMOVED_PARTICIPANT: case eprosima::fastrtps::rtps::ParticipantDiscoveryInfo::DROPPED_PARTICIPANT: { - graphManager_from_->remove_participant(participant, false); + const rmw_gid_t gid = rmw_fastrtps_shared_cpp::create_rmw_gid("rmw_fastrtps_cpp", info.info.m_guid); + graphManager_from_->get_graph_cache().remove_participant(gid); break; } default: diff --git a/snap/hooks/configure b/snap/hooks/configure index d51603c..d0729c7 100755 --- a/snap/hooks/configure +++ b/snap/hooks/configure @@ -101,4 +101,4 @@ case "$daemon" in echo "'$daemon' is not a valid boolean for daemon" >&2 return 1 ;; -esac \ No newline at end of file +esac diff --git a/snap/local/fastdds_no_shared_memory.xml b/snap/local/fastdds_no_shared_memory.xml new file mode 100644 index 0000000..a4f0105 --- /dev/null +++ b/snap/local/fastdds_no_shared_memory.xml @@ -0,0 +1,19 @@ + + + + + CustomUdpTransport + UDPv4 + + + + + + + CustomUdpTransport + + + false + + + diff --git a/snap/local/micro-ros-agent-daemon b/snap/local/micro-ros-agent-daemon index 1ec437e..32dc832 100755 --- a/snap/local/micro-ros-agent-daemon +++ b/snap/local/micro-ros-agent-daemon @@ -24,4 +24,4 @@ if [ -n "$p2p_port" ]; then set -- --p2p "$p2p_port" "$@" fi -exec "$SNAP/lib/micro_ros_agent/micro_ros_agent" "$transport" "$@" +exec "$SNAP/opt/ros/snap/lib/micro_ros_agent/micro_ros_agent" "$transport" "$@" diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 21a0138..4df4e57 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -71,16 +71,6 @@ description: | $ 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 in order to establish a successful connection: @@ -120,49 +110,59 @@ architectures: - build-on: armhf - build-on: ppc64el +package-repositories: +- components: [main] + formats: [deb] + key-id: C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 + key-server: keyserver.ubuntu.com + suites: [focal] + type: apt + url: http://repo.ros2.org/ubuntu/main + parts: + ros2-foxy-extension: + build-packages: [ros-foxy-ros-core] + override-build: install -D -m 0755 launch ${SNAPCRAFT_PART_INSTALL}/snap/command-chain/ros2-launch + plugin: nil + source: $SNAPCRAFT_EXTENSIONS_DIR/ros2 uros-agent: plugin: colcon source: . - override-build: | - set +u - git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git -b $ROS_DISTRO - git clone https://github.com/eProsima/Micro-CDR.git -b $ROS_DISTRO - 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 - git clone https://github.com/micro-ROS/rmw-microxrcedds.git -b $ROS_DISTRO - git clone https://github.com/micro-ROS/micro-ROS-Agent.git -b $ROS_DISTRO - . /opt/ros/$ROS_DISTRO/setup.sh - 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 + colcon-cmake-args: + - -DMICROROSAGENT_SUPERBUILD=ON + - --cmake-force-configure + override-pull: | + snapcraftctl pull + + version="$(git describe --always --tags| sed -e 's/^v//;s/-/+git/;y/-/./')" + [ -n "$(echo $version | grep "+git")" ] && grade=devel || grade=stable + snapcraftctl set-version "$version" + snapcraftctl set-grade "$grade" + build-packages: [make, gcc, g++] stage-packages: [ros-foxy-ros2launch] + build-environment: + - ROS_VERSION: '2' + - ROS_DISTRO: foxy runner: plugin: dump source: snap/local/ organize: - '*': usr/bin/ - -plugs: - micro-ros-agent-shm-netplug: - interface: system-files - allow-auto-connection: true - write: - - /dev/shm + 'micro-ros-agent-daemon': usr/bin/ + 'fastdds_no_shared_memory.xml': usr/share/ apps: micro-ros-agent: - command: lib/micro_ros_agent/micro_ros_agent + command: opt/ros/snap/lib/micro_ros_agent/micro_ros_agent environment: - LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib" - plugs: [network, network-bind, serial-port, micro-ros-agent-shm-netplug] - extensions: [ros2-foxy] + FASTRTPS_DEFAULT_PROFILES_FILE: ${SNAP}/usr/share/fastdds_no_shared_memory.xml + plugs: [network, network-bind, serial-port] daemon: command: usr/bin/micro-ros-agent-daemon environment: - LD_LIBRARY_PATH: "$LD_LIBRARY_PATH:$SNAP/lib" + FASTRTPS_DEFAULT_PROFILES_FILE: ${SNAP}/usr/share/fastdds_no_shared_memory.xml daemon: simple - plugs: [network, network-bind, serial-port, micro-ros-agent-shm-netplug] + plugs: [network, network-bind, serial-port]