Compare commits
44 Commits
30.1.2
...
native_buf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b4d3d01c6 | ||
|
|
b6e9b4c9b4 | ||
|
|
8cd4d47ec5 | ||
|
|
f145c9ee04 | ||
|
|
dea57660b5 | ||
|
|
aea98d665a | ||
|
|
87be5fbfd4 | ||
|
|
1bf4e6a810 | ||
|
|
fc1afcb3bc | ||
|
|
b6730f9d4e | ||
|
|
9f79f40621 | ||
|
|
6ff4d83498 | ||
|
|
4d950baa15 | ||
|
|
866c56d153 | ||
|
|
6a244e3305 | ||
|
|
bddd6105c2 | ||
|
|
38cfc4c215 | ||
|
|
b009212508 | ||
|
|
c7065f7f34 | ||
|
|
db7469798f | ||
|
|
5ac7f1f024 | ||
|
|
f8a7ace7a8 | ||
|
|
fcc505f453 | ||
|
|
841a4632a4 | ||
|
|
cd86362f75 | ||
|
|
6397047d47 | ||
|
|
7f783cbf58 | ||
|
|
c85ff926d2 | ||
|
|
a4a72ac544 | ||
|
|
4e166cbed3 | ||
|
|
6cbb994aca | ||
|
|
825b4e4650 | ||
|
|
41c7f68013 | ||
|
|
02caec12c3 | ||
|
|
87a4cefb83 | ||
|
|
d3c95a6a46 | ||
|
|
1500449c11 | ||
|
|
95cb964a3b | ||
|
|
f160024ba4 | ||
|
|
e6ea37ed5a | ||
|
|
354413c060 | ||
|
|
63bdf2add4 | ||
|
|
ad019b9827 | ||
|
|
eb49444c32 |
@@ -2,6 +2,39 @@
|
||||
Changelog for package rclcpp
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
30.1.5 (2026-02-09)
|
||||
-------------------
|
||||
* remove default: so that compiler can detect the missing case. (`#3048 <https://github.com/ros2/rclcpp/issues/3048>`_)
|
||||
* use weak_ptr for rcl entities in the memory strategy. (`#2988 <https://github.com/ros2/rclcpp/issues/2988>`_)
|
||||
* remove test_static_executor_entities_collector.cpp (`#3041 <https://github.com/ros2/rclcpp/issues/3041>`_)
|
||||
* include the 1st spin that might throw the exception. (`#3042 <https://github.com/ros2/rclcpp/issues/3042>`_)
|
||||
* print warning message on owner node if the parameter operation fails. (`#3037 <https://github.com/ros2/rclcpp/issues/3037>`_)
|
||||
* fix context in wait for message wait set (`#3030 <https://github.com/ros2/rclcpp/issues/3030>`_)
|
||||
* Revert "construct wait set with passed in context (`#3021 <https://github.com/ros2/rclcpp/issues/3021>`_)" (`#3028 <https://github.com/ros2/rclcpp/issues/3028>`_)
|
||||
* construct wait set with passed in context (`#3021 <https://github.com/ros2/rclcpp/issues/3021>`_)
|
||||
* Improve the robustness of the TopicEndpointInfo constructor (`#3013 <https://github.com/ros2/rclcpp/issues/3013>`_)
|
||||
* Deprecate the shared_ptr<MessageT> subscription callback signatures (`#2975 <https://github.com/ros2/rclcpp/issues/2975>`_)
|
||||
* Contributors: Barry Xu, Maurice Alexander Purnawan, Michael Carroll, Rahat Dhande, Tomoya Fujita
|
||||
|
||||
30.1.4 (2025-12-23)
|
||||
-------------------
|
||||
* Updated deprecated ament_index_cpp API (`#3011 <https://github.com/ros2/rclcpp/issues/3011>`_)
|
||||
* Unified Node Interfaces: Add const version of get_node_x_interface() (`#3006 <https://github.com/ros2/rclcpp/issues/3006>`_)
|
||||
* Parameter Descriptor Simplification (`#2179 <https://github.com/ros2/rclcpp/issues/2179>`_)
|
||||
* ParameterEventHandler support ContentFiltering (`#2971 <https://github.com/ros2/rclcpp/issues/2971>`_)
|
||||
* update policy_name_from_kind && test_qos (`#2156 <https://github.com/ros2/rclcpp/issues/2156>`_)
|
||||
* Add ability to disable and enable subscription's callbacks (`#2985 <https://github.com/ros2/rclcpp/issues/2985>`_)
|
||||
* Switch to isolated testing via rmw_test_fixture (`#2929 <https://github.com/ros2/rclcpp/issues/2929>`_)
|
||||
* remove I/O from signal handler. (`#2986 <https://github.com/ros2/rclcpp/issues/2986>`_)
|
||||
* Contributors: Alejandro Hernández Cordero, Andrianov Roman, Barry Xu, Lucas Wendland, Michael Orlov, Tomoya Fujita, fabianhirmann, yadunund
|
||||
|
||||
30.1.3 (2025-11-18)
|
||||
-------------------
|
||||
* correct test function descriptions (`#2970 <https://github.com/ros2/rclcpp/issues/2970>`_)
|
||||
* add : get clients, servers info (`#2569 <https://github.com/ros2/rclcpp/issues/2569>`_)
|
||||
* Fix REP url locations (`#2987 <https://github.com/ros2/rclcpp/issues/2987>`_)
|
||||
* Contributors: Minju, Lee, Tim Clephas, Yuchen966
|
||||
|
||||
30.1.2 (2025-10-21)
|
||||
-------------------
|
||||
* clear handles before node destruction in test_memory_strategy. (`#2969 <https://github.com/ros2/rclcpp/issues/2969>`_)
|
||||
|
||||
@@ -103,6 +103,7 @@ set(${PROJECT_NAME}_SRCS
|
||||
src/rclcpp/node_options.cpp
|
||||
src/rclcpp/parameter.cpp
|
||||
src/rclcpp/parameter_client.cpp
|
||||
src/rclcpp/parameter_descriptor_wrapper.cpp
|
||||
src/rclcpp/parameter_event_handler.cpp
|
||||
src/rclcpp/parameter_events_filter.cpp
|
||||
src/rclcpp/parameter_map.cpp
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
This document is a declaration of software quality for the `rclcpp` package, based on the guidelines in [REP-2004](https://www.ros.org/reps/rep-2004.html).
|
||||
This document is a declaration of software quality for the `rclcpp` package, based on the guidelines in [REP-2004](https://reps.openrobotics.org/rep-2004/).
|
||||
|
||||
# rclcpp Quality Declaration
|
||||
|
||||
The package `rclcpp` claims to be in the **Quality Level 1** category when it is used with a **Quality Level 1** middleware.
|
||||
|
||||
Below are the rationales, notes, and caveats for this claim, organized by each requirement listed in the [Package Requirements for Quality Level 1 in REP-2004](https://www.ros.org/reps/rep-2004.html).
|
||||
Below are the rationales, notes, and caveats for this claim, organized by each requirement listed in the [Package Requirements for Quality Level 1 in REP-2004](https://reps.openrobotics.org/rep-2004/).
|
||||
|
||||
## Version Policy [1]
|
||||
|
||||
@@ -55,7 +55,7 @@ All pull requests will be peer-reviewed, check [ROS 2 Developer Guide](https://d
|
||||
|
||||
### Continuous Integration [2.iv]
|
||||
|
||||
All pull requests must pass CI on all [tier 1 platforms](https://www.ros.org/reps/rep-2000.html#support-tiers)
|
||||
All pull requests must pass CI on all [tier 1 platforms](https://reps.openrobotics.org/rep-2000/#support-tiers)
|
||||
|
||||
Currently nightly results can be seen here:
|
||||
|
||||
@@ -213,7 +213,7 @@ It is **Quality Level 1**, see its [Quality Declaration document](https://github
|
||||
|
||||
## Platform Support [6]
|
||||
|
||||
`rclcpp` supports all of the tier 1 platforms as described in [REP-2000](https://www.ros.org/reps/rep-2000.html#support-tiers), and tests each change against all of them.
|
||||
`rclcpp` supports all of the tier 1 platforms as described in [REP-2000](https://reps.openrobotics.org/rep-2000/#support-tiers), and tests each change against all of them.
|
||||
|
||||
Currently nightly build status can be seen here:
|
||||
* [linux-aarch64_release](https://ci.ros2.org/view/nightly/job/nightly_linux-aarch64_release/lastBuild/rclcpp/)
|
||||
@@ -225,4 +225,4 @@ Currently nightly build status can be seen here:
|
||||
|
||||
### Vulnerability Disclosure Policy [7.i]
|
||||
|
||||
This package conforms to the Vulnerability Disclosure Policy in [REP-2006](https://www.ros.org/reps/rep-2006.html).
|
||||
This package conforms to the Vulnerability Disclosure Policy in [REP-2006](https://reps.openrobotics.org/rep-2006/).
|
||||
|
||||
@@ -27,10 +27,39 @@ namespace rclcpp
|
||||
namespace allocator
|
||||
{
|
||||
|
||||
template<typename T>
|
||||
using clean_t = std::remove_cv_t<std::remove_reference_t<T>>;
|
||||
|
||||
// Primary template: false
|
||||
template<typename, typename = std::void_t<>>
|
||||
struct has_get_rcl_allocator : std::false_type {};
|
||||
|
||||
// Specialization: true if expression is valid
|
||||
template<typename T>
|
||||
struct has_get_rcl_allocator<T,
|
||||
std::void_t<
|
||||
decltype(std::declval<clean_t<T> &>().get_rcl_allocator())
|
||||
>
|
||||
>
|
||||
: std::bool_constant<
|
||||
std::is_same_v<
|
||||
decltype(std::declval<clean_t<T> &>().get_rcl_allocator()),
|
||||
rcl_allocator_t
|
||||
>
|
||||
>
|
||||
{};
|
||||
|
||||
// Helper variable template
|
||||
template<typename T>
|
||||
inline constexpr bool has_get_rcl_allocator_v =
|
||||
has_get_rcl_allocator<T>::value;
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
using AllocRebind = typename std::allocator_traits<Alloc>::template rebind_traits<T>;
|
||||
|
||||
template<typename Alloc>
|
||||
[[deprecated("Conversion of C++ allocators to C style is not valid, as the size on deallocate"
|
||||
"can not be determined. This will be remove in future versions of ros.")]]
|
||||
void * retyped_allocate(size_t size, void * untyped_allocator)
|
||||
{
|
||||
auto typed_allocator = static_cast<Alloc *>(untyped_allocator);
|
||||
@@ -41,6 +70,8 @@ void * retyped_allocate(size_t size, void * untyped_allocator)
|
||||
}
|
||||
|
||||
template<typename Alloc>
|
||||
[[deprecated("Conversion of C++ allocators to C style is not valid, as the size on deallocate"
|
||||
"can not be determined. This will be remove in future versions of ros.")]]
|
||||
void * retyped_zero_allocate(size_t number_of_elem, size_t size_of_elem, void * untyped_allocator)
|
||||
{
|
||||
auto typed_allocator = static_cast<Alloc *>(untyped_allocator);
|
||||
@@ -57,6 +88,8 @@ void * retyped_zero_allocate(size_t number_of_elem, size_t size_of_elem, void *
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
[[deprecated("Conversion of C++ allocators to C style is not valid, as the size on deallocate"
|
||||
"can not be determined. This will be remove in future versions of ros.")]]
|
||||
void retyped_deallocate(void * untyped_pointer, void * untyped_allocator)
|
||||
{
|
||||
auto typed_allocator = static_cast<Alloc *>(untyped_allocator);
|
||||
@@ -68,6 +101,8 @@ void retyped_deallocate(void * untyped_pointer, void * untyped_allocator)
|
||||
}
|
||||
|
||||
template<typename T, typename Alloc>
|
||||
[[deprecated("Conversion of C++ allocators to C style is not valid, as the size on deallocate"
|
||||
"can not be determined. This will be remove in future versions of ros.")]]
|
||||
void * retyped_reallocate(void * untyped_pointer, size_t size, void * untyped_allocator)
|
||||
{
|
||||
auto typed_allocator = static_cast<Alloc *>(untyped_allocator);
|
||||
@@ -85,6 +120,9 @@ template<
|
||||
typename T,
|
||||
typename Alloc,
|
||||
typename std::enable_if<!std::is_same<Alloc, std::allocator<void>>::value>::type * = nullptr>
|
||||
[[deprecated("Conversion of C++ allocators to C style is not valid, as the size on deallocate"
|
||||
"can not be determined. This will be remove in future versions of ros. To suppress this warning"
|
||||
"define the method 'rcl_allocator_t get_rcl_allocator()' on your allocator")]]
|
||||
rcl_allocator_t get_rcl_allocator(Alloc & allocator)
|
||||
{
|
||||
rcl_allocator_t rcl_allocator = rcl_get_default_allocator();
|
||||
|
||||
@@ -15,8 +15,10 @@
|
||||
#ifndef RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
|
||||
#define RCLCPP__ANY_SUBSCRIPTION_CALLBACK_HPP_
|
||||
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
#include <stdexcept>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
@@ -375,7 +377,19 @@ public:
|
||||
allocator::set_allocator_for_deleter(&ros_message_type_deleter_, &ros_message_type_allocator_);
|
||||
}
|
||||
|
||||
AnySubscriptionCallback(const AnySubscriptionCallback &) = default;
|
||||
AnySubscriptionCallback(const AnySubscriptionCallback & other)
|
||||
: callback_variant_(other.callback_variant_),
|
||||
callback_disabled_(other.callback_disabled_.load()),
|
||||
subscribed_type_allocator_(other.subscribed_type_allocator_),
|
||||
subscribed_type_deleter_(other.subscribed_type_deleter_),
|
||||
ros_message_type_allocator_(other.ros_message_type_allocator_),
|
||||
ros_message_type_deleter_(other.ros_message_type_deleter_),
|
||||
serialized_message_allocator_(other.serialized_message_allocator_),
|
||||
serialized_message_deleter_(other.serialized_message_deleter_)
|
||||
{
|
||||
allocator::set_allocator_for_deleter(&subscribed_type_deleter_, &subscribed_type_allocator_);
|
||||
allocator::set_allocator_for_deleter(&ros_message_type_deleter_, &ros_message_type_allocator_);
|
||||
}
|
||||
|
||||
/// Generic function for setting the callback.
|
||||
/**
|
||||
@@ -393,12 +407,91 @@ public:
|
||||
// converted to one another, e.g. shared_ptr and unique_ptr.
|
||||
using scbth = detail::SubscriptionCallbackTypeHelper<MessageT, CallbackT>;
|
||||
|
||||
callback_variant_ = static_cast<typename scbth::callback_type>(callback);
|
||||
// Determine if the given CallbackT is a deprecated signature or not.
|
||||
constexpr auto is_deprecated =
|
||||
rclcpp::function_traits::same_arguments<
|
||||
typename scbth::callback_type,
|
||||
std::function<void(std::shared_ptr<SubscribedType>)>
|
||||
>::value ||
|
||||
rclcpp::function_traits::same_arguments<
|
||||
typename scbth::callback_type,
|
||||
std::function<void(std::shared_ptr<SubscribedType>, const rclcpp::MessageInfo &)>
|
||||
>::value ||
|
||||
rclcpp::function_traits::same_arguments<
|
||||
typename scbth::callback_type,
|
||||
std::function<void(std::shared_ptr<ROSMessageType>)>
|
||||
>::value ||
|
||||
rclcpp::function_traits::same_arguments<
|
||||
typename scbth::callback_type,
|
||||
std::function<void(std::shared_ptr<ROSMessageType>, const rclcpp::MessageInfo &)>
|
||||
>::value ||
|
||||
rclcpp::function_traits::same_arguments<
|
||||
typename scbth::callback_type,
|
||||
std::function<void(std::shared_ptr<rclcpp::SerializedMessage>)>
|
||||
>::value ||
|
||||
rclcpp::function_traits::same_arguments<
|
||||
typename scbth::callback_type,
|
||||
std::function<void(std::shared_ptr<rclcpp::SerializedMessage>, const rclcpp::MessageInfo &)>
|
||||
>::value;
|
||||
|
||||
// Use the discovered type to force the type of callback when assigning
|
||||
// into the variant.
|
||||
if constexpr (is_deprecated) {
|
||||
// If deprecated, call sub-routine that is deprecated.
|
||||
set_deprecated(static_cast<typename scbth::callback_type>(callback));
|
||||
} else {
|
||||
// Otherwise just assign it.
|
||||
callback_variant_ = static_cast<typename scbth::callback_type>(callback);
|
||||
}
|
||||
|
||||
// Return copy of self for easier testing, normally will be compiled out.
|
||||
return *this;
|
||||
}
|
||||
|
||||
/// Function for shared_ptr to non-const MessageT, which is deprecated.
|
||||
template<typename SetT>
|
||||
// *INDENT-OFF*
|
||||
#if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
|
||||
// suppress deprecation warnings in `test_any_subscription_callback.cpp`
|
||||
[[deprecated("use 'void(std::shared_ptr<const MessageT>)' instead")]]
|
||||
#endif
|
||||
// *INDENT-ON*
|
||||
void
|
||||
set_deprecated(std::function<void(std::shared_ptr<SetT>)> callback)
|
||||
{
|
||||
callback_variant_ = callback;
|
||||
}
|
||||
|
||||
/// Function for shared_ptr to non-const MessageT with MessageInfo, which is deprecated.
|
||||
template<typename SetT>
|
||||
// *INDENT-OFF*
|
||||
#if !defined(RCLCPP_AVOID_DEPRECATIONS_FOR_UNIT_TESTS)
|
||||
// suppress deprecation warnings in `test_any_subscription_callback.cpp`
|
||||
[[deprecated(
|
||||
"use 'void(std::shared_ptr<const MessageT>, const rclcpp::MessageInfo &)' instead"
|
||||
)]]
|
||||
#endif
|
||||
// *INDENT-ON*
|
||||
void
|
||||
set_deprecated(std::function<void(std::shared_ptr<SetT>, const rclcpp::MessageInfo &)> callback)
|
||||
{
|
||||
callback_variant_ = callback;
|
||||
}
|
||||
|
||||
/// Disable the callback from being called during dispatch.
|
||||
void disable()
|
||||
{
|
||||
std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
|
||||
callback_disabled_.store(true);
|
||||
}
|
||||
|
||||
/// Enable the callback to be called during dispatch.
|
||||
void enable()
|
||||
{
|
||||
std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
|
||||
callback_disabled_.store(false);
|
||||
}
|
||||
|
||||
std::unique_ptr<ROSMessageType, ROSMessageTypeDeleter>
|
||||
create_ros_unique_ptr_from_ros_shared_ptr_message(
|
||||
const std::shared_ptr<const ROSMessageType> & message)
|
||||
@@ -469,6 +562,10 @@ public:
|
||||
std::shared_ptr<ROSMessageType> message,
|
||||
const rclcpp::MessageInfo & message_info)
|
||||
{
|
||||
std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
|
||||
if (callback_disabled_.load()) {
|
||||
return;
|
||||
}
|
||||
TRACETOOLS_TRACEPOINT(callback_start, static_cast<const void *>(this), false);
|
||||
// Check if the variant is "unset", throw if it is.
|
||||
if (callback_variant_.index() == 0) {
|
||||
@@ -569,6 +666,10 @@ public:
|
||||
std::shared_ptr<const rclcpp::SerializedMessage> serialized_message,
|
||||
const rclcpp::MessageInfo & message_info)
|
||||
{
|
||||
std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
|
||||
if (callback_disabled_.load()) {
|
||||
return;
|
||||
}
|
||||
TRACETOOLS_TRACEPOINT(callback_start, static_cast<const void *>(this), false);
|
||||
// Check if the variant is "unset", throw if it is.
|
||||
if (callback_variant_.index() == 0) {
|
||||
@@ -648,6 +749,10 @@ public:
|
||||
std::shared_ptr<const SubscribedType> message,
|
||||
const rclcpp::MessageInfo & message_info)
|
||||
{
|
||||
std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
|
||||
if (callback_disabled_.load()) {
|
||||
return;
|
||||
}
|
||||
TRACETOOLS_TRACEPOINT(callback_start, static_cast<const void *>(this), true);
|
||||
// Check if the variant is "unset", throw if it is.
|
||||
if (callback_variant_.index() == 0) {
|
||||
@@ -778,6 +883,10 @@ public:
|
||||
std::unique_ptr<SubscribedType, SubscribedTypeDeleter> message,
|
||||
const rclcpp::MessageInfo & message_info)
|
||||
{
|
||||
std::unique_lock<std::recursive_mutex> callback_lock(callback_mutex_);
|
||||
if (callback_disabled_.load()) {
|
||||
return;
|
||||
}
|
||||
TRACETOOLS_TRACEPOINT(callback_start, static_cast<const void *>(this), true);
|
||||
// Check if the variant is "unset", throw if it is.
|
||||
if (callback_variant_.index() == 0) {
|
||||
@@ -972,6 +1081,8 @@ private:
|
||||
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p2162r0.html
|
||||
// For now, compose the variant into this class as a private attribute.
|
||||
typename HelperT::variant_type callback_variant_;
|
||||
std::recursive_mutex callback_mutex_;
|
||||
std::atomic_bool callback_disabled_{false};
|
||||
|
||||
SubscribedTypeAllocator subscribed_type_allocator_;
|
||||
SubscribedTypeDeleter subscribed_type_deleter_;
|
||||
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
explicit CallbackGroup(
|
||||
CallbackGroupType group_type,
|
||||
rclcpp::Context::WeakPtr context,
|
||||
const rclcpp::Context::WeakPtr & context,
|
||||
bool automatically_add_to_executor_with_node = true);
|
||||
|
||||
/// Default destructor.
|
||||
@@ -106,35 +106,35 @@ public:
|
||||
|
||||
template<typename Function>
|
||||
rclcpp::SubscriptionBase::SharedPtr
|
||||
find_subscription_ptrs_if(Function func) const
|
||||
find_subscription_ptrs_if(const Function & func) const
|
||||
{
|
||||
return _find_ptrs_if_impl<rclcpp::SubscriptionBase, Function>(func, subscription_ptrs_);
|
||||
}
|
||||
|
||||
template<typename Function>
|
||||
rclcpp::TimerBase::SharedPtr
|
||||
find_timer_ptrs_if(Function func) const
|
||||
find_timer_ptrs_if(const Function & func) const
|
||||
{
|
||||
return _find_ptrs_if_impl<rclcpp::TimerBase, Function>(func, timer_ptrs_);
|
||||
}
|
||||
|
||||
template<typename Function>
|
||||
rclcpp::ServiceBase::SharedPtr
|
||||
find_service_ptrs_if(Function func) const
|
||||
find_service_ptrs_if(const Function & func) const
|
||||
{
|
||||
return _find_ptrs_if_impl<rclcpp::ServiceBase, Function>(func, service_ptrs_);
|
||||
}
|
||||
|
||||
template<typename Function>
|
||||
rclcpp::ClientBase::SharedPtr
|
||||
find_client_ptrs_if(Function func) const
|
||||
find_client_ptrs_if(const Function & func) const
|
||||
{
|
||||
return _find_ptrs_if_impl<rclcpp::ClientBase, Function>(func, client_ptrs_);
|
||||
}
|
||||
|
||||
template<typename Function>
|
||||
rclcpp::Waitable::SharedPtr
|
||||
find_waitable_ptrs_if(Function func) const
|
||||
find_waitable_ptrs_if(const Function & func) const
|
||||
{
|
||||
return _find_ptrs_if_impl<rclcpp::Waitable, Function>(func, waitable_ptrs_);
|
||||
}
|
||||
@@ -179,11 +179,11 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
collect_all_ptrs(
|
||||
std::function<void(const rclcpp::SubscriptionBase::SharedPtr &)> sub_func,
|
||||
std::function<void(const rclcpp::ServiceBase::SharedPtr &)> service_func,
|
||||
std::function<void(const rclcpp::ClientBase::SharedPtr &)> client_func,
|
||||
std::function<void(const rclcpp::TimerBase::SharedPtr &)> timer_func,
|
||||
std::function<void(const rclcpp::Waitable::SharedPtr &)> waitable_func) const;
|
||||
const std::function<void(const rclcpp::SubscriptionBase::SharedPtr &)> & sub_func,
|
||||
const std::function<void(const rclcpp::ServiceBase::SharedPtr &)> & service_func,
|
||||
const std::function<void(const rclcpp::ClientBase::SharedPtr &)> & client_func,
|
||||
const std::function<void(const rclcpp::TimerBase::SharedPtr &)> & timer_func,
|
||||
const std::function<void(const rclcpp::Waitable::SharedPtr &)> & waitable_func) const;
|
||||
|
||||
/// Return a reference to the 'associated with executor' atomic boolean.
|
||||
/**
|
||||
@@ -228,31 +228,31 @@ protected:
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_publisher(const rclcpp::PublisherBase::SharedPtr publisher_ptr);
|
||||
add_publisher(const rclcpp::PublisherBase::SharedPtr & publisher_ptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_subscription(const rclcpp::SubscriptionBase::SharedPtr subscription_ptr);
|
||||
add_subscription(const rclcpp::SubscriptionBase::SharedPtr & subscription_ptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_timer(const rclcpp::TimerBase::SharedPtr timer_ptr);
|
||||
add_timer(const rclcpp::TimerBase::SharedPtr & timer_ptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_service(const rclcpp::ServiceBase::SharedPtr service_ptr);
|
||||
add_service(const rclcpp::ServiceBase::SharedPtr & service_ptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_client(const rclcpp::ClientBase::SharedPtr client_ptr);
|
||||
add_client(const rclcpp::ClientBase::SharedPtr & client_ptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_waitable(const rclcpp::Waitable::SharedPtr waitable_ptr);
|
||||
add_waitable(const rclcpp::Waitable::SharedPtr & waitable_ptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
remove_waitable(const rclcpp::Waitable::SharedPtr waitable_ptr) noexcept;
|
||||
remove_waitable(const rclcpp::Waitable::SharedPtr & waitable_ptr) noexcept;
|
||||
|
||||
CallbackGroupType type_;
|
||||
// Mutex to protect the subsequent vectors of pointers.
|
||||
@@ -274,7 +274,7 @@ protected:
|
||||
private:
|
||||
template<typename TypeT, typename Function>
|
||||
typename TypeT::SharedPtr _find_ptrs_if_impl(
|
||||
Function func, const std::vector<typename TypeT::WeakPtr> & vect_ptrs) const
|
||||
const Function & func, const std::vector<typename TypeT::WeakPtr> & vect_ptrs) const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
for (auto & weak_ptr : vect_ptrs) {
|
||||
|
||||
@@ -145,7 +145,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
ClientBase(
|
||||
rclcpp::node_interfaces::NodeBaseInterface * node_base,
|
||||
rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph);
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
virtual ~ClientBase() = default;
|
||||
@@ -221,7 +221,8 @@ public:
|
||||
virtual std::shared_ptr<void> create_response() = 0;
|
||||
virtual std::shared_ptr<rmw_request_id_t> create_request_header() = 0;
|
||||
virtual void handle_response(
|
||||
std::shared_ptr<rmw_request_id_t> request_header, std::shared_ptr<void> response) = 0;
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & response) = 0;
|
||||
|
||||
/// Exchange the "in use by wait set" state for this client.
|
||||
/**
|
||||
@@ -296,7 +297,7 @@ public:
|
||||
* \param[in] callback functor to be called when a new response is received
|
||||
*/
|
||||
void
|
||||
set_on_new_response_callback(std::function<void(size_t)> callback)
|
||||
set_on_new_response_callback(const std::function<void(size_t)> & callback)
|
||||
{
|
||||
if (!callback) {
|
||||
throw std::invalid_argument(
|
||||
@@ -477,7 +478,7 @@ public:
|
||||
*/
|
||||
Client(
|
||||
rclcpp::node_interfaces::NodeBaseInterface * node_base,
|
||||
rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph,
|
||||
const std::string & service_name,
|
||||
rcl_client_options_t & client_options)
|
||||
: ClientBase(node_base, node_graph),
|
||||
@@ -556,8 +557,8 @@ public:
|
||||
*/
|
||||
void
|
||||
handle_response(
|
||||
std::shared_ptr<rmw_request_id_t> request_header,
|
||||
std::shared_ptr<void> response) override
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & response) override
|
||||
{
|
||||
std::optional<CallbackInfoVariant>
|
||||
optional_pending_request = this->get_and_erase_pending_request(request_header->sequence_number);
|
||||
@@ -566,7 +567,7 @@ public:
|
||||
}
|
||||
auto & value = *optional_pending_request;
|
||||
auto typed_response = std::static_pointer_cast<typename ServiceT::Response>(
|
||||
std::move(response));
|
||||
response);
|
||||
if (std::holds_alternative<Promise>(value)) {
|
||||
auto & promise = std::get<Promise>(value);
|
||||
promise.set_value(std::move(typed_response));
|
||||
@@ -617,7 +618,7 @@ public:
|
||||
* \return a FutureAndRequestId instance.
|
||||
*/
|
||||
FutureAndRequestId
|
||||
async_send_request(SharedRequest request)
|
||||
async_send_request(const SharedRequest & request)
|
||||
{
|
||||
Promise promise;
|
||||
auto future = promise.get_future();
|
||||
@@ -652,7 +653,7 @@ public:
|
||||
>::type * = nullptr
|
||||
>
|
||||
SharedFutureAndRequestId
|
||||
async_send_request(SharedRequest request, CallbackT && cb)
|
||||
async_send_request(const SharedRequest & request, CallbackT && cb)
|
||||
{
|
||||
Promise promise;
|
||||
auto shared_future = promise.get_future().share();
|
||||
@@ -683,7 +684,7 @@ public:
|
||||
>::type * = nullptr
|
||||
>
|
||||
SharedFutureWithRequestAndRequestId
|
||||
async_send_request(SharedRequest request, CallbackT && cb)
|
||||
async_send_request(const SharedRequest & request, CallbackT && cb)
|
||||
{
|
||||
PromiseWithRequest promise;
|
||||
auto shared_future = promise.get_future().share();
|
||||
@@ -795,7 +796,7 @@ public:
|
||||
*/
|
||||
void
|
||||
configure_introspection(
|
||||
Clock::SharedPtr clock, const QoS & qos_service_event_pub,
|
||||
const Clock::SharedPtr & clock, const QoS & qos_service_event_pub,
|
||||
rcl_service_introspection_state_t introspection_state)
|
||||
{
|
||||
rcl_publisher_options_t pub_opts = rcl_publisher_get_default_options();
|
||||
|
||||
@@ -117,8 +117,8 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
sleep_until(
|
||||
Time until,
|
||||
Context::SharedPtr context = contexts::get_global_default_context());
|
||||
const Time & until,
|
||||
const Context::SharedPtr & context = contexts::get_global_default_context());
|
||||
|
||||
/**
|
||||
* Sleep for a specified Duration.
|
||||
@@ -141,8 +141,8 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
sleep_for(
|
||||
Duration rel_time,
|
||||
Context::SharedPtr context = contexts::get_global_default_context());
|
||||
const Duration & rel_time,
|
||||
const Context::SharedPtr & context = contexts::get_global_default_context());
|
||||
|
||||
/**
|
||||
* Check if the clock is started.
|
||||
@@ -168,7 +168,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
wait_until_started(Context::SharedPtr context = contexts::get_global_default_context());
|
||||
wait_until_started(const Context::SharedPtr & context = contexts::get_global_default_context());
|
||||
|
||||
/**
|
||||
* Wait for clock to start, with timeout.
|
||||
@@ -186,7 +186,7 @@ public:
|
||||
bool
|
||||
wait_until_started(
|
||||
const rclcpp::Duration & timeout,
|
||||
Context::SharedPtr context = contexts::get_global_default_context(),
|
||||
const Context::SharedPtr & context = contexts::get_global_default_context(),
|
||||
const rclcpp::Duration & wait_tick_ns = rclcpp::Duration(0, static_cast<uint32_t>(1e7)));
|
||||
|
||||
/**
|
||||
@@ -238,8 +238,8 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
JumpHandler::SharedPtr
|
||||
create_jump_callback(
|
||||
JumpHandler::pre_callback_t pre_callback,
|
||||
JumpHandler::post_callback_t post_callback,
|
||||
const JumpHandler::pre_callback_t & pre_callback,
|
||||
const JumpHandler::post_callback_t & post_callback,
|
||||
const rcl_jump_threshold_t & threshold);
|
||||
|
||||
private:
|
||||
@@ -327,7 +327,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
ClockConditionalVariable(
|
||||
const rclcpp::Clock::SharedPtr & clock,
|
||||
rclcpp::Context::SharedPtr context = rclcpp::contexts::get_global_default_context());
|
||||
const rclcpp::Context::SharedPtr & context = rclcpp::contexts::get_global_default_context());
|
||||
RCLCPP_PUBLIC
|
||||
~ClockConditionalVariable();
|
||||
|
||||
@@ -347,7 +347,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
wait_until(
|
||||
std::unique_lock<std::mutex> & lock, rclcpp::Time until,
|
||||
std::unique_lock<std::mutex> & lock, const rclcpp::Time & until,
|
||||
const std::function<bool ()> & pred);
|
||||
|
||||
/**
|
||||
|
||||
@@ -229,7 +229,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
OnShutdownCallback
|
||||
on_shutdown(OnShutdownCallback callback);
|
||||
on_shutdown(const OnShutdownCallback & callback);
|
||||
|
||||
/// Add a on_shutdown callback to be called when shutdown is called for this context.
|
||||
/**
|
||||
@@ -253,7 +253,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
OnShutdownCallbackHandle
|
||||
add_on_shutdown_callback(OnShutdownCallback callback);
|
||||
add_on_shutdown_callback(const OnShutdownCallback & callback);
|
||||
|
||||
/// Remove an registered on_shutdown callbacks.
|
||||
/**
|
||||
@@ -280,7 +280,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
PreShutdownCallbackHandle
|
||||
add_pre_shutdown_callback(PreShutdownCallback callback);
|
||||
add_pre_shutdown_callback(const PreShutdownCallback & callback);
|
||||
|
||||
/// Remove an registered pre_shutdown callback.
|
||||
/**
|
||||
@@ -417,7 +417,7 @@ private:
|
||||
RCLCPP_LOCAL
|
||||
ShutdownCallbackHandle
|
||||
add_shutdown_callback(
|
||||
ShutdownCallback callback);
|
||||
const ShutdownCallback & callback);
|
||||
|
||||
template<ShutdownType shutdown_type>
|
||||
RCLCPP_LOCAL
|
||||
|
||||
@@ -46,13 +46,13 @@ namespace rclcpp
|
||||
RCLCPP_PUBLIC
|
||||
rclcpp::GenericClient::SharedPtr
|
||||
create_generic_client(
|
||||
std::shared_ptr<node_interfaces::NodeBaseInterface> node_base,
|
||||
std::shared_ptr<node_interfaces::NodeGraphInterface> node_graph,
|
||||
std::shared_ptr<node_interfaces::NodeServicesInterface> node_services,
|
||||
const std::shared_ptr<node_interfaces::NodeBaseInterface> & node_base,
|
||||
const std::shared_ptr<node_interfaces::NodeGraphInterface> & node_graph,
|
||||
const std::shared_ptr<node_interfaces::NodeServicesInterface> & node_services,
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
const rclcpp::QoS & qos = rclcpp::ServicesQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr);
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = rclcpp::CallbackGroup::SharedPtr());
|
||||
|
||||
/// Create a generic service client with a name of given type.
|
||||
/**
|
||||
|
||||
@@ -270,8 +270,8 @@ apply_qos_override(
|
||||
RCLCPP_DETAIL_APPLY_QOS_OVERRIDE_FROM_PARAMETER_STRING(
|
||||
reliability, RELIABILITY, value, qos);
|
||||
break;
|
||||
default:
|
||||
throw std::invalid_argument{"unknown QosPolicyKind"};
|
||||
case QosPolicyKind::Invalid:
|
||||
throw std::invalid_argument{"invalid QosPolicyKind"};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -332,9 +332,11 @@ get_default_qos_param_value(rclcpp::QosPolicyKind kind, const rclcpp::QoS & qos)
|
||||
return ParameterValue(
|
||||
check_if_stringified_policy_is_null(
|
||||
rmw_qos_reliability_policy_to_str(rmw_qos.reliability), kind));
|
||||
default:
|
||||
throw std::invalid_argument{"unknown QoS policy kind"};
|
||||
case QosPolicyKind::Invalid:
|
||||
throw std::invalid_argument{"invalid QoS policy kind"};
|
||||
}
|
||||
|
||||
return ParameterValue();
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
@@ -29,7 +29,7 @@ template<typename OptionsT, typename NodeBaseT>
|
||||
bool
|
||||
resolve_enable_topic_statistics(const OptionsT & options, const NodeBaseT & node_base)
|
||||
{
|
||||
bool topic_stats_enabled;
|
||||
bool topic_stats_enabled = false;
|
||||
switch (options.topic_stats_options.state) {
|
||||
case TopicStatisticsState::Enable:
|
||||
topic_stats_enabled = true;
|
||||
|
||||
@@ -30,7 +30,7 @@ template<typename OptionsT, typename NodeBaseT>
|
||||
bool
|
||||
resolve_use_intra_process(const OptionsT & options, const NodeBaseT & node_base)
|
||||
{
|
||||
bool use_intra_process;
|
||||
bool use_intra_process = false;
|
||||
switch (options.use_intra_process_comm) {
|
||||
case IntraProcessSetting::Enable:
|
||||
use_intra_process = true;
|
||||
@@ -43,7 +43,6 @@ resolve_use_intra_process(const OptionsT & options, const NodeBaseT & node_base)
|
||||
break;
|
||||
default:
|
||||
throw std::runtime_error("Unrecognized IntraProcessSetting value");
|
||||
break;
|
||||
}
|
||||
|
||||
return use_intra_process;
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#ifndef RCLCPP__EVENT_HANDLER_HPP_
|
||||
#define RCLCPP__EVENT_HANDLER_HPP_
|
||||
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <mutex>
|
||||
@@ -110,6 +111,14 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
virtual ~EventHandlerBase();
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
void enable() = 0;
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
void disable() = 0;
|
||||
|
||||
/// Get the number of ready events
|
||||
RCLCPP_PUBLIC
|
||||
size_t
|
||||
@@ -192,7 +201,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_event_callback_mutex_);
|
||||
|
||||
// Set it temporarily to the new callback, while we replace the old one.
|
||||
// This two-step setting, prevents a gap where the old std::function has
|
||||
@@ -215,7 +224,7 @@ public:
|
||||
void
|
||||
clear_on_ready_callback() override
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_event_callback_mutex_);
|
||||
if (on_new_event_callback_) {
|
||||
set_on_new_event_callback(nullptr, nullptr);
|
||||
on_new_event_callback_ = nullptr;
|
||||
@@ -234,7 +243,7 @@ protected:
|
||||
void
|
||||
set_on_new_event_callback(rcl_event_callback_t callback, const void * user_data);
|
||||
|
||||
std::recursive_mutex callback_mutex_;
|
||||
std::recursive_mutex on_new_event_callback_mutex_;
|
||||
std::function<void(size_t)> on_new_event_callback_{nullptr};
|
||||
|
||||
rcl_event_t event_handle_;
|
||||
@@ -302,6 +311,10 @@ public:
|
||||
void
|
||||
execute(const std::shared_ptr<void> & data) override
|
||||
{
|
||||
std::unique_lock<std::mutex> event_callback_lock(event_callback_mutex_);
|
||||
if (disabled_.load()) {
|
||||
return;
|
||||
}
|
||||
if (!data) {
|
||||
throw std::runtime_error("'data' is empty");
|
||||
}
|
||||
@@ -310,12 +323,53 @@ public:
|
||||
callback_ptr.reset();
|
||||
}
|
||||
|
||||
/// Disable the event callback from being called when execute(..) invoked
|
||||
/**
|
||||
* This will also temporarily remove the on_new_event_callback from the underlying rmw layer,
|
||||
* so that it is not called from the middleware while disabled.
|
||||
*/
|
||||
void disable() override
|
||||
{
|
||||
{
|
||||
// Temporary remove the on_new_event_callback_ to prevent it from being called
|
||||
std::lock_guard<std::recursive_mutex> on_new_event_lock(on_new_event_callback_mutex_);
|
||||
if (on_new_event_callback_) {
|
||||
set_on_new_event_callback(nullptr, nullptr);
|
||||
}
|
||||
}
|
||||
std::lock_guard<std::mutex> event_callback_lock(event_callback_mutex_);
|
||||
disabled_.store(true);
|
||||
}
|
||||
|
||||
/// Enable the event callback to be called when execute(..) invoked
|
||||
/**
|
||||
* This will also set back the on_new_event_callback to the underlying rmw layer, if it was
|
||||
* previously removed with disable().
|
||||
*/
|
||||
void enable() override
|
||||
{
|
||||
{
|
||||
// Set callback again if it was previously removed in disable()
|
||||
std::lock_guard<std::recursive_mutex> on_new_event_lock(on_new_event_callback_mutex_);
|
||||
if (on_new_event_callback_) {
|
||||
set_on_new_event_callback(
|
||||
rclcpp::detail::cpp_callback_trampoline<
|
||||
decltype(on_new_event_callback_), const void *, size_t>,
|
||||
static_cast<const void *>(&on_new_event_callback_));
|
||||
}
|
||||
}
|
||||
std::lock_guard<std::mutex> event_callback_lock(event_callback_mutex_);
|
||||
disabled_.store(false);
|
||||
}
|
||||
|
||||
private:
|
||||
using EventCallbackInfoT = typename std::remove_reference<typename
|
||||
rclcpp::function_traits::function_traits<EventCallbackT>::template argument_type<0>>::type;
|
||||
|
||||
ParentHandleT parent_handle_;
|
||||
EventCallbackT event_callback_;
|
||||
std::mutex event_callback_mutex_;
|
||||
std::atomic_bool disabled_{false};
|
||||
};
|
||||
} // namespace rclcpp
|
||||
|
||||
|
||||
@@ -102,8 +102,8 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
add_callback_group(
|
||||
rclcpp::CallbackGroup::SharedPtr group_ptr,
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group_ptr,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
bool notify = true);
|
||||
|
||||
/// Get callback groups that belong to executor.
|
||||
@@ -173,7 +173,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
remove_callback_group(
|
||||
rclcpp::CallbackGroup::SharedPtr group_ptr,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group_ptr,
|
||||
bool notify = true);
|
||||
|
||||
/// Add a node to the executor.
|
||||
@@ -197,7 +197,9 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
add_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr, bool notify = true);
|
||||
add_node(
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
bool notify = true);
|
||||
|
||||
/// Convenience function which takes Node and forwards NodeBaseInterface.
|
||||
/**
|
||||
@@ -205,7 +207,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
add_node(std::shared_ptr<rclcpp::Node> node_ptr, bool notify = true);
|
||||
add_node(const std::shared_ptr<rclcpp::Node> & node_ptr, bool notify = true);
|
||||
|
||||
/// Remove a node from the executor.
|
||||
/**
|
||||
@@ -225,7 +227,9 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
remove_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr, bool notify = true);
|
||||
remove_node(
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
bool notify = true);
|
||||
|
||||
/// Convenience function which takes Node and forwards NodeBaseInterface.
|
||||
/**
|
||||
@@ -233,7 +237,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
remove_node(std::shared_ptr<rclcpp::Node> node_ptr, bool notify = true);
|
||||
remove_node(const std::shared_ptr<rclcpp::Node> & node_ptr, bool notify = true);
|
||||
|
||||
/// Add a node to executor, execute the next available unit of work, and remove the node.
|
||||
/**
|
||||
@@ -245,7 +249,7 @@ public:
|
||||
template<typename RepT = int64_t, typename T = std::milli>
|
||||
void
|
||||
spin_node_once(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node,
|
||||
std::chrono::duration<RepT, T> timeout = std::chrono::duration<RepT, T>(-1))
|
||||
{
|
||||
return spin_node_once_nanoseconds(
|
||||
@@ -258,7 +262,7 @@ public:
|
||||
template<typename NodeT = rclcpp::Node, typename RepT = int64_t, typename T = std::milli>
|
||||
void
|
||||
spin_node_once(
|
||||
std::shared_ptr<NodeT> node,
|
||||
const std::shared_ptr<NodeT> & node,
|
||||
std::chrono::duration<RepT, T> timeout = std::chrono::duration<RepT, T>(-1))
|
||||
{
|
||||
return spin_node_once_nanoseconds(
|
||||
@@ -273,12 +277,12 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
spin_node_some(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node);
|
||||
spin_node_some(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node);
|
||||
|
||||
/// Convenience function which takes Node and forwards NodeBaseInterface.
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
spin_node_some(std::shared_ptr<rclcpp::Node> node);
|
||||
spin_node_some(const std::shared_ptr<rclcpp::Node> & node);
|
||||
|
||||
/// Collect work once and execute all available work, optionally within a max duration.
|
||||
/**
|
||||
@@ -321,13 +325,13 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
spin_node_all(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node,
|
||||
std::chrono::nanoseconds max_duration);
|
||||
|
||||
/// Convenience function which takes Node and forwards NodeBaseInterface.
|
||||
RCLCPP_PUBLIC
|
||||
virtual void
|
||||
spin_node_all(std::shared_ptr<rclcpp::Node> node, std::chrono::nanoseconds max_duration);
|
||||
spin_node_all(const std::shared_ptr<rclcpp::Node> & node, std::chrono::nanoseconds max_duration);
|
||||
|
||||
/// Collect and execute work repeatedly within a duration or until no more work is available.
|
||||
/**
|
||||
@@ -427,7 +431,7 @@ protected:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
spin_node_once_nanoseconds(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node,
|
||||
std::chrono::nanoseconds timeout);
|
||||
|
||||
/// Spin (blocking) until the future is complete, it times out waiting, or rclcpp is interrupted.
|
||||
@@ -478,7 +482,7 @@ protected:
|
||||
RCLCPP_PUBLIC
|
||||
static void
|
||||
execute_subscription(
|
||||
rclcpp::SubscriptionBase::SharedPtr subscription);
|
||||
const rclcpp::SubscriptionBase::SharedPtr & subscription);
|
||||
|
||||
/// Run timer executable.
|
||||
/**
|
||||
@@ -487,7 +491,7 @@ protected:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
static void
|
||||
execute_timer(rclcpp::TimerBase::SharedPtr timer, const std::shared_ptr<void> & data_ptr);
|
||||
execute_timer(const rclcpp::TimerBase::SharedPtr & timer, const std::shared_ptr<void> & data_ptr);
|
||||
|
||||
/// Run service server executable.
|
||||
/**
|
||||
@@ -496,7 +500,7 @@ protected:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
static void
|
||||
execute_service(rclcpp::ServiceBase::SharedPtr service);
|
||||
execute_service(const rclcpp::ServiceBase::SharedPtr & service);
|
||||
|
||||
/// Run service client executable.
|
||||
/**
|
||||
@@ -505,7 +509,7 @@ protected:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
static void
|
||||
execute_client(rclcpp::ClientBase::SharedPtr client);
|
||||
execute_client(const rclcpp::ClientBase::SharedPtr & client);
|
||||
|
||||
/// Gather all of the waitable entities from associated nodes and callback groups.
|
||||
RCLCPP_PUBLIC
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace rclcpp
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
spin_all(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
std::chrono::nanoseconds max_duration);
|
||||
|
||||
/**
|
||||
@@ -68,7 +68,7 @@ spin_all(
|
||||
[[deprecated("use SingleThreadedExecutor::spin_all instead")]]
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
spin_all(rclcpp::Node::SharedPtr node_ptr, std::chrono::nanoseconds max_duration);
|
||||
spin_all(const rclcpp::Node::SharedPtr & node_ptr, std::chrono::nanoseconds max_duration);
|
||||
|
||||
/**
|
||||
* @brief Create a default single-threaded executor and execute any immediately available work.
|
||||
@@ -87,7 +87,7 @@ spin_all(rclcpp::Node::SharedPtr node_ptr, std::chrono::nanoseconds max_duration
|
||||
[[deprecated("use SingleThreadedExecutor::spin_some instead")]]
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
spin_some(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr);
|
||||
spin_some(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr);
|
||||
|
||||
/**
|
||||
* @brief Create a default single-threaded executor and execute any immediately available work.
|
||||
@@ -106,17 +106,17 @@ spin_some(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr);
|
||||
[[deprecated("use SingleThreadedExecutor::spin_some instead")]]
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
spin_some(rclcpp::Node::SharedPtr node_ptr);
|
||||
spin_some(const rclcpp::Node::SharedPtr & node_ptr);
|
||||
|
||||
/// Create a default single-threaded executor and spin the specified node.
|
||||
/** \param[in] node_ptr Shared pointer to the node to spin. */
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
spin(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr);
|
||||
spin(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
spin(rclcpp::Node::SharedPtr node_ptr);
|
||||
spin(const rclcpp::Node::SharedPtr & node_ptr);
|
||||
|
||||
namespace executors
|
||||
{
|
||||
@@ -140,7 +140,7 @@ template<typename FutureT, typename TimeRepT = int64_t, typename TimeT = std::mi
|
||||
rclcpp::FutureReturnCode
|
||||
spin_node_until_future_complete(
|
||||
rclcpp::Executor & executor,
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
const FutureT & future,
|
||||
std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
|
||||
{
|
||||
@@ -157,7 +157,7 @@ template<typename NodeT = rclcpp::Node, typename FutureT, typename TimeRepT = in
|
||||
rclcpp::FutureReturnCode
|
||||
spin_node_until_future_complete(
|
||||
rclcpp::Executor & executor,
|
||||
std::shared_ptr<NodeT> node_ptr,
|
||||
const std::shared_ptr<NodeT> & node_ptr,
|
||||
const FutureT & future,
|
||||
std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
|
||||
{
|
||||
@@ -173,7 +173,7 @@ spin_node_until_future_complete(
|
||||
template<typename FutureT, typename TimeRepT = int64_t, typename TimeT = std::milli>
|
||||
rclcpp::FutureReturnCode
|
||||
spin_until_future_complete(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
const FutureT & future,
|
||||
std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
|
||||
{
|
||||
@@ -187,7 +187,7 @@ template<typename NodeT = rclcpp::Node, typename FutureT, typename TimeRepT = in
|
||||
typename TimeT = std::milli>
|
||||
rclcpp::FutureReturnCode
|
||||
spin_until_future_complete(
|
||||
std::shared_ptr<NodeT> node_ptr,
|
||||
const std::shared_ptr<NodeT> & node_ptr,
|
||||
const FutureT & future,
|
||||
std::chrono::duration<TimeRepT, TimeT> timeout = std::chrono::duration<TimeRepT, TimeT>(-1))
|
||||
{
|
||||
|
||||
@@ -63,7 +63,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
explicit ExecutorEntitiesCollector(
|
||||
std::shared_ptr<ExecutorNotifyWaitable> notify_waitable);
|
||||
const std::shared_ptr<ExecutorNotifyWaitable> & notify_waitable);
|
||||
|
||||
/// Destructor
|
||||
RCLCPP_PUBLIC
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr);
|
||||
add_node(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr);
|
||||
|
||||
/// Remove a node from the entity collector
|
||||
/**
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
remove_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr);
|
||||
remove_node(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr);
|
||||
|
||||
/// Add a callback group to the entity collector
|
||||
/**
|
||||
@@ -101,7 +101,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_callback_group(rclcpp::CallbackGroup::SharedPtr group_ptr);
|
||||
add_callback_group(const rclcpp::CallbackGroup::SharedPtr & group_ptr);
|
||||
|
||||
/// Remove a callback group from the entity collector
|
||||
/**
|
||||
@@ -111,7 +111,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
remove_callback_group(rclcpp::CallbackGroup::SharedPtr group_ptr);
|
||||
remove_callback_group(const rclcpp::CallbackGroup::SharedPtr & group_ptr);
|
||||
|
||||
/// Get all callback groups known to this entity collector
|
||||
/**
|
||||
@@ -211,7 +211,7 @@ protected:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_callback_group_to_collection(
|
||||
rclcpp::CallbackGroup::SharedPtr group_ptr,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group_ptr,
|
||||
CallbackGroupCollection & collection) RCPPUTILS_TSA_REQUIRES(mutex_);
|
||||
|
||||
/// Iterate over queued added/remove nodes and callback_groups
|
||||
|
||||
@@ -43,7 +43,8 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
explicit ExecutorNotifyWaitable(
|
||||
std::function<void(void)> on_execute_callback = {}, const rclcpp::Context::SharedPtr & context =
|
||||
const std::function<void(void)> & on_execute_callback = {},
|
||||
const rclcpp::Context::SharedPtr & context =
|
||||
rclcpp::contexts::get_global_default_context());
|
||||
|
||||
// Destructor
|
||||
@@ -115,7 +116,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
add_guard_condition(rclcpp::GuardCondition::WeakPtr guard_condition);
|
||||
add_guard_condition(const rclcpp::GuardCondition::WeakPtr & guard_condition);
|
||||
|
||||
/// Unset any callback registered via set_on_ready_callback.
|
||||
/**
|
||||
@@ -139,7 +140,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
remove_guard_condition(rclcpp::GuardCondition::WeakPtr weak_guard_condition);
|
||||
remove_guard_condition(const rclcpp::GuardCondition::WeakPtr & weak_guard_condition);
|
||||
|
||||
/// Get the number of ready guard_conditions
|
||||
/**
|
||||
|
||||
@@ -82,10 +82,9 @@ create_intra_process_buffer(
|
||||
|
||||
break;
|
||||
}
|
||||
default:
|
||||
case IntraProcessBufferType::CallbackDefault:
|
||||
{
|
||||
throw std::runtime_error("Unrecognized IntraProcessBufferType value");
|
||||
break;
|
||||
throw std::runtime_error("IntraProcessBufferType::CallbackDefault is not allowed");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include <shared_mutex>
|
||||
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
@@ -118,7 +119,8 @@ public:
|
||||
typename Alloc = std::allocator<ROSMessageType>
|
||||
>
|
||||
uint64_t
|
||||
add_subscription(rclcpp::experimental::SubscriptionIntraProcessBase::SharedPtr subscription)
|
||||
add_subscription(
|
||||
const rclcpp::experimental::SubscriptionIntraProcessBase::SharedPtr & subscription)
|
||||
{
|
||||
std::unique_lock<std::shared_timed_mutex> lock(mutex_);
|
||||
|
||||
@@ -175,8 +177,8 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
uint64_t
|
||||
add_publisher(
|
||||
rclcpp::PublisherBase::SharedPtr publisher,
|
||||
rclcpp::experimental::buffers::IntraProcessBufferBase::SharedPtr buffer =
|
||||
const rclcpp::PublisherBase::SharedPtr & publisher,
|
||||
const rclcpp::experimental::buffers::IntraProcessBufferBase::SharedPtr & buffer =
|
||||
rclcpp::experimental::buffers::IntraProcessBufferBase::SharedPtr());
|
||||
|
||||
/// Unregister a publisher using the publisher's unique id.
|
||||
@@ -386,6 +388,39 @@ private:
|
||||
std::vector<uint64_t> take_ownership_subscriptions;
|
||||
};
|
||||
|
||||
/// Hash function for rmw_gid_t to enable use in unordered_map
|
||||
struct rmw_gid_hash
|
||||
{
|
||||
std::size_t operator()(const rmw_gid_t & gid) const noexcept
|
||||
{
|
||||
// Using the FNV-1a hash algorithm on the gid data
|
||||
constexpr std::size_t FNV_prime = 1099511628211u;
|
||||
std::size_t result = 14695981039346656037u;
|
||||
|
||||
for (std::size_t i = 0; i < RMW_GID_STORAGE_SIZE; ++i) {
|
||||
result ^= gid.data[i];
|
||||
result *= FNV_prime;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
/// Equality comparison for rmw_gid_t to enable use in unordered_map
|
||||
struct rmw_gid_equal
|
||||
{
|
||||
bool operator()(const rmw_gid_t & lhs, const rmw_gid_t & rhs) const noexcept
|
||||
{
|
||||
// Compare the data bytes only.
|
||||
// implementation_identifier pointer comparison is not used here because
|
||||
// intra-process communication is always within the same process and RMW,
|
||||
// and pointer comparison is fragile across dynamically loaded components.
|
||||
return std::equal(
|
||||
std::begin(lhs.data),
|
||||
std::end(lhs.data),
|
||||
std::begin(rhs.data));
|
||||
}
|
||||
};
|
||||
|
||||
using SubscriptionMap =
|
||||
std::unordered_map<uint64_t, rclcpp::experimental::SubscriptionIntraProcessBase::WeakPtr>;
|
||||
|
||||
@@ -398,6 +433,16 @@ private:
|
||||
using PublisherToSubscriptionIdsMap =
|
||||
std::unordered_map<uint64_t, SplittedSubscriptions>;
|
||||
|
||||
/// Structure to store publisher information in GID lookup map
|
||||
struct PublisherInfo
|
||||
{
|
||||
uint64_t pub_id;
|
||||
rclcpp::PublisherBase::WeakPtr publisher;
|
||||
};
|
||||
|
||||
using GidToPublisherInfoMap =
|
||||
std::unordered_map<rmw_gid_t, PublisherInfo, rmw_gid_hash, rmw_gid_equal>;
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
static
|
||||
uint64_t
|
||||
@@ -410,8 +455,8 @@ private:
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
can_communicate(
|
||||
rclcpp::PublisherBase::SharedPtr pub,
|
||||
rclcpp::experimental::SubscriptionIntraProcessBase::SharedPtr sub) const;
|
||||
const rclcpp::PublisherBase::SharedPtr & pub,
|
||||
const rclcpp::experimental::SubscriptionIntraProcessBase::SharedPtr & sub) const;
|
||||
|
||||
template<
|
||||
typename ROSMessageType,
|
||||
@@ -642,6 +687,8 @@ private:
|
||||
PublisherBufferMap publisher_buffers_;
|
||||
|
||||
mutable std::shared_timed_mutex mutex_;
|
||||
|
||||
GidToPublisherInfoMap gid_to_publisher_info_;
|
||||
};
|
||||
|
||||
} // namespace experimental
|
||||
|
||||
@@ -154,6 +154,29 @@ public:
|
||||
execute_impl<SubscribedType>(data);
|
||||
}
|
||||
|
||||
/// Disable callbacks from being called
|
||||
/**
|
||||
* This method will block, until any subscription's callbacks currently being executed are
|
||||
* finished.
|
||||
* This method is thread safe, and provides a safe way to atomically disable the callbacks.
|
||||
*/
|
||||
void disable_callbacks() override
|
||||
{
|
||||
SubscriptionIntraProcessBase::disable_callbacks();
|
||||
any_callback_.disable();
|
||||
}
|
||||
|
||||
/// Enable the callbacks to be called
|
||||
/**
|
||||
* This method is thread safe, and provides a safe way to atomically enable the callbacks
|
||||
* in a multithreaded environment.
|
||||
*/
|
||||
void enable_callbacks() override
|
||||
{
|
||||
SubscriptionIntraProcessBase::enable_callbacks();
|
||||
any_callback_.enable();
|
||||
}
|
||||
|
||||
protected:
|
||||
template<typename T>
|
||||
typename std::enable_if<std::is_same<T, rcl_serialized_message_t>::value, void>::type
|
||||
|
||||
@@ -87,6 +87,22 @@ public:
|
||||
void
|
||||
execute(const std::shared_ptr<void> & data) override = 0;
|
||||
|
||||
/// Disable callbacks from being called
|
||||
/**
|
||||
* This function temporary disable on_new_message_callback to prevent it from being called.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
void disable_callbacks();
|
||||
|
||||
/// Enable the callbacks to be called
|
||||
/**
|
||||
* This function enable the on_new_message_callback if it was previously set.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
void enable_callbacks();
|
||||
|
||||
virtual
|
||||
bool
|
||||
use_take_shared_method() const = 0;
|
||||
@@ -158,7 +174,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
on_new_message_callback_ = new_callback;
|
||||
|
||||
if (unread_count_ > 0) {
|
||||
@@ -176,7 +192,7 @@ public:
|
||||
void
|
||||
clear_on_ready_callback() override
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
on_new_message_callback_ = nullptr;
|
||||
}
|
||||
|
||||
@@ -188,8 +204,9 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
std::recursive_mutex callback_mutex_;
|
||||
std::recursive_mutex on_new_message_callback_mutex_;
|
||||
std::function<void(size_t)> on_new_message_callback_ {nullptr};
|
||||
bool on_new_message_callback_disabled_{false};
|
||||
size_t unread_count_{0};
|
||||
rclcpp::GuardCondition gc_;
|
||||
|
||||
@@ -199,11 +216,13 @@ protected:
|
||||
void
|
||||
invoke_on_new_message()
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(this->callback_mutex_);
|
||||
if (this->on_new_message_callback_) {
|
||||
this->on_new_message_callback_(1);
|
||||
} else {
|
||||
this->unread_count_++;
|
||||
std::lock_guard<std::recursive_mutex> lock(this->on_new_message_callback_mutex_);
|
||||
if (!on_new_message_callback_disabled_) {
|
||||
if (this->on_new_message_callback_) {
|
||||
this->on_new_message_callback_(1);
|
||||
} else {
|
||||
this->unread_count_++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,7 @@ public:
|
||||
* @throws std::invalid_argument if timer is a nullptr.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void add_timer(rclcpp::TimerBase::SharedPtr timer);
|
||||
void add_timer(const rclcpp::TimerBase::SharedPtr & timer);
|
||||
|
||||
/**
|
||||
* @brief Remove a single timer from the object storage.
|
||||
@@ -113,7 +113,7 @@ public:
|
||||
* @param timer the timer to remove.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void remove_timer(rclcpp::TimerBase::SharedPtr timer);
|
||||
void remove_timer(const rclcpp::TimerBase::SharedPtr & timer);
|
||||
|
||||
/**
|
||||
* @brief Remove all the timers stored in the object.
|
||||
|
||||
@@ -95,7 +95,7 @@ public:
|
||||
|
||||
GenericClient(
|
||||
rclcpp::node_interfaces::NodeBaseInterface * node_base,
|
||||
rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph,
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
rcl_client_options_t & client_options);
|
||||
@@ -111,8 +111,8 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
handle_response(
|
||||
std::shared_ptr<rmw_request_id_t> request_header,
|
||||
std::shared_ptr<void> response) override;
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & response) override;
|
||||
|
||||
/// Send a request to the service server.
|
||||
/**
|
||||
@@ -144,7 +144,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
FutureAndRequestId
|
||||
async_send_request(const Request request);
|
||||
async_send_request(const Request & request);
|
||||
|
||||
/// Send a request to the service server and schedule a callback in the executor.
|
||||
/**
|
||||
@@ -172,7 +172,7 @@ public:
|
||||
>::type * = nullptr
|
||||
>
|
||||
SharedFutureAndRequestId
|
||||
async_send_request(const Request request, CallbackT && cb)
|
||||
async_send_request(const Request & request, CallbackT && cb)
|
||||
{
|
||||
Promise promise;
|
||||
auto shared_future = promise.get_future().share();
|
||||
@@ -280,7 +280,7 @@ protected:
|
||||
RCLCPP_PUBLIC
|
||||
int64_t
|
||||
async_send_request_impl(
|
||||
const Request request,
|
||||
const Request & request,
|
||||
CallbackInfoVariant value);
|
||||
|
||||
std::optional<CallbackInfoVariant>
|
||||
|
||||
@@ -159,10 +159,10 @@ public:
|
||||
if (std::holds_alternative<SharedPtrCallback>(callback_)) {
|
||||
(void)request_header;
|
||||
const auto & cb = std::get<SharedPtrCallback>(callback_);
|
||||
cb(std::move(request), std::move(response));
|
||||
cb(std::move(request), response);
|
||||
} else if (std::holds_alternative<SharedPtrWithRequestHeaderCallback>(callback_)) {
|
||||
const auto & cb = std::get<SharedPtrWithRequestHeaderCallback>(callback_);
|
||||
cb(request_header, std::move(request), std::move(response));
|
||||
cb(request_header, std::move(request), response);
|
||||
}
|
||||
TRACETOOLS_TRACEPOINT(callback_end, static_cast<const void *>(this));
|
||||
return response;
|
||||
@@ -245,7 +245,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
GenericService(
|
||||
std::shared_ptr<rcl_node_t> node_handle,
|
||||
const std::shared_ptr<rcl_node_t> & node_handle,
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
GenericServiceCallback any_callback,
|
||||
@@ -270,7 +270,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
take_request(SharedRequest request_out, rmw_request_id_t & request_id_out);
|
||||
take_request(SharedRequest & request_out, rmw_request_id_t & request_id_out);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
std::shared_ptr<void>
|
||||
@@ -287,8 +287,8 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
handle_request(
|
||||
std::shared_ptr<rmw_request_id_t> request_header,
|
||||
std::shared_ptr<void> request) override;
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & request) override;
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
|
||||
@@ -80,7 +80,7 @@ public:
|
||||
node_base,
|
||||
*rclcpp::get_message_typesupport_handle(topic_type, "rosidl_typesupport_cpp", *ts_lib),
|
||||
topic_name,
|
||||
options.to_rcl_subscription_options(qos),
|
||||
force_cpu_buffer_backend_(options).to_rcl_subscription_options(qos),
|
||||
options.event_callbacks,
|
||||
options.use_default_callbacks,
|
||||
DeliveredMessageKind::SERIALIZED_MESSAGE),
|
||||
@@ -111,6 +111,26 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
std::shared_ptr<rclcpp::SerializedMessage> create_serialized_message() override;
|
||||
|
||||
/// Disable callbacks from being called
|
||||
/**
|
||||
* This method will block, until any subscription's callbacks provided during construction
|
||||
* currently being executed are finished.
|
||||
* \note This method also temporary removes the on new message callback and all
|
||||
* on new event callbacks from the rmw layer to prevent them from being called. However, this
|
||||
* method will not block and wait until the currently executing on_new_[message]event callbacks
|
||||
* are finished.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void disable_callbacks() override;
|
||||
|
||||
/// Enable the callbacks to be called
|
||||
/**
|
||||
* This method is thread safe, and provides a safe way to atomically enable the callbacks
|
||||
* in a multithreaded environment.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void enable_callbacks() override;
|
||||
|
||||
/// Cast the message to a rclcpp::SerializedMessage and call the callback.
|
||||
RCLCPP_PUBLIC
|
||||
void handle_message(
|
||||
@@ -162,6 +182,17 @@ public:
|
||||
|
||||
private:
|
||||
RCLCPP_DISABLE_COPY(GenericSubscription)
|
||||
|
||||
template<typename AllocatorT>
|
||||
static rclcpp::SubscriptionOptionsWithAllocator<AllocatorT>
|
||||
force_cpu_buffer_backend_(
|
||||
const rclcpp::SubscriptionOptionsWithAllocator<AllocatorT> & options)
|
||||
{
|
||||
auto opts = options;
|
||||
opts.acceptable_buffer_backends = "cpu";
|
||||
return opts;
|
||||
}
|
||||
|
||||
AnySubscriptionCallback<rclcpp::SerializedMessage, std::allocator<void>> any_callback_;
|
||||
// The type support library should stay loaded, so it is stored in the GenericSubscription
|
||||
std::shared_ptr<rcpputils::SharedLibrary> ts_lib_;
|
||||
|
||||
@@ -120,7 +120,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
set_on_trigger_callback(std::function<void(size_t)> callback);
|
||||
set_on_trigger_callback(const std::function<void(size_t)> & callback);
|
||||
|
||||
protected:
|
||||
rcl_guard_condition_t rcl_guard_condition_;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "rcl/allocator.h"
|
||||
#include "rcl/types.h"
|
||||
|
||||
#include "rclcpp/allocator/allocator_common.hpp"
|
||||
@@ -61,7 +62,16 @@ public:
|
||||
message_allocator_ = std::make_shared<MessageAlloc>();
|
||||
serialized_message_allocator_ = std::make_shared<SerializedMessageAlloc>();
|
||||
buffer_allocator_ = std::make_shared<BufferAlloc>();
|
||||
rcutils_allocator_ = allocator::get_rcl_allocator<char, BufferAlloc>(*buffer_allocator_.get());
|
||||
if constexpr (std::is_same_v<Alloc, std::allocator<void>>) {
|
||||
rcutils_allocator_ = rcl_get_default_allocator();
|
||||
} else {
|
||||
if constexpr (rclcpp::allocator::has_get_rcl_allocator_v<Alloc>) {
|
||||
rcutils_allocator_ = message_allocator_->get_rcl_allocator();
|
||||
} else {
|
||||
rcutils_allocator_ = allocator::get_rcl_allocator<char,
|
||||
BufferAlloc>(*buffer_allocator_.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
explicit MessageMemoryStrategy(std::shared_ptr<Alloc> allocator)
|
||||
@@ -69,7 +79,16 @@ public:
|
||||
message_allocator_ = std::make_shared<MessageAlloc>(*allocator.get());
|
||||
serialized_message_allocator_ = std::make_shared<SerializedMessageAlloc>(*allocator.get());
|
||||
buffer_allocator_ = std::make_shared<BufferAlloc>(*allocator.get());
|
||||
rcutils_allocator_ = allocator::get_rcl_allocator<char, BufferAlloc>(*buffer_allocator_.get());
|
||||
if constexpr (std::is_same_v<Alloc, std::allocator<void>>) {
|
||||
rcutils_allocator_ = rcl_get_default_allocator();
|
||||
} else {
|
||||
if constexpr (rclcpp::allocator::has_get_rcl_allocator_v<Alloc>) {
|
||||
rcutils_allocator_ = allocator->get_rcl_allocator();
|
||||
} else {
|
||||
rcutils_allocator_ = allocator::get_rcl_allocator<char,
|
||||
BufferAlloc>(*buffer_allocator_.get());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
virtual ~MessageMemoryStrategy() = default;
|
||||
|
||||
@@ -242,7 +242,7 @@ public:
|
||||
create_wall_timer(
|
||||
std::chrono::duration<DurationRepT, DurationT> period,
|
||||
CallbackT callback,
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr,
|
||||
bool autostart = true);
|
||||
|
||||
/// Create a timer that uses the node clock to drive the callback.
|
||||
@@ -256,7 +256,7 @@ public:
|
||||
create_timer(
|
||||
std::chrono::duration<DurationRepT, DurationT> period,
|
||||
CallbackT callback,
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr);
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr);
|
||||
|
||||
/// Create and return a Client.
|
||||
/**
|
||||
@@ -270,7 +270,7 @@ public:
|
||||
create_client(
|
||||
const std::string & service_name,
|
||||
const rclcpp::QoS & qos = rclcpp::ServicesQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr);
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr);
|
||||
|
||||
/// Create and return a Service.
|
||||
/**
|
||||
@@ -286,7 +286,7 @@ public:
|
||||
const std::string & service_name,
|
||||
CallbackT && callback,
|
||||
const rclcpp::QoS & qos = rclcpp::ServicesQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr);
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr);
|
||||
|
||||
/// Create and return a GenericClient.
|
||||
/**
|
||||
@@ -302,7 +302,7 @@ public:
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
const rclcpp::QoS & qos = rclcpp::ServicesQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr);
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr);
|
||||
|
||||
/// Create and return a GenericService.
|
||||
/**
|
||||
@@ -320,7 +320,7 @@ public:
|
||||
const std::string & service_type,
|
||||
CallbackT && callback,
|
||||
const rclcpp::QoS & qos = rclcpp::ServicesQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr);
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr);
|
||||
|
||||
/// Create and return a GenericPublisher.
|
||||
/**
|
||||
@@ -1388,6 +1388,66 @@ public:
|
||||
std::vector<rclcpp::TopicEndpointInfo>
|
||||
get_subscriptions_info_by_topic(const std::string & topic_name, bool no_mangle = false) const;
|
||||
|
||||
/// Return the service endpoint information about clients on a given service.
|
||||
/**
|
||||
* The returned parameter is a list of service endpoint information, where each item will contain
|
||||
* the node name, node namespace, service type, endpoint type, endpoint count,
|
||||
* service endpoint's GIDs, and its QoS profiles.
|
||||
*
|
||||
* When the `no_mangle` parameter is `true`, the provided `service_name` should be a valid service
|
||||
* name for the middleware (useful when combining ROS with native middleware apps).
|
||||
* When the `no_mangle` parameter is `false`, the provided `service_name` should follow
|
||||
* ROS service name conventions. In DDS-based RMWs, services are implemented as topics with mangled
|
||||
* names (e.g., `rq/my_serviceRequest` and `rp/my_serviceReply`), so `no_mangle = true` is not
|
||||
* supported and will result in an error. Use `get_publishers_info_by_topic` or
|
||||
* `get_subscriptions_info_by_topic` for unmangled topic queries in such cases. Other RMWs
|
||||
* (e.g., Zenoh) may support `no_mangle = true` if they natively handle services without topic-based
|
||||
*
|
||||
* 'service_name` may be a relative, private, or fully qualified service name.
|
||||
* A relative or private service will be expanded using this node's namespace and name.
|
||||
* The queried `service_name` is not remapped.
|
||||
*
|
||||
* \param[in] service_name the actual service name used; it will not be automatically remapped.
|
||||
* \param[in] no_mangle if `true`, `service_name` needs to be a valid middleware service name,
|
||||
* otherwise it should be a valid ROS service name. Defaults to `false`.
|
||||
* \return a list of SeviceEndpointInfo representing all the clients on this service.
|
||||
* \throws InvalidServiceNameError if the given service_name is invalid.
|
||||
* \throws std::runtime_error if internal error happens.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
get_clients_info_by_service(const std::string & service_name, bool no_mangle = false) const;
|
||||
|
||||
/// Return the service endpoint information about servers on a given service.
|
||||
/**
|
||||
* The returned parameter is a list of service endpoint information, where each item will contain
|
||||
* the node name, node namespace, service type, endpoint type, endpoint count,
|
||||
* service endpoint's GIDs, and its QoS profiles.
|
||||
*
|
||||
* When the `no_mangle` parameter is `true`, the provided `service_name` should be a valid service
|
||||
* name for the middleware (useful when combining ROS with native middleware apps).
|
||||
* When the `no_mangle` parameter is `false`, the provided `service_name` should follow
|
||||
* ROS service name conventions. In DDS-based RMWs, services are implemented as topics with mangled
|
||||
* names (e.g., `rq/my_serviceRequest` and `rp/my_serviceReply`), so `no_mangle = true` is not
|
||||
* supported and will result in an error. Use `rcl_get_publishers_info_by_topic` or
|
||||
* `rcl_get_subscriptions_info_by_topic` for unmangled topic queries in such cases. Other RMWs
|
||||
* (e.g., Zenoh) may support `no_mangle = true` if they natively handle services without topic-based
|
||||
*
|
||||
* 'service_name` may be a relative, private, or fully qualified service name.
|
||||
* A relative or private service will be expanded using this node's namespace and name.
|
||||
* The queried `service_name` is not remapped.
|
||||
*
|
||||
* \param[in] service_name the actual service name used; it will not be automatically remapped.
|
||||
* \param[in] no_mangle if `true`, `service_name` needs to be a valid middleware service name,
|
||||
* otherwise it should be a valid ROS service name. Defaults to `false`.
|
||||
* \return a list of SeviceEndpointInfo representing all the servers on this service.
|
||||
* \throws InvalidServiceNameError if the given service_name is invalid.
|
||||
* \throws std::runtime_error if internal error happens.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
get_servers_info_by_service(const std::string & service_name, bool no_mangle = false) const;
|
||||
|
||||
/// Return a graph event, which will be set anytime a graph change occurs.
|
||||
/* The graph Event object is a loan which must be returned.
|
||||
* The Event object is scoped and therefore to return the loan just let it go
|
||||
@@ -1411,7 +1471,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
wait_for_graph_change(
|
||||
rclcpp::Event::SharedPtr event,
|
||||
const rclcpp::Event::SharedPtr & event,
|
||||
std::chrono::nanoseconds timeout);
|
||||
|
||||
/// Get a clock as a non-const shared pointer which is managed by the node.
|
||||
|
||||
@@ -111,7 +111,7 @@ typename rclcpp::WallTimer<CallbackT>::SharedPtr
|
||||
Node::create_wall_timer(
|
||||
std::chrono::duration<DurationRepT, DurationT> period,
|
||||
CallbackT callback,
|
||||
rclcpp::CallbackGroup::SharedPtr group,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group,
|
||||
bool autostart)
|
||||
{
|
||||
return rclcpp::create_wall_timer(
|
||||
@@ -128,7 +128,7 @@ typename rclcpp::GenericTimer<CallbackT>::SharedPtr
|
||||
Node::create_timer(
|
||||
std::chrono::duration<DurationRepT, DurationT> period,
|
||||
CallbackT callback,
|
||||
rclcpp::CallbackGroup::SharedPtr group)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group)
|
||||
{
|
||||
return rclcpp::create_timer(
|
||||
this->get_clock(),
|
||||
@@ -144,7 +144,7 @@ typename Client<ServiceT>::SharedPtr
|
||||
Node::create_client(
|
||||
const std::string & service_name,
|
||||
const rclcpp::QoS & qos,
|
||||
rclcpp::CallbackGroup::SharedPtr group)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group)
|
||||
{
|
||||
return rclcpp::create_client<ServiceT>(
|
||||
node_base_,
|
||||
@@ -161,7 +161,7 @@ Node::create_service(
|
||||
const std::string & service_name,
|
||||
CallbackT && callback,
|
||||
const rclcpp::QoS & qos,
|
||||
rclcpp::CallbackGroup::SharedPtr group)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group)
|
||||
{
|
||||
return rclcpp::create_service<ServiceT, CallbackT>(
|
||||
node_base_,
|
||||
@@ -179,7 +179,7 @@ Node::create_generic_service(
|
||||
const std::string & service_type,
|
||||
CallbackT && callback,
|
||||
const rclcpp::QoS & qos,
|
||||
rclcpp::CallbackGroup::SharedPtr group)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group)
|
||||
{
|
||||
return rclcpp::create_generic_service<CallbackT>(
|
||||
node_base_,
|
||||
|
||||
@@ -199,6 +199,12 @@ init_tuple(NodeT & n)
|
||||
{ \
|
||||
return StorageClassT::template get<NodeInterfaceType>(); \
|
||||
} \
|
||||
\
|
||||
std::shared_ptr<const NodeInterfaceType> \
|
||||
get_node_ ## NodeInterfaceName ## _interface() const \
|
||||
{ \
|
||||
return StorageClassT::template get<NodeInterfaceType>(); \
|
||||
} \
|
||||
}; \
|
||||
} // namespace rclcpp::node_interfaces::detail
|
||||
// *INDENT-ON*
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include "rclcpp/node_interfaces/node_base_interface.hpp"
|
||||
#include "rclcpp/node_interfaces/node_graph_interface.hpp"
|
||||
#include "rclcpp/visibility_control.hpp"
|
||||
#include "rmw/service_endpoint_info_array.h"
|
||||
#include "rmw/topic_endpoint_info_array.h"
|
||||
|
||||
namespace rclcpp
|
||||
@@ -159,6 +160,18 @@ public:
|
||||
const std::string & topic_name,
|
||||
bool no_mangle = false) const override;
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
get_clients_info_by_service(
|
||||
const std::string & service_name,
|
||||
bool no_mangle = false) const override;
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
get_servers_info_by_service(
|
||||
const std::string & service_name,
|
||||
bool no_mangle = false) const override;
|
||||
|
||||
private:
|
||||
RCLCPP_DISABLE_COPY(NodeGraph)
|
||||
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <chrono>
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
@@ -40,7 +42,9 @@ enum class EndpointType
|
||||
{
|
||||
Invalid = RMW_ENDPOINT_INVALID,
|
||||
Publisher = RMW_ENDPOINT_PUBLISHER,
|
||||
Subscription = RMW_ENDPOINT_SUBSCRIPTION
|
||||
Subscription = RMW_ENDPOINT_SUBSCRIPTION,
|
||||
Client = RMW_ENDPOINT_CLIENT,
|
||||
Server = RMW_ENDPOINT_SERVER
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -53,13 +57,17 @@ public:
|
||||
/// Construct a TopicEndpointInfo from a rcl_topic_endpoint_info_t.
|
||||
RCLCPP_PUBLIC
|
||||
explicit TopicEndpointInfo(const rcl_topic_endpoint_info_t & info)
|
||||
: node_name_(info.node_name),
|
||||
node_namespace_(info.node_namespace),
|
||||
topic_type_(info.topic_type),
|
||||
endpoint_type_(static_cast<rclcpp::EndpointType>(info.endpoint_type)),
|
||||
: endpoint_type_(static_cast<rclcpp::EndpointType>(info.endpoint_type)),
|
||||
qos_profile_({info.qos_profile.history, info.qos_profile.depth}, info.qos_profile),
|
||||
topic_type_hash_(info.topic_type_hash)
|
||||
{
|
||||
if (!info.node_name || !info.node_namespace || !info.topic_type) {
|
||||
throw std::invalid_argument("Constructor TopicEndpointInfo with invalid topic endpoint info");
|
||||
}
|
||||
node_name_ = info.node_name;
|
||||
node_namespace_ = info.node_namespace;
|
||||
topic_type_ = info.topic_type;
|
||||
|
||||
std::copy(info.endpoint_gid, info.endpoint_gid + RMW_GID_STORAGE_SIZE, endpoint_gid_.begin());
|
||||
}
|
||||
|
||||
@@ -143,6 +151,125 @@ private:
|
||||
rosidl_type_hash_t topic_type_hash_;
|
||||
};
|
||||
|
||||
/**
|
||||
* Struct that contains service endpoint information like the associated node name, node namespace,
|
||||
* service type, endpoint type, endpoint count, endpoint GIDs, and its QoS profiles.
|
||||
*/
|
||||
class ServiceEndpointInfo
|
||||
{
|
||||
public:
|
||||
/// Construct a ServiceEndpointInfo from a rcl_service_endpoint_info_t.
|
||||
RCLCPP_PUBLIC
|
||||
explicit ServiceEndpointInfo(const rcl_service_endpoint_info_t & info)
|
||||
: node_name_(info.node_name),
|
||||
node_namespace_(info.node_namespace),
|
||||
service_type_(info.service_type),
|
||||
endpoint_type_(static_cast<rclcpp::EndpointType>(info.endpoint_type)),
|
||||
service_type_hash_(info.service_type_hash),
|
||||
endpoint_count_(info.endpoint_count)
|
||||
{
|
||||
for(size_t i = 0; i < endpoint_count_; i++) {
|
||||
std::array<uint8_t, RMW_GID_STORAGE_SIZE> gid;
|
||||
std::copy(info.endpoint_gids[i], info.endpoint_gids[i] + RMW_GID_STORAGE_SIZE, gid.begin());
|
||||
endpoint_gids_.push_back(gid);
|
||||
|
||||
rclcpp::QoS qos(
|
||||
{info.qos_profiles[i].history, info.qos_profiles[i].depth}, info.qos_profiles[i]);
|
||||
qos_profiles_.push_back(qos);
|
||||
}
|
||||
}
|
||||
|
||||
/// Get a mutable reference to the node name.
|
||||
RCLCPP_PUBLIC
|
||||
std::string &
|
||||
node_name();
|
||||
|
||||
/// Get a const reference to the node name.
|
||||
RCLCPP_PUBLIC
|
||||
const std::string &
|
||||
node_name() const;
|
||||
|
||||
/// Get a mutable reference to the node namespace.
|
||||
RCLCPP_PUBLIC
|
||||
std::string &
|
||||
node_namespace();
|
||||
|
||||
/// Get a const reference to the node namespace.
|
||||
RCLCPP_PUBLIC
|
||||
const std::string &
|
||||
node_namespace() const;
|
||||
|
||||
/// Get a mutable reference to the service type string.
|
||||
RCLCPP_PUBLIC
|
||||
std::string &
|
||||
service_type();
|
||||
|
||||
/// Get a const reference to the service type string.
|
||||
RCLCPP_PUBLIC
|
||||
const std::string &
|
||||
service_type() const;
|
||||
|
||||
/// Get a mutable reference to the service endpoint type.
|
||||
RCLCPP_PUBLIC
|
||||
rclcpp::EndpointType &
|
||||
endpoint_type();
|
||||
|
||||
/// Get a const reference to the service endpoint type.
|
||||
RCLCPP_PUBLIC
|
||||
const rclcpp::EndpointType &
|
||||
endpoint_type() const;
|
||||
|
||||
/// Get a mutable reference to the endpoint count.
|
||||
RCLCPP_PUBLIC
|
||||
size_t &
|
||||
endpoint_count();
|
||||
|
||||
/// Get a const reference to the endpoint count.
|
||||
RCLCPP_PUBLIC
|
||||
const size_t &
|
||||
endpoint_count() const;
|
||||
|
||||
/// Get a mutable reference to the GID of the service endpoint.
|
||||
RCLCPP_PUBLIC
|
||||
std::vector<std::array<uint8_t, RMW_GID_STORAGE_SIZE>> &
|
||||
endpoint_gids();
|
||||
|
||||
/// Get a const reference to the GID of the service endpoint.
|
||||
RCLCPP_PUBLIC
|
||||
const std::vector<std::array<uint8_t, RMW_GID_STORAGE_SIZE>> &
|
||||
endpoint_gids() const;
|
||||
|
||||
/// Get a mutable reference to the QoS profile of the service endpoint.
|
||||
RCLCPP_PUBLIC
|
||||
std::vector<rclcpp::QoS> &
|
||||
qos_profiles();
|
||||
|
||||
/// Get a const reference to the QoS profile of the service endpoint.
|
||||
RCLCPP_PUBLIC
|
||||
const std::vector<rclcpp::QoS> &
|
||||
qos_profiles() const;
|
||||
|
||||
/// Get a mutable reference to the type hash of the service endpoint.
|
||||
RCLCPP_PUBLIC
|
||||
rosidl_type_hash_t &
|
||||
service_type_hash();
|
||||
|
||||
/// Get a const reference to the type hash of the service endpoint.
|
||||
RCLCPP_PUBLIC
|
||||
const rosidl_type_hash_t &
|
||||
service_type_hash() const;
|
||||
|
||||
private:
|
||||
std::string node_name_;
|
||||
std::string node_namespace_;
|
||||
std::string service_type_;
|
||||
rclcpp::EndpointType endpoint_type_;
|
||||
std::vector<std::array<uint8_t, RMW_GID_STORAGE_SIZE>> endpoint_gids_;
|
||||
std::vector<rclcpp::QoS> qos_profiles_;
|
||||
rosidl_type_hash_t service_type_hash_;
|
||||
size_t endpoint_count_;
|
||||
};
|
||||
|
||||
namespace node_interfaces
|
||||
{
|
||||
|
||||
@@ -408,6 +535,30 @@ public:
|
||||
virtual
|
||||
std::vector<rclcpp::TopicEndpointInfo>
|
||||
get_subscriptions_info_by_topic(const std::string & topic_name, bool no_mangle = false) const = 0;
|
||||
|
||||
/// Return the service endpoint information about clients on a given service.
|
||||
/**
|
||||
* \param[in] service_name the actual service name used; it will not be automatically remapped.
|
||||
* \param[in] no_mangle if `true`, `service_name` needs to be a valid middleware service name,
|
||||
* otherwise it should be a valid ROS service name.
|
||||
* \sa rclcpp::Node::get_clients_info_by_service
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
get_clients_info_by_service(const std::string & service_name, bool no_mangle = false) const = 0;
|
||||
|
||||
/// Return the service endpoint information about servers on a given service.
|
||||
/**
|
||||
* \param[in] service_name the actual service name used; it will not be automatically remapped.
|
||||
* \param[in] no_mangle if `true`, `service_name` needs to be a valid middleware service name,
|
||||
* otherwise it should be a valid ROS service name.
|
||||
* \sa rclcpp::Node::get_servers_info_by_service
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
get_servers_info_by_service(const std::string & service_name, bool no_mangle = false) const = 0;
|
||||
};
|
||||
|
||||
} // namespace node_interfaces
|
||||
|
||||
@@ -38,7 +38,7 @@ public:
|
||||
RCLCPP_SMART_PTR_ALIASES_ONLY(NodeLoggingInterface)
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
explicit NodeLogging(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base);
|
||||
explicit NodeLogging(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_base);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
create_logger_services(
|
||||
node_interfaces::NodeServicesInterface::SharedPtr node_services) override;
|
||||
const node_interfaces::NodeServicesInterface::SharedPtr & node_services) override;
|
||||
|
||||
private:
|
||||
RCLCPP_DISABLE_COPY(NodeLogging)
|
||||
|
||||
@@ -61,7 +61,7 @@ public:
|
||||
virtual
|
||||
void
|
||||
create_logger_services(
|
||||
node_interfaces::NodeServicesInterface::SharedPtr node_services) = 0;
|
||||
const node_interfaces::NodeServicesInterface::SharedPtr & node_services) = 0;
|
||||
};
|
||||
|
||||
} // namespace node_interfaces
|
||||
|
||||
@@ -39,10 +39,10 @@ public:
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
explicit NodeTypeDescriptions(
|
||||
NodeBaseInterface::SharedPtr node_base,
|
||||
NodeLoggingInterface::SharedPtr node_logging,
|
||||
NodeParametersInterface::SharedPtr node_parameters,
|
||||
NodeServicesInterface::SharedPtr node_services);
|
||||
const NodeBaseInterface::SharedPtr & node_base,
|
||||
const NodeLoggingInterface::SharedPtr & node_logging,
|
||||
const NodeParametersInterface::SharedPtr & node_parameters,
|
||||
const NodeServicesInterface::SharedPtr & node_services);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
/// Set the context, return this for parameter idiom.
|
||||
RCLCPP_PUBLIC
|
||||
NodeOptions &
|
||||
context(rclcpp::Context::SharedPtr context);
|
||||
context(const rclcpp::Context::SharedPtr & context);
|
||||
|
||||
/// Return a reference to the list of arguments for the node.
|
||||
RCLCPP_PUBLIC
|
||||
|
||||
@@ -64,13 +64,13 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
AsyncParametersClient(
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_interface,
|
||||
const rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr node_topics_interface,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph_interface,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services_interface,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_base_interface,
|
||||
const rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr & node_topics_interface,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph_interface,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr & node_services_interface,
|
||||
const std::string & remote_node_name = "",
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr);
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr);
|
||||
|
||||
/**
|
||||
* \param[in] node The async parameters client will be added to this node.
|
||||
@@ -80,10 +80,10 @@ public:
|
||||
*/
|
||||
template<typename NodeT>
|
||||
explicit AsyncParametersClient(
|
||||
const std::shared_ptr<NodeT> node,
|
||||
const std::shared_ptr<NodeT> & node,
|
||||
const std::string & remote_node_name = "",
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr)
|
||||
: AsyncParametersClient(
|
||||
node->get_node_base_interface(),
|
||||
node->get_node_topics_interface(),
|
||||
@@ -105,7 +105,7 @@ public:
|
||||
NodeT * node,
|
||||
const std::string & remote_node_name = "",
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS(),
|
||||
rclcpp::CallbackGroup::SharedPtr group = nullptr)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group = nullptr)
|
||||
: AsyncParametersClient(
|
||||
node->get_node_base_interface(),
|
||||
node->get_node_topics_interface(),
|
||||
@@ -120,41 +120,41 @@ public:
|
||||
std::shared_future<std::vector<rclcpp::Parameter>>
|
||||
get_parameters(
|
||||
const std::vector<std::string> & names,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rclcpp::Parameter>>)
|
||||
> callback = nullptr);
|
||||
> & callback = nullptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
std::shared_future<std::vector<rcl_interfaces::msg::ParameterDescriptor>>
|
||||
describe_parameters(
|
||||
const std::vector<std::string> & names,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rcl_interfaces::msg::ParameterDescriptor>>)
|
||||
> callback = nullptr);
|
||||
> & callback = nullptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
std::shared_future<std::vector<rclcpp::ParameterType>>
|
||||
get_parameter_types(
|
||||
const std::vector<std::string> & names,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rclcpp::ParameterType>>)
|
||||
> callback = nullptr);
|
||||
> & callback = nullptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
std::shared_future<std::vector<rcl_interfaces::msg::SetParametersResult>>
|
||||
set_parameters(
|
||||
const std::vector<rclcpp::Parameter> & parameters,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rcl_interfaces::msg::SetParametersResult>>)
|
||||
> callback = nullptr);
|
||||
> & callback = nullptr);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
std::shared_future<rcl_interfaces::msg::SetParametersResult>
|
||||
set_parameters_atomically(
|
||||
const std::vector<rclcpp::Parameter> & parameters,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<rcl_interfaces::msg::SetParametersResult>)
|
||||
> callback = nullptr);
|
||||
> & callback = nullptr);
|
||||
|
||||
/// Delete several parameters at once.
|
||||
/**
|
||||
@@ -200,9 +200,9 @@ public:
|
||||
list_parameters(
|
||||
const std::vector<std::string> & prefixes,
|
||||
uint64_t depth,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<rcl_interfaces::msg::ListParametersResult>)
|
||||
> callback = nullptr);
|
||||
> & callback = nullptr);
|
||||
|
||||
template<
|
||||
typename CallbackT,
|
||||
@@ -304,7 +304,7 @@ public:
|
||||
|
||||
template<typename NodeT>
|
||||
explicit SyncParametersClient(
|
||||
std::shared_ptr<NodeT> node,
|
||||
const std::shared_ptr<NodeT> & node,
|
||||
const std::string & remote_node_name = "",
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS())
|
||||
: SyncParametersClient(
|
||||
@@ -316,8 +316,8 @@ public:
|
||||
|
||||
template<typename NodeT>
|
||||
SyncParametersClient(
|
||||
rclcpp::Executor::SharedPtr executor,
|
||||
std::shared_ptr<NodeT> node,
|
||||
const rclcpp::Executor::SharedPtr & executor,
|
||||
const std::shared_ptr<NodeT> & node,
|
||||
const std::string & remote_node_name = "",
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS())
|
||||
: SyncParametersClient(
|
||||
@@ -344,7 +344,7 @@ public:
|
||||
|
||||
template<typename NodeT>
|
||||
SyncParametersClient(
|
||||
rclcpp::Executor::SharedPtr executor,
|
||||
const rclcpp::Executor::SharedPtr & executor,
|
||||
NodeT * node,
|
||||
const std::string & remote_node_name = "",
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS())
|
||||
@@ -360,11 +360,11 @@ public:
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
SyncParametersClient(
|
||||
rclcpp::Executor::SharedPtr executor,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_interface,
|
||||
const rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr node_topics_interface,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph_interface,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services_interface,
|
||||
const rclcpp::Executor::SharedPtr & executor,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_base_interface,
|
||||
const rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr & node_topics_interface,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph_interface,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr & node_services_interface,
|
||||
const std::string & remote_node_name = "",
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS())
|
||||
: executor_(executor), node_base_interface_(node_base_interface)
|
||||
|
||||
82
rclcpp/include/rclcpp/parameter_descriptor_wrapper.hpp
Normal file
82
rclcpp/include/rclcpp/parameter_descriptor_wrapper.hpp
Normal file
@@ -0,0 +1,82 @@
|
||||
// Copyright 2023 Open Source Robotics Foundation, Inc.
|
||||
//
|
||||
// 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.
|
||||
|
||||
#ifndef RCLCPP__PARAMETER_DESCRIPTOR_WRAPPER_HPP_
|
||||
#define RCLCPP__PARAMETER_DESCRIPTOR_WRAPPER_HPP_
|
||||
|
||||
// C++ Standard library includes
|
||||
#include <functional>
|
||||
#include <utility>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
// Additional ROS libraries needed
|
||||
#include "rcl_interfaces/msg/parameter_descriptor.hpp"
|
||||
|
||||
#include "rclcpp/node.hpp"
|
||||
#include "rclcpp/parameter_value.hpp"
|
||||
#include "rclcpp/node_interfaces/get_node_parameters_interface.hpp"
|
||||
#include "rclcpp/visibility_control.hpp"
|
||||
#include "node_interfaces/node_parameters_interface.hpp"
|
||||
|
||||
namespace rclcpp
|
||||
{
|
||||
|
||||
// Implements ParameterDesription class with builder design pattern
|
||||
class ParameterDescription
|
||||
{
|
||||
public:
|
||||
RCLCPP_SMART_PTR_DEFINITIONS(ParameterDescription)
|
||||
|
||||
// List of classes the builder manages
|
||||
RCLCPP_PUBLIC
|
||||
ParameterDescription();
|
||||
|
||||
// Our Main build methods which will construct the base class
|
||||
RCLCPP_PUBLIC rcl_interfaces::msg::ParameterDescriptor build() const;
|
||||
|
||||
// Builder Methods:
|
||||
// Describes the instances in a parameter_description object
|
||||
RCLCPP_PUBLIC ParameterDescription & set_name(const std::string & name);
|
||||
RCLCPP_PUBLIC ParameterDescription & set_type(std::uint8_t type);
|
||||
RCLCPP_PUBLIC ParameterDescription & set_description_text(const std::string & description);
|
||||
RCLCPP_PUBLIC ParameterDescription & set_additional_constraints(const std::string & constraints);
|
||||
RCLCPP_PUBLIC ParameterDescription & set_read_only(bool read_only);
|
||||
RCLCPP_PUBLIC ParameterDescription & set_dynamic_typing(bool dynamic_typing);
|
||||
RCLCPP_PUBLIC ParameterDescription & set_floating_point_description_range(
|
||||
float min, float max, float step);
|
||||
RCLCPP_PUBLIC ParameterDescription & set_integer_description_range(int min, int max, int step);
|
||||
|
||||
// Need the current node in order to begin the configuration state
|
||||
// for it via the declare_parameter function
|
||||
template<typename NodeT>
|
||||
ParameterDescription & declare_parameter(
|
||||
const rclcpp::ParameterValue & default_value,
|
||||
NodeT && node)
|
||||
{
|
||||
auto node_param = rclcpp::node_interfaces::get_node_parameters_interface(node);
|
||||
node_param->declare_parameter(
|
||||
parameter_descriptor.name, default_value,
|
||||
parameter_descriptor);
|
||||
return *this;
|
||||
}
|
||||
|
||||
private:
|
||||
// The main descriptor object we're meant to initialize and adjust
|
||||
rcl_interfaces::msg::ParameterDescriptor parameter_descriptor;
|
||||
};
|
||||
|
||||
} // namespace rclcpp
|
||||
|
||||
#endif // RCLCPP__PARAMETER_DESCRIPTOR_WRAPPER_HPP_
|
||||
@@ -184,7 +184,7 @@ public:
|
||||
*/
|
||||
template<typename NodeT>
|
||||
explicit ParameterEventHandler(
|
||||
NodeT node,
|
||||
const NodeT & node,
|
||||
const rclcpp::QoS & qos =
|
||||
rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(rmw_qos_profile_parameter_events)))
|
||||
: node_base_(rclcpp::node_interfaces::get_node_base_interface(node))
|
||||
@@ -217,7 +217,7 @@ public:
|
||||
RCUTILS_WARN_UNUSED
|
||||
ParameterEventCallbackHandle::SharedPtr
|
||||
add_parameter_event_callback(
|
||||
ParameterEventCallbackType callback);
|
||||
const ParameterEventCallbackType & callback);
|
||||
|
||||
/// Remove parameter event callback registered with add_parameter_event_callback.
|
||||
/**
|
||||
@@ -226,7 +226,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
remove_parameter_event_callback(
|
||||
ParameterEventCallbackHandle::SharedPtr callback_handle);
|
||||
const ParameterEventCallbackHandle::SharedPtr & callback_handle);
|
||||
|
||||
using ParameterCallbackType = ParameterCallbackHandle::ParameterCallbackType;
|
||||
|
||||
@@ -234,6 +234,10 @@ public:
|
||||
/**
|
||||
* If a node_name is not provided, defaults to the current node.
|
||||
*
|
||||
* The configure_nodes_filter() function will affect the behavior of this function.
|
||||
* If the node specified in this function isn't included in the nodes specified in
|
||||
* configure_nodes_filter(), the callback will never be called.
|
||||
*
|
||||
* Note: if the returned callback handle smart pointer is not captured, the callback
|
||||
* is immediately unregistered. A compiler warning should be generated to warn
|
||||
* of this.
|
||||
@@ -248,9 +252,34 @@ public:
|
||||
ParameterCallbackHandle::SharedPtr
|
||||
add_parameter_callback(
|
||||
const std::string & parameter_name,
|
||||
ParameterCallbackType callback,
|
||||
const ParameterCallbackType & callback,
|
||||
const std::string & node_name = "");
|
||||
|
||||
/// Configure which node parameter events will be received.
|
||||
/**
|
||||
* This function depends on rmw implementation support for content filtering.
|
||||
* If middleware doesn't support contentfilter, return false.
|
||||
*
|
||||
* If node_names is empty, the configured node filter will be cleared.
|
||||
*
|
||||
* If this function return true, only parameter events from the specified node will be received.
|
||||
* It affects the behavior of the following two functions.
|
||||
* - add_parameter_event_callback()
|
||||
* The callback will only be called for parameter events from the specified nodes which are
|
||||
* configured in this function.
|
||||
* - add_parameter_callback()
|
||||
* The callback will only be called for parameter events from the specified nodes which are
|
||||
* configured in this function and add_parameter_callback().
|
||||
* If the nodes specified in this function is different from the nodes specified in
|
||||
* add_parameter_callback(), the callback will never be called.
|
||||
*
|
||||
* \param[in] node_names Node names to filter parameter events from.
|
||||
* \returns true if configuring was successfully applied, false otherwise.
|
||||
* \throws rclcpp::exceptions::RCLError if internal error occurred when calling the rcl function.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
bool configure_nodes_filter(const std::vector<std::string> & node_names);
|
||||
|
||||
/// Remove a parameter callback registered with add_parameter_callback.
|
||||
/**
|
||||
* The parameter name and node name are inspected from the callback handle. The callback handle
|
||||
@@ -262,7 +291,7 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
remove_parameter_callback(
|
||||
ParameterCallbackHandle::SharedPtr callback_handle);
|
||||
const ParameterCallbackHandle::SharedPtr & callback_handle);
|
||||
|
||||
/// Get an rclcpp::Parameter from a parameter event.
|
||||
/**
|
||||
|
||||
@@ -42,8 +42,8 @@ public:
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
ParameterService(
|
||||
const std::shared_ptr<node_interfaces::NodeBaseInterface> node_base,
|
||||
const std::shared_ptr<node_interfaces::NodeServicesInterface> node_services,
|
||||
const std::shared_ptr<node_interfaces::NodeBaseInterface> & node_base,
|
||||
const std::shared_ptr<node_interfaces::NodeServicesInterface> & node_services,
|
||||
rclcpp::node_interfaces::NodeParametersInterface * node_params,
|
||||
const rclcpp::QoS & qos_profile = rclcpp::ParametersQoS());
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ public:
|
||||
void
|
||||
setup_intra_process(
|
||||
uint64_t intra_process_publisher_id,
|
||||
IntraProcessManagerSharedPtr ipm);
|
||||
const IntraProcessManagerSharedPtr & ipm);
|
||||
|
||||
/// Get network flow endpoints
|
||||
/**
|
||||
@@ -300,7 +300,7 @@ public:
|
||||
*/
|
||||
void
|
||||
set_on_new_qos_event_callback(
|
||||
std::function<void(size_t)> callback,
|
||||
const std::function<void(size_t)> & callback,
|
||||
rcl_publisher_event_type_t event_type)
|
||||
{
|
||||
if (event_handlers_.count(event_type) == 0) {
|
||||
@@ -319,7 +319,7 @@ public:
|
||||
// The on_ready_callback signature has an extra `int` argument used to disambiguate between
|
||||
// possible different entities within a generic waitable.
|
||||
// We hide that detail to users of this method.
|
||||
std::function<void(size_t, int)> new_callback = std::bind(callback, std::placeholders::_1);
|
||||
std::function<void(size_t, int)> new_callback = [callback] (size_t nr, int) {callback(nr);};
|
||||
event_handlers_[event_type]->set_on_ready_callback(new_callback);
|
||||
}
|
||||
|
||||
|
||||
@@ -123,11 +123,20 @@ private:
|
||||
rcl_allocator_t
|
||||
get_rcl_allocator() const
|
||||
{
|
||||
if (!plain_allocator_storage_) {
|
||||
plain_allocator_storage_ =
|
||||
std::make_shared<PlainAllocator>(*this->get_allocator());
|
||||
if constexpr (std::is_same_v<Allocator, std::allocator<void>>) {
|
||||
return rcl_get_default_allocator();
|
||||
} else {
|
||||
if constexpr (rclcpp::allocator::has_get_rcl_allocator_v<Allocator>) {
|
||||
return get_allocator()->get_rcl_allocator();
|
||||
} else {
|
||||
if (!plain_allocator_storage_) {
|
||||
plain_allocator_storage_ =
|
||||
std::make_shared<PlainAllocator>(*this->get_allocator());
|
||||
}
|
||||
|
||||
return rclcpp::allocator::get_rcl_allocator<char>(*plain_allocator_storage_);
|
||||
}
|
||||
}
|
||||
return rclcpp::allocator::get_rcl_allocator<char>(*plain_allocator_storage_);
|
||||
}
|
||||
|
||||
// This is a temporal workaround, to make sure that get_allocator()
|
||||
|
||||
@@ -58,12 +58,12 @@ public:
|
||||
RCLCPP_PUBLIC
|
||||
explicit Rate(
|
||||
const double rate,
|
||||
Clock::SharedPtr clock = std::make_shared<Clock>(RCL_SYSTEM_TIME));
|
||||
const Clock::SharedPtr & clock = std::make_shared<Clock>(RCL_SYSTEM_TIME));
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
explicit Rate(
|
||||
const Duration & period,
|
||||
Clock::SharedPtr clock = std::make_shared<Clock>(RCL_SYSTEM_TIME));
|
||||
const Clock::SharedPtr & clock = std::make_shared<Clock>(RCL_SYSTEM_TIME));
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
virtual bool
|
||||
|
||||
@@ -175,6 +175,7 @@
|
||||
#include "rclcpp/parameter_event_handler.hpp"
|
||||
#include "rclcpp/parameter.hpp"
|
||||
#include "rclcpp/parameter_service.hpp"
|
||||
#include "rclcpp/parameter_descriptor_wrapper.hpp"
|
||||
#include "rclcpp/rate.hpp"
|
||||
#include "rclcpp/time.hpp"
|
||||
#include "rclcpp/utilities.hpp"
|
||||
|
||||
@@ -58,10 +58,10 @@ public:
|
||||
explicit SerializedMessage(const rcl_serialized_message_t & other);
|
||||
|
||||
/// Move Constructor for a SerializedMessage
|
||||
SerializedMessage(SerializedMessage && other);
|
||||
SerializedMessage(SerializedMessage && other) noexcept;
|
||||
|
||||
/// Constructor for a SerializedMessage from a moved rcl_serialized_message_t
|
||||
explicit SerializedMessage(rcl_serialized_message_t && other);
|
||||
explicit SerializedMessage(rcl_serialized_message_t && other) noexcept;
|
||||
|
||||
/// Copy assignment operator
|
||||
SerializedMessage & operator=(const SerializedMessage & other);
|
||||
@@ -70,10 +70,10 @@ public:
|
||||
SerializedMessage & operator=(const rcl_serialized_message_t & other);
|
||||
|
||||
/// Move assignment operator
|
||||
SerializedMessage & operator=(SerializedMessage && other);
|
||||
SerializedMessage & operator=(SerializedMessage && other) noexcept;
|
||||
|
||||
/// Move assignment operator from a rcl_serialized_message_t
|
||||
SerializedMessage & operator=(rcl_serialized_message_t && other);
|
||||
SerializedMessage & operator=(rcl_serialized_message_t && other) noexcept;
|
||||
|
||||
/// Destructor for a SerializedMessage
|
||||
virtual ~SerializedMessage();
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <mutex>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include "rcl/error_handling.h"
|
||||
#include "rcl/event_callback.h"
|
||||
@@ -54,7 +55,7 @@ public:
|
||||
RCLCPP_SMART_PTR_DEFINITIONS_NOT_COPYABLE(ServiceBase)
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
explicit ServiceBase(std::shared_ptr<rcl_node_t> node_handle);
|
||||
explicit ServiceBase(const std::shared_ptr<rcl_node_t> & node_handle);
|
||||
|
||||
RCLCPP_PUBLIC
|
||||
virtual ~ServiceBase() = default;
|
||||
@@ -113,8 +114,8 @@ public:
|
||||
virtual
|
||||
void
|
||||
handle_request(
|
||||
std::shared_ptr<rmw_request_id_t> request_header,
|
||||
std::shared_ptr<void> request) = 0;
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & request) = 0;
|
||||
|
||||
/// Exchange the "in use by wait set" state for this service.
|
||||
/**
|
||||
@@ -190,7 +191,7 @@ public:
|
||||
* \param[in] callback functor to be called when a new request is received
|
||||
*/
|
||||
void
|
||||
set_on_new_request_callback(std::function<void(size_t)> callback)
|
||||
set_on_new_request_callback(const std::function<void(size_t)> & callback)
|
||||
{
|
||||
if (!callback) {
|
||||
throw std::invalid_argument(
|
||||
@@ -286,6 +287,7 @@ class Service
|
||||
public std::enable_shared_from_this<Service<ServiceT>>
|
||||
{
|
||||
public:
|
||||
using ServiceType = ServiceT;
|
||||
using CallbackType = std::function<
|
||||
void (
|
||||
const std::shared_ptr<typename ServiceT::Request>,
|
||||
@@ -372,10 +374,10 @@ public:
|
||||
* \param[in] any_callback User defined callback to call when a client request is received.
|
||||
*/
|
||||
Service(
|
||||
std::shared_ptr<rcl_node_t> node_handle,
|
||||
std::shared_ptr<rcl_service_t> service_handle,
|
||||
const std::shared_ptr<rcl_node_t> & node_handle,
|
||||
const std::shared_ptr<rcl_service_t> & service_handle,
|
||||
AnyServiceCallback<ServiceT> any_callback)
|
||||
: ServiceBase(node_handle), any_callback_(any_callback),
|
||||
: ServiceBase(node_handle), any_callback_(std::move(any_callback)),
|
||||
srv_type_support_handle_(rosidl_typesupport_cpp::get_service_type_support_handle<ServiceT>())
|
||||
{
|
||||
// check if service handle was initialized
|
||||
@@ -407,10 +409,10 @@ public:
|
||||
* \param[in] any_callback User defined callback to call when a client request is received.
|
||||
*/
|
||||
Service(
|
||||
std::shared_ptr<rcl_node_t> node_handle,
|
||||
const std::shared_ptr<rcl_node_t> & node_handle,
|
||||
rcl_service_t * service_handle,
|
||||
AnyServiceCallback<ServiceT> any_callback)
|
||||
: ServiceBase(node_handle), any_callback_(any_callback),
|
||||
: ServiceBase(node_handle), any_callback_(std::move(any_callback)),
|
||||
srv_type_support_handle_(rosidl_typesupport_cpp::get_service_type_support_handle<ServiceT>())
|
||||
{
|
||||
// check if service handle was initialized
|
||||
@@ -471,8 +473,8 @@ public:
|
||||
|
||||
void
|
||||
handle_request(
|
||||
std::shared_ptr<rmw_request_id_t> request_header,
|
||||
std::shared_ptr<void> request) override
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & request) override
|
||||
{
|
||||
auto typed_request = std::static_pointer_cast<typename ServiceT::Request>(request);
|
||||
auto response = any_callback_.dispatch(this->shared_from_this(), request_header, typed_request);
|
||||
@@ -510,7 +512,7 @@ public:
|
||||
*/
|
||||
void
|
||||
configure_introspection(
|
||||
Clock::SharedPtr clock, const QoS & qos_service_event_pub,
|
||||
const Clock::SharedPtr & clock, const QoS & qos_service_event_pub,
|
||||
rcl_service_introspection_state_t introspection_state)
|
||||
{
|
||||
rcl_publisher_options_t pub_opts = rcl_publisher_get_default_options();
|
||||
|
||||
@@ -99,49 +99,92 @@ public:
|
||||
// Important to use subscription_handles_.size() instead of wait set's size since
|
||||
// there may be more subscriptions in the wait set due to Waitables added to the end.
|
||||
// The same logic applies for other entities.
|
||||
|
||||
// Mark corresponding weak_ptr as expired for entities that are null in the wait set
|
||||
size_t valid_subscription_count = 0;
|
||||
for (size_t i = 0; i < subscription_handles_.size(); ++i) {
|
||||
if (!wait_set->subscriptions[i]) {
|
||||
subscription_handles_[i].reset();
|
||||
if (valid_subscription_count < wait_set->size_of_subscriptions &&
|
||||
!wait_set->subscriptions[valid_subscription_count])
|
||||
{
|
||||
subscription_handles_[i] = std::weak_ptr<const rcl_subscription_t>{};
|
||||
}
|
||||
if (subscription_handles_[i].lock()) {
|
||||
++valid_subscription_count;
|
||||
}
|
||||
}
|
||||
|
||||
size_t valid_service_count = 0;
|
||||
for (size_t i = 0; i < service_handles_.size(); ++i) {
|
||||
if (!wait_set->services[i]) {
|
||||
service_handles_[i].reset();
|
||||
if (valid_service_count < wait_set->size_of_services &&
|
||||
!wait_set->services[valid_service_count])
|
||||
{
|
||||
service_handles_[i] = std::weak_ptr<const rcl_service_t>{};
|
||||
}
|
||||
if (service_handles_[i].lock()) {
|
||||
++valid_service_count;
|
||||
}
|
||||
}
|
||||
|
||||
size_t valid_client_count = 0;
|
||||
for (size_t i = 0; i < client_handles_.size(); ++i) {
|
||||
if (!wait_set->clients[i]) {
|
||||
client_handles_[i].reset();
|
||||
if (valid_client_count < wait_set->size_of_clients &&
|
||||
!wait_set->clients[valid_client_count])
|
||||
{
|
||||
client_handles_[i] = std::weak_ptr<const rcl_client_t>{};
|
||||
}
|
||||
if (client_handles_[i].lock()) {
|
||||
++valid_client_count;
|
||||
}
|
||||
}
|
||||
|
||||
size_t valid_timer_count = 0;
|
||||
for (size_t i = 0; i < timer_handles_.size(); ++i) {
|
||||
if (!wait_set->timers[i]) {
|
||||
timer_handles_[i].reset();
|
||||
if (valid_timer_count < wait_set->size_of_timers &&
|
||||
!wait_set->timers[valid_timer_count])
|
||||
{
|
||||
timer_handles_[i] = std::weak_ptr<const rcl_timer_t>{};
|
||||
}
|
||||
if (timer_handles_[i].lock()) {
|
||||
++valid_timer_count;
|
||||
}
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < waitable_handles_.size(); ++i) {
|
||||
if (!waitable_handles_[i]->is_ready(*wait_set)) {
|
||||
waitable_handles_[i].reset();
|
||||
}
|
||||
}
|
||||
|
||||
// Remove expired weak_ptr instances
|
||||
subscription_handles_.erase(
|
||||
std::remove(subscription_handles_.begin(), subscription_handles_.end(), nullptr),
|
||||
std::remove_if(subscription_handles_.begin(), subscription_handles_.end(),
|
||||
[](const std::weak_ptr<const rcl_subscription_t> & weak_ptr) {
|
||||
return weak_ptr.expired();
|
||||
}),
|
||||
subscription_handles_.end()
|
||||
);
|
||||
|
||||
service_handles_.erase(
|
||||
std::remove(service_handles_.begin(), service_handles_.end(), nullptr),
|
||||
std::remove_if(service_handles_.begin(), service_handles_.end(),
|
||||
[](const std::weak_ptr<const rcl_service_t> & weak_ptr) {
|
||||
return weak_ptr.expired();
|
||||
}),
|
||||
service_handles_.end()
|
||||
);
|
||||
|
||||
client_handles_.erase(
|
||||
std::remove(client_handles_.begin(), client_handles_.end(), nullptr),
|
||||
std::remove_if(client_handles_.begin(), client_handles_.end(),
|
||||
[](const std::weak_ptr<const rcl_client_t> & weak_ptr) {
|
||||
return weak_ptr.expired();
|
||||
}),
|
||||
client_handles_.end()
|
||||
);
|
||||
|
||||
timer_handles_.erase(
|
||||
std::remove(timer_handles_.begin(), timer_handles_.end(), nullptr),
|
||||
std::remove_if(timer_handles_.begin(), timer_handles_.end(),
|
||||
[](const std::weak_ptr<const rcl_timer_t> & weak_ptr) {
|
||||
return weak_ptr.expired();
|
||||
}),
|
||||
timer_handles_.end()
|
||||
);
|
||||
|
||||
@@ -196,7 +239,13 @@ public:
|
||||
|
||||
bool add_handles_to_wait_set(rcl_wait_set_t * wait_set) override
|
||||
{
|
||||
for (const std::shared_ptr<const rcl_subscription_t> & subscription : subscription_handles_) {
|
||||
for (const std::weak_ptr<const rcl_subscription_t> & weak_subscription :
|
||||
subscription_handles_)
|
||||
{
|
||||
auto subscription = weak_subscription.lock();
|
||||
if (!subscription) {
|
||||
continue; // Skip expired handles
|
||||
}
|
||||
if (rcl_wait_set_add_subscription(wait_set, subscription.get(), NULL) != RCL_RET_OK) {
|
||||
RCUTILS_LOG_ERROR_NAMED(
|
||||
"rclcpp",
|
||||
@@ -206,7 +255,11 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
for (const std::shared_ptr<const rcl_client_t> & client : client_handles_) {
|
||||
for (const std::weak_ptr<const rcl_client_t> & weak_client : client_handles_) {
|
||||
auto client = weak_client.lock();
|
||||
if (!client) {
|
||||
continue; // Skip expired handles
|
||||
}
|
||||
if (rcl_wait_set_add_client(wait_set, client.get(), NULL) != RCL_RET_OK) {
|
||||
RCUTILS_LOG_ERROR_NAMED(
|
||||
"rclcpp",
|
||||
@@ -216,7 +269,11 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
for (const std::shared_ptr<const rcl_service_t> & service : service_handles_) {
|
||||
for (const std::weak_ptr<const rcl_service_t> & weak_service : service_handles_) {
|
||||
auto service = weak_service.lock();
|
||||
if (!service) {
|
||||
continue; // Skip expired handles
|
||||
}
|
||||
if (rcl_wait_set_add_service(wait_set, service.get(), NULL) != RCL_RET_OK) {
|
||||
RCUTILS_LOG_ERROR_NAMED(
|
||||
"rclcpp",
|
||||
@@ -226,7 +283,11 @@ public:
|
||||
}
|
||||
}
|
||||
|
||||
for (const std::shared_ptr<const rcl_timer_t> & timer : timer_handles_) {
|
||||
for (const std::weak_ptr<const rcl_timer_t> & weak_timer : timer_handles_) {
|
||||
auto timer = weak_timer.lock();
|
||||
if (!timer) {
|
||||
continue; // Skip expired handles
|
||||
}
|
||||
if (rcl_wait_set_add_timer(wait_set, timer.get(), NULL) != RCL_RET_OK) {
|
||||
RCUTILS_LOG_ERROR_NAMED(
|
||||
"rclcpp",
|
||||
@@ -253,7 +314,13 @@ public:
|
||||
{
|
||||
auto it = subscription_handles_.begin();
|
||||
while (it != subscription_handles_.end()) {
|
||||
auto subscription = get_subscription_by_handle(*it, weak_groups_to_nodes);
|
||||
auto subscription_handle = it->lock();
|
||||
if (!subscription_handle) {
|
||||
// Handle expired, remove it and continue
|
||||
it = subscription_handles_.erase(it);
|
||||
continue;
|
||||
}
|
||||
auto subscription = get_subscription_by_handle(subscription_handle, weak_groups_to_nodes);
|
||||
if (subscription) {
|
||||
// Find the group for this handle and see if it can be serviced
|
||||
auto group = get_group_by_subscription(subscription, weak_groups_to_nodes);
|
||||
@@ -288,7 +355,13 @@ public:
|
||||
{
|
||||
auto it = service_handles_.begin();
|
||||
while (it != service_handles_.end()) {
|
||||
auto service = get_service_by_handle(*it, weak_groups_to_nodes);
|
||||
auto service_handle = it->lock();
|
||||
if (!service_handle) {
|
||||
// Handle expired, remove it and continue
|
||||
it = service_handles_.erase(it);
|
||||
continue;
|
||||
}
|
||||
auto service = get_service_by_handle(service_handle, weak_groups_to_nodes);
|
||||
if (service) {
|
||||
// Find the group for this handle and see if it can be serviced
|
||||
auto group = get_group_by_service(service, weak_groups_to_nodes);
|
||||
@@ -323,7 +396,13 @@ public:
|
||||
{
|
||||
auto it = client_handles_.begin();
|
||||
while (it != client_handles_.end()) {
|
||||
auto client = get_client_by_handle(*it, weak_groups_to_nodes);
|
||||
auto client_handle = it->lock();
|
||||
if (!client_handle) {
|
||||
// Handle expired, remove it and continue
|
||||
it = client_handles_.erase(it);
|
||||
continue;
|
||||
}
|
||||
auto client = get_client_by_handle(client_handle, weak_groups_to_nodes);
|
||||
if (client) {
|
||||
// Find the group for this handle and see if it can be serviced
|
||||
auto group = get_group_by_client(client, weak_groups_to_nodes);
|
||||
@@ -358,7 +437,13 @@ public:
|
||||
{
|
||||
auto it = timer_handles_.begin();
|
||||
while (it != timer_handles_.end()) {
|
||||
auto timer = get_timer_by_handle(*it, weak_groups_to_nodes);
|
||||
auto timer_handle = it->lock();
|
||||
if (!timer_handle) {
|
||||
// Handle expired, remove it and continue
|
||||
it = timer_handles_.erase(it);
|
||||
continue;
|
||||
}
|
||||
auto timer = get_timer_by_handle(timer_handle, weak_groups_to_nodes);
|
||||
if (timer) {
|
||||
// Find the group for this handle and see if it can be serviced
|
||||
auto group = get_group_by_timer(timer, weak_groups_to_nodes);
|
||||
@@ -430,12 +515,22 @@ public:
|
||||
|
||||
rcl_allocator_t get_allocator() override
|
||||
{
|
||||
return rclcpp::allocator::get_rcl_allocator<void *, VoidAlloc>(*allocator_.get());
|
||||
if constexpr (std::is_same_v<Alloc, std::allocator<void>>) {
|
||||
return rcl_get_default_allocator();
|
||||
} else {
|
||||
return rclcpp::allocator::get_rcl_allocator<void *, VoidAlloc>(*allocator_.get());
|
||||
}
|
||||
}
|
||||
|
||||
size_t number_of_ready_subscriptions() const override
|
||||
{
|
||||
size_t number_of_subscriptions = subscription_handles_.size();
|
||||
size_t number_of_subscriptions = 0;
|
||||
// Count only non-expired weak_ptr references
|
||||
for (const auto & weak_subscription : subscription_handles_) {
|
||||
if (!weak_subscription.expired()) {
|
||||
++number_of_subscriptions;
|
||||
}
|
||||
}
|
||||
for (const std::shared_ptr<Waitable> & waitable : waitable_handles_) {
|
||||
number_of_subscriptions += waitable->get_number_of_ready_subscriptions();
|
||||
}
|
||||
@@ -444,7 +539,13 @@ public:
|
||||
|
||||
size_t number_of_ready_services() const override
|
||||
{
|
||||
size_t number_of_services = service_handles_.size();
|
||||
size_t number_of_services = 0;
|
||||
// Count only non-expired weak_ptr references
|
||||
for (const auto & weak_service : service_handles_) {
|
||||
if (!weak_service.expired()) {
|
||||
++number_of_services;
|
||||
}
|
||||
}
|
||||
for (const std::shared_ptr<Waitable> & waitable : waitable_handles_) {
|
||||
number_of_services += waitable->get_number_of_ready_services();
|
||||
}
|
||||
@@ -462,7 +563,13 @@ public:
|
||||
|
||||
size_t number_of_ready_clients() const override
|
||||
{
|
||||
size_t number_of_clients = client_handles_.size();
|
||||
size_t number_of_clients = 0;
|
||||
// Count only non-expired weak_ptr references
|
||||
for (const auto & weak_client : client_handles_) {
|
||||
if (!weak_client.expired()) {
|
||||
++number_of_clients;
|
||||
}
|
||||
}
|
||||
for (const std::shared_ptr<Waitable> & waitable : waitable_handles_) {
|
||||
number_of_clients += waitable->get_number_of_ready_clients();
|
||||
}
|
||||
@@ -480,7 +587,13 @@ public:
|
||||
|
||||
size_t number_of_ready_timers() const override
|
||||
{
|
||||
size_t number_of_timers = timer_handles_.size();
|
||||
size_t number_of_timers = 0;
|
||||
// Count only non-expired weak_ptr references
|
||||
for (const auto & weak_timer : timer_handles_) {
|
||||
if (!weak_timer.expired()) {
|
||||
++number_of_timers;
|
||||
}
|
||||
}
|
||||
for (const std::shared_ptr<Waitable> & waitable : waitable_handles_) {
|
||||
number_of_timers += waitable->get_number_of_ready_timers();
|
||||
}
|
||||
@@ -499,10 +612,10 @@ private:
|
||||
|
||||
VectorRebind<const rclcpp::GuardCondition *> guard_conditions_;
|
||||
|
||||
VectorRebind<std::shared_ptr<const rcl_subscription_t>> subscription_handles_;
|
||||
VectorRebind<std::shared_ptr<const rcl_service_t>> service_handles_;
|
||||
VectorRebind<std::shared_ptr<const rcl_client_t>> client_handles_;
|
||||
VectorRebind<std::shared_ptr<const rcl_timer_t>> timer_handles_;
|
||||
VectorRebind<std::weak_ptr<const rcl_subscription_t>> subscription_handles_;
|
||||
VectorRebind<std::weak_ptr<const rcl_service_t>> service_handles_;
|
||||
VectorRebind<std::weak_ptr<const rcl_client_t>> client_handles_;
|
||||
VectorRebind<std::weak_ptr<const rcl_timer_t>> timer_handles_;
|
||||
VectorRebind<std::shared_ptr<Waitable>> waitable_handles_;
|
||||
|
||||
std::shared_ptr<VoidAlloc> allocator_;
|
||||
|
||||
@@ -279,6 +279,50 @@ public:
|
||||
return message_memory_strategy_->borrow_serialized_message();
|
||||
}
|
||||
|
||||
/// Disable callbacks from being called
|
||||
/**
|
||||
* This method will block, until any subscription's callbacks provided during construction
|
||||
* currently being executed are finished.
|
||||
* \note This method also temporary removes the on new message callback and all
|
||||
* on new event callbacks from the rmw layer to prevent them from being called. However, this
|
||||
* method will not block and wait until the currently executing on_new_[message]event callbacks
|
||||
* are finished.
|
||||
*/
|
||||
void
|
||||
disable_callbacks() override
|
||||
{
|
||||
SubscriptionBase::disable_callbacks();
|
||||
any_callback_.disable();
|
||||
if (subscription_intra_process_) {
|
||||
subscription_intra_process_->disable_callbacks();
|
||||
}
|
||||
for (const auto & [_, event_ptr] : event_handlers_) {
|
||||
if (event_ptr) {
|
||||
event_ptr->disable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Enable the callbacks to be called
|
||||
/**
|
||||
* This method is thread safe, and provides a safe way to atomically enable the callbacks
|
||||
* in a multithreaded environment.
|
||||
*/
|
||||
void
|
||||
enable_callbacks() override
|
||||
{
|
||||
SubscriptionBase::enable_callbacks();
|
||||
any_callback_.enable();
|
||||
if (subscription_intra_process_) {
|
||||
subscription_intra_process_->enable_callbacks();
|
||||
}
|
||||
for (const auto & [_, event_ptr] : event_handlers_) {
|
||||
if (event_ptr) {
|
||||
event_ptr->enable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
handle_message(
|
||||
std::shared_ptr<void> & message,
|
||||
|
||||
@@ -212,6 +212,23 @@ public:
|
||||
std::shared_ptr<rclcpp::SerializedMessage>
|
||||
create_serialized_message() = 0;
|
||||
|
||||
/// Disable callbacks from being called
|
||||
/**
|
||||
* This function temporary removes the on_new_message_callback to prevent it from being called.
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
void disable_callbacks();
|
||||
|
||||
/// Enable the callbacks to be called
|
||||
/**
|
||||
* This function sets back the on_new_message_callback if it was previously removed in
|
||||
* disable_callbacks().
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
virtual
|
||||
void enable_callbacks();
|
||||
|
||||
/// Check if we need to handle the message, and execute the callback if we do.
|
||||
/**
|
||||
* \param[in] message Shared pointer to the message to handle.
|
||||
@@ -355,7 +372,7 @@ public:
|
||||
* \param[in] callback functor to be called when a new message is received
|
||||
*/
|
||||
void
|
||||
set_on_new_message_callback(std::function<void(size_t)> callback)
|
||||
set_on_new_message_callback(const std::function<void(size_t)> & callback)
|
||||
{
|
||||
if (!callback) {
|
||||
throw std::invalid_argument(
|
||||
@@ -383,7 +400,7 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
|
||||
// Set it temporarily to the new callback, while we replace the old one.
|
||||
// This two-step setting, prevents a gap where the old std::function has
|
||||
@@ -406,7 +423,7 @@ public:
|
||||
void
|
||||
clear_on_new_message_callback()
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(callback_mutex_);
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
|
||||
if (on_new_message_callback_) {
|
||||
set_on_new_message_callback(nullptr, nullptr);
|
||||
@@ -433,7 +450,7 @@ public:
|
||||
* \param[in] callback functor to be called when a new message is received
|
||||
*/
|
||||
void
|
||||
set_on_new_intra_process_message_callback(std::function<void(size_t)> callback)
|
||||
set_on_new_intra_process_message_callback(const std::function<void(size_t)> & callback)
|
||||
{
|
||||
if (!use_intra_process_) {
|
||||
RCLCPP_WARN(
|
||||
@@ -451,7 +468,7 @@ public:
|
||||
// The on_ready_callback signature has an extra `int` argument used to disambiguate between
|
||||
// possible different entities within a generic waitable.
|
||||
// We hide that detail to users of this method.
|
||||
std::function<void(size_t, int)> new_callback = std::bind(callback, std::placeholders::_1);
|
||||
std::function<void(size_t, int)> new_callback = [callback] (size_t nr, int) {callback(nr);};
|
||||
subscription_intra_process_->set_on_ready_callback(new_callback);
|
||||
}
|
||||
|
||||
@@ -497,7 +514,7 @@ public:
|
||||
*/
|
||||
void
|
||||
set_on_new_qos_event_callback(
|
||||
std::function<void(size_t)> callback,
|
||||
const std::function<void(size_t)> & callback,
|
||||
rcl_subscription_event_type_t event_type)
|
||||
{
|
||||
if (event_handlers_.count(event_type) == 0) {
|
||||
@@ -516,7 +533,7 @@ public:
|
||||
// The on_ready_callback signature has an extra `int` argument used to disambiguate between
|
||||
// possible different entities within a generic waitable.
|
||||
// We hide that detail to users of this method.
|
||||
std::function<void(size_t, int)> new_callback = std::bind(callback, std::placeholders::_1);
|
||||
std::function<void(size_t, int)> new_callback = [callback] (size_t nr, int) {callback(nr);};
|
||||
event_handlers_[event_type]->set_on_ready_callback(new_callback);
|
||||
}
|
||||
|
||||
@@ -646,7 +663,7 @@ protected:
|
||||
|
||||
std::shared_ptr<rcl_node_t> node_handle_;
|
||||
|
||||
std::recursive_mutex callback_mutex_;
|
||||
std::recursive_mutex on_new_message_callback_mutex_;
|
||||
// It is important to declare on_new_message_callback_ before
|
||||
// subscription_handle_, so on destruction the subscription is
|
||||
// destroyed first. Otherwise, the rmw subscription callback
|
||||
|
||||
@@ -89,6 +89,15 @@ struct SubscriptionOptionsBase
|
||||
QosOverridingOptions qos_overriding_options;
|
||||
|
||||
ContentFilterOptions content_filter_options;
|
||||
|
||||
/// Acceptable buffer backend names for this subscription.
|
||||
/**
|
||||
* Empty string or "cpu" means CPU-only (default for backward compatibility).
|
||||
* "any" means all installed backends are acceptable.
|
||||
* Comma-separated for specific backends, e.g. "cuda,demo".
|
||||
* CPU is always implicitly acceptable regardless of this value.
|
||||
*/
|
||||
std::string acceptable_buffer_backends{"cpu"};
|
||||
};
|
||||
|
||||
/// Structure containing optional configuration for Subscriptions.
|
||||
@@ -145,6 +154,11 @@ struct SubscriptionOptionsWithAllocator : public SubscriptionOptionsBase
|
||||
}
|
||||
}
|
||||
|
||||
if (!acceptable_buffer_backends.empty()) {
|
||||
result.rmw_subscription_options.acceptable_buffer_backends =
|
||||
acceptable_buffer_backends.c_str();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -167,11 +181,20 @@ private:
|
||||
rcl_allocator_t
|
||||
get_rcl_allocator() const
|
||||
{
|
||||
if (!plain_allocator_storage_) {
|
||||
plain_allocator_storage_ =
|
||||
std::make_shared<PlainAllocator>(*this->get_allocator());
|
||||
if constexpr (std::is_same_v<Allocator, std::allocator<void>>) {
|
||||
return rcl_get_default_allocator();
|
||||
} else {
|
||||
if constexpr (rclcpp::allocator::has_get_rcl_allocator_v<Allocator>) {
|
||||
return get_allocator()->get_rcl_allocator();
|
||||
} else {
|
||||
if (!plain_allocator_storage_) {
|
||||
plain_allocator_storage_ =
|
||||
std::make_shared<PlainAllocator>(*this->get_allocator());
|
||||
}
|
||||
|
||||
return rclcpp::allocator::get_rcl_allocator<char>(*plain_allocator_storage_);
|
||||
}
|
||||
}
|
||||
return rclcpp::allocator::get_rcl_allocator<char>(*plain_allocator_storage_);
|
||||
}
|
||||
|
||||
// This is a temporal workaround, to make sure that get_allocator()
|
||||
|
||||
@@ -60,7 +60,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
explicit TimeSource(
|
||||
rclcpp::Node::SharedPtr node,
|
||||
const rclcpp::Node::SharedPtr & node,
|
||||
const rclcpp::QoS & qos = rclcpp::ClockQoS(),
|
||||
bool use_clock_thread = true);
|
||||
|
||||
@@ -89,7 +89,7 @@ public:
|
||||
* \param node std::shared pointer to a initialized node
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void attachNode(rclcpp::Node::SharedPtr node);
|
||||
void attachNode(const rclcpp::Node::SharedPtr & node);
|
||||
|
||||
/// Attach node to the time source.
|
||||
/**
|
||||
@@ -124,11 +124,11 @@ public:
|
||||
* \throws std::invalid_argument the time source must be a RCL_ROS_TIME otherwise throws an exception
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void attachClock(rclcpp::Clock::SharedPtr clock);
|
||||
void attachClock(const rclcpp::Clock::SharedPtr & clock);
|
||||
|
||||
/// Detach a clock from the time source
|
||||
RCLCPP_PUBLIC
|
||||
void detachClock(rclcpp::Clock::SharedPtr clock);
|
||||
void detachClock(const rclcpp::Clock::SharedPtr & clock);
|
||||
|
||||
/// Get whether a separate clock thread is used or not
|
||||
RCLCPP_PUBLIC
|
||||
|
||||
@@ -183,7 +183,7 @@ public:
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
set_on_reset_callback(std::function<void(size_t)> callback);
|
||||
set_on_reset_callback(const std::function<void(size_t)> & callback);
|
||||
|
||||
/// Unset the callback registered for reset timer
|
||||
RCLCPP_PUBLIC
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "rclcpp/context.hpp"
|
||||
#include "rclcpp/contexts/default_context.hpp"
|
||||
#include "rclcpp/init_options.hpp"
|
||||
#include "rclcpp/visibility_control.hpp"
|
||||
|
||||
@@ -173,7 +174,7 @@ remove_ros_arguments(int argc, char const * const * argv);
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
ok(rclcpp::Context::SharedPtr context = nullptr);
|
||||
ok(const rclcpp::Context::SharedPtr & context = rclcpp::contexts::get_global_default_context());
|
||||
|
||||
/// Shutdown rclcpp context, invalidating it for derived entities.
|
||||
/**
|
||||
@@ -192,7 +193,7 @@ ok(rclcpp::Context::SharedPtr context = nullptr);
|
||||
RCLCPP_PUBLIC
|
||||
bool
|
||||
shutdown(
|
||||
rclcpp::Context::SharedPtr context = nullptr,
|
||||
const rclcpp::Context::SharedPtr & context = rclcpp::contexts::get_global_default_context(),
|
||||
const std::string & reason = "user called rclcpp::shutdown()");
|
||||
|
||||
/// Register a function to be called when shutdown is called on the context.
|
||||
@@ -212,7 +213,9 @@ shutdown(
|
||||
*/
|
||||
RCLCPP_PUBLIC
|
||||
void
|
||||
on_shutdown(std::function<void()> callback, rclcpp::Context::SharedPtr context = nullptr);
|
||||
on_shutdown(
|
||||
const std::function<void()> & callback,
|
||||
const rclcpp::Context::SharedPtr & context = rclcpp::contexts::get_global_default_context());
|
||||
|
||||
/// Use the global condition variable to block for the specified amount of time.
|
||||
/**
|
||||
@@ -231,7 +234,7 @@ RCLCPP_PUBLIC
|
||||
bool
|
||||
sleep_for(
|
||||
const std::chrono::nanoseconds & nanoseconds,
|
||||
rclcpp::Context::SharedPtr context = nullptr);
|
||||
const rclcpp::Context::SharedPtr & context = rclcpp::contexts::get_global_default_context());
|
||||
|
||||
/// Safely check if addition will overflow.
|
||||
/**
|
||||
|
||||
@@ -56,7 +56,7 @@ bool wait_for_message(
|
||||
}
|
||||
});
|
||||
|
||||
rclcpp::WaitSet wait_set;
|
||||
rclcpp::WaitSet wait_set({}, {}, {}, {}, {}, {}, context);
|
||||
wait_set.add_subscription(subscription);
|
||||
RCPPUTILS_SCOPE_EXIT(wait_set.remove_subscription(subscription); );
|
||||
wait_set.add_guard_condition(gc);
|
||||
|
||||
@@ -704,10 +704,12 @@ public:
|
||||
return WaitResult<WaitSetTemplate>::from_timeout_wait_result_kind();
|
||||
case WaitResultKind::Empty:
|
||||
return WaitResult<WaitSetTemplate>::from_empty_wait_result_kind();
|
||||
default:
|
||||
auto msg = "unknown WaitResultKind with value: " + std::to_string(wait_result_kind);
|
||||
case WaitResultKind::Invalid:
|
||||
auto msg = "invalid WaitResultKind with value: " + std::to_string(wait_result_kind);
|
||||
throw std::runtime_error(msg);
|
||||
}
|
||||
// This should never be reached, but is needed to satisfy the compiler
|
||||
throw std::runtime_error("unreachable code in wait result kind switch");
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
|
||||
<package format="2">
|
||||
<name>rclcpp</name>
|
||||
<version>30.1.2</version>
|
||||
<version>30.1.5</version>
|
||||
<description>The ROS client library in C++.</description>
|
||||
|
||||
<maintainer email="ivanpauno@ekumenlabs.com">Ivan Paunovic</maintainer>
|
||||
@@ -47,9 +47,9 @@
|
||||
<depend>statistics_msgs</depend>
|
||||
<depend>tracetools</depend>
|
||||
|
||||
<test_depend>ament_cmake_gmock</test_depend>
|
||||
<test_depend>ament_cmake_google_benchmark</test_depend>
|
||||
<test_depend>ament_cmake_gtest</test_depend>
|
||||
<test_depend>ament_cmake_ros</test_depend>
|
||||
<test_depend>ament_lint_auto</test_depend>
|
||||
<test_depend>ament_lint_common</test_depend>
|
||||
<test_depend>mimick_vendor</test_depend>
|
||||
|
||||
@@ -31,7 +31,7 @@ using rclcpp::CallbackGroupType;
|
||||
|
||||
CallbackGroup::CallbackGroup(
|
||||
CallbackGroupType group_type,
|
||||
rclcpp::Context::WeakPtr context,
|
||||
const rclcpp::Context::WeakPtr & context,
|
||||
bool automatically_add_to_executor_with_node)
|
||||
: type_(group_type), associated_with_executor_(false),
|
||||
can_be_taken_from_(true),
|
||||
@@ -59,6 +59,7 @@ CallbackGroup::type() const
|
||||
size_t
|
||||
CallbackGroup::size() const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
return
|
||||
subscription_ptrs_.size() +
|
||||
service_ptrs_.size() +
|
||||
@@ -68,11 +69,11 @@ CallbackGroup::size() const
|
||||
}
|
||||
|
||||
void CallbackGroup::collect_all_ptrs(
|
||||
std::function<void(const rclcpp::SubscriptionBase::SharedPtr &)> sub_func,
|
||||
std::function<void(const rclcpp::ServiceBase::SharedPtr &)> service_func,
|
||||
std::function<void(const rclcpp::ClientBase::SharedPtr &)> client_func,
|
||||
std::function<void(const rclcpp::TimerBase::SharedPtr &)> timer_func,
|
||||
std::function<void(const rclcpp::Waitable::SharedPtr &)> waitable_func) const
|
||||
const std::function<void(const rclcpp::SubscriptionBase::SharedPtr &)> & sub_func,
|
||||
const std::function<void(const rclcpp::ServiceBase::SharedPtr &)> & service_func,
|
||||
const std::function<void(const rclcpp::ClientBase::SharedPtr &)> & client_func,
|
||||
const std::function<void(const rclcpp::TimerBase::SharedPtr &)> & timer_func,
|
||||
const std::function<void(const rclcpp::Waitable::SharedPtr &)> & waitable_func) const
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
|
||||
@@ -149,7 +150,7 @@ CallbackGroup::trigger_notify_guard_condition()
|
||||
|
||||
void
|
||||
CallbackGroup::add_subscription(
|
||||
const rclcpp::SubscriptionBase::SharedPtr subscription_ptr)
|
||||
const rclcpp::SubscriptionBase::SharedPtr & subscription_ptr)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
subscription_ptrs_.push_back(subscription_ptr);
|
||||
@@ -157,12 +158,12 @@ CallbackGroup::add_subscription(
|
||||
std::remove_if(
|
||||
subscription_ptrs_.begin(),
|
||||
subscription_ptrs_.end(),
|
||||
[](rclcpp::SubscriptionBase::WeakPtr x) {return x.expired();}),
|
||||
[](const rclcpp::SubscriptionBase::WeakPtr & x) {return x.expired();}),
|
||||
subscription_ptrs_.end());
|
||||
}
|
||||
|
||||
void
|
||||
CallbackGroup::add_timer(const rclcpp::TimerBase::SharedPtr timer_ptr)
|
||||
CallbackGroup::add_timer(const rclcpp::TimerBase::SharedPtr & timer_ptr)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
timer_ptrs_.push_back(timer_ptr);
|
||||
@@ -170,12 +171,12 @@ CallbackGroup::add_timer(const rclcpp::TimerBase::SharedPtr timer_ptr)
|
||||
std::remove_if(
|
||||
timer_ptrs_.begin(),
|
||||
timer_ptrs_.end(),
|
||||
[](rclcpp::TimerBase::WeakPtr x) {return x.expired();}),
|
||||
[](const rclcpp::TimerBase::WeakPtr & x) {return x.expired();}),
|
||||
timer_ptrs_.end());
|
||||
}
|
||||
|
||||
void
|
||||
CallbackGroup::add_service(const rclcpp::ServiceBase::SharedPtr service_ptr)
|
||||
CallbackGroup::add_service(const rclcpp::ServiceBase::SharedPtr & service_ptr)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
service_ptrs_.push_back(service_ptr);
|
||||
@@ -183,12 +184,12 @@ CallbackGroup::add_service(const rclcpp::ServiceBase::SharedPtr service_ptr)
|
||||
std::remove_if(
|
||||
service_ptrs_.begin(),
|
||||
service_ptrs_.end(),
|
||||
[](rclcpp::ServiceBase::WeakPtr x) {return x.expired();}),
|
||||
[](const rclcpp::ServiceBase::WeakPtr & x) {return x.expired();}),
|
||||
service_ptrs_.end());
|
||||
}
|
||||
|
||||
void
|
||||
CallbackGroup::add_client(const rclcpp::ClientBase::SharedPtr client_ptr)
|
||||
CallbackGroup::add_client(const rclcpp::ClientBase::SharedPtr & client_ptr)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
client_ptrs_.push_back(client_ptr);
|
||||
@@ -196,12 +197,12 @@ CallbackGroup::add_client(const rclcpp::ClientBase::SharedPtr client_ptr)
|
||||
std::remove_if(
|
||||
client_ptrs_.begin(),
|
||||
client_ptrs_.end(),
|
||||
[](rclcpp::ClientBase::WeakPtr x) {return x.expired();}),
|
||||
[](const rclcpp::ClientBase::WeakPtr & x) {return x.expired();}),
|
||||
client_ptrs_.end());
|
||||
}
|
||||
|
||||
void
|
||||
CallbackGroup::add_waitable(const rclcpp::Waitable::SharedPtr waitable_ptr)
|
||||
CallbackGroup::add_waitable(const rclcpp::Waitable::SharedPtr & waitable_ptr)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
waitable_ptrs_.push_back(waitable_ptr);
|
||||
@@ -209,12 +210,12 @@ CallbackGroup::add_waitable(const rclcpp::Waitable::SharedPtr waitable_ptr)
|
||||
std::remove_if(
|
||||
waitable_ptrs_.begin(),
|
||||
waitable_ptrs_.end(),
|
||||
[](rclcpp::Waitable::WeakPtr x) {return x.expired();}),
|
||||
[](const rclcpp::Waitable::WeakPtr & x) {return x.expired();}),
|
||||
waitable_ptrs_.end());
|
||||
}
|
||||
|
||||
void
|
||||
CallbackGroup::remove_waitable(const rclcpp::Waitable::SharedPtr waitable_ptr) noexcept
|
||||
CallbackGroup::remove_waitable(const rclcpp::Waitable::SharedPtr & waitable_ptr) noexcept
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex_);
|
||||
for (auto iter = waitable_ptrs_.begin(); iter != waitable_ptrs_.end(); ++iter) {
|
||||
|
||||
@@ -37,7 +37,7 @@ using rclcpp::exceptions::throw_from_rcl_error;
|
||||
|
||||
ClientBase::ClientBase(
|
||||
rclcpp::node_interfaces::NodeBaseInterface * node_base,
|
||||
rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph)
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph)
|
||||
: node_graph_(node_graph),
|
||||
node_handle_(node_base->get_shared_rcl_node_handle()),
|
||||
context_(node_base->get_context()),
|
||||
|
||||
@@ -60,8 +60,8 @@ JumpHandler::JumpHandler(
|
||||
pre_callback_t pre_callback,
|
||||
post_callback_t post_callback,
|
||||
const rcl_jump_threshold_t & threshold)
|
||||
: pre_callback(pre_callback),
|
||||
post_callback(post_callback),
|
||||
: pre_callback(std::move(pre_callback)),
|
||||
post_callback(std::move(post_callback)),
|
||||
notice_threshold(threshold)
|
||||
{}
|
||||
|
||||
@@ -85,8 +85,8 @@ Clock::now() const
|
||||
|
||||
bool
|
||||
Clock::sleep_until(
|
||||
Time until,
|
||||
Context::SharedPtr context)
|
||||
const Time & until,
|
||||
const Context::SharedPtr & context)
|
||||
{
|
||||
if (!context || !context->is_valid()) {
|
||||
throw std::runtime_error("context cannot be slept with because it's invalid");
|
||||
@@ -194,7 +194,7 @@ Clock::sleep_until(
|
||||
}
|
||||
|
||||
bool
|
||||
Clock::sleep_for(Duration rel_time, Context::SharedPtr context)
|
||||
Clock::sleep_for(const Duration & rel_time, const Context::SharedPtr & context)
|
||||
{
|
||||
return sleep_until(now() + rel_time, context);
|
||||
}
|
||||
@@ -209,7 +209,7 @@ Clock::started()
|
||||
}
|
||||
|
||||
bool
|
||||
Clock::wait_until_started(Context::SharedPtr context)
|
||||
Clock::wait_until_started(const Context::SharedPtr & context)
|
||||
{
|
||||
if (!context || !context->is_valid()) {
|
||||
throw std::runtime_error("context cannot be slept with because it's invalid");
|
||||
@@ -229,7 +229,7 @@ Clock::wait_until_started(Context::SharedPtr context)
|
||||
bool
|
||||
Clock::wait_until_started(
|
||||
const Duration & timeout,
|
||||
Context::SharedPtr context,
|
||||
const Context::SharedPtr & context,
|
||||
const Duration & wait_tick_ns)
|
||||
{
|
||||
if (!context || !context->is_valid()) {
|
||||
@@ -318,8 +318,8 @@ Clock::on_time_jump(
|
||||
|
||||
JumpHandler::SharedPtr
|
||||
Clock::create_jump_callback(
|
||||
JumpHandler::pre_callback_t pre_callback,
|
||||
JumpHandler::post_callback_t post_callback,
|
||||
const JumpHandler::pre_callback_t & pre_callback,
|
||||
const JumpHandler::post_callback_t & post_callback,
|
||||
const rcl_jump_threshold_t & threshold)
|
||||
{
|
||||
// Allocate a new jump handler
|
||||
@@ -516,7 +516,7 @@ class ClockConditionalVariable::Impl
|
||||
ClockWaiter::UniquePtr clock_;
|
||||
|
||||
public:
|
||||
Impl(const rclcpp::Clock::SharedPtr & clock, rclcpp::Context::SharedPtr context)
|
||||
Impl(const rclcpp::Clock::SharedPtr & clock, const rclcpp::Context::SharedPtr & context)
|
||||
:context_(context),
|
||||
clock_(std::make_unique<ClockWaiter>(clock))
|
||||
{
|
||||
@@ -541,7 +541,7 @@ public:
|
||||
|
||||
bool
|
||||
wait_until(
|
||||
std::unique_lock<std::mutex> & lock, rclcpp::Time until,
|
||||
std::unique_lock<std::mutex> & lock, const rclcpp::Time & until,
|
||||
const std::function<bool ()> & pred)
|
||||
{
|
||||
if(lock.mutex() != &pred_mutex_) {
|
||||
@@ -571,7 +571,7 @@ public:
|
||||
|
||||
ClockConditionalVariable::ClockConditionalVariable(
|
||||
const rclcpp::Clock::SharedPtr & clock,
|
||||
rclcpp::Context::SharedPtr context)
|
||||
const rclcpp::Context::SharedPtr & context)
|
||||
:impl_(std::make_unique<Impl>(clock, context))
|
||||
{
|
||||
}
|
||||
@@ -586,7 +586,7 @@ ClockConditionalVariable::notify_one()
|
||||
|
||||
bool
|
||||
ClockConditionalVariable::wait_until(
|
||||
std::unique_lock<std::mutex> & lock, rclcpp::Time until,
|
||||
std::unique_lock<std::mutex> & lock, const rclcpp::Time & until,
|
||||
const std::function<bool ()> & pred)
|
||||
{
|
||||
return impl_->wait_until(lock, until, pred);
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
std::remove_if(
|
||||
weak_contexts_.begin(),
|
||||
weak_contexts_.end(),
|
||||
[context](const Context::WeakPtr weak_context) {
|
||||
[context](const Context::WeakPtr & weak_context) {
|
||||
auto locked_context = weak_context.lock();
|
||||
if (!locked_context) {
|
||||
// take advantage and removed expired contexts
|
||||
@@ -388,14 +388,14 @@ Context::shutdown(const std::string & reason)
|
||||
}
|
||||
|
||||
rclcpp::Context::OnShutdownCallback
|
||||
Context::on_shutdown(OnShutdownCallback callback)
|
||||
Context::on_shutdown(const OnShutdownCallback & callback)
|
||||
{
|
||||
add_on_shutdown_callback(callback);
|
||||
return callback;
|
||||
}
|
||||
|
||||
rclcpp::OnShutdownCallbackHandle
|
||||
Context::add_on_shutdown_callback(OnShutdownCallback callback)
|
||||
Context::add_on_shutdown_callback(const OnShutdownCallback & callback)
|
||||
{
|
||||
return add_shutdown_callback<ShutdownType::on_shutdown>(callback);
|
||||
}
|
||||
@@ -407,7 +407,7 @@ Context::remove_on_shutdown_callback(const OnShutdownCallbackHandle & callback_h
|
||||
}
|
||||
|
||||
rclcpp::PreShutdownCallbackHandle
|
||||
Context::add_pre_shutdown_callback(PreShutdownCallback callback)
|
||||
Context::add_pre_shutdown_callback(const PreShutdownCallback & callback)
|
||||
{
|
||||
return add_shutdown_callback<ShutdownType::pre_shutdown>(callback);
|
||||
}
|
||||
@@ -422,7 +422,7 @@ Context::remove_pre_shutdown_callback(
|
||||
template<Context::ShutdownType shutdown_type>
|
||||
rclcpp::ShutdownCallbackHandle
|
||||
Context::add_shutdown_callback(
|
||||
ShutdownCallback callback)
|
||||
const ShutdownCallback & callback)
|
||||
{
|
||||
auto callback_shared_ptr =
|
||||
std::make_shared<ShutdownCallbackHandle::ShutdownCallbackType>(callback);
|
||||
@@ -497,8 +497,9 @@ Context::get_shutdown_callback() const
|
||||
const auto get_callback_vector = [](auto & mutex, auto & callback_set) {
|
||||
const std::lock_guard<std::recursive_mutex> lock(mutex);
|
||||
std::vector<rclcpp::Context::ShutdownCallback> callbacks;
|
||||
callbacks.reserve(callback_set.size());
|
||||
for (auto & callback : callback_set) {
|
||||
callbacks.push_back(*callback);
|
||||
callbacks.emplace_back(*callback);
|
||||
}
|
||||
return callbacks;
|
||||
};
|
||||
|
||||
@@ -19,13 +19,13 @@ namespace rclcpp
|
||||
{
|
||||
rclcpp::GenericClient::SharedPtr
|
||||
create_generic_client(
|
||||
std::shared_ptr<node_interfaces::NodeBaseInterface> node_base,
|
||||
std::shared_ptr<node_interfaces::NodeGraphInterface> node_graph,
|
||||
std::shared_ptr<node_interfaces::NodeServicesInterface> node_services,
|
||||
const std::shared_ptr<node_interfaces::NodeBaseInterface> & node_base,
|
||||
const std::shared_ptr<node_interfaces::NodeGraphInterface> & node_graph,
|
||||
const std::shared_ptr<node_interfaces::NodeServicesInterface> & node_services,
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
const rclcpp::QoS & qos,
|
||||
rclcpp::CallbackGroup::SharedPtr group)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group)
|
||||
{
|
||||
rcl_client_options_t options = rcl_client_get_default_options();
|
||||
options.qos = qos.get_rmw_qos_profile();
|
||||
|
||||
@@ -99,29 +99,29 @@ Executor::~Executor()
|
||||
notify_waitable_->remove_guard_condition(shutdown_guard_condition_);
|
||||
current_collection_.timers.update(
|
||||
{}, {},
|
||||
[this](auto timer) {wait_set_.remove_timer(timer);});
|
||||
[this](auto timer) {wait_set_.remove_timer(std::move(timer));});
|
||||
|
||||
current_collection_.subscriptions.update(
|
||||
{}, {},
|
||||
[this](auto subscription) {
|
||||
wait_set_.remove_subscription(subscription, kDefaultSubscriptionMask);
|
||||
wait_set_.remove_subscription(std::move(subscription), kDefaultSubscriptionMask);
|
||||
});
|
||||
|
||||
current_collection_.clients.update(
|
||||
{}, {},
|
||||
[this](auto client) {wait_set_.remove_client(client);});
|
||||
[this](auto client) {wait_set_.remove_client(std::move(client));});
|
||||
|
||||
current_collection_.services.update(
|
||||
{}, {},
|
||||
[this](auto service) {wait_set_.remove_service(service);});
|
||||
[this](auto service) {wait_set_.remove_service(std::move(service));});
|
||||
|
||||
current_collection_.guard_conditions.update(
|
||||
{}, {},
|
||||
[this](auto guard_condition) {wait_set_.remove_guard_condition(guard_condition);});
|
||||
[this](auto guard_condition) {wait_set_.remove_guard_condition(std::move(guard_condition));});
|
||||
|
||||
current_collection_.waitables.update(
|
||||
{}, {},
|
||||
[this](auto waitable) {wait_set_.remove_waitable(waitable);});
|
||||
[this](auto waitable) {wait_set_.remove_waitable(std::move(waitable));});
|
||||
|
||||
// Remove shutdown callback handle registered to Context
|
||||
if (!context_->remove_on_shutdown_callback(shutdown_callback_handle_)) {
|
||||
@@ -170,8 +170,8 @@ Executor::get_automatically_added_callback_groups_from_nodes()
|
||||
|
||||
void
|
||||
Executor::add_callback_group(
|
||||
rclcpp::CallbackGroup::SharedPtr group_ptr,
|
||||
[[maybe_unused]] rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group_ptr,
|
||||
[[maybe_unused]] const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
bool notify)
|
||||
{
|
||||
this->collector_.add_callback_group(group_ptr);
|
||||
@@ -186,7 +186,9 @@ Executor::add_callback_group(
|
||||
}
|
||||
|
||||
void
|
||||
Executor::add_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr, bool notify)
|
||||
Executor::add_node(
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
bool notify)
|
||||
{
|
||||
if (node_ptr->get_context() != context_) {
|
||||
throw std::runtime_error(
|
||||
@@ -206,7 +208,7 @@ Executor::add_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_pt
|
||||
|
||||
void
|
||||
Executor::remove_callback_group(
|
||||
rclcpp::CallbackGroup::SharedPtr group_ptr,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group_ptr,
|
||||
bool notify)
|
||||
{
|
||||
this->collector_.remove_callback_group(group_ptr);
|
||||
@@ -221,13 +223,15 @@ Executor::remove_callback_group(
|
||||
}
|
||||
|
||||
void
|
||||
Executor::add_node(std::shared_ptr<rclcpp::Node> node_ptr, bool notify)
|
||||
Executor::add_node(const std::shared_ptr<rclcpp::Node> & node_ptr, bool notify)
|
||||
{
|
||||
this->add_node(node_ptr->get_node_base_interface(), notify);
|
||||
}
|
||||
|
||||
void
|
||||
Executor::remove_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr, bool notify)
|
||||
Executor::remove_node(
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
bool notify)
|
||||
{
|
||||
this->collector_.remove_node(node_ptr);
|
||||
|
||||
@@ -241,14 +245,14 @@ Executor::remove_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node
|
||||
}
|
||||
|
||||
void
|
||||
Executor::remove_node(std::shared_ptr<rclcpp::Node> node_ptr, bool notify)
|
||||
Executor::remove_node(const std::shared_ptr<rclcpp::Node> & node_ptr, bool notify)
|
||||
{
|
||||
this->remove_node(node_ptr->get_node_base_interface(), notify);
|
||||
}
|
||||
|
||||
void
|
||||
Executor::spin_node_once_nanoseconds(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node,
|
||||
std::chrono::nanoseconds timeout)
|
||||
{
|
||||
this->add_node(node, false);
|
||||
@@ -311,7 +315,7 @@ Executor::spin_until_future_complete_impl(
|
||||
}
|
||||
|
||||
void
|
||||
Executor::spin_node_some(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node)
|
||||
Executor::spin_node_some(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node)
|
||||
{
|
||||
this->add_node(node, false);
|
||||
spin_some();
|
||||
@@ -319,7 +323,7 @@ Executor::spin_node_some(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr n
|
||||
}
|
||||
|
||||
void
|
||||
Executor::spin_node_some(std::shared_ptr<rclcpp::Node> node)
|
||||
Executor::spin_node_some(const std::shared_ptr<rclcpp::Node> & node)
|
||||
{
|
||||
this->spin_node_some(node->get_node_base_interface());
|
||||
}
|
||||
@@ -331,7 +335,7 @@ void Executor::spin_some(std::chrono::nanoseconds max_duration)
|
||||
|
||||
void
|
||||
Executor::spin_node_all(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node,
|
||||
std::chrono::nanoseconds max_duration)
|
||||
{
|
||||
this->add_node(node, false);
|
||||
@@ -340,7 +344,9 @@ Executor::spin_node_all(
|
||||
}
|
||||
|
||||
void
|
||||
Executor::spin_node_all(std::shared_ptr<rclcpp::Node> node, std::chrono::nanoseconds max_duration)
|
||||
Executor::spin_node_all(
|
||||
const std::shared_ptr<rclcpp::Node> & node,
|
||||
std::chrono::nanoseconds max_duration)
|
||||
{
|
||||
this->spin_node_all(node->get_node_base_interface(), max_duration);
|
||||
}
|
||||
@@ -546,7 +552,7 @@ take_and_do_error_handling(
|
||||
}
|
||||
|
||||
void
|
||||
Executor::execute_subscription(rclcpp::SubscriptionBase::SharedPtr subscription)
|
||||
Executor::execute_subscription(const rclcpp::SubscriptionBase::SharedPtr & subscription)
|
||||
{
|
||||
using rclcpp::dynamic_typesupport::DynamicMessage;
|
||||
|
||||
@@ -640,7 +646,7 @@ Executor::execute_subscription(rclcpp::SubscriptionBase::SharedPtr subscription)
|
||||
throw std::runtime_error("Unimplemented");
|
||||
}
|
||||
|
||||
default:
|
||||
case rclcpp::DeliveredMessageKind::INVALID:
|
||||
{
|
||||
throw std::runtime_error("Delivered message kind is not supported");
|
||||
}
|
||||
@@ -648,13 +654,15 @@ Executor::execute_subscription(rclcpp::SubscriptionBase::SharedPtr subscription)
|
||||
}
|
||||
|
||||
void
|
||||
Executor::execute_timer(rclcpp::TimerBase::SharedPtr timer, const std::shared_ptr<void> & data_ptr)
|
||||
Executor::execute_timer(
|
||||
const rclcpp::TimerBase::SharedPtr & timer,
|
||||
const std::shared_ptr<void> & data_ptr)
|
||||
{
|
||||
timer->execute_callback(data_ptr);
|
||||
}
|
||||
|
||||
void
|
||||
Executor::execute_service(rclcpp::ServiceBase::SharedPtr service)
|
||||
Executor::execute_service(const rclcpp::ServiceBase::SharedPtr & service)
|
||||
{
|
||||
auto request_header = service->create_request_header();
|
||||
std::shared_ptr<void> request = service->create_request();
|
||||
@@ -666,7 +674,7 @@ Executor::execute_service(rclcpp::ServiceBase::SharedPtr service)
|
||||
}
|
||||
|
||||
void
|
||||
Executor::execute_client(rclcpp::ClientBase::SharedPtr client)
|
||||
Executor::execute_client(const rclcpp::ClientBase::SharedPtr & client)
|
||||
{
|
||||
auto request_header = client->create_request_header();
|
||||
std::shared_ptr<void> response = client->create_response();
|
||||
@@ -708,37 +716,37 @@ Executor::collect_entities()
|
||||
// from the wait set as necessary.
|
||||
current_collection_.timers.update(
|
||||
collection.timers,
|
||||
[this](auto timer) {wait_set_.add_timer(timer);},
|
||||
[this](auto timer) {wait_set_.remove_timer(timer);});
|
||||
[this](auto timer) {wait_set_.add_timer(std::move(timer));},
|
||||
[this](auto timer) {wait_set_.remove_timer(std::move(timer));});
|
||||
|
||||
current_collection_.subscriptions.update(
|
||||
collection.subscriptions,
|
||||
[this](auto subscription) {
|
||||
wait_set_.add_subscription(subscription, kDefaultSubscriptionMask);
|
||||
wait_set_.add_subscription(std::move(subscription), kDefaultSubscriptionMask);
|
||||
},
|
||||
[this](auto subscription) {
|
||||
wait_set_.remove_subscription(subscription, kDefaultSubscriptionMask);
|
||||
wait_set_.remove_subscription(std::move(subscription), kDefaultSubscriptionMask);
|
||||
});
|
||||
|
||||
current_collection_.clients.update(
|
||||
collection.clients,
|
||||
[this](auto client) {wait_set_.add_client(client);},
|
||||
[this](auto client) {wait_set_.remove_client(client);});
|
||||
[this](auto client) {wait_set_.add_client(std::move(client));},
|
||||
[this](auto client) {wait_set_.remove_client(std::move(client));});
|
||||
|
||||
current_collection_.services.update(
|
||||
collection.services,
|
||||
[this](auto service) {wait_set_.add_service(service);},
|
||||
[this](auto service) {wait_set_.remove_service(service);});
|
||||
[this](auto service) {wait_set_.add_service(std::move(service));},
|
||||
[this](auto service) {wait_set_.remove_service(std::move(service));});
|
||||
|
||||
current_collection_.guard_conditions.update(
|
||||
collection.guard_conditions,
|
||||
[this](auto guard_condition) {wait_set_.add_guard_condition(guard_condition);},
|
||||
[this](auto guard_condition) {wait_set_.remove_guard_condition(guard_condition);});
|
||||
[this](auto guard_condition) {wait_set_.add_guard_condition(std::move(guard_condition));},
|
||||
[this](auto guard_condition) {wait_set_.remove_guard_condition(std::move(guard_condition));});
|
||||
|
||||
current_collection_.waitables.update(
|
||||
collection.waitables,
|
||||
[this](auto waitable) {wait_set_.add_waitable(waitable);},
|
||||
[this](auto waitable) {wait_set_.remove_waitable(waitable);});
|
||||
[this](auto waitable) {wait_set_.add_waitable(std::move(waitable));},
|
||||
[this](auto waitable) {wait_set_.remove_waitable(std::move(waitable));});
|
||||
|
||||
// In the case that an entity already has an expired weak pointer
|
||||
// before being removed from the waitset, additionally prune the waitset.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
void
|
||||
rclcpp::spin_all(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr,
|
||||
std::chrono::nanoseconds max_duration)
|
||||
{
|
||||
rclcpp::ExecutorOptions options;
|
||||
@@ -27,7 +27,7 @@ rclcpp::spin_all(
|
||||
}
|
||||
|
||||
void
|
||||
rclcpp::spin_some(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr)
|
||||
rclcpp::spin_some(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr)
|
||||
{
|
||||
rclcpp::ExecutorOptions options;
|
||||
options.context = node_ptr->get_context();
|
||||
@@ -36,7 +36,7 @@ rclcpp::spin_some(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr
|
||||
}
|
||||
|
||||
void
|
||||
rclcpp::spin(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr)
|
||||
rclcpp::spin(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr)
|
||||
{
|
||||
rclcpp::ExecutorOptions options;
|
||||
options.context = node_ptr->get_context();
|
||||
@@ -47,13 +47,13 @@ rclcpp::spin(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr)
|
||||
}
|
||||
|
||||
void
|
||||
rclcpp::spin(rclcpp::Node::SharedPtr node_ptr)
|
||||
rclcpp::spin(const rclcpp::Node::SharedPtr & node_ptr)
|
||||
{
|
||||
rclcpp::spin(node_ptr->get_node_base_interface());
|
||||
}
|
||||
|
||||
void
|
||||
rclcpp::spin_all(rclcpp::Node::SharedPtr node_ptr, std::chrono::nanoseconds max_duration)
|
||||
rclcpp::spin_all(const rclcpp::Node::SharedPtr & node_ptr, std::chrono::nanoseconds max_duration)
|
||||
{
|
||||
RCPPUTILS_DEPRECATION_WARNING_OFF_START
|
||||
rclcpp::spin_all(node_ptr->get_node_base_interface(), max_duration);
|
||||
@@ -61,7 +61,7 @@ rclcpp::spin_all(rclcpp::Node::SharedPtr node_ptr, std::chrono::nanoseconds max_
|
||||
}
|
||||
|
||||
void
|
||||
rclcpp::spin_some(rclcpp::Node::SharedPtr node_ptr)
|
||||
rclcpp::spin_some(const rclcpp::Node::SharedPtr & node_ptr)
|
||||
{
|
||||
RCPPUTILS_DEPRECATION_WARNING_OFF_START
|
||||
rclcpp::spin_some(node_ptr->get_node_base_interface());
|
||||
|
||||
@@ -70,7 +70,7 @@ build_entities_collection(
|
||||
{
|
||||
collection.clear();
|
||||
|
||||
for (auto weak_group_ptr : callback_groups) {
|
||||
for (const auto & weak_group_ptr : callback_groups) {
|
||||
auto group_ptr = weak_group_ptr.lock();
|
||||
if (!group_ptr) {
|
||||
continue;
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace executors
|
||||
{
|
||||
|
||||
ExecutorEntitiesCollector::ExecutorEntitiesCollector(
|
||||
std::shared_ptr<ExecutorNotifyWaitable> notify_waitable)
|
||||
const std::shared_ptr<ExecutorNotifyWaitable> & notify_waitable)
|
||||
: notify_waitable_(notify_waitable)
|
||||
{
|
||||
}
|
||||
@@ -47,7 +47,7 @@ ExecutorEntitiesCollector::~ExecutorEntitiesCollector()
|
||||
weak_group_it = remove_weak_callback_group(weak_group_it, manually_added_groups_);
|
||||
}
|
||||
|
||||
for (auto weak_node_ptr : pending_added_nodes_) {
|
||||
for (const auto & weak_node_ptr : pending_added_nodes_) {
|
||||
auto node_ptr = weak_node_ptr.lock();
|
||||
if (node_ptr) {
|
||||
node_ptr->get_associated_with_executor_atomic().store(false);
|
||||
@@ -56,7 +56,7 @@ ExecutorEntitiesCollector::~ExecutorEntitiesCollector()
|
||||
pending_added_nodes_.clear();
|
||||
pending_removed_nodes_.clear();
|
||||
|
||||
for (auto weak_group_ptr : pending_manually_added_groups_) {
|
||||
for (const auto & weak_group_ptr : pending_manually_added_groups_) {
|
||||
auto group_ptr = weak_group_ptr.lock();
|
||||
if (group_ptr) {
|
||||
group_ptr->get_associated_with_executor_atomic().store(false);
|
||||
@@ -83,7 +83,8 @@ ExecutorEntitiesCollector::has_pending() const
|
||||
}
|
||||
|
||||
void
|
||||
ExecutorEntitiesCollector::add_node(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr)
|
||||
ExecutorEntitiesCollector::add_node(
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr)
|
||||
{
|
||||
// If the node already has an executor
|
||||
std::atomic_bool & has_executor = node_ptr->get_associated_with_executor_atomic();
|
||||
@@ -109,7 +110,7 @@ ExecutorEntitiesCollector::add_node(rclcpp::node_interfaces::NodeBaseInterface::
|
||||
|
||||
void
|
||||
ExecutorEntitiesCollector::remove_node(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_ptr)
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_ptr)
|
||||
{
|
||||
std::atomic_bool & has_executor = node_ptr->get_associated_with_executor_atomic();
|
||||
if (!has_executor.exchange(false)) {
|
||||
@@ -133,7 +134,7 @@ ExecutorEntitiesCollector::remove_node(
|
||||
}
|
||||
|
||||
void
|
||||
ExecutorEntitiesCollector::add_callback_group(rclcpp::CallbackGroup::SharedPtr group_ptr)
|
||||
ExecutorEntitiesCollector::add_callback_group(const rclcpp::CallbackGroup::SharedPtr & group_ptr)
|
||||
{
|
||||
std::atomic_bool & has_executor = group_ptr->get_associated_with_executor_atomic();
|
||||
if (has_executor.exchange(true)) {
|
||||
@@ -158,7 +159,7 @@ ExecutorEntitiesCollector::add_callback_group(rclcpp::CallbackGroup::SharedPtr g
|
||||
}
|
||||
|
||||
void
|
||||
ExecutorEntitiesCollector::remove_callback_group(rclcpp::CallbackGroup::SharedPtr group_ptr)
|
||||
ExecutorEntitiesCollector::remove_callback_group(const rclcpp::CallbackGroup::SharedPtr & group_ptr)
|
||||
{
|
||||
if (!group_ptr->get_associated_with_executor_atomic().load()) {
|
||||
throw std::runtime_error("Callback group needs to be associated with an executor.");
|
||||
@@ -288,7 +289,7 @@ ExecutorEntitiesCollector::remove_weak_callback_group(
|
||||
|
||||
void
|
||||
ExecutorEntitiesCollector::add_callback_group_to_collection(
|
||||
rclcpp::CallbackGroup::SharedPtr group_ptr,
|
||||
const rclcpp::CallbackGroup::SharedPtr & group_ptr,
|
||||
CallbackGroupCollection & collection)
|
||||
{
|
||||
auto iter = collection.insert(group_ptr);
|
||||
@@ -305,7 +306,7 @@ ExecutorEntitiesCollector::add_callback_group_to_collection(
|
||||
void
|
||||
ExecutorEntitiesCollector::process_queues()
|
||||
{
|
||||
for (auto weak_node_ptr : pending_added_nodes_) {
|
||||
for (const auto & weak_node_ptr : pending_added_nodes_) {
|
||||
auto node_ptr = weak_node_ptr.lock();
|
||||
if (!node_ptr) {
|
||||
continue;
|
||||
@@ -320,7 +321,7 @@ ExecutorEntitiesCollector::process_queues()
|
||||
}
|
||||
pending_added_nodes_.clear();
|
||||
|
||||
for (auto weak_node_ptr : pending_removed_nodes_) {
|
||||
for (const auto & weak_node_ptr : pending_removed_nodes_) {
|
||||
auto node_it = weak_nodes_.find(weak_node_ptr);
|
||||
if (node_it != weak_nodes_.end()) {
|
||||
remove_weak_node(node_it);
|
||||
@@ -348,7 +349,7 @@ ExecutorEntitiesCollector::process_queues()
|
||||
}
|
||||
pending_removed_nodes_.clear();
|
||||
|
||||
for (auto weak_group_ptr : pending_manually_added_groups_) {
|
||||
for (const auto & weak_group_ptr : pending_manually_added_groups_) {
|
||||
auto group_ptr = weak_group_ptr.lock();
|
||||
if (group_ptr) {
|
||||
this->add_callback_group_to_collection(group_ptr, manually_added_groups_);
|
||||
@@ -363,7 +364,7 @@ ExecutorEntitiesCollector::process_queues()
|
||||
}
|
||||
pending_manually_added_groups_.clear();
|
||||
|
||||
for (auto weak_group_ptr : pending_manually_removed_groups_) {
|
||||
for (const auto & weak_group_ptr : pending_manually_removed_groups_) {
|
||||
auto group_ptr = weak_group_ptr.lock();
|
||||
if (group_ptr) {
|
||||
auto group_it = manually_added_groups_.find(group_ptr);
|
||||
@@ -386,7 +387,7 @@ ExecutorEntitiesCollector::add_automatically_associated_callback_groups(
|
||||
auto node = weak_node.lock();
|
||||
if (node) {
|
||||
node->for_each_callback_group(
|
||||
[this, node](rclcpp::CallbackGroup::SharedPtr group_ptr)
|
||||
[this, node](const rclcpp::CallbackGroup::SharedPtr & group_ptr)
|
||||
{
|
||||
if (!group_ptr->get_associated_with_executor_atomic().load() &&
|
||||
group_ptr->automatically_add_to_executor_with_node())
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace executors
|
||||
{
|
||||
|
||||
ExecutorNotifyWaitable::ExecutorNotifyWaitable(
|
||||
std::function<void(void)> on_execute_callback,
|
||||
const std::function<void(void)> & on_execute_callback,
|
||||
const rclcpp::Context::SharedPtr & context)
|
||||
: execute_callback_(on_execute_callback),
|
||||
guard_condition_(std::make_shared<rclcpp::GuardCondition>(context))
|
||||
@@ -144,13 +144,13 @@ ExecutorNotifyWaitable::take_data_by_entity_id([[maybe_unused]] size_t id)
|
||||
}
|
||||
|
||||
void
|
||||
ExecutorNotifyWaitable::set_on_ready_callback(std::function<void(size_t, int)> callback)
|
||||
ExecutorNotifyWaitable::set_on_ready_callback(std::function<void(size_t, int)> callback_in)
|
||||
{
|
||||
// The second argument of the callback could be used to identify which guard condition
|
||||
// triggered the event.
|
||||
// We could indicate which of the guard conditions was triggered, but the executor
|
||||
// is already going to check that.
|
||||
auto gc_callback = [callback](size_t count) {
|
||||
auto gc_callback = [callback = std::move(callback_in)](size_t count) {
|
||||
callback(count, 0);
|
||||
};
|
||||
|
||||
@@ -179,11 +179,12 @@ void
|
||||
ExecutorNotifyWaitable::set_execute_callback(std::function<void(void)> on_execute_callback)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(execute_mutex_);
|
||||
execute_callback_ = on_execute_callback;
|
||||
execute_callback_ = std::move(on_execute_callback);
|
||||
}
|
||||
|
||||
void
|
||||
ExecutorNotifyWaitable::add_guard_condition(rclcpp::GuardCondition::WeakPtr weak_guard_condition)
|
||||
ExecutorNotifyWaitable::add_guard_condition(
|
||||
const rclcpp::GuardCondition::WeakPtr & weak_guard_condition)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(guard_condition_mutex_);
|
||||
const auto & guard_condition = weak_guard_condition.lock();
|
||||
@@ -196,7 +197,8 @@ ExecutorNotifyWaitable::add_guard_condition(rclcpp::GuardCondition::WeakPtr weak
|
||||
}
|
||||
|
||||
void
|
||||
ExecutorNotifyWaitable::remove_guard_condition(rclcpp::GuardCondition::WeakPtr weak_guard_condition)
|
||||
ExecutorNotifyWaitable::remove_guard_condition(
|
||||
const rclcpp::GuardCondition::WeakPtr & weak_guard_condition)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(guard_condition_mutex_);
|
||||
const auto & guard_condition = weak_guard_condition.lock();
|
||||
|
||||
@@ -29,7 +29,7 @@ TimersManager::TimersManager(
|
||||
std::shared_ptr<rclcpp::Context> context,
|
||||
std::function<void(const rclcpp::TimerBase *, const std::shared_ptr<void> &)> on_ready_callback)
|
||||
: on_ready_callback_(on_ready_callback),
|
||||
context_(context)
|
||||
context_(std::move(context))
|
||||
{
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ TimersManager::~TimersManager()
|
||||
this->stop();
|
||||
}
|
||||
|
||||
void TimersManager::add_timer(rclcpp::TimerBase::SharedPtr timer)
|
||||
void TimersManager::add_timer(const rclcpp::TimerBase::SharedPtr & timer)
|
||||
{
|
||||
if (!timer) {
|
||||
throw std::invalid_argument("TimersManager::add_timer() trying to add nullptr timer");
|
||||
@@ -311,7 +311,7 @@ void TimersManager::clear()
|
||||
timers_cv_.notify_one();
|
||||
}
|
||||
|
||||
void TimersManager::remove_timer(TimerPtr timer)
|
||||
void TimersManager::remove_timer(const TimerPtr & timer)
|
||||
{
|
||||
bool removed = false;
|
||||
{
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace rclcpp
|
||||
{
|
||||
GenericClient::GenericClient(
|
||||
rclcpp::node_interfaces::NodeBaseInterface * node_base,
|
||||
rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph,
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
rcl_client_options_t & client_options)
|
||||
@@ -97,8 +97,8 @@ GenericClient::create_request_header()
|
||||
|
||||
void
|
||||
GenericClient::handle_response(
|
||||
std::shared_ptr<rmw_request_id_t> request_header,
|
||||
std::shared_ptr<void> response)
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & response)
|
||||
{
|
||||
auto optional_pending_request =
|
||||
this->get_and_erase_pending_request(request_header->sequence_number);
|
||||
@@ -108,13 +108,13 @@ GenericClient::handle_response(
|
||||
auto & value = *optional_pending_request;
|
||||
if (std::holds_alternative<Promise>(value)) {
|
||||
auto & promise = std::get<Promise>(value);
|
||||
promise.set_value(std::move(response));
|
||||
promise.set_value(response);
|
||||
} else if (std::holds_alternative<CallbackTypeValueVariant>(value)) {
|
||||
auto & inner = std::get<CallbackTypeValueVariant>(value);
|
||||
const auto & callback = std::get<CallbackType>(inner);
|
||||
auto & promise = std::get<Promise>(inner);
|
||||
auto & future = std::get<SharedFuture>(inner);
|
||||
promise.set_value(std::move(response));
|
||||
promise.set_value(response);
|
||||
callback(std::move(future));
|
||||
}
|
||||
}
|
||||
@@ -164,7 +164,7 @@ GenericClient::get_and_erase_pending_request(int64_t request_number)
|
||||
}
|
||||
|
||||
GenericClient::FutureAndRequestId
|
||||
GenericClient::async_send_request(const Request request)
|
||||
GenericClient::async_send_request(const Request & request)
|
||||
{
|
||||
Promise promise;
|
||||
auto future = promise.get_future();
|
||||
@@ -175,7 +175,7 @@ GenericClient::async_send_request(const Request request)
|
||||
}
|
||||
|
||||
int64_t
|
||||
GenericClient::async_send_request_impl(const Request request, CallbackInfoVariant value)
|
||||
GenericClient::async_send_request_impl(const Request & request, CallbackInfoVariant value)
|
||||
{
|
||||
int64_t sequence_number;
|
||||
std::lock_guard<std::mutex> lock(pending_requests_mutex_);
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
namespace rclcpp
|
||||
{
|
||||
GenericService::GenericService(
|
||||
std::shared_ptr<rcl_node_t> node_handle,
|
||||
const std::shared_ptr<rcl_node_t> & node_handle,
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
GenericServiceCallback any_callback,
|
||||
rcl_service_options_t & service_options)
|
||||
: ServiceBase(node_handle),
|
||||
any_callback_(any_callback)
|
||||
any_callback_(std::move(any_callback))
|
||||
{
|
||||
const rosidl_service_type_support_t * service_ts;
|
||||
try {
|
||||
@@ -98,7 +98,7 @@ GenericService::GenericService(
|
||||
|
||||
bool
|
||||
GenericService::take_request(
|
||||
SharedRequest request_out,
|
||||
SharedRequest & request_out,
|
||||
rmw_request_id_t & request_id_out)
|
||||
{
|
||||
request_out = create_request();
|
||||
@@ -141,8 +141,8 @@ GenericService::create_request_header()
|
||||
|
||||
void
|
||||
GenericService::handle_request(
|
||||
std::shared_ptr<rmw_request_id_t> request_header,
|
||||
std::shared_ptr<void> request)
|
||||
const std::shared_ptr<rmw_request_id_t> & request_header,
|
||||
const std::shared_ptr<void> & request)
|
||||
{
|
||||
auto response = any_callback_.dispatch(
|
||||
this->shared_from_this(), request_header, request, create_response());
|
||||
|
||||
@@ -37,6 +37,30 @@ GenericSubscription::create_serialized_message()
|
||||
return std::make_shared<rclcpp::SerializedMessage>(0);
|
||||
}
|
||||
|
||||
void
|
||||
GenericSubscription::disable_callbacks()
|
||||
{
|
||||
SubscriptionBase::disable_callbacks();
|
||||
any_callback_.disable();
|
||||
for (const auto & [_, event_ptr] : event_handlers_) {
|
||||
if (event_ptr) {
|
||||
event_ptr->disable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
GenericSubscription::enable_callbacks()
|
||||
{
|
||||
SubscriptionBase::enable_callbacks();
|
||||
any_callback_.enable();
|
||||
for (const auto & [_, event_ptr] : event_handlers_) {
|
||||
if (event_ptr) {
|
||||
event_ptr->enable();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
GenericSubscription::handle_message(
|
||||
std::shared_ptr<void> &,
|
||||
|
||||
@@ -112,7 +112,7 @@ GuardCondition::add_to_wait_set(rcl_wait_set_t & wait_set)
|
||||
}
|
||||
|
||||
void
|
||||
GuardCondition::set_on_trigger_callback(std::function<void(size_t)> callback)
|
||||
GuardCondition::set_on_trigger_callback(const std::function<void(size_t)> & callback)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(reentrant_mutex_);
|
||||
|
||||
|
||||
@@ -33,8 +33,8 @@ IntraProcessManager::~IntraProcessManager()
|
||||
|
||||
uint64_t
|
||||
IntraProcessManager::add_publisher(
|
||||
rclcpp::PublisherBase::SharedPtr publisher,
|
||||
rclcpp::experimental::buffers::IntraProcessBufferBase::SharedPtr buffer)
|
||||
const rclcpp::PublisherBase::SharedPtr & publisher,
|
||||
const rclcpp::experimental::buffers::IntraProcessBufferBase::SharedPtr & buffer)
|
||||
{
|
||||
std::unique_lock<std::shared_timed_mutex> lock(mutex_);
|
||||
|
||||
@@ -51,6 +51,9 @@ IntraProcessManager::add_publisher(
|
||||
}
|
||||
}
|
||||
|
||||
// Add GID to publisher info mapping for fast lookups (stores both ID and weak_ptr)
|
||||
gid_to_publisher_info_[publisher->get_gid()] = {pub_id, publisher};
|
||||
|
||||
// Initialize the subscriptions storage for this publisher.
|
||||
pub_to_subs_[pub_id] = SplittedSubscriptions();
|
||||
|
||||
@@ -98,6 +101,24 @@ IntraProcessManager::remove_publisher(uint64_t intra_process_publisher_id)
|
||||
{
|
||||
std::unique_lock<std::shared_timed_mutex> lock(mutex_);
|
||||
|
||||
// Remove GID to publisher info mapping.
|
||||
// First try via the publisher's own GID (fast path).
|
||||
auto pub_it = publishers_.find(intra_process_publisher_id);
|
||||
if (pub_it != publishers_.end()) {
|
||||
auto publisher = pub_it->second.lock();
|
||||
if (publisher) {
|
||||
gid_to_publisher_info_.erase(publisher->get_gid());
|
||||
} else {
|
||||
// Publisher weak_ptr already expired, fall back to linear scan by pub_id.
|
||||
for (auto git = gid_to_publisher_info_.begin(); git != gid_to_publisher_info_.end(); ++git) {
|
||||
if (git->second.pub_id == intra_process_publisher_id) {
|
||||
gid_to_publisher_info_.erase(git);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
publishers_.erase(intra_process_publisher_id);
|
||||
publisher_buffers_.erase(intra_process_publisher_id);
|
||||
pub_to_subs_.erase(intra_process_publisher_id);
|
||||
@@ -108,16 +129,15 @@ IntraProcessManager::matches_any_publishers(const rmw_gid_t * id) const
|
||||
{
|
||||
std::shared_lock<std::shared_timed_mutex> lock(mutex_);
|
||||
|
||||
for (auto & publisher_pair : publishers_) {
|
||||
auto publisher = publisher_pair.second.lock();
|
||||
if (!publisher) {
|
||||
continue;
|
||||
}
|
||||
if (*publisher.get() == id) {
|
||||
return true;
|
||||
}
|
||||
// Single O(1) hash map lookup - struct contains both ID and weak_ptr
|
||||
auto it = gid_to_publisher_info_.find(*id);
|
||||
if (it == gid_to_publisher_info_.end()) {
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
|
||||
// Verify the publisher still exists by checking the weak_ptr
|
||||
auto publisher = it->second.publisher.lock();
|
||||
return publisher != nullptr;
|
||||
}
|
||||
|
||||
size_t
|
||||
@@ -197,8 +217,8 @@ IntraProcessManager::insert_sub_id_for_pub(
|
||||
|
||||
bool
|
||||
IntraProcessManager::can_communicate(
|
||||
rclcpp::PublisherBase::SharedPtr pub,
|
||||
rclcpp::experimental::SubscriptionIntraProcessBase::SharedPtr sub) const
|
||||
const rclcpp::PublisherBase::SharedPtr & pub,
|
||||
const rclcpp::experimental::SubscriptionIntraProcessBase::SharedPtr & sub) const
|
||||
{
|
||||
// publisher and subscription must be on the same topic
|
||||
if (strcmp(pub->get_topic_name(), sub->get_topic_name()) != 0) {
|
||||
|
||||
@@ -547,6 +547,18 @@ Node::get_subscriptions_info_by_topic(const std::string & topic_name, bool no_ma
|
||||
return node_graph_->get_subscriptions_info_by_topic(topic_name, no_mangle);
|
||||
}
|
||||
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
Node::get_clients_info_by_service(const std::string & service_name, bool no_mangle) const
|
||||
{
|
||||
return node_graph_->get_clients_info_by_service(service_name, no_mangle);
|
||||
}
|
||||
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
Node::get_servers_info_by_service(const std::string & service_name, bool no_mangle) const
|
||||
{
|
||||
return node_graph_->get_servers_info_by_service(service_name, no_mangle);
|
||||
}
|
||||
|
||||
void
|
||||
Node::for_each_callback_group(
|
||||
const node_interfaces::NodeBaseInterface::CallbackGroupFunction & func)
|
||||
@@ -562,7 +574,7 @@ Node::get_graph_event()
|
||||
|
||||
void
|
||||
Node::wait_for_graph_change(
|
||||
rclcpp::Event::SharedPtr event,
|
||||
const rclcpp::Event::SharedPtr & event,
|
||||
std::chrono::nanoseconds timeout)
|
||||
{
|
||||
node_graph_->wait_for_graph_change(event, timeout);
|
||||
@@ -683,7 +695,7 @@ Node::create_generic_client(
|
||||
const std::string & service_name,
|
||||
const std::string & service_type,
|
||||
const rclcpp::QoS & qos,
|
||||
rclcpp::CallbackGroup::SharedPtr group)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group)
|
||||
{
|
||||
return rclcpp::create_generic_client(
|
||||
node_base_,
|
||||
|
||||
@@ -42,13 +42,13 @@ NodeBase::NodeBase(
|
||||
bool use_intra_process_default,
|
||||
bool enable_topic_statistics_default,
|
||||
rclcpp::CallbackGroup::SharedPtr default_callback_group)
|
||||
: context_(context),
|
||||
: context_(std::move(context)),
|
||||
use_intra_process_default_(use_intra_process_default),
|
||||
enable_topic_statistics_default_(enable_topic_statistics_default),
|
||||
node_handle_(nullptr),
|
||||
default_callback_group_(default_callback_group),
|
||||
default_callback_group_(std::move(default_callback_group)),
|
||||
associated_with_executor_(false),
|
||||
notify_guard_condition_(std::make_shared<rclcpp::GuardCondition>(context)),
|
||||
notify_guard_condition_(std::make_shared<rclcpp::GuardCondition>(context_)),
|
||||
notify_guard_condition_is_valid_(false)
|
||||
{
|
||||
// Create the rcl node and store it in a shared_ptr with a custom destructor.
|
||||
|
||||
@@ -26,11 +26,11 @@ NodeClock::NodeClock(
|
||||
rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services,
|
||||
rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging,
|
||||
rcl_clock_type_t clock_type)
|
||||
: node_base_(node_base),
|
||||
node_topics_(node_topics),
|
||||
node_graph_(node_graph),
|
||||
node_services_(node_services),
|
||||
node_logging_(node_logging),
|
||||
: node_base_(std::move(node_base)),
|
||||
node_topics_(std::move(node_topics)),
|
||||
node_graph_(std::move(node_graph)),
|
||||
node_services_(std::move(node_services)),
|
||||
node_logging_(std::move(node_logging)),
|
||||
clock_(std::make_shared<rclcpp::Clock>(clock_type))
|
||||
{}
|
||||
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include "rclcpp/node_interfaces/node_graph.hpp"
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <tuple>
|
||||
@@ -644,8 +645,9 @@ std::vector<rclcpp::TopicEndpointInfo>
|
||||
convert_to_topic_info_list(const rcl_topic_endpoint_info_array_t & info_array)
|
||||
{
|
||||
std::vector<rclcpp::TopicEndpointInfo> topic_info_list;
|
||||
topic_info_list.reserve(info_array.size);
|
||||
for (size_t i = 0; i < info_array.size; ++i) {
|
||||
topic_info_list.push_back(rclcpp::TopicEndpointInfo(info_array.info_array[i]));
|
||||
topic_info_list.emplace_back(info_array.info_array[i]);
|
||||
}
|
||||
return topic_info_list;
|
||||
}
|
||||
@@ -753,6 +755,123 @@ NodeGraph::get_subscriptions_info_by_topic(
|
||||
rcl_get_subscriptions_info_by_topic);
|
||||
}
|
||||
|
||||
static
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
convert_to_service_info_list(const rcl_service_endpoint_info_array_t & info_array)
|
||||
{
|
||||
std::vector<rclcpp::ServiceEndpointInfo> service_info_list;
|
||||
service_info_list.reserve(info_array.size);
|
||||
for (size_t i = 0; i < info_array.size; ++i) {
|
||||
service_info_list.emplace_back(info_array.info_array[i]);
|
||||
}
|
||||
return service_info_list;
|
||||
}
|
||||
|
||||
template<const char * EndpointType, typename FunctionT>
|
||||
static std::vector<rclcpp::ServiceEndpointInfo>
|
||||
get_info_by_service(
|
||||
rclcpp::node_interfaces::NodeBaseInterface * node_base,
|
||||
const std::string & service_name,
|
||||
bool no_mangle,
|
||||
FunctionT rcl_get_info_by_service)
|
||||
{
|
||||
std::string fqdn;
|
||||
auto rcl_node_handle = node_base->get_rcl_node_handle();
|
||||
|
||||
if (no_mangle) {
|
||||
fqdn = service_name;
|
||||
} else {
|
||||
fqdn = rclcpp::expand_topic_or_service_name(
|
||||
service_name,
|
||||
rcl_node_get_name(rcl_node_handle),
|
||||
rcl_node_get_namespace(rcl_node_handle),
|
||||
true);
|
||||
|
||||
// Get the node options
|
||||
const rcl_node_options_t * node_options = rcl_node_get_options(rcl_node_handle);
|
||||
if (nullptr == node_options) {
|
||||
throw std::runtime_error("Need valid node options in get_info_by_service()");
|
||||
}
|
||||
const rcl_arguments_t * global_args = nullptr;
|
||||
if (node_options->use_global_arguments) {
|
||||
global_args = &(rcl_node_handle->context->global_arguments);
|
||||
}
|
||||
|
||||
char * remapped_service_name = nullptr;
|
||||
rcl_ret_t ret = rcl_remap_service_name(
|
||||
&(node_options->arguments),
|
||||
global_args,
|
||||
fqdn.c_str(),
|
||||
rcl_node_get_name(rcl_node_handle),
|
||||
rcl_node_get_namespace(rcl_node_handle),
|
||||
node_options->allocator,
|
||||
&remapped_service_name);
|
||||
if (RCL_RET_OK != ret) {
|
||||
throw_from_rcl_error(ret, std::string("Failed to remap service name ") + fqdn);
|
||||
} else if (nullptr != remapped_service_name) {
|
||||
fqdn = remapped_service_name;
|
||||
node_options->allocator.deallocate(remapped_service_name, node_options->allocator.state);
|
||||
}
|
||||
}
|
||||
|
||||
rcutils_allocator_t allocator = rcutils_get_default_allocator();
|
||||
rcl_service_endpoint_info_array_t info_array =
|
||||
rcl_get_zero_initialized_service_endpoint_info_array();
|
||||
rcl_ret_t ret =
|
||||
rcl_get_info_by_service(rcl_node_handle, &allocator, fqdn.c_str(), no_mangle, &info_array);
|
||||
if (RCL_RET_OK != ret) {
|
||||
auto error_msg =
|
||||
std::string("Failed to get information by service for ") + EndpointType + std::string(":");
|
||||
if (RCL_RET_UNSUPPORTED == ret) {
|
||||
error_msg += std::string("function not supported by RMW_IMPLEMENTATION");
|
||||
} else {
|
||||
error_msg += rcl_get_error_string().str;
|
||||
}
|
||||
rcl_reset_error();
|
||||
if (RCL_RET_OK != rcl_service_endpoint_info_array_fini(&info_array, &allocator)) {
|
||||
error_msg += std::string(", failed also to cleanup service info array, leaking memory: ") +
|
||||
rcl_get_error_string().str;
|
||||
rcl_reset_error();
|
||||
}
|
||||
throw_from_rcl_error(ret, error_msg);
|
||||
}
|
||||
|
||||
std::vector<rclcpp::ServiceEndpointInfo> service_info_list =
|
||||
convert_to_service_info_list(info_array);
|
||||
ret = rcl_service_endpoint_info_array_fini(&info_array, &allocator);
|
||||
if (RCL_RET_OK != ret) {
|
||||
throw_from_rcl_error(ret, "rcl_service_info_array_fini failed.");
|
||||
}
|
||||
|
||||
return service_info_list;
|
||||
}
|
||||
|
||||
static constexpr char kClientEndpointTypeName[] = "clients";
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
NodeGraph::get_clients_info_by_service(
|
||||
const std::string & service_name,
|
||||
bool no_mangle) const
|
||||
{
|
||||
return get_info_by_service<kClientEndpointTypeName>(
|
||||
node_base_,
|
||||
service_name,
|
||||
no_mangle,
|
||||
rcl_get_clients_info_by_service);
|
||||
}
|
||||
|
||||
static constexpr char kServerEndpointTypeName[] = "servers";
|
||||
std::vector<rclcpp::ServiceEndpointInfo>
|
||||
NodeGraph::get_servers_info_by_service(
|
||||
const std::string & service_name,
|
||||
bool no_mangle) const
|
||||
{
|
||||
return get_info_by_service<kServerEndpointTypeName>(
|
||||
node_base_,
|
||||
service_name,
|
||||
no_mangle,
|
||||
rcl_get_servers_info_by_service);
|
||||
}
|
||||
|
||||
std::string &
|
||||
rclcpp::TopicEndpointInfo::node_name()
|
||||
{
|
||||
@@ -836,3 +955,99 @@ rclcpp::TopicEndpointInfo::topic_type_hash() const
|
||||
{
|
||||
return topic_type_hash_;
|
||||
}
|
||||
|
||||
std::string &
|
||||
rclcpp::ServiceEndpointInfo::node_name()
|
||||
{
|
||||
return node_name_;
|
||||
}
|
||||
|
||||
const std::string &
|
||||
rclcpp::ServiceEndpointInfo::node_name() const
|
||||
{
|
||||
return node_name_;
|
||||
}
|
||||
|
||||
std::string &
|
||||
rclcpp::ServiceEndpointInfo::node_namespace()
|
||||
{
|
||||
return node_namespace_;
|
||||
}
|
||||
|
||||
const std::string &
|
||||
rclcpp::ServiceEndpointInfo::node_namespace() const
|
||||
{
|
||||
return node_namespace_;
|
||||
}
|
||||
|
||||
std::string &
|
||||
rclcpp::ServiceEndpointInfo::service_type()
|
||||
{
|
||||
return service_type_;
|
||||
}
|
||||
|
||||
const std::string &
|
||||
rclcpp::ServiceEndpointInfo::service_type() const
|
||||
{
|
||||
return service_type_;
|
||||
}
|
||||
|
||||
rclcpp::EndpointType &
|
||||
rclcpp::ServiceEndpointInfo::endpoint_type()
|
||||
{
|
||||
return endpoint_type_;
|
||||
}
|
||||
|
||||
const rclcpp::EndpointType &
|
||||
rclcpp::ServiceEndpointInfo::endpoint_type() const
|
||||
{
|
||||
return endpoint_type_;
|
||||
}
|
||||
|
||||
size_t &
|
||||
rclcpp::ServiceEndpointInfo::endpoint_count()
|
||||
{
|
||||
return endpoint_count_;
|
||||
}
|
||||
|
||||
const size_t &
|
||||
rclcpp::ServiceEndpointInfo::endpoint_count() const
|
||||
{
|
||||
return endpoint_count_;
|
||||
}
|
||||
|
||||
std::vector<std::array<uint8_t, RMW_GID_STORAGE_SIZE>> &
|
||||
rclcpp::ServiceEndpointInfo::endpoint_gids()
|
||||
{
|
||||
return endpoint_gids_;
|
||||
}
|
||||
|
||||
const std::vector<std::array<uint8_t, RMW_GID_STORAGE_SIZE>> &
|
||||
rclcpp::ServiceEndpointInfo::endpoint_gids() const
|
||||
{
|
||||
return endpoint_gids_;
|
||||
}
|
||||
|
||||
std::vector<rclcpp::QoS> &
|
||||
rclcpp::ServiceEndpointInfo::qos_profiles()
|
||||
{
|
||||
return qos_profiles_;
|
||||
}
|
||||
|
||||
const std::vector<rclcpp::QoS> &
|
||||
rclcpp::ServiceEndpointInfo::qos_profiles() const
|
||||
{
|
||||
return qos_profiles_;
|
||||
}
|
||||
|
||||
rosidl_type_hash_t &
|
||||
rclcpp::ServiceEndpointInfo::service_type_hash()
|
||||
{
|
||||
return service_type_hash_;
|
||||
}
|
||||
|
||||
const rosidl_type_hash_t &
|
||||
rclcpp::ServiceEndpointInfo::service_type_hash() const
|
||||
{
|
||||
return service_type_hash_;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
using rclcpp::node_interfaces::NodeLogging;
|
||||
|
||||
NodeLogging::NodeLogging(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base)
|
||||
NodeLogging::NodeLogging(const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_base)
|
||||
: node_base_(node_base)
|
||||
{
|
||||
logger_ = rclcpp::get_logger(NodeLogging::get_logger_name());
|
||||
@@ -41,7 +41,7 @@ NodeLogging::get_logger_name() const
|
||||
}
|
||||
|
||||
void NodeLogging::create_logger_services(
|
||||
node_interfaces::NodeServicesInterface::SharedPtr node_services)
|
||||
const node_interfaces::NodeServicesInterface::SharedPtr & node_services)
|
||||
{
|
||||
rclcpp::ServicesQoS qos_profile;
|
||||
const std::string node_name = node_base_->get_name();
|
||||
@@ -51,8 +51,8 @@ void NodeLogging::create_logger_services(
|
||||
node_base_, node_services,
|
||||
node_name + "/get_logger_levels",
|
||||
[](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::GetLoggerLevels::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::GetLoggerLevels::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::GetLoggerLevels::Response> response)
|
||||
{
|
||||
for (auto & name : request->names) {
|
||||
@@ -73,8 +73,8 @@ void NodeLogging::create_logger_services(
|
||||
node_base_, node_services,
|
||||
node_name + "/set_logger_levels",
|
||||
[](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::SetLoggerLevels::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::SetLoggerLevels::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::SetLoggerLevels::Response> response)
|
||||
{
|
||||
rcl_interfaces::msg::SetLoggerLevelsResult result;
|
||||
|
||||
@@ -29,13 +29,13 @@ NodeTimeSource::NodeTimeSource(
|
||||
rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters,
|
||||
const rclcpp::QoS & qos,
|
||||
bool use_clock_thread)
|
||||
: node_base_(node_base),
|
||||
node_topics_(node_topics),
|
||||
node_graph_(node_graph),
|
||||
node_services_(node_services),
|
||||
node_logging_(node_logging),
|
||||
node_clock_(node_clock),
|
||||
node_parameters_(node_parameters),
|
||||
: node_base_(std::move(node_base)),
|
||||
node_topics_(std::move(node_topics)),
|
||||
node_graph_(std::move(node_graph)),
|
||||
node_services_(std::move(node_services)),
|
||||
node_logging_(std::move(node_logging)),
|
||||
node_clock_(std::move(node_clock)),
|
||||
node_parameters_(std::move(node_parameters)),
|
||||
time_source_(qos, use_clock_thread)
|
||||
{
|
||||
time_source_.attachNode(
|
||||
|
||||
@@ -59,11 +59,11 @@ public:
|
||||
|
||||
NodeTypeDescriptionsImpl(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base,
|
||||
rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging,
|
||||
rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters,
|
||||
rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services)
|
||||
const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & node_logging,
|
||||
const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & node_parameters,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr & node_services)
|
||||
: logger_(node_logging->get_logger()),
|
||||
node_base_(node_base)
|
||||
node_base_(std::move(node_base))
|
||||
{
|
||||
rclcpp::ParameterValue enable_param;
|
||||
const std::string enable_param_name = "start_type_description_service";
|
||||
@@ -92,7 +92,7 @@ public:
|
||||
}
|
||||
|
||||
if (enable_param.get<bool>()) {
|
||||
auto * rcl_node = node_base->get_rcl_node_handle();
|
||||
auto * rcl_node = node_base_->get_rcl_node_handle();
|
||||
std::shared_ptr<rcl_service_t> rcl_srv(
|
||||
new rcl_service_t,
|
||||
[rcl_node, logger = this->logger_](rcl_service_t * service)
|
||||
@@ -121,9 +121,9 @@ public:
|
||||
rclcpp::AnyServiceCallback<ServiceT> cb;
|
||||
cb.set(
|
||||
[this](
|
||||
std::shared_ptr<rmw_request_id_t> header,
|
||||
std::shared_ptr<ServiceT::Request> request,
|
||||
std::shared_ptr<ServiceT::Response> response
|
||||
const std::shared_ptr<rmw_request_id_t> & header,
|
||||
const std::shared_ptr<ServiceT::Request> & request,
|
||||
const std::shared_ptr<ServiceT::Response> & response
|
||||
) {
|
||||
rcl_node_type_description_service_handle_request(
|
||||
node_base_->get_rcl_node_handle(),
|
||||
@@ -144,10 +144,10 @@ public:
|
||||
};
|
||||
|
||||
NodeTypeDescriptions::NodeTypeDescriptions(
|
||||
rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base,
|
||||
rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr node_logging,
|
||||
rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters,
|
||||
rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services)
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_base,
|
||||
const rclcpp::node_interfaces::NodeLoggingInterface::SharedPtr & node_logging,
|
||||
const rclcpp::node_interfaces::NodeParametersInterface::SharedPtr & node_parameters,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr & node_services)
|
||||
: impl_(new NodeTypeDescriptionsImpl(
|
||||
node_base,
|
||||
node_logging,
|
||||
|
||||
@@ -143,7 +143,7 @@ NodeOptions::context() const
|
||||
}
|
||||
|
||||
NodeOptions &
|
||||
NodeOptions::context(rclcpp::Context::SharedPtr context)
|
||||
NodeOptions::context(const rclcpp::Context::SharedPtr & context)
|
||||
{
|
||||
this->context_ = context;
|
||||
return *this;
|
||||
|
||||
@@ -30,13 +30,13 @@ using rclcpp::AsyncParametersClient;
|
||||
using rclcpp::SyncParametersClient;
|
||||
|
||||
AsyncParametersClient::AsyncParametersClient(
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr node_base_interface,
|
||||
const rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr node_topics_interface,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr node_graph_interface,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr node_services_interface,
|
||||
const rclcpp::node_interfaces::NodeBaseInterface::SharedPtr & node_base_interface,
|
||||
const rclcpp::node_interfaces::NodeTopicsInterface::SharedPtr & node_topics_interface,
|
||||
const rclcpp::node_interfaces::NodeGraphInterface::SharedPtr & node_graph_interface,
|
||||
const rclcpp::node_interfaces::NodeServicesInterface::SharedPtr & node_services_interface,
|
||||
const std::string & remote_node_name,
|
||||
const rclcpp::QoS & qos_profile,
|
||||
rclcpp::CallbackGroup::SharedPtr group)
|
||||
const rclcpp::CallbackGroup::SharedPtr & group)
|
||||
: node_topics_interface_(node_topics_interface)
|
||||
{
|
||||
if (remote_node_name != "") {
|
||||
@@ -107,9 +107,9 @@ AsyncParametersClient::AsyncParametersClient(
|
||||
std::shared_future<std::vector<rclcpp::Parameter>>
|
||||
AsyncParametersClient::get_parameters(
|
||||
const std::vector<std::string> & names,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rclcpp::Parameter>>)
|
||||
> callback)
|
||||
> & callback)
|
||||
{
|
||||
auto promise_result =
|
||||
std::make_shared<std::promise<std::vector<rclcpp::Parameter>>>();
|
||||
@@ -147,9 +147,9 @@ AsyncParametersClient::get_parameters(
|
||||
std::shared_future<std::vector<rcl_interfaces::msg::ParameterDescriptor>>
|
||||
AsyncParametersClient::describe_parameters(
|
||||
const std::vector<std::string> & names,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rcl_interfaces::msg::ParameterDescriptor>>)
|
||||
> callback)
|
||||
> & callback)
|
||||
{
|
||||
auto promise_result =
|
||||
std::make_shared<std::promise<std::vector<rcl_interfaces::msg::ParameterDescriptor>>>();
|
||||
@@ -176,9 +176,9 @@ AsyncParametersClient::describe_parameters(
|
||||
std::shared_future<std::vector<rclcpp::ParameterType>>
|
||||
AsyncParametersClient::get_parameter_types(
|
||||
const std::vector<std::string> & names,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rclcpp::ParameterType>>)
|
||||
> callback)
|
||||
> & callback)
|
||||
{
|
||||
auto promise_result =
|
||||
std::make_shared<std::promise<std::vector<rclcpp::ParameterType>>>();
|
||||
@@ -210,9 +210,9 @@ AsyncParametersClient::get_parameter_types(
|
||||
std::shared_future<std::vector<rcl_interfaces::msg::SetParametersResult>>
|
||||
AsyncParametersClient::set_parameters(
|
||||
const std::vector<rclcpp::Parameter> & parameters,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<std::vector<rcl_interfaces::msg::SetParametersResult>>)
|
||||
> callback)
|
||||
> & callback)
|
||||
{
|
||||
auto promise_result =
|
||||
std::make_shared<std::promise<std::vector<rcl_interfaces::msg::SetParametersResult>>>();
|
||||
@@ -243,9 +243,9 @@ AsyncParametersClient::set_parameters(
|
||||
std::shared_future<rcl_interfaces::msg::SetParametersResult>
|
||||
AsyncParametersClient::set_parameters_atomically(
|
||||
const std::vector<rclcpp::Parameter> & parameters,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<rcl_interfaces::msg::SetParametersResult>)
|
||||
> callback)
|
||||
> & callback)
|
||||
{
|
||||
auto promise_result =
|
||||
std::make_shared<std::promise<rcl_interfaces::msg::SetParametersResult>>();
|
||||
@@ -322,9 +322,9 @@ std::shared_future<rcl_interfaces::msg::ListParametersResult>
|
||||
AsyncParametersClient::list_parameters(
|
||||
const std::vector<std::string> & prefixes,
|
||||
uint64_t depth,
|
||||
std::function<
|
||||
const std::function<
|
||||
void(std::shared_future<rcl_interfaces::msg::ListParametersResult>)
|
||||
> callback)
|
||||
> & callback)
|
||||
{
|
||||
auto promise_result =
|
||||
std::make_shared<std::promise<rcl_interfaces::msg::ListParametersResult>>();
|
||||
|
||||
97
rclcpp/src/rclcpp/parameter_descriptor_wrapper.cpp
Normal file
97
rclcpp/src/rclcpp/parameter_descriptor_wrapper.cpp
Normal file
@@ -0,0 +1,97 @@
|
||||
// Copyright 2023 Open Source Robotics Foundation, Inc.
|
||||
//
|
||||
// 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 "rclcpp/parameter_descriptor_wrapper.hpp"
|
||||
|
||||
namespace rclcpp
|
||||
{
|
||||
|
||||
ParameterDescription::ParameterDescription()
|
||||
{
|
||||
// Need to set this in the constructor, but it doesn't necessarily need to be used
|
||||
parameter_descriptor.type = rcl_interfaces::msg::ParameterType::PARAMETER_NOT_SET;
|
||||
}
|
||||
|
||||
rcl_interfaces::msg::ParameterDescriptor ParameterDescription::build() const
|
||||
{
|
||||
// Return some some sort message
|
||||
return parameter_descriptor;
|
||||
}
|
||||
|
||||
// Builder methods which set up the original class
|
||||
// They all follow the same format of initing the value given within the base class
|
||||
// then returning the current class
|
||||
ParameterDescription & ParameterDescription::set_name(const std::string & name)
|
||||
{
|
||||
parameter_descriptor.name = name;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ParameterDescription & ParameterDescription::set_type(std::uint8_t type)
|
||||
{
|
||||
parameter_descriptor.type = type;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ParameterDescription & ParameterDescription::set_description_text(const std::string & description)
|
||||
{
|
||||
parameter_descriptor.description = description;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ParameterDescription & ParameterDescription::set_additional_constraints(
|
||||
const std::string & constraints)
|
||||
{
|
||||
parameter_descriptor.additional_constraints = constraints;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ParameterDescription & ParameterDescription::set_read_only(bool read_only)
|
||||
{
|
||||
parameter_descriptor.read_only = read_only;
|
||||
return *this;
|
||||
}
|
||||
|
||||
ParameterDescription & ParameterDescription::set_dynamic_typing(bool dynamic_typing)
|
||||
{
|
||||
parameter_descriptor.dynamic_typing = dynamic_typing;
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Here is the Specific range function for this parameter description
|
||||
ParameterDescription & ParameterDescription::set_floating_point_description_range(
|
||||
float min, float max, float step)
|
||||
{
|
||||
if (parameter_descriptor.type == rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE) {
|
||||
parameter_descriptor.floating_point_range.resize(1);
|
||||
parameter_descriptor.floating_point_range.at(0).from_value = min;
|
||||
parameter_descriptor.floating_point_range.at(0).to_value = max;
|
||||
parameter_descriptor.floating_point_range.at(0).step = step;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
ParameterDescription & ParameterDescription::set_integer_description_range(
|
||||
int min, int max, int step)
|
||||
{
|
||||
if (parameter_descriptor.type == rcl_interfaces::msg::ParameterType::PARAMETER_INTEGER) {
|
||||
parameter_descriptor.integer_range.resize(1);
|
||||
parameter_descriptor.integer_range.at(0).from_value = min;
|
||||
parameter_descriptor.integer_range.at(0).to_value = max;
|
||||
parameter_descriptor.integer_range.at(0).step = step;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
} // namespace rclcpp
|
||||
@@ -27,7 +27,7 @@ namespace rclcpp
|
||||
|
||||
ParameterEventCallbackHandle::SharedPtr
|
||||
ParameterEventHandler::add_parameter_event_callback(
|
||||
ParameterEventCallbackType callback)
|
||||
const ParameterEventCallbackType & callback)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(callbacks_->mutex_);
|
||||
auto handle = std::make_shared<ParameterEventCallbackHandle>();
|
||||
@@ -39,7 +39,7 @@ ParameterEventHandler::add_parameter_event_callback(
|
||||
|
||||
void
|
||||
ParameterEventHandler::remove_parameter_event_callback(
|
||||
ParameterEventCallbackHandle::SharedPtr callback_handle)
|
||||
const ParameterEventCallbackHandle::SharedPtr & callback_handle)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(callbacks_->mutex_);
|
||||
auto it = std::find_if(
|
||||
@@ -58,7 +58,7 @@ ParameterEventHandler::remove_parameter_event_callback(
|
||||
ParameterCallbackHandle::SharedPtr
|
||||
ParameterEventHandler::add_parameter_callback(
|
||||
const std::string & parameter_name,
|
||||
ParameterCallbackType callback,
|
||||
const ParameterCallbackType & callback,
|
||||
const std::string & node_name)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(callbacks_->mutex_);
|
||||
@@ -74,9 +74,41 @@ ParameterEventHandler::add_parameter_callback(
|
||||
return handle;
|
||||
}
|
||||
|
||||
bool
|
||||
ParameterEventHandler::configure_nodes_filter(const std::vector<std::string> & node_names)
|
||||
{
|
||||
if (node_names.empty()) {
|
||||
// Clear content filter
|
||||
event_subscription_->set_content_filter("");
|
||||
if (event_subscription_->is_cft_enabled()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string filter_expression;
|
||||
size_t total = node_names.size();
|
||||
for (size_t i = 0; i < total; ++i) {
|
||||
filter_expression += "node = %" + std::to_string(i);
|
||||
if (i < total - 1) {
|
||||
filter_expression += " OR ";
|
||||
}
|
||||
}
|
||||
|
||||
// Enclose each node name in "'".
|
||||
std::vector<std::string> quoted_node_names;
|
||||
for (const auto & name : node_names) {
|
||||
quoted_node_names.push_back("'" + resolve_path(name) + "'");
|
||||
}
|
||||
|
||||
event_subscription_->set_content_filter(filter_expression, quoted_node_names);
|
||||
|
||||
return event_subscription_->is_cft_enabled();
|
||||
}
|
||||
|
||||
void
|
||||
ParameterEventHandler::remove_parameter_callback(
|
||||
ParameterCallbackHandle::SharedPtr callback_handle)
|
||||
const ParameterCallbackHandle::SharedPtr & callback_handle)
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(callbacks_->mutex_);
|
||||
auto handle = callback_handle.get();
|
||||
|
||||
@@ -26,13 +26,13 @@ ParameterEventsFilter::ParameterEventsFilter(
|
||||
std::shared_ptr<const rcl_interfaces::msg::ParameterEvent> event,
|
||||
const std::vector<std::string> & names,
|
||||
const std::vector<EventType> & types)
|
||||
: event_(event)
|
||||
: event_(std::move(event))
|
||||
{
|
||||
if (!event) {
|
||||
if (!event_) {
|
||||
throw std::invalid_argument("event cannot be null");
|
||||
}
|
||||
if (std::find(types.begin(), types.end(), EventType::NEW) != types.end()) {
|
||||
for (auto & new_parameter : event->new_parameters) {
|
||||
for (auto & new_parameter : event_->new_parameters) {
|
||||
if (std::find(names.begin(), names.end(), new_parameter.name) != names.end()) {
|
||||
result_.push_back(
|
||||
EventPair(EventType::NEW, &new_parameter));
|
||||
@@ -40,7 +40,7 @@ ParameterEventsFilter::ParameterEventsFilter(
|
||||
}
|
||||
}
|
||||
if (std::find(types.begin(), types.end(), EventType::CHANGED) != types.end()) {
|
||||
for (auto & changed_parameter : event->changed_parameters) {
|
||||
for (auto & changed_parameter : event_->changed_parameters) {
|
||||
if (std::find(names.begin(), names.end(), changed_parameter.name) != names.end()) {
|
||||
result_.push_back(
|
||||
EventPair(EventType::CHANGED, &changed_parameter));
|
||||
@@ -48,7 +48,7 @@ ParameterEventsFilter::ParameterEventsFilter(
|
||||
}
|
||||
}
|
||||
if (std::find(types.begin(), types.end(), EventType::DELETED) != types.end()) {
|
||||
for (auto & deleted_parameter : event->deleted_parameters) {
|
||||
for (auto & deleted_parameter : event_->deleted_parameters) {
|
||||
if (std::find(names.begin(), names.end(), deleted_parameter.name) != names.end()) {
|
||||
result_.push_back(
|
||||
EventPair(EventType::DELETED, &deleted_parameter));
|
||||
|
||||
@@ -26,8 +26,8 @@
|
||||
using rclcpp::ParameterService;
|
||||
|
||||
ParameterService::ParameterService(
|
||||
const std::shared_ptr<rclcpp::node_interfaces::NodeBaseInterface> node_base,
|
||||
const std::shared_ptr<rclcpp::node_interfaces::NodeServicesInterface> node_services,
|
||||
const std::shared_ptr<rclcpp::node_interfaces::NodeBaseInterface> & node_base,
|
||||
const std::shared_ptr<rclcpp::node_interfaces::NodeServicesInterface> & node_services,
|
||||
rclcpp::node_interfaces::NodeParametersInterface * node_params,
|
||||
const rclcpp::QoS & qos_profile)
|
||||
{
|
||||
@@ -37,8 +37,8 @@ ParameterService::ParameterService(
|
||||
node_base, node_services,
|
||||
node_name + "/" + parameter_service_names::get_parameters,
|
||||
[node_params](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::GetParameters::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::GetParameters::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::GetParameters::Response> response)
|
||||
{
|
||||
try {
|
||||
@@ -47,9 +47,9 @@ ParameterService::ParameterService(
|
||||
response->values.push_back(param.get_value_message());
|
||||
}
|
||||
} catch (const rclcpp::exceptions::ParameterNotDeclaredException & ex) {
|
||||
RCLCPP_DEBUG(rclcpp::get_logger("rclcpp"), "Failed to get parameters: %s", ex.what());
|
||||
RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to get parameters: %s", ex.what());
|
||||
} catch (const rclcpp::exceptions::ParameterUninitializedException & ex) {
|
||||
RCLCPP_DEBUG(rclcpp::get_logger("rclcpp"), "Failed to get parameters: %s", ex.what());
|
||||
RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to get parameters: %s", ex.what());
|
||||
}
|
||||
},
|
||||
qos_profile, nullptr);
|
||||
@@ -58,8 +58,8 @@ ParameterService::ParameterService(
|
||||
node_base, node_services,
|
||||
node_name + "/" + parameter_service_names::get_parameter_types,
|
||||
[node_params](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::GetParameterTypes::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::GetParameterTypes::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::GetParameterTypes::Response> response)
|
||||
{
|
||||
try {
|
||||
@@ -70,7 +70,7 @@ ParameterService::ParameterService(
|
||||
return static_cast<rclcpp::ParameterType>(type);
|
||||
});
|
||||
} catch (const rclcpp::exceptions::ParameterNotDeclaredException & ex) {
|
||||
RCLCPP_DEBUG(rclcpp::get_logger("rclcpp"), "Failed to get parameter types: %s", ex.what());
|
||||
RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to get parameter types: %s", ex.what());
|
||||
}
|
||||
},
|
||||
qos_profile, nullptr);
|
||||
@@ -79,8 +79,8 @@ ParameterService::ParameterService(
|
||||
node_base, node_services,
|
||||
node_name + "/" + parameter_service_names::set_parameters,
|
||||
[node_params](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::SetParameters::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::SetParameters::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::SetParameters::Response> response)
|
||||
{
|
||||
// Set parameters one-by-one, since there's no way to return a partial result if
|
||||
@@ -91,7 +91,7 @@ ParameterService::ParameterService(
|
||||
result = node_params->set_parameters_atomically(
|
||||
{rclcpp::Parameter::from_parameter_msg(p)});
|
||||
} catch (const rclcpp::exceptions::ParameterNotDeclaredException & ex) {
|
||||
RCLCPP_DEBUG(rclcpp::get_logger("rclcpp"), "Failed to set parameter: %s", ex.what());
|
||||
RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to set parameter: %s", ex.what());
|
||||
result.successful = false;
|
||||
result.reason = ex.what();
|
||||
}
|
||||
@@ -104,8 +104,8 @@ ParameterService::ParameterService(
|
||||
node_base, node_services,
|
||||
node_name + "/" + parameter_service_names::set_parameters_atomically,
|
||||
[node_params](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::SetParametersAtomically::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::SetParametersAtomically::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::SetParametersAtomically::Response> response)
|
||||
{
|
||||
std::vector<rclcpp::Parameter> pvariants;
|
||||
@@ -119,7 +119,7 @@ ParameterService::ParameterService(
|
||||
auto result = node_params->set_parameters_atomically(pvariants);
|
||||
response->result = result;
|
||||
} catch (const rclcpp::exceptions::ParameterNotDeclaredException & ex) {
|
||||
RCLCPP_DEBUG(
|
||||
RCLCPP_WARN(
|
||||
rclcpp::get_logger("rclcpp"), "Failed to set parameters atomically: %s", ex.what());
|
||||
response->result.successful = false;
|
||||
response->result.reason = "One or more parameters were not declared before setting";
|
||||
@@ -131,15 +131,15 @@ ParameterService::ParameterService(
|
||||
node_base, node_services,
|
||||
node_name + "/" + parameter_service_names::describe_parameters,
|
||||
[node_params](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::DescribeParameters::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::DescribeParameters::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::DescribeParameters::Response> response)
|
||||
{
|
||||
try {
|
||||
auto descriptors = node_params->describe_parameters(request->names);
|
||||
response->descriptors = descriptors;
|
||||
} catch (const rclcpp::exceptions::ParameterNotDeclaredException & ex) {
|
||||
RCLCPP_DEBUG(rclcpp::get_logger("rclcpp"), "Failed to describe parameters: %s", ex.what());
|
||||
RCLCPP_WARN(rclcpp::get_logger("rclcpp"), "Failed to describe parameters: %s", ex.what());
|
||||
}
|
||||
},
|
||||
qos_profile, nullptr);
|
||||
@@ -148,8 +148,8 @@ ParameterService::ParameterService(
|
||||
node_base, node_services,
|
||||
node_name + "/" + parameter_service_names::list_parameters,
|
||||
[node_params](
|
||||
const std::shared_ptr<rmw_request_id_t>,
|
||||
const std::shared_ptr<rcl_interfaces::srv::ListParameters::Request> request,
|
||||
const std::shared_ptr<rmw_request_id_t> &,
|
||||
const std::shared_ptr<rcl_interfaces::srv::ListParameters::Request> & request,
|
||||
std::shared_ptr<rcl_interfaces::srv::ListParameters::Response> response)
|
||||
{
|
||||
auto result = node_params->list_parameters(request->prefixes, request->depth);
|
||||
|
||||
@@ -44,9 +44,9 @@ rclcpp::to_string(const ParameterType type)
|
||||
return "double_array";
|
||||
case ParameterType::PARAMETER_STRING_ARRAY:
|
||||
return "string_array";
|
||||
default:
|
||||
return "unknown type";
|
||||
}
|
||||
|
||||
return "unknown type";
|
||||
}
|
||||
|
||||
std::ostream &
|
||||
@@ -103,9 +103,9 @@ rclcpp::to_string(const ParameterValue & value)
|
||||
return array_to_string(value.get<std::vector<double>>());
|
||||
case ParameterType::PARAMETER_STRING_ARRAY:
|
||||
return array_to_string(value.get<std::vector<std::string>>());
|
||||
default:
|
||||
return "unknown type";
|
||||
}
|
||||
|
||||
return "unknown type";
|
||||
}
|
||||
|
||||
ParameterValue::ParameterValue()
|
||||
|
||||
@@ -344,7 +344,7 @@ PublisherBase::operator==(const rmw_gid_t * gid) const
|
||||
void
|
||||
PublisherBase::setup_intra_process(
|
||||
uint64_t intra_process_publisher_id,
|
||||
IntraProcessManagerSharedPtr ipm)
|
||||
const IntraProcessManagerSharedPtr & ipm)
|
||||
{
|
||||
intra_process_publisher_id_ = intra_process_publisher_id;
|
||||
weak_ipm_ = ipm;
|
||||
@@ -396,10 +396,10 @@ std::vector<rclcpp::NetworkFlowEndpoint> PublisherBase::get_network_flow_endpoin
|
||||
}
|
||||
|
||||
std::vector<rclcpp::NetworkFlowEndpoint> network_flow_endpoint_vector;
|
||||
network_flow_endpoint_vector.reserve(network_flow_endpoint_array.size);
|
||||
for (size_t i = 0; i < network_flow_endpoint_array.size; ++i) {
|
||||
network_flow_endpoint_vector.push_back(
|
||||
rclcpp::NetworkFlowEndpoint(
|
||||
network_flow_endpoint_array.network_flow_endpoint[i]));
|
||||
network_flow_endpoint_vector.emplace_back(
|
||||
network_flow_endpoint_array.network_flow_endpoint[i]);
|
||||
}
|
||||
|
||||
ret = rcl_network_flow_endpoint_array_fini(&network_flow_endpoint_array);
|
||||
|
||||
@@ -40,6 +40,12 @@ std::string qos_policy_name_from_kind(rmw_qos_policy_kind_t policy_kind)
|
||||
return "HISTORY_QOS_POLICY";
|
||||
case RMW_QOS_POLICY_LIFESPAN:
|
||||
return "LIFESPAN_QOS_POLICY";
|
||||
case RMW_QOS_POLICY_DEPTH:
|
||||
return "DEPTH_QOS_POLICY";
|
||||
case RMW_QOS_POLICY_LIVELINESS_LEASE_DURATION:
|
||||
return "LIVELINESS_LEASE_DURATION_QOS_POLICY";
|
||||
case RMW_QOS_POLICY_AVOID_ROS_NAMESPACE_CONVENTIONS:
|
||||
return "AVOID_ROS_NAMESPACE_CONVENTIONS_QOS_POLICY";
|
||||
default:
|
||||
return "INVALID_QOS_POLICY";
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ QosOverridingOptions::with_default_policies(
|
||||
QosCallback validation_callback,
|
||||
std::string id)
|
||||
{
|
||||
return QosOverridingOptions{kDefaultPolicies, validation_callback, id};
|
||||
return QosOverridingOptions{kDefaultPolicies, std::move(validation_callback), id};
|
||||
}
|
||||
|
||||
const std::string &
|
||||
|
||||
@@ -21,7 +21,7 @@ namespace rclcpp
|
||||
{
|
||||
|
||||
Rate::Rate(
|
||||
const double rate, Clock::SharedPtr clock)
|
||||
const double rate, const Clock::SharedPtr & clock)
|
||||
: clock_(clock), period_(0, 0), last_interval_(clock_->now())
|
||||
{
|
||||
if (rate <= 0.0) {
|
||||
@@ -31,7 +31,7 @@ Rate::Rate(
|
||||
}
|
||||
|
||||
Rate::Rate(
|
||||
const Duration & period, Clock::SharedPtr clock)
|
||||
const Duration & period, const Clock::SharedPtr & clock)
|
||||
: clock_(clock), period_(period), last_interval_(clock_->now())
|
||||
{
|
||||
if (period <= Duration(0, 0)) {
|
||||
|
||||
@@ -70,12 +70,12 @@ SerializedMessage::SerializedMessage(const rcl_serialized_message_t & other)
|
||||
copy_rcl_message(other, serialized_message_);
|
||||
}
|
||||
|
||||
SerializedMessage::SerializedMessage(SerializedMessage && other)
|
||||
SerializedMessage::SerializedMessage(SerializedMessage && other) noexcept
|
||||
: serialized_message_(
|
||||
std::exchange(other.serialized_message_, rmw_get_zero_initialized_serialized_message()))
|
||||
{}
|
||||
|
||||
SerializedMessage::SerializedMessage(rcl_serialized_message_t && other)
|
||||
SerializedMessage::SerializedMessage(rcl_serialized_message_t && other) noexcept
|
||||
: serialized_message_(
|
||||
std::exchange(other, rmw_get_zero_initialized_serialized_message()))
|
||||
{}
|
||||
@@ -98,7 +98,7 @@ SerializedMessage & SerializedMessage::operator=(const rcl_serialized_message_t
|
||||
return *this;
|
||||
}
|
||||
|
||||
SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
|
||||
SerializedMessage & SerializedMessage::operator=(SerializedMessage && other) noexcept
|
||||
{
|
||||
if (this != &other) {
|
||||
if (nullptr != serialized_message_.buffer) {
|
||||
@@ -116,7 +116,7 @@ SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
|
||||
return *this;
|
||||
}
|
||||
|
||||
SerializedMessage & SerializedMessage::operator=(rcl_serialized_message_t && other)
|
||||
SerializedMessage & SerializedMessage::operator=(rcl_serialized_message_t && other) noexcept
|
||||
{
|
||||
if (&serialized_message_ != &other) {
|
||||
if (nullptr != serialized_message_.buffer) {
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
using rclcpp::ServiceBase;
|
||||
|
||||
ServiceBase::ServiceBase(std::shared_ptr<rcl_node_t> node_handle)
|
||||
ServiceBase::ServiceBase(const std::shared_ptr<rcl_node_t> & node_handle)
|
||||
: node_handle_(node_handle),
|
||||
node_logger_(rclcpp::get_node_logger(node_handle_.get()))
|
||||
{}
|
||||
|
||||
@@ -68,7 +68,6 @@ void
|
||||
SignalHandler::signal_handler(
|
||||
int signum, siginfo_t * siginfo, void * context)
|
||||
{
|
||||
RCLCPP_INFO(SignalHandler::get_logger(), "signal_handler(signum=%d)", signum);
|
||||
auto & instance = SignalHandler::get_global_signal_handler();
|
||||
|
||||
auto old_signal_handler = instance.get_old_signal_handler(signum);
|
||||
@@ -85,13 +84,12 @@ SignalHandler::signal_handler(
|
||||
old_signal_handler.sa_handler(signum);
|
||||
}
|
||||
}
|
||||
instance.signal_handler_common();
|
||||
instance.signal_handler_common(signum);
|
||||
}
|
||||
#else
|
||||
void
|
||||
SignalHandler::signal_handler(int signum)
|
||||
{
|
||||
RCLCPP_INFO(SignalHandler::get_logger(), "signal_handler(signum=%d)", signum);
|
||||
auto & instance = SignalHandler::get_global_signal_handler();
|
||||
auto old_signal_handler = instance.get_old_signal_handler(signum);
|
||||
if (
|
||||
@@ -100,7 +98,7 @@ SignalHandler::signal_handler(int signum)
|
||||
{
|
||||
old_signal_handler(signum);
|
||||
}
|
||||
instance.signal_handler_common();
|
||||
instance.signal_handler_common(signum);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -245,13 +243,11 @@ SignalHandler::get_old_signal_handler(int signum)
|
||||
}
|
||||
|
||||
void
|
||||
SignalHandler::signal_handler_common()
|
||||
SignalHandler::signal_handler_common(int signum)
|
||||
{
|
||||
auto & instance = SignalHandler::get_global_signal_handler();
|
||||
instance.signal_number_.store(signum);
|
||||
instance.signal_received_.store(true);
|
||||
RCLCPP_DEBUG(
|
||||
get_logger(),
|
||||
"signal_handler(): notifying deferred signal handler");
|
||||
instance.notify_signal_handler();
|
||||
}
|
||||
|
||||
@@ -260,8 +256,10 @@ SignalHandler::deferred_signal_handler()
|
||||
{
|
||||
while (true) {
|
||||
if (signal_received_.exchange(false)) {
|
||||
int signum = signal_number_.load();
|
||||
RCLCPP_INFO(get_logger(), "signal_handler(signum=%d)", signum);
|
||||
RCLCPP_DEBUG(get_logger(), "deferred_signal_handler(): shutting down");
|
||||
for (auto context_ptr : rclcpp::get_contexts()) {
|
||||
for (const auto & context_ptr : rclcpp::get_contexts()) {
|
||||
if (context_ptr->get_init_options().shutdown_on_signal) {
|
||||
RCLCPP_DEBUG(
|
||||
get_logger(),
|
||||
|
||||
@@ -116,7 +116,7 @@ private:
|
||||
|
||||
/// Common signal handler code between sigaction and non-sigaction versions.
|
||||
void
|
||||
signal_handler_common();
|
||||
signal_handler_common(int signum);
|
||||
|
||||
#if defined(RCLCPP_HAS_SIGACTION)
|
||||
/// Signal handler function.
|
||||
@@ -189,6 +189,8 @@ private:
|
||||
|
||||
// Whether or not a signal has been received.
|
||||
std::atomic_bool signal_received_ = false;
|
||||
// The signal number that was received.
|
||||
std::atomic_int signal_number_ = 0;
|
||||
// A thread to which signal handling tasks are deferred.
|
||||
std::thread signal_handler_thread_;
|
||||
|
||||
|
||||
@@ -323,7 +323,7 @@ SubscriptionBase::setup_intra_process(
|
||||
IntraProcessManagerWeakPtr weak_ipm)
|
||||
{
|
||||
intra_process_subscription_id_ = intra_process_subscription_id;
|
||||
weak_ipm_ = weak_ipm;
|
||||
weak_ipm_ = std::move(weak_ipm);
|
||||
use_intra_process_ = true;
|
||||
}
|
||||
|
||||
@@ -449,11 +449,11 @@ SubscriptionBase::get_network_flow_endpoints() const
|
||||
}
|
||||
|
||||
std::vector<rclcpp::NetworkFlowEndpoint> network_flow_endpoint_vector;
|
||||
network_flow_endpoint_vector.reserve(network_flow_endpoint_array.size);
|
||||
for (size_t i = 0; i < network_flow_endpoint_array.size; ++i) {
|
||||
network_flow_endpoint_vector.push_back(
|
||||
rclcpp::NetworkFlowEndpoint(
|
||||
network_flow_endpoint_vector.emplace_back(
|
||||
network_flow_endpoint_array.
|
||||
network_flow_endpoint[i]));
|
||||
network_flow_endpoint[i]);
|
||||
}
|
||||
|
||||
ret = rcl_network_flow_endpoint_array_fini(&network_flow_endpoint_array);
|
||||
@@ -577,3 +577,26 @@ SubscriptionBase::take_dynamic_message(
|
||||
throw std::runtime_error("Unimplemented");
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
SubscriptionBase::disable_callbacks()
|
||||
{
|
||||
// Temporary remove the on_new_message_callback_ to prevent it from being called
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
if (on_new_message_callback_) {
|
||||
set_on_new_message_callback(nullptr, nullptr);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SubscriptionBase::enable_callbacks()
|
||||
{
|
||||
// Set callback again if it was previously removed in disable_callbacks()
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
if (on_new_message_callback_) {
|
||||
set_on_new_message_callback(
|
||||
rclcpp::detail::cpp_callback_trampoline<
|
||||
decltype(on_new_message_callback_), const void *, size_t>,
|
||||
static_cast<const void *>(&on_new_message_callback_));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,3 +40,17 @@ SubscriptionIntraProcessBase::is_durability_transient_local() const
|
||||
{
|
||||
return qos_profile_.durability() == rclcpp::DurabilityPolicy::TransientLocal;
|
||||
}
|
||||
|
||||
void
|
||||
SubscriptionIntraProcessBase::disable_callbacks()
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
on_new_message_callback_disabled_ = true;
|
||||
}
|
||||
|
||||
void
|
||||
SubscriptionIntraProcessBase::enable_callbacks()
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(on_new_message_callback_mutex_);
|
||||
on_new_message_callback_disabled_ = false;
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ public:
|
||||
}
|
||||
|
||||
// Attach a clock
|
||||
void attachClock(rclcpp::Clock::SharedPtr clock)
|
||||
void attachClock(const rclcpp::Clock::SharedPtr & clock)
|
||||
{
|
||||
{
|
||||
std::lock_guard<std::mutex> clock_guard(clock->get_clock_mutex());
|
||||
@@ -97,7 +97,7 @@ public:
|
||||
}
|
||||
|
||||
// Detach a clock
|
||||
void detachClock(rclcpp::Clock::SharedPtr clock)
|
||||
void detachClock(const rclcpp::Clock::SharedPtr & clock)
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(clock_list_lock_);
|
||||
auto removed = associated_clocks_.erase(clock);
|
||||
@@ -108,9 +108,9 @@ public:
|
||||
|
||||
// Internal helper function used inside iterators
|
||||
static void set_clock(
|
||||
const builtin_interfaces::msg::Time::SharedPtr msg,
|
||||
const builtin_interfaces::msg::Time::SharedPtr & msg,
|
||||
bool set_ros_time_enabled,
|
||||
rclcpp::Clock::SharedPtr clock)
|
||||
const rclcpp::Clock::SharedPtr & clock)
|
||||
{
|
||||
std::lock_guard<std::mutex> clock_guard(clock->get_clock_mutex());
|
||||
|
||||
@@ -145,7 +145,7 @@ public:
|
||||
|
||||
// Internal helper function
|
||||
void set_all_clocks(
|
||||
const builtin_interfaces::msg::Time::SharedPtr msg,
|
||||
const builtin_interfaces::msg::Time::SharedPtr & msg,
|
||||
bool set_ros_time_enabled)
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(clock_list_lock_);
|
||||
@@ -155,7 +155,7 @@ public:
|
||||
}
|
||||
|
||||
// Cache the last clock message received
|
||||
void cache_last_msg(std::shared_ptr<const rosgraph_msgs::msg::Clock> msg)
|
||||
void cache_last_msg(const std::shared_ptr<const rosgraph_msgs::msg::Clock> & msg)
|
||||
{
|
||||
last_time_msg_ = std::make_shared<builtin_interfaces::msg::Time>(msg->clock);
|
||||
}
|
||||
@@ -237,13 +237,13 @@ public:
|
||||
rclcpp::node_interfaces::NodeParametersInterface::SharedPtr node_parameters_interface)
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(node_base_lock_);
|
||||
node_base_ = node_base_interface;
|
||||
node_topics_ = node_topics_interface;
|
||||
node_graph_ = node_graph_interface;
|
||||
node_services_ = node_services_interface;
|
||||
node_logging_ = node_logging_interface;
|
||||
node_clock_ = node_clock_interface;
|
||||
node_parameters_ = node_parameters_interface;
|
||||
node_base_ = std::move(node_base_interface);
|
||||
node_topics_ = std::move(node_topics_interface);
|
||||
node_graph_ = std::move(node_graph_interface);
|
||||
node_services_ = std::move(node_services_interface);
|
||||
node_logging_ = std::move(node_logging_interface);
|
||||
node_clock_ = std::move(node_clock_interface);
|
||||
node_parameters_ = std::move(node_parameters_interface);
|
||||
// TODO(tfoote): Update QOS
|
||||
|
||||
logger_ = node_logging_->get_logger();
|
||||
@@ -262,7 +262,7 @@ public:
|
||||
}
|
||||
if (use_sim_time_param.get_type() == rclcpp::PARAMETER_BOOL) {
|
||||
if (use_sim_time_param.get<bool>()) {
|
||||
parameter_state_ = SET_TRUE;
|
||||
sim_time_parameter_state_ = true;
|
||||
clocks_state_.enable_ros_time();
|
||||
create_clock_sub();
|
||||
}
|
||||
@@ -305,14 +305,14 @@ public:
|
||||
node_parameters_.reset();
|
||||
}
|
||||
|
||||
void attachClock(std::shared_ptr<rclcpp::Clock> clock)
|
||||
void attachClock(const std::shared_ptr<rclcpp::Clock> & clock)
|
||||
{
|
||||
clocks_state_.attachClock(std::move(clock));
|
||||
clocks_state_.attachClock(clock);
|
||||
}
|
||||
|
||||
void detachClock(std::shared_ptr<rclcpp::Clock> clock)
|
||||
void detachClock(const std::shared_ptr<rclcpp::Clock> & clock)
|
||||
{
|
||||
clocks_state_.detachClock(std::move(clock));
|
||||
clocks_state_.detachClock(clock);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -346,16 +346,16 @@ private:
|
||||
rclcpp::executors::SingleThreadedExecutor::SharedPtr clock_executor_;
|
||||
|
||||
// The clock callback itself
|
||||
void clock_cb(std::shared_ptr<const rosgraph_msgs::msg::Clock> msg)
|
||||
void clock_cb(const std::shared_ptr<const rosgraph_msgs::msg::Clock> & msg)
|
||||
{
|
||||
if (!clocks_state_.is_ros_time_active() && SET_TRUE == this->parameter_state_) {
|
||||
if (!clocks_state_.is_ros_time_active() && sim_time_parameter_state_) {
|
||||
clocks_state_.enable_ros_time();
|
||||
}
|
||||
// Cache the last message in case a new clock is attached.
|
||||
clocks_state_.cache_last_msg(msg);
|
||||
auto time_msg = std::make_shared<builtin_interfaces::msg::Time>(msg->clock);
|
||||
|
||||
if (SET_TRUE == this->parameter_state_) {
|
||||
if (sim_time_parameter_state_) {
|
||||
clocks_state_.set_all_clocks(time_msg, true);
|
||||
}
|
||||
}
|
||||
@@ -403,7 +403,7 @@ private:
|
||||
node_topics_,
|
||||
"/clock",
|
||||
qos_,
|
||||
[this](std::shared_ptr<const rosgraph_msgs::msg::Clock> msg) {
|
||||
[this](const std::shared_ptr<const rosgraph_msgs::msg::Clock> & msg) {
|
||||
bool execute_cb = false;
|
||||
{
|
||||
std::lock_guard<std::mutex> guard(node_base_lock_);
|
||||
@@ -466,11 +466,11 @@ private:
|
||||
for (const auto & param : parameters) {
|
||||
if (param.get_name() == "use_sim_time") {
|
||||
if (param.as_bool()) {
|
||||
parameter_state_ = SET_TRUE;
|
||||
sim_time_parameter_state_ = true;
|
||||
clocks_state_.enable_ros_time();
|
||||
create_clock_sub();
|
||||
} else {
|
||||
parameter_state_ = SET_FALSE;
|
||||
sim_time_parameter_state_ = false;
|
||||
destroy_clock_sub();
|
||||
clocks_state_.disable_ros_time();
|
||||
}
|
||||
@@ -478,13 +478,11 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
// An enum to hold the parameter state
|
||||
enum UseSimTimeParameterState {SET_TRUE, SET_FALSE};
|
||||
UseSimTimeParameterState parameter_state_;
|
||||
bool sim_time_parameter_state_ = false;
|
||||
};
|
||||
|
||||
TimeSource::TimeSource(
|
||||
std::shared_ptr<rclcpp::Node> node,
|
||||
const std::shared_ptr<rclcpp::Node> & node,
|
||||
const rclcpp::QoS & qos,
|
||||
bool use_clock_thread)
|
||||
: TimeSource(qos, use_clock_thread)
|
||||
@@ -501,7 +499,7 @@ TimeSource::TimeSource(
|
||||
node_state_ = std::make_shared<NodeState>(qos, use_clock_thread);
|
||||
}
|
||||
|
||||
void TimeSource::attachNode(rclcpp::Node::SharedPtr node)
|
||||
void TimeSource::attachNode(const rclcpp::Node::SharedPtr & node)
|
||||
{
|
||||
node_state_->set_use_clock_thread(node->get_node_options().use_clock_thread());
|
||||
attachNode(
|
||||
@@ -541,14 +539,14 @@ void TimeSource::detachNode()
|
||||
constructed_use_clock_thread_);
|
||||
}
|
||||
|
||||
void TimeSource::attachClock(std::shared_ptr<rclcpp::Clock> clock)
|
||||
void TimeSource::attachClock(const std::shared_ptr<rclcpp::Clock> & clock)
|
||||
{
|
||||
node_state_->attachClock(std::move(clock));
|
||||
node_state_->attachClock(clock);
|
||||
}
|
||||
|
||||
void TimeSource::detachClock(std::shared_ptr<rclcpp::Clock> clock)
|
||||
void TimeSource::detachClock(const std::shared_ptr<rclcpp::Clock> & clock)
|
||||
{
|
||||
node_state_->detachClock(std::move(clock));
|
||||
node_state_->detachClock(clock);
|
||||
}
|
||||
|
||||
bool TimeSource::get_use_clock_thread()
|
||||
|
||||
@@ -150,7 +150,7 @@ TimerBase::exchange_in_use_by_wait_set_state(bool in_use_state)
|
||||
}
|
||||
|
||||
void
|
||||
TimerBase::set_on_reset_callback(std::function<void(size_t)> callback)
|
||||
TimerBase::set_on_reset_callback(const std::function<void(size_t)> & callback)
|
||||
{
|
||||
if (!callback) {
|
||||
throw std::invalid_argument(
|
||||
|
||||
@@ -123,27 +123,27 @@ std::string get_typesupport_library_path(
|
||||
{
|
||||
const char * dynamic_library_folder;
|
||||
#ifdef _WIN32
|
||||
dynamic_library_folder = "/bin/";
|
||||
dynamic_library_folder = "bin";
|
||||
#elif __APPLE__
|
||||
dynamic_library_folder = "/lib/";
|
||||
dynamic_library_folder = "lib";
|
||||
#else
|
||||
dynamic_library_folder = "/lib/";
|
||||
dynamic_library_folder = "lib";
|
||||
#endif
|
||||
|
||||
std::string package_prefix;
|
||||
std::filesystem::path package_prefix;
|
||||
try {
|
||||
package_prefix = ament_index_cpp::get_package_prefix(package_name);
|
||||
ament_index_cpp::get_package_prefix(package_name, package_prefix);
|
||||
} catch (ament_index_cpp::PackageNotFoundError & e) {
|
||||
throw std::runtime_error(e.what());
|
||||
}
|
||||
|
||||
const std::string library_path = rcpputils::path_for_library(
|
||||
package_prefix + dynamic_library_folder,
|
||||
(package_prefix / dynamic_library_folder).string(),
|
||||
package_name + "__" + typesupport_identifier);
|
||||
if (library_path.empty()) {
|
||||
throw std::runtime_error(
|
||||
"Typesupport library for " + package_name + " does not exist in '" + package_prefix +
|
||||
"'.");
|
||||
"Typesupport library for " + package_name + " does not exist in '" +
|
||||
package_prefix.string() + "'.");
|
||||
}
|
||||
return library_path;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user