.. _program_listing_file_include_rclcpp_node_impl.hpp: Program Listing for File node_impl.hpp ====================================== |exhale_lsh| :ref:`Return to documentation for file ` (``include/rclcpp/node_impl.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp // Copyright 2014 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__NODE_IMPL_HPP_ #define RCLCPP__NODE_IMPL_HPP_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "rcl/publisher.h" #include "rcl/subscription.h" #include "rclcpp/contexts/default_context.hpp" #include "rclcpp/create_client.hpp" #include "rclcpp/create_generic_publisher.hpp" #include "rclcpp/create_generic_subscription.hpp" #include "rclcpp/create_publisher.hpp" #include "rclcpp/create_service.hpp" #include "rclcpp/create_subscription.hpp" #include "rclcpp/create_timer.hpp" #include "rclcpp/detail/resolve_enable_topic_statistics.hpp" #include "rclcpp/parameter.hpp" #include "rclcpp/qos.hpp" #include "rclcpp/timer.hpp" #include "rclcpp/type_support_decl.hpp" #include "rclcpp/visibility_control.hpp" #ifndef RCLCPP__NODE_HPP_ #include "node.hpp" #endif namespace rclcpp { RCLCPP_LOCAL inline std::string extend_name_with_sub_namespace(const std::string & name, const std::string & sub_namespace) { std::string name_with_sub_namespace(name); if (sub_namespace != "" && name.front() != '/' && name.front() != '~') { name_with_sub_namespace = sub_namespace + "/" + name; } return name_with_sub_namespace; } template std::shared_ptr Node::create_publisher( const std::string & topic_name, const rclcpp::QoS & qos, const PublisherOptionsWithAllocator & options) { return rclcpp::create_publisher( *this, extend_name_with_sub_namespace(topic_name, this->get_sub_namespace()), qos, options); } template< typename MessageT, typename CallbackT, typename AllocatorT, typename SubscriptionT, typename MessageMemoryStrategyT> std::shared_ptr Node::create_subscription( const std::string & topic_name, const rclcpp::QoS & qos, CallbackT && callback, const SubscriptionOptionsWithAllocator & options, typename MessageMemoryStrategyT::SharedPtr msg_mem_strat) { return rclcpp::create_subscription( *this, extend_name_with_sub_namespace(topic_name, this->get_sub_namespace()), qos, std::forward(callback), options, msg_mem_strat); } template typename rclcpp::WallTimer::SharedPtr Node::create_wall_timer( std::chrono::duration period, CallbackT callback, rclcpp::CallbackGroup::SharedPtr group) { return rclcpp::create_wall_timer( period, std::move(callback), group, this->node_base_.get(), this->node_timers_.get()); } template typename Client::SharedPtr Node::create_client( const std::string & service_name, const rmw_qos_profile_t & qos_profile, rclcpp::CallbackGroup::SharedPtr group) { return rclcpp::create_client( node_base_, node_graph_, node_services_, extend_name_with_sub_namespace(service_name, this->get_sub_namespace()), qos_profile, group); } template typename rclcpp::Service::SharedPtr Node::create_service( const std::string & service_name, CallbackT && callback, const rmw_qos_profile_t & qos_profile, rclcpp::CallbackGroup::SharedPtr group) { return rclcpp::create_service( node_base_, node_services_, extend_name_with_sub_namespace(service_name, this->get_sub_namespace()), std::forward(callback), qos_profile, group); } template std::shared_ptr Node::create_generic_publisher( const std::string & topic_name, const std::string & topic_type, const rclcpp::QoS & qos, const rclcpp::PublisherOptionsWithAllocator & options) { return rclcpp::create_generic_publisher( node_topics_, extend_name_with_sub_namespace(topic_name, this->get_sub_namespace()), topic_type, qos, options ); } template std::shared_ptr Node::create_generic_subscription( const std::string & topic_name, const std::string & topic_type, const rclcpp::QoS & qos, std::function)> callback, const rclcpp::SubscriptionOptionsWithAllocator & options) { return rclcpp::create_generic_subscription( node_topics_, extend_name_with_sub_namespace(topic_name, this->get_sub_namespace()), topic_type, qos, std::move(callback), options ); } template auto Node::declare_parameter( const std::string & name, const ParameterT & default_value, const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor, bool ignore_override) { try { return this->declare_parameter( name, rclcpp::ParameterValue(default_value), parameter_descriptor, ignore_override ).get(); } catch (const ParameterTypeException & ex) { throw exceptions::InvalidParameterTypeException(name, ex.what()); } } template auto Node::declare_parameter( const std::string & name, const rcl_interfaces::msg::ParameterDescriptor & parameter_descriptor, bool ignore_override) { // get advantage of parameter value template magic to get // the correct rclcpp::ParameterType from ParameterT rclcpp::ParameterValue value{ParameterT{}}; try { return this->declare_parameter( name, value.get_type(), parameter_descriptor, ignore_override ).get(); } catch (const ParameterTypeException &) { throw exceptions::UninitializedStaticallyTypedParameterException(name); } } template std::vector Node::declare_parameters( const std::string & namespace_, const std::map & parameters, bool ignore_overrides) { std::vector result; std::string normalized_namespace = namespace_.empty() ? "" : (namespace_ + "."); std::transform( parameters.begin(), parameters.end(), std::back_inserter(result), [this, &normalized_namespace, ignore_overrides](auto element) { return this->declare_parameter( normalized_namespace + element.first, element.second, rcl_interfaces::msg::ParameterDescriptor(), ignore_overrides); } ); return result; } template std::vector Node::declare_parameters( const std::string & namespace_, const std::map< std::string, std::pair > & parameters, bool ignore_overrides) { std::vector result; std::string normalized_namespace = namespace_.empty() ? "" : (namespace_ + "."); std::transform( parameters.begin(), parameters.end(), std::back_inserter(result), [this, &normalized_namespace, ignore_overrides](auto element) { return static_cast( this->declare_parameter( normalized_namespace + element.first, element.second.first, element.second.second, ignore_overrides) ); } ); return result; } template bool Node::get_parameter(const std::string & name, ParameterT & parameter) const { std::string sub_name = extend_name_with_sub_namespace(name, this->get_sub_namespace()); rclcpp::Parameter parameter_variant; bool result = get_parameter(sub_name, parameter_variant); if (result) { parameter = static_cast(parameter_variant.get_value()); } return result; } template bool Node::get_parameter_or( const std::string & name, ParameterT & parameter, const ParameterT & alternative_value) const { std::string sub_name = extend_name_with_sub_namespace(name, this->get_sub_namespace()); bool got_parameter = get_parameter(sub_name, parameter); if (!got_parameter) { parameter = alternative_value; } return got_parameter; } template ParameterT Node::get_parameter_or( const std::string & name, const ParameterT & alternative_value) const { ParameterT parameter; get_parameter_or(name, parameter, alternative_value); return parameter; } // this is a partially-specialized version of get_parameter above, // where our concrete type for ParameterT is std::map, but the to-be-determined // type is the value in the map. template bool Node::get_parameters( const std::string & prefix, std::map & values) const { std::map params; bool result = node_parameters_->get_parameters_by_prefix(prefix, params); if (result) { for (const auto & param : params) { values[param.first] = static_cast(param.second.get_value()); } } return result; } } // namespace rclcpp #endif // RCLCPP__NODE_IMPL_HPP_