1 #include <ros/advertise_service_options.h>
2 #include <ros/callback_queue.h>
4 #include <ros/node_handle.h>
6 #include <ros/service.h>
15 #include <ed_msgs/SimpleQuery.h>
22 #include <ed_msgs/Query.h>
26 #include <ed_msgs/UpdateSrv.h>
31 #include <ed_msgs/Reset.h>
34 #include <ed_msgs/Configure.h>
41 #include <ed_msgs/LoadPlugin.h>
51 #include <boost/thread.hpp>
63 bool srvReset(ed_msgs::Reset::Request& req, ed_msgs::Reset::Response& )
71 bool srvUpdate(ed_msgs::UpdateSrv::Request& req, ed_msgs::UpdateSrv::Response& res)
77 res.response = r.
error();
90 res.response +=
"Entities should have field 'id'.\n";
97 if (action ==
"remove")
100 res.response +=
"Unknown action '" + action +
"'.\n";
124 else if(r.
readValue(
"remove", remove) && remove ==
"true")
130 res.response +=
"For entity '" +
id +
"': invalid pose (position).\n";
146 res.response +=
"For entity '" +
id +
"': flag list should only contain 'add' or 'remove'.\n";
174 res.response +=
"For entity '" +
id +
"': unknown property '" + prop_name +
"'.\n";
180 res.response +=
"For entity '" +
id +
"': property '" + prop_name +
"' is not serializable.\n";
188 res.response +=
"For entity '" +
id +
"': deserialization of property '" + prop_name +
"' failed.\n";
200 if (!update_req.
empty())
207 res.response += r.
error();
215 bool srvQuery(ed_msgs::Query::Request& req, ed_msgs::Query::Response& res)
244 if (req.since_revision >= entity_revs[i])
251 if (!ids.
empty() && ids.
find(e->id().str()) == ids.
end())
263 w.
writeValue(
"existence_prob", e->existenceProbability());
296 if (!e->data().empty())
300 emitter.
emit(e->data(), out);
314 if (req.properties.empty())
333 if (it_prop != properties.
end())
354 removed_entities.
push_back(e->id().str());
360 if (!removed_entities.
empty())
361 w.
writeValue(
"removed_entities", &removed_entities[0], removed_entities.
size());
365 res.human_readable = out.
str();
373 bool srvSimpleQuery(ed_msgs::SimpleQuery::Request& req, ed_msgs::SimpleQuery::Response& res)
375 double radius = req.radius;
384 if (!req.id.empty() && e->id() !=
ed::UUID(req.id))
390 if (!req.type.empty())
392 if (req.type ==
"unknown")
399 if (!e->hasType(req.type))
406 bool geom_ok =
false;
409 center_point.
z = e->pose().t.z;
414 geo::Vector3 center_point_e = e->pose().getBasis().transpose() * (center_point - e->pose().getOrigin());
416 geom_ok = visual->intersect(center_point_e, radius);
418 geom_ok = visual->contains(center_point_e);
422 geom_ok = radius > 0 && radius * radius > (e->pose().t - center_point).length2();
429 res.entities.push_back(ed_msgs::EntityInfo());
430 convert(*e, res.entities.back());
439 bool srvConfigure(ed_msgs::Configure::Request& req, ed_msgs::Configure::Response& res)
464 const char * val = ::getenv(var.
c_str());
465 if ( val ==
nullptr )
477 signal(SIGSEGV, SIG_DFL);
478 signal(SIGABRT, SIG_DFL);
489 else if (sig == SIGABRT)
501 size_t name_size = 1000;
502 if (pthread_getname_np(pthread_self(), name, name_size) == 0)
509 std::cerr <<
"name unknown (id = " << boost::this_thread::get_id() <<
")";
515 std::cerr <<
"name unknown (id = " << boost::this_thread::get_id() <<
")";
529 for(
unsigned int i = edata->
stack.
size(); i > 0; --i)
531 const char* message = edata->
stack[i-1].first;
532 const char* value = edata->
stack[i-1].second;
558 size = backtrace(array, 20);
561 backtrace_symbols_fd(array, size, STDERR_FILENO);
568 int main(
int argc,
char** argv)
570 ros::init(argc, argv,
"ed");
573 pthread_setname_np(pthread_self(),
"ed_main");
590 errc.
change(
"Start ED server",
"configure");
612 errc.
change(
"Start ED server",
"service init");
615 ros::NodeHandle nh_private(
"~");
617 ros::CallbackQueue cb_queue;
619 ros::AdvertiseServiceOptions opt_simple_query =
620 ros::AdvertiseServiceOptions::create<ed_msgs::SimpleQuery>(
622 ros::ServiceServer srv_simple_query = nh_private.advertiseService(opt_simple_query);
624 ros::AdvertiseServiceOptions opt_reset =
625 ros::AdvertiseServiceOptions::create<ed_msgs::Reset>(
626 "reset",
srvReset, ros::VoidPtr(), &cb_queue);
627 ros::ServiceServer srv_reset = nh_private.advertiseService(opt_reset);
629 ros::NodeHandle nh_private2(
"~");
630 nh_private2.setCallbackQueue(&cb_queue);
632 ros::ServiceServer srv_query = nh_private2.advertiseService(
"query",
srvQuery);
633 ros::ServiceServer srv_update = nh_private2.advertiseService(
"update",
srvUpdate);
634 ros::ServiceServer srv_configure = nh_private2.advertiseService(
"configure",
srvConfigure);
638 errc.
change(
"Start ED server",
"init");
651 errc.
change(
"ED server",
"main loop");
657 cb_queue.callAvailable();