有了上节的服务器,我们就可以写一个客户端对其进行调用。
还是在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)