基于unordered_map实现管理客户端的容器节点

###代码

#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;
}
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值