ROS:订阅相同的回调和相同的主题(具有不同的索引)分配给对应的变量

时间:2014-12-31 14:57:29

标签: callback argument-passing ros subscribe

我在舞台ROS中有10个机器人,想要订阅位置/base_pose_ground_truth的主题。这意味着我必须订阅robot0_base_pose_ground_truthrobot1_base_pose_ground_truth,....

首先想到的解决方案是:

for(int i=0; i<RobotNumber; i++) {                  
  char str[30] = "/robot_";
  char index[4];
  sprintf(index, "%d", i);
  strcat(str, index);
  strcat(str, "/base_pose_ground_truth");
  GoalPos_sub[i] = Node.subscribe(str, 100, GetPos_callback);           
}   

并且回调可能是:

void GetPos_callback(const nav_msgs::Odometry::ConstPtr& msg) {
  Goalpose[0] = msg->pose.pose.position.x;
  Goalpose[1] = msg->pose.pose.position.y;
}

但这不会给我10个与每个机器人相对应的不同位置。我不知道如何将每个机器人的位置放在相应的内存中(例如数组或向量)。可以将机器人索引作为参数传递给回调,并尝试使用它将位置主题分配给数组。

如果有人在这个问题上帮助我,我将感激不尽。

2 个答案:

答案 0 :(得分:1)

您已经非常接近解决方案:您确实可以将机器人索引作为参数添加到回调中,并将Goalpose更改为数组:

void GetPos_callback(const nav_msgs::Odometry::ConstPtr& msg, int index) {
  Goalpose[index][0] = msg->pose.pose.position.x;
  Goalpose[index][1] = msg->pose.pose.position.y;
}

您必须稍微更改subscribe命令才能使其正常工作。要将索引传递给回调,您必须使用boost::bind

GoalPos_sub[i] = Node.subscribe(str, 100, boost::bind(GetPos_callback, _1, i));

答案 1 :(得分:1)

我认为先前的答案已经相当不错了。因此,我只想在这里添加一些对ROS动力学有用的东西。由于回调函数现在与预订主题中的回调函数不匹配,因此您必须提供数据类型。

在您的情况下,修改为:

GoalPos_sub[i] = Node.subscribe<nav_msgs::Odometry>(str, 100, boost::bind(GetPos_callback, _1, i));

我找到了similar answer here