00001
00002
00025 #include "RosLoService.h"
00026
00027 #include "lo/ServiceLocatedObject.h"
00028
00029 #include <tf/transform_listener.h>
00030 #include <string>
00031 #include <boost/bind.hpp>
00032 #include <boost/thread.hpp>
00033
00034 #define IDQUERY "idquery"
00035 #define NAMEQUERY "namequery"
00036 #define FRAMEQUERY "framequery"
00037 #define DELETE "del"
00038 #define UPDATE "update"
00039 #define COUTLO "coutlo"
00040 #ifdef _DEBUG
00041 #define PRINTF_DEBUG(A) printf(A)
00042 #else
00043 #define PRINTF_DEBUG(A) printf(A)
00044 #endif
00045
00046 std::queue<unsigned long> RosLoService::m_queueOfLosToPublish;
00047
00048 RosLoService::RosLoService(const char* nodename, ros::NodeHandle &n, std::string configFile)
00049 : jlo::ServiceInterface(configFile.c_str()),
00050 located_object_service( n.advertiseService("/located_object", &RosLoService::ServiceCallback, this) )
00051
00052 {
00053 using namespace std;
00054
00058 printf("Advertise Service \"/located_object\"\n");
00059
00063 if( n.hasParam( "tf_blacklist" ) )
00064 {
00065 using namespace XmlRpc;
00066
00067 XmlRpcValue blacklist_param_value;
00068 n.getParam( "tf_blacklist", blacklist_param_value );
00069 if( blacklist_param_value.getType() != XmlRpcValue::TypeArray )
00070 ROS_WARN("tf_blacklist has invalid type.");
00071 else
00072 {
00073 for(int i=0; i<blacklist_param_value.size(); i++)
00074 {
00075 if( blacklist_param_value[i].getType() != XmlRpcValue::TypeString )
00076 {
00077 ROS_WARN("Ignoring blacklist entry. Not a string");
00078 continue;
00079 }
00080 string blacklist_entry = blacklist_param_value[i];
00081 tf_blacklist.insert( blacklist_entry );
00082 ROS_INFO("Adding '%s' to tf blacklist", blacklist_entry.c_str());
00083 }
00084 }
00085 }
00086
00087 string tf_topic;
00088 n.param<string>( "tf_topic", tf_topic, "/tf" );
00089 printf("Subscribe \"%s\"\n", tf_topic.c_str());
00090 tf_subscription = n.subscribe<tf::tfMessage>( tf_topic, 5, boost::bind(&RosLoService::tf_subscription_callback, this, _1) );
00091
00092 }
00093
00094 RosLoService::~RosLoService()
00095 {
00096 SaveList()->WriteToFile("bla.ini");
00097 printf("Wrote data to bla.ini\n");
00098 }
00099
00100 bool PutLoIntoPartialLo( jlo::ServiceLocatedObject* lo, vision_msgs::partial_lo& out_lo, bool incRef = true)
00101 {
00102 try
00103 {
00104 out_lo.id = lo->m_uniqueID;
00105 out_lo.parent_id = lo->m_parentID;
00106 int width = 4;
00107 Matrix m = lo->GetMatrix();
00108 Matrix cov = lo->GetCovarianceMatrix();
00109 if(incRef)
00110 lo->IncreaseReferenceCounter();
00111 for(int r = 0; r < width; r++)
00112 {
00113 for(int c = 0; c < width; c++)
00114 {
00115 out_lo.pose[r * width + c] = m.element(r,c);
00116 }
00117 }
00118 width = 6;
00119 for(int r = 0; r < width; r++)
00120 {
00121 for(int c = 0; c < width; c++)
00122 {
00123 out_lo.cov[r * width + c] = cov.element(r,c);
00124 }
00125 }
00126 out_lo.type = lo->GetLOType();
00127 out_lo.name = lo->m_mapstring;
00128 }
00129 catch(...)
00130 {
00131 printf("Critical Error in PutLoIntoResponse \n");
00132 return false;
00133 }
00134 return true;
00135 }
00136
00137 bool PutLoIntoResponse( jlo::ServiceLocatedObject* lo, vision_srvs::srvjlo::Response& answer)
00138 {
00139 vision_msgs::partial_lo& out_lo = answer.answer;
00140 return PutLoIntoPartialLo(lo, out_lo);
00141 }
00142
00143 std::map<std::string, int> s_tester;
00144 std::map<std::string, int> s_tester_max;
00145
00146 void IncreaseTester(std::string callerid)
00147 {
00148 s_tester[callerid] += 1;
00149 if(s_tester[callerid] >= 100)
00150 {
00151 s_tester_max[callerid] += s_tester[callerid];
00152 s_tester[callerid] = 0;
00153 ROS_WARN("Warning: the jlo caller %s registered %d jlos without deleting", callerid.c_str(), s_tester_max[callerid] );
00154 }
00155 }
00156
00157 void DecreaseTester(std::string callerid)
00158 {
00159 s_tester[callerid] -= 1;
00160 }
00161
00162
00163 bool RosLoService::ServiceCallback(vision_srvs::srvjlo::Request& request, vision_srvs::srvjlo::Response& answer)
00164 {
00165 std::string callerid = (*request.__connection_header)["callerid"];
00166 try
00167 {
00168 if(request.command.compare(IDQUERY) == 0)
00169 {
00170
00171 jlo::ServiceLocatedObject* lo = GetServiceLocatedObject(request.query.id);
00172
00173 if (lo == NULL)
00174 {
00175 ROS_WARN("Error in IDquery: Id %ld does not exist! (Caller: %s)\n", request.query.id, callerid.c_str());
00176 answer.error = "Error in IDquery: Id does not exist!\n";
00177 return true;
00178 }
00179 IncreaseTester(callerid);
00180 PutLoIntoResponse(lo, answer);
00181 }
00182 else if(request.command.compare(NAMEQUERY) == 0)
00183 {
00184 long id = GetServiceLocatedObjectID(request.query.name);
00185 if(id >= ID_WORLD)
00186 {
00187 jlo::ServiceLocatedObject* lo = GetServiceLocatedObject(id);
00188 if (lo == NULL)
00189 {
00190 ROS_WARN("Error in NameQuery: Id %s does not exist!(Caller: %s)\n", request.query.name.c_str(), callerid.c_str());
00191 answer.error = "Error in NameQuery: Id does not exist!\n";
00192 return true;
00193 }
00194 PutLoIntoResponse(lo, answer);
00195 }
00196 else
00197 {
00198 ROS_WARN("Error in NameQuery: Name %s does not exist!(Caller: %s)\n", request.query.name.c_str(), callerid.c_str());
00199 answer.error = std::string("Error in NameQuery: Name does not exist: ").append(request.query.name);
00200 answer.answer.id = 0;
00201 return true;
00202 }
00203 }
00204 else if (request.command.compare(FRAMEQUERY) == 0)
00205 {
00206 try
00207 {
00208 unsigned long parentID = request.query.parent_id;
00209 jlo::ServiceLocatedObject* lo = GetServiceLocatedObject(request.query.id);
00210 if(lo != NULL && request.query.id == parentID)
00211 {
00212 answer.error = "Warning Parsing Input: Self reference ignored!\n";
00213 IncreaseTester(callerid);
00214 PutLoIntoResponse(lo, answer);
00215 }
00216 else
00217 {
00218 if (lo == NULL)
00219 {
00220 ROS_WARN("Error in Framequery: Id %ld does not exist! (Caller %s)\n", request.query.id, callerid.c_str());
00221 answer.error = "Error in Framequery: Id does not exist!\n";
00222 return true;
00223 }
00224 if(lo->m_uniqueID != ID_WORLD && lo->m_relation->m_uniqueID == (unsigned long)parentID)
00225 {
00226 IncreaseTester(callerid);
00227 PutLoIntoResponse(lo, answer);
00228 }
00229 else
00230 {
00231 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(parentID);
00232 if (parent == NULL)
00233 {
00234 ROS_WARN("Error in Framequery: Parent Id %ld does not exist! (Caller: %s)\n", parentID, callerid.c_str());
00235 answer.error = "Error in Framequery: Parent Id does not exist!\n";
00236 return true;
00237 }
00238 Matrix mat = lo->GetMatrix(*parent);
00239 Matrix cov = lo->GetCovarianceMatrix(*parent);
00240 IncreaseTester(callerid);
00241 PutLoIntoResponse(FServiceLocatedObject(parent, mat, cov, 0), answer);
00242 }
00243 }
00244 }
00245 catch(...)
00246 {
00247 printf("Critical error in FrameQuery\n");
00248 return true;
00249 }
00250 }
00251 else if(request.command.compare(DELETE) == 0)
00252 {
00253 unsigned long id = request.query.id;
00254 if(id != ID_WORLD)
00255 {
00256 jlo::ServiceLocatedObject* obj = GetServiceLocatedObject(id);
00257 if(obj == NULL)
00258 {
00259 ROS_WARN("Error in delete: Object %ld does not exist! (Caller: %s)\n", id, callerid.c_str());
00260 answer.error = "Error in delete: Object does not exist!\n";
00261 return true;
00262 }
00263 else
00264 {
00265 DecreaseTester(callerid);
00266 unsigned long ref_count = obj->GetReferenceCounter();
00267
00268 FreeServiceLocatedObject(obj);
00269 if(ref_count > 1)
00270 {
00271 answer.error = "Warning in delete: Object is still referenced.";
00272 }
00273 }
00274 }
00275 else
00276 {
00277 PRINTF_DEBUG("Error in delete: Can't delete ID_WORLD!\n");
00278 answer.error = "Error in delete: Can't delete ID_WORLD!\n";
00279 return true;
00280 }
00281 }
00282
00283
00284 else if(request.command.compare(UPDATE) == 0)
00285 {
00286 unsigned long parentID, id;
00287 bool update = false;
00288 unsigned long type = request.query.type;
00289 id = request.query.id;
00290 parentID = request.query.parent_id;
00291 if(id != 0)
00292 {
00293 update = true;
00294 }
00295 Matrix mat(4,4), cov(6,6);
00296
00297 int width = 4;
00298 for(int r = 0; r < width; r++)
00299 {
00300 for(int c = 0; c < width; c++)
00301 {
00302 if((unsigned)(r * width + c) < request.query.pose.size())
00303 mat.element(r,c) = request.query.pose[r * width + c];
00304 else
00305 printf("Wrong length of pose\n");
00306
00307 }
00308 }
00309 width = 6;
00310 for(int r = 0; r < width; r++)
00311 {
00312 for(int c = 0; c < width; c++)
00313 {
00314 if((unsigned)(r * width + c) < request.query.cov.size())
00315 cov.element(r,c) = request.query.cov[r * width + c];
00316 else
00317 printf("Wrong length of cov\n");
00318 }
00319 }
00320 if(update)
00321 {
00322 jlo::ServiceLocatedObject* pose = GetServiceLocatedObject(id);
00323 if(pose == NULL)
00324 {
00325 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(parentID);
00326 if(parent == NULL)
00327 {
00328 PRINTF_DEBUG("Error in Update: Requested parent does not exist!\n");
00329 answer.error = "Error in Update: Requested parent does not exist!\n";
00330 return true;
00331 }
00332 jlo::ServiceLocatedObject* pose = FServiceLocatedObject(parent, mat, cov, type);
00333 IncreaseTester(callerid);
00334 if(request.query.name.length() > 0 && GetServiceLocatedObjectID(request.query.name) < ID_WORLD)
00335 {
00336 ServiceInterface::AddMapString(pose, request.query.name);
00337 }
00338 PutLoIntoResponse(pose, answer);
00339 }
00340 else
00341 {
00342 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(parentID);
00343 if(parent == NULL || (parent->m_uniqueID == ID_WORLD && pose->m_uniqueID == ID_WORLD))
00344 {
00345 ROS_WARN("Error in Update: Requested parent %ld does not exist!\n", parentID);
00346 answer.error = "Error in Update: Requested parent does not exist!\n";
00347 return true;
00348 }
00349 if((parent->m_uniqueID == ID_WORLD && pose->m_uniqueID == ID_WORLD))
00350 {
00351 answer.error = "Error in Update: Asked for world in world\n";
00352 return true;
00353 }
00354 if(parent->m_uniqueID != pose->m_parentID)
00355 {
00356 ROS_WARN("Updated parent, dangerous in terms of circles (Old parent: %ld New Parent %ld)", pose->m_parentID, parent->m_uniqueID);
00357 pose->UpdateParent(parent);
00358 }
00359 pose->Update(mat, cov, ServiceInterface::FServiceLocatedObjectCopy, ServiceInterface::FreeServiceLocatedObject, &RosLoService::UpdateEventNotifier);
00360 if(request.query.name.length() > 0 && GetServiceLocatedObjectID(request.query.name) < ID_WORLD)
00361 {
00362 if(pose->m_mapstring.compare(request.query.name) != 0)
00363 {
00364 ServiceInterface::RemoveMapString(pose->m_mapstring);
00365 }
00366 ServiceInterface::AddMapString(pose, request.query.name);
00367 }
00368 IncreaseTester(callerid);
00369 PutLoIntoResponse(pose, answer);
00370 }
00371 }
00372 else
00373 {
00374 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(parentID);
00375 if(parent == NULL)
00376 {
00377 ROS_WARN("Error in Update: Requested parent %ld does not exist!\n", parentID);
00378 answer.error = "Error in Update: Requested parent does not exist!\n";
00379 return true;
00380 }
00381 jlo::ServiceLocatedObject* pose = FServiceLocatedObject(parent, mat, cov, type);
00382 if(request.query.name.length() > 0 && GetServiceLocatedObjectID(request.query.name) < ID_WORLD)
00383 {
00384 ServiceInterface::AddMapString(pose, request.query.name);
00385 }
00386 IncreaseTester(callerid);
00387 PutLoIntoResponse(pose, answer);
00388 }
00389 }
00390 else if (request.command.compare(COUTLO) == 0)
00391 {
00392
00393 jlo::ServiceLocatedObject* lo = GetServiceLocatedObject(request.query.id);
00394
00395 if (lo == NULL)
00396 {
00397 ROS_WARN("Error Parsing Input: Id %ld does not exist!\n", request.query.id);
00398 answer.error = "Error Parsing Input: Id does not exist!\n";
00399 return true;
00400 }
00401 IncreaseTester(callerid);
00402 PutLoIntoResponse(lo, answer);
00403 std::string st = lo->SaveComplete()->WriteToString();
00404 cout << st << endl;
00405 }
00406 else
00407 {
00408 printf("Command %s not accepted\n", request.command.c_str());
00409 PRINTF_DEBUG("Error: Requested command does not exist!\n");
00410 answer.error = "Erro: Requested command does not exist!\n";
00411 return true;
00412 }
00413 return true;
00414 }
00415 catch(...)
00416 {
00417 printf("An exception occured during parsing the message!\n");
00418 answer.error = "Error in jlo: Exception happened during execution!\n";
00419 return true;
00420 }
00421 }
00422
00423 boost::condition_variable cond;boost::mutex mut;
00424
00425 bool RosLoService::PublishUpdate(unsigned long id, PubParentFilterStruct& obj_to_pub)
00426 {
00427 jlo::ServiceLocatedObject* lo = GetServiceLocatedObject(id);
00428 if(obj_to_pub.parent_id != 0)
00429 {
00430 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(obj_to_pub.parent_id);
00431 if (parent != NULL)
00432 {
00433 Matrix mat = lo->GetMatrix(*parent);
00434 Matrix cov = lo->GetCovarianceMatrix(*parent);
00435 lo = FServiceLocatedObject(parent, mat, cov, 0);
00436 }
00437 else
00438 {
00439 PRINTF_DEBUG("Error in Framequery: Parent Id does not exist!\n");
00440 lo = NULL;
00441 }
00442 }
00443 if(lo == NULL)
00444 {
00445 return false;
00446 }
00447 else
00448 {
00450 if(obj_to_pub.last_value_set)
00451 {
00452 Matrix pos = lo->GetMatrix(lo->m_relation->m_uniqueID);
00453 ColumnVector rot = irpy(pos);
00454 ColumnVector xyz(3);
00455 xyz << pos.element(0,3)<< pos.element(1,3) << pos.element(2,3);
00456 if(fabs(obj_to_pub.last_val[0] - rot.element(0)) < obj_to_pub.filter[0] &&
00457 fabs(obj_to_pub.last_val[1] - rot.element(1)) < obj_to_pub.filter[1] &&
00458 fabs(obj_to_pub.last_val[2] - rot.element(2)) < obj_to_pub.filter[2] &&
00459 fabs(obj_to_pub.last_val[3] - xyz.element(0)) < obj_to_pub.filter[3] &&
00460 fabs(obj_to_pub.last_val[4] - xyz.element(1)) < obj_to_pub.filter[4] &&
00461 fabs(obj_to_pub.last_val[5] - xyz.element(2)) < obj_to_pub.filter[5])
00462 {
00463 return true;
00464 }
00465 else
00466 {
00467 obj_to_pub.last_val[0] = rot.element(0);
00468 obj_to_pub.last_val[1] = rot.element(1);
00469 obj_to_pub.last_val[2] = rot.element(2);
00470 obj_to_pub.last_val[3] = xyz.element(0);
00471 obj_to_pub.last_val[4] = xyz.element(1);
00472 obj_to_pub.last_val[5] = xyz.element(2);
00473 }
00474 }
00475 else
00476 {
00477 Matrix pos = lo->GetMatrix(lo->m_relation->m_uniqueID);
00478 ColumnVector rot = irpy(pos);
00479 ColumnVector xyz(3);
00480 obj_to_pub.last_val.push_back(rot.element(0));
00481 obj_to_pub.last_val.push_back(rot.element(1));
00482 obj_to_pub.last_val.push_back(rot.element(2));
00483 obj_to_pub.last_val.push_back(xyz.element(0));
00484 obj_to_pub.last_val.push_back(xyz.element(1));
00485 obj_to_pub.last_val.push_back(xyz.element(2));
00486 obj_to_pub.last_value_set = true;
00487 }
00488 }
00489 vision_msgs::partial_lo answer;
00490 PutLoIntoPartialLo(lo, answer, false);
00491
00492 for(std::vector<ros::Publisher*>::iterator it = obj_to_pub.publisher.begin();
00493 it != obj_to_pub.publisher.end(); it++)
00494 {
00495 (*it)->publish(answer);
00496 }
00497 return true;
00498 }
00499
00500 void RosLoService::UpdateEventHandler()
00501 {
00502 while(true)
00503 {
00504 boost::unique_lock<boost::mutex> lock(mut);
00505 while(m_queueOfLosToPublish.size() > 0 )
00506 {
00507 unsigned long id = m_queueOfLosToPublish.front();
00508 m_queueOfLosToPublish.pop();
00509 std::map<unsigned long, PubParentFilterStruct>::iterator iter =
00510 m_jlotopicMap.find(id);
00511 if(iter != m_jlotopicMap.end())
00512 {
00513 PubParentFilterStruct& obj_to_pub = (*iter).second;
00514 if(!PublishUpdate(id, obj_to_pub))
00515 m_jlotopicMap.erase(iter);
00516 }
00518 std::map<unsigned long, unsigned long>::iterator iter_parent = m_parentToRegisteredJlo.find(id);
00519 if(iter_parent != m_parentToRegisteredJlo.end())
00520 {
00521 std::map<unsigned long, PubParentFilterStruct>::iterator iter_child =
00522 m_jlotopicMap.find(m_parentToRegisteredJlo[id]);
00523 if(iter_child != m_jlotopicMap.end())
00524 {
00525 PubParentFilterStruct& obj_to_pub = (*iter_child).second;
00526 if(!PublishUpdate(id, obj_to_pub))
00527 m_jlotopicMap.erase(iter_child);
00528
00529 }
00530 else
00531 {
00532 m_parentToRegisteredJlo.erase(iter_parent);
00533 }
00534 }
00535 }
00536 cond.wait(lock);
00537 }
00538 }
00539
00540 void RosLoService::UpdateEventNotifier(unsigned long id)
00541 {
00542 boost::lock_guard<boost::mutex> lock(mut);
00543 m_queueOfLosToPublish.push(id);
00544 cond.notify_one();
00545 }
00546
00547
00548 bool RosLoService::CallbackRegisterService(vision_srvs::register_jlo_callback::Request& request, vision_srvs::register_jlo_callback::Response& answer)
00549 {
00550 jlo::ServiceLocatedObject* obj = GetServiceLocatedObject(request.jlo_id);
00551 if(obj != NULL)
00552 {
00553 ros::NodeHandle nh;
00554 std::vector<double> filter(request.filter_delta_cov.size());
00555 for(size_t i = 0; i < request.filter_delta_cov.size(); i++)
00556 filter[i] = request.filter_delta_cov[i];
00557 if(m_jlotopicMap.find(request.jlo_id) == m_jlotopicMap.end())
00558 {
00559 m_jlotopicMap[request.jlo_id] = RosLoService::PubParentFilterStruct::PubParentFilterStruct(std::vector<ros::Publisher*>(), request.parent_id, filter);
00560 m_parentToRegisteredJlo[request.parent_id] = request.jlo_id;
00561 }
00562 else
00563 {
00564 if(request.parent_id != m_jlotopicMap[request.jlo_id].parent_id)
00565 answer.error = "Error: Object will be puplished with wrong parent";
00566 else
00567 answer.error = "Error: Object will be most probbably filtered incorrect";
00568 }
00569 std::map<std::string, ros::Publisher>::iterator it = m_topicPublisherMap.find(request.topic_name);
00570 if(it == m_topicPublisherMap.end())
00571 {
00572 m_topicPublisherMap[request.topic_name] = (nh.advertise<vision_msgs::partial_lo>(request.topic_name, 20));
00573 }
00574 m_jlotopicMap[request.jlo_id].publisher.push_back(&m_topicPublisherMap[request.topic_name]);
00575 }
00576 else
00577 answer.error = "Error: Object does not exist";
00578 return true;
00579 }
00580
00581
00582 void RosLoService::tf_subscription_callback(const tf::tfMessage::ConstPtr &msg_in_)
00583 {
00584 for (unsigned int i = 0; i < msg_in_->transforms.size(); i++)
00585 {
00586 tf::StampedTransform trans;
00587
00588 transformStampedMsgToTF(msg_in_->transforms[i], trans);
00589 if( tf_blacklist.find( trans.child_frame_id_ ) != tf_blacklist.end() )
00590 continue;
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601 try
00602 {
00603 std::map<std::string, std::string>* msg_header_map = msg_in_->__connection_header.get();
00604 std::string authority;
00605 std::map<std::string, std::string>::iterator it = msg_header_map->find("callerid");
00606 if (it == msg_header_map->end())
00607 {
00608 ROS_WARN("Message recieved without callerid");
00609 authority = "no callerid";
00610 }
00611 else
00612 {
00613 authority = it->second;
00614 }
00615
00616 }
00617 catch(...)
00618 {
00619 ROS_ERROR("Failure to set recieved transform\n");
00620 }
00621 if(trans.frame_id_.length() == 0)
00622 {
00623 printf("Empty tf\n");
00624 continue;
00625 }
00626 else
00627 {
00628
00629 }
00630
00631
00632
00633
00634 unsigned long id = (long)GetServiceLocatedObjectID(trans.child_frame_id_);
00635 unsigned long parentid = (long)GetServiceLocatedObjectID(trans.frame_id_);
00636 if(parentid < ID_WORLD && trans.frame_id_.compare("/map") != 0)
00637 {
00638 printf("Error reading tf: Requested parent does not exist! (%s in %s)\n", trans.child_frame_id_.c_str(), trans.frame_id_.c_str());
00639 continue;
00640
00641
00642 }
00643 if(parentid < ID_WORLD)
00644 {
00645 parentid = ID_WORLD;
00646 printf("Setting name of world to %s\n", trans.frame_id_.c_str());
00647 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(parentid);
00648 ServiceInterface::AddMapString(parent, trans.frame_id_);
00649 }
00650 jlo::ServiceLocatedObject* pose = NULL;
00651
00652 btScalar matrix[16];
00653 trans.getOpenGLMatrix(matrix);
00654
00655 Matrix mat(4,4);
00656 mat << matrix[0] << matrix[4]<< matrix[8]<< matrix[12]
00657 << matrix[1]<< matrix[5]<< matrix[9]<< matrix[13]
00658 << matrix[2]<< matrix[6]<< matrix[10]<< matrix[14]
00659 << matrix[3]<< matrix[7]<< matrix[11]<< matrix[15];
00660
00661 Matrix cov(6,6);
00662
00663 cov << 0 << 0 << 0 << 0 << 0 << 0
00664 << 0 << 0 << 0 << 0 << 0 << 0
00665 << 0 << 0 << 0 << 0 << 0 << 0
00666 << 0 << 0 << 0 << 0 << 0 << 0
00667 << 0 << 0 << 0 << 0 << 0 << 0
00668 << 0 << 0 << 0 << 0 << 0 << 0;
00669
00670 int type = LO_TYPE_PHYSICAL;
00671
00672 if(id < ID_WORLD)
00673 {
00674 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(parentid);
00675 if(parent == NULL)
00676 {
00677 printf("Error tf: Requested parent does not exist! (%s -> %ld)\n", trans.child_frame_id_.c_str(), parentid);
00678 continue;
00679 }
00680 pose = FServiceLocatedObject(parent, mat, cov, type);
00681 ServiceInterface::AddMapString(pose, trans.child_frame_id_);
00682 }
00683 else
00684 {
00685 pose = GetServiceLocatedObject(id);
00686 if (pose == NULL)
00687 {
00688 ROS_ERROR("Error tf: Reject overwritten frame %s -> %ld\n", trans.child_frame_id_.c_str(), id);
00689 continue;
00690 }
00691
00692 if(parentid == pose->m_parentID)
00693 {
00694 Matrix m = pose->GetMatrix();
00695 Matrix diff = mat - m;
00696 if((fabs(diff.element(0,0)) < 0.000001 &&
00697 fabs(diff.element(0,1)) < 0.000001 &&
00698 fabs(diff.element(0,2)) < 0.000001 &&
00699 fabs(diff.element(0,3)) < 0.000001 &&
00700 fabs(diff.element(1,0)) < 0.000001 &&
00701 fabs(diff.element(1,1)) < 0.000001 &&
00702 fabs(diff.element(1,2)) < 0.000001 &&
00703 fabs(diff.element(1,3)) < 0.000001 &&
00704 fabs(diff.element(2,0)) < 0.000001 &&
00705 fabs(diff.element(2,1)) < 0.000001 &&
00706 fabs(diff.element(2,2)) < 0.000001 &&
00707 fabs(diff.element(2,3)) < 0.000001) || pose->m_uniqueID == ID_WORLD)
00708 {
00709 continue;
00710 }
00711 pose->Update(mat, cov, ServiceInterface::FServiceLocatedObjectCopy, ServiceInterface::FreeServiceLocatedObject, &RosLoService::UpdateEventNotifier);
00712
00713
00714
00715 }
00716 else
00717 {
00718 printf("tf from %s with parent %s does not correspond with the actual situation %ld with parentID %ld\n", trans.child_frame_id_.c_str(), trans.frame_id_.c_str(), pose->m_uniqueID, pose->m_parentID);
00719 pose->m_mapstring = "";
00720 jlo::ServiceLocatedObject* parent = GetServiceLocatedObject(parentid);
00721 if(parent == NULL || parent->m_uniqueID != parentid)
00722 {
00723 printf("Error tf: Requested parent does not exist! (%s -> %ld)\n", trans.frame_id_.c_str(), parentid);
00724 continue;
00725 }
00726 pose = FServiceLocatedObject(parent, mat, cov, type);
00727 ServiceInterface::AddMapString(pose, trans.child_frame_id_);
00728 pose->IncreaseReferenceCounter();
00729 }
00730 }
00731
00732
00733
00735
00736
00737
00738
00739 }
00740
00741
00742
00743 };
00744
00745