【ROS2】演示:配置服务自省

目标:为服务客户端和服务器配置服务内省。

 教程级别:高级

 时间:15 分钟

 目录

  •  概述

  •  安装演示

  • 内省配置状态

  •  内省演示

  •  相关内容

 概述 

ROS 2 应用程序通常由服务组成,以在远程节点中执行特定程序。可以通过服务内省来检查服务数据通信

在此演示中,我们将重点介绍如何为服务客户端和服务器配置服务自省状态,并监控与 ros2 service echo 的服务通信。

安装演示 

请参阅安装说明以了解安装 ROS 2 的详细信息。

如果您已经安装了 ROS 2 二进制包,请确保已安装 ros-jazzy-demo-nodes-cpp 。如果您下载了存档或从源代码构建了 ROS 2,它将已经是安装的一部分。

内省配置状态 

服务自省有 3 种配置状态。

服务自省配置状态 

RCL_SERVICE_INTROSPECTION_OFF

 禁用

RCL_SERVICE_INTROSPECTION_METADATA

仅元数据,没有任何用户数据内容

RCL_SERVICE_INTROSPECTION_CONTENTS

用户数据内容与元数据

 内省演示 

此演示展示了如何使用 ros2 service echo 管理服务自省和监控服务数据通信。

内省服务节点:

https://github.com/ros2/demos/blob/jazzy/demo_nodes_cpp/src/services/introspection_service.cpp

#include <cinttypes> // 包含固定宽度整数类型的头文件
#include <memory> // 包含智能指针库
#include <vector> // 包含向量容器库


#include "rcl/service_introspection.h" // 包含服务内省的头文件


#include "rclcpp/qos.hpp" // 包含质量服务(QoS)设置的头文件
#include "rclcpp/rclcpp.hpp" // 包含ROS 2的核心库
#include "rclcpp_components/register_node_macro.hpp" // 包含注册节点宏的头文件


#include "example_interfaces/srv/add_two_ints.hpp" // 包含示例服务AddTwoInts的头文件
#include "rcl_interfaces/msg/set_parameters_result.hpp" // 包含设置参数结果消息的头文件


#include "demo_nodes_cpp/visibility_control.h" // 包含可见性控制的头文件


// 这个演示程序展示了如何通过参数动态配置服务内省。
// 该程序由一个服务节点(IntrospectionServiceNode)组成,该节点监听'/add_two_ints'服务的客户端请求。
// 当客户端连接并发送请求时,它会将两个整数相加并返回结果。
//
// 上述是一个相当常见的ROS 2服务,但该程序试图展示的是内省功能。
// IntrospectionServiceNode有一个名为'service_configure_introspection'的字符串参数。
// 如果该参数设置为'disabled'(默认值),则不会进行内省。
// 如果该参数设置为'metadata'(参见下面的参数设置详情),则会将基本元数据(时间戳、序列号等)发送到一个隐藏的主题/add_two_ints/_service_event。
//
// 要查看此功能,请运行以下命令:
//
// ros2 launch demo_nodes_cpp introspect_services_launch.py
// 由于内省的默认设置是'disabled',这与普通的客户端和服务器没有区别。
// 不会创建额外的主题,也不会发送内省数据。然而,动态更改内省配置是完全支持的。
// 这可以通过运行'ros2 param set /introspection_service service_configure_introspection metadata'来实现,
// 这将配置服务开始将内省元数据发送到/add_two_ints/_service_event。
//
// 一旦设置了参数,可以通过运行以下命令查看内省数据:
// ros2 topic echo /add_two_ints/_service_event


namespace demo_nodes_cpp // 定义命名空间demo_nodes_cpp
{


class IntrospectionServiceNode : public rclcpp::Node // 定义IntrospectionServiceNode类,继承自rclcpp::Node
{
public:
  DEMO_NODES_CPP_PUBLIC
  explicit IntrospectionServiceNode(const rclcpp::NodeOptions & options) // 构造函数,接受节点选项作为参数
  : Node("introspection_service", options) // 调用基类构造函数,设置节点名称为"introspection_service"
  {
    auto handle_add_two_ints = [this](
      const std::shared_ptr<rmw_request_id_t> request_header,
      const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,
      std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response) -> void // 响应参数
      {
        (void)request_header; // 忽略请求头
        RCLCPP_INFO( // 打印信息日志
          this->get_logger(), "Incoming request\na: %" PRId64 " b: %" PRId64
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值