自适应服务类型客户端
完整示例代码
#include <rclcpp/rclcpp.hpp>
#include <memory>template <typename ServiceType>
class ClientNode : public rclcpp::Node {
public:ClientNode(const std::string &service_name): Node("client_node"), service_name_(service_name) {client_ = this->create_client<ServiceType>(service_name_);}void send_request(const typename ServiceType::Request::SharedPtr &request) {while (!client_->wait_for_service(std::chrono::seconds(1))) {if (!rclcpp::ok()) {RCLCPP_ERROR(get_logger(), "Interrupted while waiting for the service. Exiting.");return;}RCLCPP_INFO(get_logger(), "Waiting for service %s to be available...", service_name_.c_str());}auto future_response = client_->async_send_request(request,std::bind(&ClientNode::result_callback_, this, std::placeholders::_1));}private:void result_callback_(typename rclcpp::Client<ServiceType>::SharedFuture result_future) {auto response = result_future.get();if (response) {RCLCPP_INFO(this->get_logger(), "Received response");// 这里可以根据实际的服务类型处理响应数据// 例如:auto result = response->sum; (假设服务返回 sum)} else {RCLCPP_ERROR(this->get_logger(), "Service call failed");}}std::string service_name_;typename rclcpp::Client<ServiceType>::SharedPtr client_;
};// 用法示例
int main(int argc, char **argv) {rclcpp::init(argc, argv);// 示例:发送 AddTwoInts 类型的请求auto add_node = std::make_shared<ClientNode<example_interfaces::srv::AddTwoInts>>("add_two_ints");auto request = std::make_shared<example_interfaces::srv::AddTwoInts::Request>();request->a = 3;request->b = 5;add_node->send_request(request);rclcpp::spin(add_node);rclcpp::shutdown();return 0;
}
代码说明
-
模板类:
ClientNode
是一个模板类,可以接受任意类型的服务消息。你只需在实例化时指定服务类型。 -
发送请求: 在
send_request
方法中,创建并发送请求,同时绑定回调函数处理响应。 -
响应处理: 在
result_callback_
方法中,处理响应并输出结果。根据具体的服务类型,你可以自定义处理逻辑。 -
用法示例: 通过实例化
ClientNode<example_interfaces::srv::AddTwoInts>
,可以发送AddTwoInts
服务的请求。
标题async_send_request 解释
async_send_request
是 ROS 2 中用于异步发送服务请求的函数。它属于 rclcpp::Client
类,用于发送请求并返回一个 Future
对象,以便稍后处理响应。
接口和参数
std::shared_future<typename ServiceType::Response::SharedPtr> async_send_request(const typename ServiceType::Request::SharedPtr &request,const rclcpp::Client<ServiceType>::SharedResponseCallback response_callback = nullptr);
参数
-
request: 这是一个指向请求消息的智能指针,类型为
SharedPtr
。你需要将填充好的请求消息传入此参数。 -
response_callback: 这是一个可选的回调函数,用于处理响应。如果不提供,用户需要手动通过
Future
获取响应。
返回值
- 返回一个
std::shared_future<typename ServiceType::Response::SharedPtr>
,这是一个共享的未来对象,表示请求的结果。用户可以通过get()
方法阻塞地获取响应,或者通过wait()
方法检查结果是否已准备好。
使用示例
以下是一个简单的使用示例:
auto future_response = client_->async_send_request(request);// 在其他地方或在某个时刻检查响应
if (future_response.wait_for(std::chrono::seconds(1)) == std::future_status::ready) {auto response = future_response.get();// 处理响应
} else {// 处理超时
}
总结
使用 async_send_request
可以有效地在不阻塞线程的情况下发送请求,从而提高程序的响应性。它适合于需要并发处理的场景,例如当多个服务请求需要同时进行时。