我有一个C ++ ROS问题。
我有一项任务,要求我从其他程序生成的一些主题中获取信息。基本上。这个其他程序从海龟模拟器ros教程中发布了一些主题,这些主题发布了一些名为Pose的基本数据。问题是,我不确定如何从所有不同的主题来源获取我需要的所有信息。我知道我需要订阅一个主题来获取它的信息,我已经知道如何获取所有主题名称并打开它们的订阅。我不清楚的是我是否必须在我订阅的每个新主题中传递一个独特的回调函数。或者是否有办法制作一个可以传递给所有订阅的通用回调函数。
到目前为止,这是我的代码
void getTTurtles(char tType, vector < TurtlePose > Tarray) {
int i;
string tname;
stringstream topicName;
//TurtlePose TPose;
ros::master::V_TopicInfo alltopics;
//get all topic names
ros::master::getTopics(alltopics);
for (int i = 0; i < alltopics.size(); i++) {
topicName.clear();
topicName.str("");
tname = getTurtlename(alltopics[i]);
if (tname[0] == 'T') {
Tarray[i].topicname = alltopics[i].name;
Tarray[i].name = tname;
topicName << "/" << TPose[i].name << "/pose";
ros::Subscriber sub_tur = n.subscribe < turtlesim::Pose > (tname, 1, poseCallback);
}
}
return false;
};
正如您所看到的,我有一个函数可以为我获取所有主题名称。这允许我只抓住名字以T开头的那个(程序的目的是让我自己的乌龟收集他所有创建的T-Turtles,同时避开他创建的Xturtles,所以这个函数意味着给我一个清单Tturtles及其位置。)我抓住了海龟主题名称的名称,从中也可以获取实际的海龟名称。但我需要提取第三个元素。 turtlesim ::姿势信息由所有Tturtle主题传输。所以我使用主题名称(T1,T2,T3等)来订阅该主题并传递回调函数,但我不知道如何正确编写回调函数以适当地将姿势信息分配到适当的位置。例如。如何确保在/ T1 /姿势发布时调用回调函数,以确保它传输的信息最终在Tarray [0] .pose而不是Tarray [1]到[2],同时还有/ T3 /姿势进入Tarray [2] .pose。等等。
解决方案必须是可扩展的,因为正在制作的T-turtle主题的数量可能会也可能会被更改。
是他们编写订阅或回调函数的方法,以便您在创建时传入特定容器,以便在特定订阅从其订阅主题获取信息时使用?
事先感谢您的帮助?
答案 0 :(得分:0)
如果您的输入数据是相同的U可以使用任意数量的订阅者使用一个回调并且在声明订阅者时U可以传递任何数量的参数,因此您可以将回传的数据分离到您的回调内部(通过将其推送到单独的全局向量等。)