2014-12-31 6 views
1

무대 ROS에 10 개의 로봇이 있고 위치가 /base_pose_ground_truth 인 주제를 구독하고 싶습니다. 그것은, 내가 robot0_base_pose_ground_truth, robot1_base_pose_ground_truth에 가입해야 함을 의미합니다 ....ROS : 동일한 콜백 및 동일한 주제 (다른 색인 포함)를 correspondig 변수에 할당

마음에 오는 첫번째 방법은 다음과 같습니다

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

이미 솔루션에 매우 가까운 위치 : 참으로 배열 될 콜백에 대한 인수로 로봇 인덱스를 추가하고 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; 
} 

당신은 변경해야하는 약간 명령 구독 이 일을하기 위해서. 콜백에 색인을 전달하려면 boost::bind :

GoalPos_sub[i] = Node.subscribe(str, 100, boost::bind(GetPos_callback, _1, i)); 
을 사용해야합니다.