我在舞台ROS中有10个机器人,想要订阅位置/base_pose_ground_truth
的主题。这意味着我必须订阅robot0_base_pose_ground_truth
,robot1_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个与每个机器人相对应的不同位置。我不知道如何将每个机器人的位置放在相应的内存中(例如数组或向量)。可以将机器人索引作为参数传递给回调,并尝试使用它将位置主题分配给数组。
如果有人在这个问题上帮助我,我将感激不尽。
答案 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));