###代码
#include "ys_srv_type.h"
#include <rclcpp/rclcpp.hpp>
#include <rclcpp/client.hpp>
// #include <std_msgs/srv/empty.hpp>
// #include <std_msgs/srv/string.hpp>
#include <unordered_map>
#include <string>
#include <memory>
#include <any>
#include <stdexcept>
class ClientManager : public rclcpp::Node {
public:
ClientManager(std::string node_name) : Node(node_name) {}
// 添加服务客户端
template<typename T>
void add_client(const std::string &service_name) {
auto client = this->create_client<T>(service_name);
clientVec_[service_name] = client;
}
// 查询服务客户端
template<typename T>
std::shared_ptr<rclcpp::Client<T>> get_client(const std::string &service_name) {
try {
return std::any_cast<std::shared_ptr<rclcpp::Client<T>>>(clientVec_.at(service_name));
} catch (const std::out_of_range&) {
RCLCPP_ERROR(this->get_logger(), "Service %s not found", service_name.c_str());
return nullptr;
} catch (const std::bad_any_cast&) {
RCLCPP_ERROR(this->get_logger(), "Client type mismatch for service: %s", service_name.c_str());
return nullptr;
}
}
// 删除服务客户端
void remove_client(const std::string &service_name) {
clientVec_.erase(service_name);
}
// 使用std::any来存储不同类型的服务客户端
std::unordered_map<std::string, std::any> clientVec_;
};
#endif
/*
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
auto node = std::make_shared<MyNode>();
// 示例:添加不同类型的服务客户端
node->add_client<std_msgs::srv::Empty>("empty_service");
node->add_client<std_msgs::srv::String>("string_service");
// 查询客户端
auto empty_client = node->get_client<std_msgs::srv::Empty>("empty_service");
if (empty_client) {
RCLCPP_INFO(node->get_logger(), "Found client for empty_service");
}
auto string_client = node->get_client<std_msgs::srv::String>("string_service");
if (string_client) {
RCLCPP_INFO(node->get_logger(), "Found client for string_service");
}
// 删除客户端
node->remove_client("empty_service");
node->remove_client("string_service");
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
*/