Q: 有时候, 通过launch文件会 include 几个 launch文件, 而其中的几个node之间需要有先后关系, 那么怎么办呢.
A: 例如: node A 发布topic, service, 然后启用 node B. 那么可以采用 rostopic list 检测 node A是否已经完成了 topic, 然后启动 node B. 用程序实现.
-
bool waitfor_topic_ok(const char *topic_wait, uint32_t timeout_sec)
-
{
-
uint32_t iCnt = 0;
-
-
iCnt = 0;
-
std::string wait_topic(topic_wait);
-
-
ros::master::V_TopicInfo master_topics;
-
while (1) {
-
ros::master::getTopics(master_topics);
-
ros::master::V_TopicInfo::iterator master_it = master_topics.begin();
-
ros::master::V_TopicInfo::iterator master_end = master_topics.end();
-
for ( ; master_it != master_end; ++master_it )
-
{
-
const ros::master::TopicInfo& info = *master_it;
-
if ( wait_topic == info.name )
-
{
-
return true;
-
break;
-
}
-
}
-
if (timeout_sec == 0) { //用户检测是否存在
-
break; //
-
}
-
else { //没有发现, 则延迟等待
-
sleep(1);
-
if ((timeout_sec > 0) && (timeout_sec <= iCnt++)) break;
-
}
-
}
-
-
return false;
-
}
同理. 其他如 service action 等等.
2. 查看自己的topic是否被订阅.
-
//查看 pub_mytopic 是否被订阅
-
if (pub_mytopic.getNumSubscribers() == 0){
-
//还没有订阅的人
-
}
阅读(1677) | 评论(0) | 转发(0) |