做网站制作公司wordpress 阿里 cdn

当前位置: 首页 > news >正文

做网站制作公司,wordpress 阿里 cdn,《网站开发课程设计》设计报告,十大经典口碑营销案例大纲 创建订阅/parameter_events的Node监控自身Node内部Parameter监控自身Node外部Parameter监听所有Node的所有Parameter的变动执行效果总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》一文中#xff0c;我们通过AsyncPa… 大纲 创建订阅/parameter_events的Node监控自身Node内部Parameter监控自身Node外部Parameter监听所有Node的所有Parameter的变动执行效果总结 在《Robot Operating System——AsyncParametersClient监控Parameters的增删改行为》一文中我们通过AsyncParametersClient和SyncParametersClient的on_parameter_event方法对Parameters的变动进行了监控。本文我们将介绍另一种监控工具类ParameterEventHandler的使用。 我们将通过demo_nodes_cpp/src/parameters/parameter_event_handler.cpp来讲解。 创建订阅/parameter_events的Node 这类对Parameters行为进行监控其底层都是通过订阅/parameter_events主题的形式实现的(后面我们会对其进行分析)。所以我们第一步需要创建一个Node并订阅该主题。 int main(int argc, char ** argv) {setvbuf(stdout, NULL, _IONBF, BUFSIZ);rclcpp::init(argc, argv);const char * node_name this_node;const char * param_name an_int_param;// Create a node with an integer parameterauto node rclcpp::Node::make_shared(node_name);node-declare_parameter(param_name, 0);// Now, create a parameter subscriber that can be used to monitor parameter changes on// our own local node as well as other remote nodesauto param_subscriber std::make_sharedrclcpp::ParameterEventHandler(node);ParameterEventHandler的构造函数中实现了主题的订阅功能。 ///opt/ros/jazzy/include/rclcpp/rclcpp/parameter_event_handler.hpp/// Construct a parameter events monitor./*** \param[in] node The node to use to create any required subscribers.* \param[in] qos The QoS settings to use for any subscriptions./templatetypename NodeTexplicit ParameterEventHandler(NodeT node,const rclcpp::QoS qos rclcpp::QoS(rclcpp::QoSInitialization::from_rmw(rmw_qos_profile_parameter_events))): nodebase(rclcpp::node_interfaces::get_node_base_interface(node)){auto node_topics rclcpp::node_interfaces::get_node_topicsinterface(node);callbacks std::make_sharedCallbacks();eventsubscription rclcpp::create_subscriptionrcl_interfaces::msg::ParameterEvent(node_topics, /parameter_events, qos,callbacks callbacks_ {callbacks-event_callback(event);});}监控自身Node内部Parameter ParameterEventHandler在API层面可以方便的支持对某个Parameter修改行为的订阅。而在AsyncParametersClient和SyncParametersClient中我们只能在监控回调中自己判断。 如下例add_parameter_callback方法对名字是param_name “an_int_param”的Parameter进行了监控。一旦这个参数发生变动则cb1会被回调。 // First, set a callback for the local integer parameter. In this case, we dont// provide a node name (the third, optional, parameter).auto cb1 node {RCLCPP_INFO(node-get_logger(),cb1: Received an update to parameter \%s\ of type %s: \% PRId64 \,p.get_name().c_str(),p.get_type_name().c_str(),p.as_int());};auto handle1 param_subscriber-add_parameter_callback(param_name, cb1);监控自身Node外部Parameter 我们先创建一个其他命名空间/a_namespace的Node。 // Lets create another remote node in a separate namespace with its own string parameterauto remote_node_name a_remote_node;auto remote_node_namespace /a_namespace;auto remote_param_name a_string_param;auto remote_node rclcpp::Node::make_shared(remote_node_name, remote_node_namespace);remote_node-declare_parameter(remote_param_name, default_string_value);auto remote_thread std::make_uniqueNodeThread(remote_node);该Node运行于一个线程中 // A utility class to assist in spinning a separate node class NodeThread { public:explicit NodeThread(rclcpp::node_interfaces::NodeBaseInterface::SharedPtr nodebase): node(nodebase){thread std::makeuniquestd::thread({executor.addnode(node);executor.spin();executor.removenode(node);});}templatetypename NodeTexplicit NodeThread(NodeT node): NodeThread(node-get_node_baseinterface()){}~NodeThread(){executor.cancel();thread_-join();}protected:rclcpp::nodeinterfaces::NodeBaseInterface::SharedPtr node;std::uniqueptrstd::thread thread;rclcpp::executors::SingleThreadedExecutor executor_; };然后我们只需要告知add_parameter_callback第三个参数的值即外部Node的名称包含命名空间就可以监听这个Node下名字叫remote_param_name “a_string_param”的Parameter的变动。 // Now, add a callback to monitor any changes to the remote nodes parameter. In this// case, we supply the remote node name.auto cb2 node {RCLCPP_INFO(node-get_logger(), cb2: Received an update to parameter \%s\ of type: %s: \%s\,p.get_name().c_str(),p.get_type_name().c_str(),p.as_string().c_str());};auto fqn remote_node_namespace std::string(/) remote_node_name;auto handle2 param_subscriber-add_parameter_callback(remote_param_name, cb2, fqn);监听所有Node的所有Parameter的变动 这次我们需要调用add_parameter_event_callback方法并传入回调即可。因为这会收到全部Node的所有Parameter的变动所以其信息也非常繁杂。这就需要我们自己在回调函数中做大量的手工处理。 // We can also monitor all parameter changes and do our own filtering/searchingauto cb3 fqn, remote_param_name, node {// Use a regular expression to scan for any updates to parameters in /a_namespace// as well as any parameter changes to our own nodestd::regex re((/a_namespace/.)|(/this_node));if (regex_match(event.node, re)) {// You can use get_parameter_from_event if you know the node name and parameter name// that youre looking forrclcpp::Parameter p;if (rclcpp::ParameterEventHandler::get_parameter_from_event(event, p,remote_param_name, fqn)){RCLCPP_INFO(node-get_logger(), cb3: Received an update to parameter \%s\ of type: %s: \%s\,p.get_name().c_str(),p.get_type_name().c_str(),p.as_string().c_str());}// You can also use get_parameters_from_event to enumerate all changes that came// in on this eventauto params rclcpp::ParameterEventHandler::get_parameters_from_event(event);for (auto p : params) {RCLCPP_INFO(node-get_logger(), cb3: Received an update to parameter \%s\ of type: %s: \%s\,p.get_name().c_str(),p.get_type_name().c_str(),p.value_to_string().c_str());}}};auto handle3 param_subscriber-add_parameter_event_callback(cb3);执行效果 总结 AsyncParametersClient和SyncParametersClient的on_parameter_event的功能和ParameterEventHandler::add_parameter_event_callback比较类似会通知所有Parameter的变动但是ParameterEventHandler::add_parameter_callback提供了更细粒度的控制我们可以通过指定Parameter名称和Node名称让ParameterEventHandler帮我们自动过滤掉我们不关心的事件。