ROS2 动态消息模板

ROS2 Dynamic messages template

本文关键字:消息 动态 ROS2      更新时间:2023-10-16

我有一个关于 ROS2 消息的问题,或者可能只是标准C++,也许你们中的一个人以前尝试过类似的东西,或者可以告诉我我试图完成的事情不起作用。

我正在尝试创建的是一个库,可用于快速创建 ROS2 节点,在启动节点之前根据情况动态添加发布者和/或订阅者。 我面临的问题是 ROS2 使用像std_msgs::msg::String这样的消息类型。示例源代码可以在 github 上找到。 源使用以下代码创建订阅服务器:

subscription_ = this->create_subscription<std_msgs::msg::String>("topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1));

我想创建一个函数,该函数可以使用给定的消息类型创建订阅者,即:

void createListener(std::string topicName, 'messagetype')
{
auto subscription_ = this->create_subscription<'messagetype'>(topicname, 10, [this]{}, this, _1));
//adding the created subscriber to a list is already done
}

这将允许我使用相同的函数,同时仍然能够使用不同的消息,例如:

nav_msgs::msg::Path
geometry_msgs::msg::Point

无需为每个消息类型创建新函数。 我似乎找不到create_subscribtion<>()函数中使用的模板类型,我只能找到每条消息创建自己的类型。std_msgs::msg::String将返回std_msgs::msg::String_<std::allocator<void>>类型。

有没有办法让我做到这一点?

您可以通过执行以下操作在此处正确使用模板:

template <typename MsgType>
void createListener(std::string topicName)
{
auto subscription_ = this->create_subscription<MsgType>(topicname, 10, [this]{}, this, _1));
//adding the created subscriber to a list is already done
}

然后可以调用此函数,例如:

createListener<nav_msgs::msg::Path>("topicName")