ROS2创建服务用RCLCPP实现

1.创建服务提供者service_server_01.cpp

#include "example_interfaces/srv/add_two_ints.hpp"
#include "rclcpp/rclcpp.hpp"

class ServiceServer01 : public rclcpp::Node {
public:
  ServiceServer01(std::string name) : Node(name) {
    RCLCPP_INFO(this->get_logger(), "节点已启动:%s.", name.c_str());
    // 创建服务
    add_ints_server_ =
      this->create_service<example_interfaces::srv::AddTwoInts>(
        "add_two_ints_srv",
        std::bind(&ServiceServer01::handle_add_two_ints, this,
                  std::placeholders::_1, std::placeholders::_2));
  }

private:
  // 声明一个服务
  rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr
    add_ints_server_;

  // 收到请求的处理函数
  void handle_add_two_ints(
    const std::shared_ptr<example_interfaces::srv::AddTwoInts::Request> request,
    std::shared_ptr<example_interfaces::srv::AddTwoInts::Response> response) {
    RCLCPP_INFO(this->get_logger(), "收到a: %ld b: %ld", request->a,
                request->b);
    response->sum = request->a + request->b;
  };
};


int main(int argc, char** argv) {
  rclcpp::init(argc, argv);
  auto node = std::make_shared<ServiceServer01>("service_server_01");
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

2.创建服务消费者service_client_01.cpp

#include "rclcpp/rclcpp.hpp"
#include "example_interfaces/srv/add_two_ints.hpp"

class ServiceClient01 : public rclcpp::Node {
public:
  // 构造函数,有一个参数为节点名称
  ServiceClient01(std::string name) : Node(name) {
    RCLCPP_INFO(this->get_logger(), "节点已启动:%s.", name.c_str());
    // 创建客户端
    client_ = this->create_client<example_interfaces::srv::AddTwoInts>("add_two_ints_srv");
  }

  void send_request(int a, int b) {
    RCLCPP_INFO(this->get_logger(), "计算%d+%d", a, b);

    // 1.等待服务端上线
    while (!client_->wait_for_service(std::chrono::seconds(1))) {
      //等待时检测rclcpp的状态
      if (!rclcpp::ok()) {
        RCLCPP_ERROR(this->get_logger(), "等待服务的过程中被打断...");
        return;
      }
      RCLCPP_INFO(this->get_logger(), "等待服务端上线中");
    }

    // 2.构造请求的
    auto request =
      std::make_shared<example_interfaces::srv::AddTwoInts_Request>();
    request->a = a;
    request->b = b;

    // 3.发送异步请求,然后等待返回,返回时调用回调函数
    client_->async_send_request(
      request, std::bind(&ServiceClient01::result_callback_, this,
                         std::placeholders::_1));
  };

private:
  // 声明客户端
  rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedPtr client_;

  void result_callback_(
    rclcpp::Client<example_interfaces::srv::AddTwoInts>::SharedFuture
      result_future) {
    auto response = result_future.get();
    RCLCPP_INFO(this->get_logger(), "计算结果:%ld", response->sum);
  }
};


int main(int argc, char** argv) {
  rclcpp::init(argc, argv);
  /*创建对应节点的共享指针对象*/
  auto node = std::make_shared<ServiceClient01>("service_client_01");
  /* 运行节点,并检测退出信号*/
  //增加这一行,node->send_request(5, 6);,计算5+6结果
  node->send_request(5, 6);
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

 

3.初始化链接应用

导入接口的三个步骤不知道你是否还记得。
ament_cmake类型功能包导入消息接口分为三步:

在CMakeLists.txt中导入,具体是先find_packages再ament_target_dependencies。
在packages.xml中导入,具体是添加depend标签并将消息接口写入。
在代码中导入,C++中是#include"消息功能包/xxx/xxx.hpp"。

CMakeLists.txt

find_package(example_interfaces REQUIRED)


add_executable(service_client_01 src/service_client_01.cpp)
ament_target_dependencies(service_client_01 rclcpp example_interfaces)

add_executable(service_server_01 src/service_server_01.cpp)
ament_target_dependencies(service_server_01 rclcpp example_interfaces)

install(TARGETS
  service_server_01
  service_client_01
  DESTINATION lib/${PROJECT_NAME}
)

 

packages.xml

<depend>example_interfaces</depend>

4.编译、运行应用

cd chapt3/chapt3_ws/
colcon build --packages-select example_service_rclcpp

# 运行 service_server_01
source install/setup.bash
ros2 run example_service_rclcpp service_server_01

# 打开新终端运行  service_client_01
source install/setup.bash
ros2 run example_service_rclcpp service_client_01

5.两数相加我们需要利用ROS2自带的example_interfaces接口,使用命令行可以查看这个接口的定义

ros2 interface show example_interfaces/srv/AddTwoInts

# 查看声明的服务
ros2 service list


# 使用命令行调用服务两数之和接口
ros2 service call /add_two_ints_srv example_interfaces/srv/AddTwoInts "{a: 5,b: 10}"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/754568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应对铜价飙升,慧能泰推出超高性价比240W五芯线专用eMarker芯片

全球铜价仍然居高不下&#xff0c;以前买电线论捆算&#xff0c;现在巴不得论‘克’珍藏。这年头&#xff0c;换根充电线都得三思而后行&#xff0c;考虑的不是颜色款式&#xff0c;而是‘这条线的铜含量&#xff0c;值几个涨停板&#xff1f;’ 说实话&#xff0c;铜价上涨&a…

[AHK]微信表情快捷输入

需求&#xff1a; 希望在电脑上微信聊天时用键盘快捷输入常用表情。 工具&#xff1a; AutoHotkey v1 使用说明&#xff1a; 微信中按空格显示热键提示窗口&#xff0c;输入键盘序列后&#xff0c;按空格输出相应表情 配置&#xff1a; 源代码&#xff1a; /** 脚本&…

Python之父推荐!Star 60k!深入CPython内核:揭秘内部实现细节

都说 Python 是人工智能的“天选”语言&#xff0c;为什么呢&#xff1f; 可能很多读者都知道&#xff0c;Python 的解释器是用 C 语言写的&#xff0c;所以其实我们在谈论 “Python” 的时候&#xff0c;99.9% 的情况说的就是 “CPython”&#xff01; CPython 是目前最流行的…

一文弄懂线性回归模型

1、引言 今天&#xff0c;我们将深入探讨机器学习中的三个关键概念&#xff1a;线性回归、代价函数和梯度下降。这些概念构成了许多机器学习算法的基础。起初&#xff0c;我决定不写一篇关于这些主题的文章&#xff0c;因为它们已经被广泛涉及。不过&#xff0c;我改变了主意&…

小白快速入门canvas画海报

小编以微信小程序原生语言举例 wxml页面&#xff1a; <canvas type"2d" id"myCanvas" style"width:375px;height:667px;"></canvas> js页面&#xff1a; import drawQrcode from ../../../utils/qrcode/weapp.qrcode.esmdata: {…

IDEA SpringBoot整合SpringData JPA(保姆级教程,超详细!!!)

目录 1. 简介 2. 创建SpringBoot项目 3. Maven依赖引入 4. 修改application.properties配置文件 5. Entity实体类编写 6. Dao层接口开发 7. 测试接口开发 8. 程序测试 1. 简介 本博客将详细介绍在IDEA中&#xff0c;如何整合SpringBoot与SpringData JPA&#xff0c;以…

EtherCAT笔记(四)——EtherCAT数据帧结构

EtherCAT数据包含2B的数据头和44~1948B的数据区。数据区由多个子报文组成。由于EtherCAT本身是通过以太网数据帧的形式传输&#xff0c;因此其协议帧中会携带以太网的帧头。 其中&#xff0c;解释如下&#xff1a; &#xff08;1&#xff09;以太网数据帧头&#xff1a;EtherC…

AUTOSAR NvM模块(一)

NvMBlockDescriptor [ECUC_NVM_00061] 用于存储所有特定于块的配置参数的容器。对于每个非易失性随机存取存储器&#xff08;NVRAM&#xff09;块&#xff0c;应该指定这个容器的一个实例。 NvMBlockCrcType 定义了NVRAM块的CRC数据宽度。根据Autosar标准&#xff0c;此参数…

KVB外汇:澳元/美元、澳元/纽元、英镑/澳元的走势如何?

摘要 本文对近期澳元/美元、澳元/纽元、英镑/澳元的技术走势进行了详细分析。通过对关键支撑位和阻力位的分析&#xff0c;我们可以更好地理解澳元在不同货币对中的表现。随着全球经济形势的变化&#xff0c;各国央行的货币政策对外汇市场的影响也愈发明显。本文旨在帮助投资者…

观成科技:证券行业加密业务安全风险监测与防御技术研究

摘要&#xff1a;解决证券⾏业加密流量威胁问题、加密流量中的应⽤⻛险问题&#xff0c;对若⼲证券⾏业的实际流量内容进⾏调研分析&#xff0c; 分析了证券⾏业加密流量⾯临的合规性⻛险和加密协议及证书本⾝存在的⻛险、以及可能存在的外部加密流量威 胁&#xff0c;并提出防…

用GAN生成奖杯

数据集链接&#xff1a;https://pan.baidu.com/s/19Uxc2ELiMG3acUtLeSTDTA?pwdwsyw 提取码&#xff1a;wsyw 我设置的图片大小为128*128&#xff0c;如果内存爆炸可以将batch_size调小&#xff0c;epoch我设置的2000&#xff0c;我感觉其实1000也够了。代码如下&#xff1a; …

信创认证 | Smartbi Insight V11成功适配申威3231处理器

在信息技术飞速发展的浪潮中&#xff0c;软硬件的深度融合与协同发展已成为推动行业创新的关键因素。 近日&#xff0c;思迈特商业智能与数据分析软件[简称&#xff1a;Smartbi Insight]V11在统信服务器操作系统V20和中电科申泰信息科技有限公司产品申威3231处理器环境下完成适…

CAN和CANFD数据写入.asc文件的dll

因为工作需要&#xff0c;需要做一些硬件不是CANoe的上位机&#xff08;比如说周立功CAN,NI-CAN&#xff09;&#xff0c;上位机需要有记录数据的功能&#xff0c;所以用Qt制作了一个记录数据的dll&#xff0c;方便重复使用&#xff08;因为有的客户指定了编程软件&#xff0c;…

51循迹小车(蓝牙+循迹+超声波+舵机+避障L298N)

基本驱动 L298N电机驱动模块负责供电和控制电机驱动 将电池12V供电接到12V供电上&#xff0c;作为输入。单片机及其他器件供电可以使用5V供电&#xff0c;这里的GND都接到一起。 输出A和输出B接到电机上&#xff0c;负责给电机供电和控制电机。 通道A使能和通道B使能以及逻…

【Windows下使用vckpg下载protoc之后环境变量问题】

使用vcpkg进行下载的protoc&#xff1a; vcpkg install protobuf protobuf:x64-windows 检查protoc版本时出现问题&#xff1a; “protoc”不是内部或外部命令&#xff0c;也不是可运行程序或批处理文件 尝试添加系统环境变量后没有反应。 这个时候找到vckpg下的packages目录…

如何利用ChatGPT寻找科研创新点?分享5个有效实践技巧

欢迎关注&#xff1a;智写AI&#xff0c;为大家带来最酷最有效的智能AI学术科研写作攻略。关于使用ChatGPT等AI学术科研的相关问题可以和作者七哥交流&#xff1a;yida985 地表功能最强大的高级学术专业版已经开放&#xff0c;拥有全球领先的GPT学术科研应用&#xff0c;有兴趣…

鸿蒙开发设备管理:【@ohos.brightness (屏幕亮度)】

屏幕亮度 该模块提供屏幕亮度的设置接口。 说明&#xff1a; 本模块首批接口从API version 7开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import brightness from ohos.brightness;brightness.setValue setValue(value: number):…

【Linux】网络编程套接字

一、预备知识 1.1 理解源IP地址和目的IP地址 在IP数据报的头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 源IP地址和目的IP地址是网络通信中常用的两个概念&#xff0c;他们代表了通信中的两个节点。 源IP地址是指发起通信的节点的IP地址&#…

在WSL Ubuntu中启用root用户的SSH服务

在 Ubuntu 中&#xff0c;默认情况下 root 用户是禁用 SSH 登录的&#xff0c;这是为了增加系统安全性。 一、修改配置 找到 PermitRootLogin 行&#xff1a;在文件中找到 PermitRootLogin 配置项。默认情况下&#xff0c;它通常被设置为 PermitRootLogin prohibit-password 或…

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩?举个例子你就彻底懂了!!

老生常谈问题之什么是缓存穿透、缓存击穿、缓存雪崩&#xff1f;举个例子你就彻底懂了&#xff01;&#xff01; 缓存穿透发生场景解决方案 缓存击穿解决方案 缓存雪崩发生场景解决方案 总结三者区分三者原因三者解决方案 想象一下&#xff0c;你开了一家便利店&#xff0c;店里…