ros2服务编程-client

有了上节的服务器,我们就可以写一个客户端对其进行调用。
还是在tutorials_service功能包的src文件夹下创建service_client.cpp文件,主要功能是调用上节编写的服务器节点进行加法运算,代码如下:

#include "rclcpp/rclcpp.hpp"
#include"oryxbot2_msgs/srv/srv_tutorial.hpp"

int main(int argc, char** argv)
{
  rclcpp::init(argc, argv);
  //初始化节点
  auto node = rclcpp::Node::make_shared("service_client");
  //创建“add_two_ints”客户端
  auto client = node->create_client<oryxbot2_msgs::srv::SrvTutorial>("add_two_ints");
  //等待连接服务器
  while (!client->wait_for_service(std::chrono::seconds(1))) {
    //关闭节点
    if (!rclcpp::ok()) {
      RCLCPP_ERROR(node->get_logger(), "Interrupted while waiting for the service. Exiting");
      return 0;
    }
    RCLCPP_INFO(node->get_logger(), "service not available, waiting again...");
  }
  //实例化消息
  auto request = std::make_shared<oryxbot2_msgs::srv::SrvTutorial::Request>();
  //赋值
  request->a = 1;
  request->b = 1;
  //延时函数  10Hz
  rclcpp::WallRate loop_rate(10);
  //熟悉的while循环
  while (rclcpp::ok()) {
    //发送消息
    auto result_future = client->async_send_request(request);
    //如果接收到返回
    if (rclcpp::spin_until_future_complete(node, result_future) ==
      rclcpp::executor::FutureReturnCode::SUCCESS)
    {
      //接收返回值
      auto result = result_future.get();
      RCLCPP_INFO(node->get_logger(), "Client request sum:%d  =  a: %d  +  b: %d", result->result,request->a, request->b);
      //request->a=request->b;
      request->b +=1;
    }else{//否则
      RCLCPP_ERROR(node->get_logger(), "service call failed :(");
    }
    //延时等待
    loop_rate.sleep();
  }
  //关闭节点
  rclcpp::shutdown();
  return 0;
}

在CMakeLists.txt添加编译规则,生成service_server节点:

add_executable(service_client src/service_client.cpp)
ament_target_dependencies(service_client rclcpp std_msgs oryxbot2_msgs tutorials_service)

  install(TARGETS
    service_server
    service_client#在原来的基础上添加service_client节点
    EXPORT export_${PROJECT_NAME}
    DESTINATION lib/${PROJECT_NAME})

同样的进入工作空间编译,source一下。
接下来首先运行上节的服务器节点

~$ ros2 run tutorials_service service_server 

什么也没有出现,是因为没有人调用服务,现在可以打开我们这节编写的客户端节点:

~$ ros2 run tutorials_service service_client 
[INFO] [service_client]: Client request sum:2  =  a: 1  +  b: 1
[INFO] [service_client]: Client request sum:3  =  a: 1  +  b: 2
[INFO] [service_client]: Client request sum:4  =  a: 1  +  b: 3
[INFO] [service_client]: Client request sum:5  =  a: 1  +  b: 4
[INFO] [service_client]: Client request sum:6  =  a: 1  +  b: 5
[INFO] [service_client]: Client request sum:7  =  a: 1  +  b: 6
[INFO] [service_client]: Client request sum:8  =  a: 1  +  b: 7
[INFO] [service_client]: Client request sum:9  =  a: 1  +  b: 8
[INFO] [service_client]: Client request sum:10  =  a: 1  +  b: 9
[INFO] [service_client]: Client request sum:11  =  a: 1  +  b: 10

我们发现客户端节点以10hz的速度调用add_two_ints服务,并且把结果打印在终端上。
而我们服务器一端,也同样打印被调用情况:

~$ ros2 run tutorials_service service_server 
[INFO] [service_server]: request : x =1 , y =1  response sum= 2
[INFO] [service_server]: request : x =1 , y =2  response sum= 3
[INFO] [service_server]: request : x =1 , y =3  response sum= 4
[INFO] [service_server]: request : x =1 , y =4  response sum= 5
[INFO] [service_server]: request : x =1 , y =5  response sum= 6
[INFO] [service_server]: request : x =1 , y =6  response sum= 7
[INFO] [service_server]: request : x =1 , y =7  response sum= 8
[INFO] [service_server]: request : x =1 , y =8  response sum= 9
[INFO] [service_server]: request : x =1 , y =9  response sum= 10
[INFO] [service_server]: request : x =1 , y =10  response sum= 11
[INFO] [service_server]: request : x =1 , y =11  response sum= 12
[INFO] [service_server]: request : x =1 , y =12  response sum= 13
[INFO] [service_server]: request : x =1 , y =13  response sum= 14

至此完成ros2服务服务器与客户端的编写。下节我们将带领大家使用ros2特性:Node Composition编写新的服务器与客户端。
(git地址: https://github.com/DylanLN/oryxbot_ws-ros2)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值