以下是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
关键点说明
- 服务接口:通过
.srv文件定义请求/响应结构,ROS2自动生成C++头文件。 - 服务端:
- 使用
create_service创建服务端点 - 回调函数处理请求并填充响应
- 使用
- 客户端:
- 使用
create_client创建客户端 async_send_request异步发送请求spin_until_future_complete等待响应
- 使用
- 编译配置:确保正确链接
rclcpp和接口依赖包
常见问题处理
- 服务未找到:检查服务名是否一致(如
add_two_ints) - 编译失败:确保
CMakeLists.txt中find_package包含所有依赖 - 运行时错误:使用
rqt_graph检查节点/服务连接状态
通过以上步骤,您可实现ROS2中基于C++的服务通信。实际开发中,可根据需求自定义服务接口(如修改.srv文件)并扩展处理逻辑。
1万+

被折叠的 条评论
为什么被折叠?



