14 using namespace mrpt::system;
16 using namespace fkie_multimaster_msgs;
19 const fkie_multimaster_msgs::ROSMaster& master1,
20 const fkie_multimaster_msgs::ROSMaster& master2)
22 return master1.uri == master2.uri;
25 const fkie_multimaster_msgs::ROSMaster& master1,
26 const fkie_multimaster_msgs::ROSMaster& master2)
28 return !(master1 == master2);
32 const mrpt_msgs::GraphSlamAgent& agent1,
33 const mrpt_msgs::GraphSlamAgent& agent2)
36 agent1.agent_id == agent2.agent_id &&
37 agent1.topic_namespace.data == agent2.topic_namespace.data);
42 const mrpt_msgs::GraphSlamAgent& agent1,
43 const mrpt_msgs::GraphSlamAgent& agent2)
45 return !(agent1 == agent2);
49 const mrpt_msgs::GraphSlamAgent& agent1,
50 const mrpt_msgs::GraphSlamAgent& agent2)
52 return agent1.agent_id < agent2.agent_id;
57 const fkie_multimaster_msgs::ROSMaster& master,
58 const mrpt_msgs::GraphSlamAgent& agent)
60 return (master.name == agent.name.data);
64 const fkie_multimaster_msgs::ROSMaster& master,
65 const mrpt_msgs::GraphSlamAgent& agent)
67 return !(master == agent);
71 const mrpt_msgs::GraphSlamAgent& agent,
72 const fkie_multimaster_msgs::ROSMaster& master)
74 return (master == agent);
77 const mrpt_msgs::GraphSlamAgent& agent,
78 const fkie_multimaster_msgs::ROSMaster& master)
80 return (master != agent);
87 : m_logger(
logger), m_nh(nh_in), has_setup_comm(false)
96 own_ns_tmp.begin() + own_ns_tmp.find_first_not_of(
" /"),
109 mrpt_msgs::GraphSlamAgents* agents_vec,
bool ignore_self )
111 ASSERTMSG_(agents_vec,
"Invalid pointer to vector of GraphSlam Agents.");
120 auto search = [
this](
const mrpt_msgs::GraphSlamAgent& agent) {
121 return (agent.topic_namespace.data == this->own_ns);
124 find_if(agents_vec->list.begin(), agents_vec->list.end(),
search);
132 if (it != agents_vec->list.end())
134 agents_vec->list.erase(it);
142 const mrpt_msgs::GraphSlamAgents&
164 std::vector<ROSMaster>* masters = &(srv.response.masters);
167 for (std::vector<ROSMaster>::const_iterator masters_it = masters->begin();
168 masters_it != masters->end(); ++masters_it)
178 auto search = [masters_it](
const mrpt_msgs::GraphSlamAgent& agent) {
179 return agent == *masters_it;
188 it->last_seen_time.data =
ros::Time((*masters_it).last_change);
192 mrpt_msgs::GraphSlamAgent new_agent;
193 bool is_agent = this->
convert(*masters_it, &new_agent);
221 "/master_discovery/list_masters");
227 const fkie_multimaster_msgs::ROSMaster& ros_master,
228 mrpt_msgs::GraphSlamAgent* slam_agent)
231 bool agent_namespace_found =
false;
233 slam_agent->name.data = ros_master.name;
234 slam_agent->is_online.data =
static_cast<bool>(ros_master.online);
237 std::string ip_addr =
239 slam_agent->ip_addr.data = ip_addr;
241 ros_master.uri, &slam_agent->port);
242 slam_agent->hostname.data = hostname;
245 vector<string> tokens;
246 mrpt::system::tokenize(ip_addr,
".", tokens);
247 slam_agent->agent_id = atoi(tokens.rbegin()->c_str());
254 slam_agent->topic_namespace.data = slam_agent->name.data;
260 ASSERTMSG_(got_topics,
"Unable to fetch topics. Exiting.");
263 const std::string& topic_ns =
"/" + slam_agent->topic_namespace.data;
265 const std::string& feedback_ns =
266 "/" + slam_agent->topic_namespace.data +
"/" +
"feedback";
269 return (strStarts(topic.name, feedback_ns));
271 ros::master::V_TopicInfo::const_iterator cit =
272 find_if(topics.begin(), topics.end(),
search);
273 if (cit != topics.end())
275 agent_namespace_found =
true;
280 slam_agent->last_seen_time.data =
ros::Time(ros_master.last_change);
281 return agent_namespace_found;
286 const mrpt_msgs::GraphSlamAgent& slam_agent,
287 fkie_multimaster_msgs::ROSMaster* ros_master)
291 ros_master->name = slam_agent.name.data;
294 ss <<
"http://" << slam_agent.ip_addr <<
":" << slam_agent.port;
295 ros_master->uri = ss.str();
297 ros_master->online = slam_agent.is_online.data;
298 ros_master->discoverer_name =
"/master_discovery";
304 const std::string& str,
unsigned short* agent_port )
307 std::string
s = std::string(str.begin() + 7, str.end());
309 vector<string> tokens;
310 mrpt::system::tokenize(
s,
":", tokens);
314 *agent_port =
static_cast<unsigned short>(atoi(tokens[1].c_str()));