ros2 服务创建与调用范例 C++

以下是ROS2中服务创建与调用的C++完整范例,包含服务端、客户端实现及编译配置:

1. 服务接口定义

srv目录下创建AddTwoInts.srv文件:

int64 a
int64 b
---
int64 sum

2. 服务端实现 (add_two_ints_server.cpp)

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

using AddTwoInts = example_interfaces::srv::AddTwoInts;

void handle_request(
  const std::shared_ptr<rmw_request_id_t> request_header,
  const std::shared_ptr<AddTwoInts::Request> request,
  const std::shared_ptr<AddTwoInts::Response> response
) {
  response->sum = request->a + request->b;
  RCLCPP_INFO(rclcpp::get_logger("Server"), "Request: %ld + %ld", request->a, request->b);
}

int main(int argc, char **argv) {
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("add_two_ints_server");
  
  auto server = node->create_service<AddTwoInts>(
    "add_two_ints", 
    [](auto req, auto res, auto ret) {
      handle_request(ret->request_header, req, res);
    }
  );
  
  RCLCPP_INFO(rclcpp::get_logger("Server"), "Service ready");
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

3. 客户端实现 (add_two_ints_client.cpp)

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

using AddTwoInts = example_interfaces::srv::AddTwoInts;

int main(int argc, char **argv) {
  rclcpp::init(argc, argv);
  auto node = rclcpp::Node::make_shared("add_two_ints_client");
  auto client = node->create_client<AddTwoInts>("add_two_ints");
  
  while (!client->wait_for_service(std::chrono::seconds(1))) {
    RCLCPP_INFO(node->get_logger(), "Waiting for service...");
  }
  
  auto request = std::make_shared<AddTwoInts::Request>();
  request->a = 5;
  request->b = 3;
  
  auto future = client->async_send_request(request);
  if (rclcpp::spin_until_future_complete(node, future) == 
      rclcpp::FutureReturnCode::SUCCESS) {
    RCLCPP_INFO(node->get_logger(), "Result: %ld", future.get()->sum);
  } else {
    RCLCPP_ERROR(node->get_logger(), "Service call failed");
  }
  
  rclcpp::shutdown();
  return 0;
}

4. CMakeLists.txt 配置

cmake_minimum_required(VERSION 3.8)
project(cpp_srvcli)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(example_interfaces REQUIRED)

add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server rclcpp example_interfaces)

add_executable(client src/add_two_ints_client.cpp)
ament_target_dependencies(client rclcpp example_interfaces)

install(TARGETS server client DESTINATION lib/${PROJECT_NAME})
ament_package()

5. 编译与运行

# 编译
colcon build --packages-select cpp_srvcli

# 启动服务端
source install/setup.bash
ros2 run cpp_srvcli server

# 启动客户端
ros2 run cpp_srvcli client

关键点说明

  1. 服务接口:通过.srv文件定义请求/响应结构,ROS2自动生成C++头文件。
  2. 服务端
    • 使用create_service创建服务端点
    • 回调函数处理请求并填充响应
  3. 客户端
    • 使用create_client创建客户端
    • async_send_request异步发送请求
    • spin_until_future_complete等待响应
  4. 编译配置:确保正确链接rclcpp和接口依赖包

常见问题处理

  • 服务未找到:检查服务名是否一致(如add_two_ints
  • 编译失败:确保CMakeLists.txtfind_package包含所有依赖
  • 运行时错误:使用rqt_graph检查节点/服务连接状态

通过以上步骤,您可实现ROS2中基于C++的服务通信。实际开发中,可根据需求自定义服务接口(如修改.srv文件)并扩展处理逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老黄编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值