$search
00001 /****************************************************************************** 00002 * \file 00003 * 00004 * $Id:$ 00005 * 00006 * Copyright (C) Brno University of Technology 00007 * 00008 * This file is part of software developed by dcgm-robotics@FIT group. 00009 * 00010 * Author: Jan Gorig (xgorig01@stud.fit.vutbr.cz) 00011 * Supervised by: Michal Spanel (spanel@fit.vutbr.cz) 00012 * Date: dd/mm/2012 00013 * 00014 * This file is free software: you can redistribute it and/or modify 00015 * it under the terms of the GNU Lesser General Public License as published by 00016 * the Free Software Foundation, either version 3 of the License, or 00017 * (at your option) any later version. 00018 * 00019 * This file is distributed in the hope that it will be useful, 00020 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00021 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00022 * GNU Lesser General Public License for more details. 00023 * 00024 * You should have received a copy of the GNU Lesser General Public License 00025 * along with this file. If not, see <http://www.gnu.org/licenses/>. 00026 */ 00027 00028 #include <Eigen/Geometry> 00029 00030 #include <srs_env_model/services_list.h> 00031 #include <srs_env_model/topics_list.h> 00032 #include <srs_env_model/but_server/plugins/objtree_plugin.h> 00033 #include <srs_env_model/but_server/objtree/plane.h> 00034 #include <srs_env_model/but_server/objtree/gbbox.h> 00035 #include <srs_env_model/but_server/objtree/bbox.h> 00036 #include <srs_env_model/but_server/objtree/filter.h> 00037 00038 #include <srs_interaction_primitives/bounding_box.h> 00039 #include <srs_interaction_primitives/plane.h> 00040 00041 static const Eigen::Vector3f upVector(0.0f, 0.0f, 1.0f); 00042 00043 00044 namespace srs_env_model 00045 { 00046 00047 CObjTreePlugin::CObjTreePlugin(const std::string &name) 00048 : CServerPluginBase(name), m_octree(objtree::Box(-10.0f, -10.0f, -10.0f, 20.0f, 20.0f, 20.0f)) 00049 { 00050 } 00051 00052 CObjTreePlugin::~CObjTreePlugin() 00053 { 00054 reset(); 00055 } 00056 00057 void CObjTreePlugin::init(ros::NodeHandle &node_handle) 00058 { 00059 //Advertise services 00060 m_serviceGetObjectsInBox = node_handle.advertiseService(GetObjectsInBox_SRV, &CObjTreePlugin::srvGetObjectsInBox, this); 00061 m_serviceGetObjectsInHalfspace = node_handle.advertiseService(GetObjectsInHalfspace_SRV, &CObjTreePlugin::srvGetObjectsInHalfspace, this); 00062 m_serviceGetObjectsInSphere = node_handle.advertiseService(GetObjectsInSphere_SRV, &CObjTreePlugin::srvGetObjectsInSphere, this); 00063 m_serviceGetPlane = node_handle.advertiseService(GetPlane_SRV, &CObjTreePlugin::srvGetPlane, this); 00064 m_serviceGetABox = node_handle.advertiseService(GetAlignedBox_SRV, &CObjTreePlugin::srvGetABox, this); 00065 m_serviceGetBBox = node_handle.advertiseService(GetBoundingBox_SRV, &CObjTreePlugin::srvGetBBox, this); 00066 m_serviceInsertPlane = node_handle.advertiseService(InsertPlane_SRV, &CObjTreePlugin::srvInsertPlane, this); 00067 m_serviceInsertPlaneByPosition = node_handle.advertiseService(InsertPlaneByPosition_SRV, &CObjTreePlugin::srvInsertPlaneByPosition, this); 00068 m_serviceGetSimilarPlane = node_handle.advertiseService(GetSimilarPlane_SRV, &CObjTreePlugin::srvGetSimilarPlane, this); 00069 m_serviceInsertPlanes = node_handle.advertiseService(InsertPlanes_SRV, &CObjTreePlugin::srvInsertPlanes, this); 00070 m_serviceInsertABox = node_handle.advertiseService(InsertAlignedBox_SRV, &CObjTreePlugin::srvInsertABox, this); 00071 m_serviceInsertABoxByPosition = node_handle.advertiseService(InsertAlignedBoxByPosition_SRV, &CObjTreePlugin::srvInsertABoxByPosition, this); 00072 m_serviceInsertBBox = node_handle.advertiseService(InsertBoundingBox_SRV, &CObjTreePlugin::srvInsertBBox, this); 00073 m_serviceInsertBBoxByPosition = node_handle.advertiseService(InsertBoundingBoxByPosition_SRV, &CObjTreePlugin::srvInsertBBoxByPosition, this); 00074 m_serviceGetSimilarABox = node_handle.advertiseService(GetSimilarAlignedBox_SRV, &CObjTreePlugin::srvGetSimilarABox, this); 00075 m_serviceGetSimilarBBox = node_handle.advertiseService(GetSimilarBoundingBox_SRV, &CObjTreePlugin::srvGetSimilarBBox, this); 00076 m_serviceRemoveObject = node_handle.advertiseService(RemoveObject_SRV, &CObjTreePlugin::srvRemoveObject, this); 00077 m_serviceShowObject = node_handle.advertiseService(ShowObject_SRV, &CObjTreePlugin::srvShowObject, this); 00078 m_serviceShowObjtree = node_handle.advertiseService(ShowObjtree_SRV, &CObjTreePlugin::srvShowObjtree, this); 00079 00080 m_clientAddPlane = node_handle.serviceClient<srs_interaction_primitives::AddPlane>(srs_interaction_primitives::AddPlane_SRV); 00081 m_clientAddBoundingBox = node_handle.serviceClient<srs_interaction_primitives::AddBoundingBox>(srs_interaction_primitives::AddBoundingBox_SRV); 00082 m_clientRemovePrimitive = node_handle.serviceClient<srs_interaction_primitives::RemovePrimitive>(srs_interaction_primitives::RemovePrimitive_SRV); 00083 00084 m_markerPub = node_handle.advertise<visualization_msgs::Marker>("visualization_marker", 5); 00085 00086 printf("ObjTree plugin initialized!\n"); 00087 } 00088 00089 void CObjTreePlugin::reset() 00090 { 00091 std::map<unsigned int, objtree::Object*> objects(m_octree.objectsAll()); 00092 00093 for(std::map<unsigned int, objtree::Object*>::iterator i = objects.begin(); i != objects.end(); i++) 00094 { 00095 removePrimitiveMarker(i->second->id()); 00096 } 00097 00098 m_octree.clear(); 00099 } 00100 00101 bool CObjTreePlugin::srvInsertPlane(srs_env_model::InsertPlane::Request &req, srs_env_model::InsertPlane::Response &res) 00102 { 00103 res.object_id = insertPlane(req.plane, INSERT); 00104 00105 showObject(res.object_id); 00106 00107 return true; 00108 } 00109 00110 bool CObjTreePlugin::srvInsertABox(srs_env_model::InsertAlignedBox::Request &req, srs_env_model::InsertAlignedBox::Response &res) 00111 { 00112 res.object_id = insertABox(req.object_id, req.position, req.scale, INSERT); 00113 00114 showObject(res.object_id); 00115 00116 return true; 00117 } 00118 00119 bool CObjTreePlugin::srvInsertBBox(srs_env_model::InsertBoundingBox::Request &req, srs_env_model::InsertBoundingBox::Response &res) 00120 { 00121 res.object_id = insertBBox(req.object_id, req.pose, req.scale, INSERT); 00122 00123 showObject(res.object_id); 00124 00125 return true; 00126 } 00127 00128 bool CObjTreePlugin::srvInsertPlaneByPosition(srs_env_model::InsertPlane::Request &req, srs_env_model::InsertPlane::Response &res) 00129 { 00130 if(m_octree.removeObject(req.plane.id)) 00131 removePrimitiveMarker(req.plane.id); 00132 00133 res.object_id = insertPlane(req.plane, UPDATE); 00134 00135 if((unsigned int)req.plane.id != res.object_id) 00136 removePrimitiveMarker(res.object_id); 00137 00138 showObject(res.object_id); 00139 00140 return true; 00141 } 00142 00143 bool CObjTreePlugin::srvInsertABoxByPosition(srs_env_model::InsertAlignedBox::Request &req, srs_env_model::InsertAlignedBox::Response &res) 00144 { 00145 if(m_octree.removeObject(req.object_id)) 00146 removePrimitiveMarker(req.object_id); 00147 00148 res.object_id = insertABox(req.object_id, req.position, req.scale, UPDATE); 00149 00150 if((unsigned int)req.object_id != res.object_id) 00151 removePrimitiveMarker(res.object_id); 00152 00153 showObject(res.object_id); 00154 00155 return true; 00156 } 00157 00158 bool CObjTreePlugin::srvInsertBBoxByPosition(srs_env_model::InsertBoundingBox::Request &req, srs_env_model::InsertBoundingBox::Response &res) 00159 { 00160 if(m_octree.removeObject(req.object_id)) 00161 removePrimitiveMarker(req.object_id); 00162 00163 res.object_id = insertBBox(req.object_id, req.pose, req.scale, UPDATE); 00164 00165 if((unsigned int)req.object_id != res.object_id) 00166 removePrimitiveMarker(res.object_id); 00167 00168 showObject(res.object_id); 00169 00170 return true; 00171 } 00172 00173 bool CObjTreePlugin::srvGetSimilarPlane(srs_env_model::InsertPlane::Request &req, srs_env_model::InsertPlane::Response &res) 00174 { 00175 res.object_id = insertPlane(req.plane, GET_SIMILAR); 00176 00177 return true; 00178 } 00179 00180 bool CObjTreePlugin::srvGetSimilarABox(srs_env_model::InsertAlignedBox::Request &req, srs_env_model::InsertAlignedBox::Response &res) 00181 { 00182 res.object_id = insertABox(req.object_id, req.position, req.scale, GET_SIMILAR); 00183 00184 return true; 00185 } 00186 00187 bool CObjTreePlugin::srvGetSimilarBBox(srs_env_model::InsertBoundingBox::Request &req, srs_env_model::InsertBoundingBox::Response &res) 00188 { 00189 res.object_id = insertBBox(req.object_id, req.pose, req.scale, GET_SIMILAR); 00190 00191 return true; 00192 } 00193 00194 bool CObjTreePlugin::srvInsertPlanes(srs_env_model::InsertPlanes::Request &req, srs_env_model::InsertPlanes::Response &res) 00195 { 00196 std::vector<srs_env_model_msgs::PlaneDesc>::iterator i; 00197 std::vector<srs_env_model_msgs::PlaneDesc> &planes(req.plane_array.planes); 00198 00199 for(i = planes.begin(); i != planes.end(); i++) 00200 { 00201 unsigned int id = insertPlane(*i, INSERT); 00202 res.object_ids.push_back(id); 00203 00204 showObject(id); 00205 } 00206 00207 return true; 00208 } 00209 00210 bool CObjTreePlugin::srvShowObject(srs_env_model::ShowObject::Request &req, srs_env_model::ShowObject::Response &res) 00211 { 00212 showObject(req.object_id); 00213 00214 return true; 00215 } 00216 00217 bool CObjTreePlugin::srvRemoveObject(srs_env_model::RemoveObject::Request &req, srs_env_model::RemoveObject::Response &res) 00218 { 00219 removeObject(req.object_id); 00220 00221 return true; 00222 } 00223 00224 bool CObjTreePlugin::srvShowObjtree(srs_env_model::ShowObjtree::Request &req, srs_env_model::ShowObjtree::Response &res) 00225 { 00226 showObjtree(); 00227 00228 return true; 00229 } 00230 00231 bool CObjTreePlugin::srvGetPlane(srs_env_model::GetPlane::Request &req, srs_env_model::GetPlane::Response &res) 00232 { 00233 const objtree::Object *object = m_octree.object(req.object_id); 00234 //Object hasn't been found 00235 if(!object) return true; 00236 if(object->type() != objtree::Object::PLANE) return true; 00237 00238 const objtree::Plane *plane = (const objtree::Plane*)object; 00239 00240 res.plane.id = req.object_id; 00241 res.plane.pose.position.x = plane->pos().x; 00242 res.plane.pose.position.y = plane->pos().y; 00243 res.plane.pose.position.z = plane->pos().z; 00244 00245 //Quaternion from normal 00246 Eigen::Vector3f normal(plane->normal().x, plane->normal().y, plane->normal().z); 00247 Eigen::Quaternionf q; 00248 q.setFromTwoVectors(upVector, normal.normalized()); 00249 00250 res.plane.pose.orientation.x = q.x(); 00251 res.plane.pose.orientation.y = q.y(); 00252 res.plane.pose.orientation.z = q.z(); 00253 res.plane.pose.orientation.w = q.w(); 00254 00255 res.plane.scale.x = plane->boundingMax().x-plane->boundingMin().x; 00256 res.plane.scale.y = plane->boundingMax().y-plane->boundingMin().y; 00257 res.plane.scale.z = plane->boundingMax().z-plane->boundingMin().z; 00258 00259 return true; 00260 } 00261 00262 bool CObjTreePlugin::srvGetABox(srs_env_model::GetAlignedBox::Request &req, srs_env_model::GetAlignedBox::Response &res) 00263 { 00264 const objtree::Object *object = m_octree.object(req.object_id); 00265 //Object hasn't been found 00266 if(!object) return true; 00267 if(object->type() != objtree::Object::ALIGNED_BOUNDING_BOX) return true; 00268 00269 const objtree::BBox *box = (const objtree::BBox*)object; 00270 00271 res.position.x = box->box().x; 00272 res.position.y = box->box().y; 00273 res.position.z = box->box().z; 00274 00275 res.scale.x = box->box().w; 00276 res.scale.y = box->box().h; 00277 res.scale.z = box->box().d; 00278 00279 return true; 00280 } 00281 00282 bool CObjTreePlugin::srvGetBBox(srs_env_model::GetBoundingBox::Request &req, srs_env_model::GetBoundingBox::Response &res) 00283 { 00284 const objtree::Object *object = m_octree.object(req.object_id); 00285 //Object hasn't been found 00286 if(!object) return true; 00287 if(object->type() != objtree::Object::GENERAL_BOUNDING_BOX) return true; 00288 00289 const objtree::GBBox *box = (const objtree::GBBox*)object; 00290 00291 res.pose.position.x = box->position().x; 00292 res.pose.position.y = box->position().y; 00293 res.pose.position.z = box->position().z; 00294 00295 res.pose.orientation.x = box->orientation().x; 00296 res.pose.orientation.y = box->orientation().y; 00297 res.pose.orientation.z = box->orientation().z; 00298 res.pose.orientation.w = box->orientation().w; 00299 00300 res.scale.x = box->scale().x; 00301 res.scale.y = box->scale().y; 00302 res.scale.z = box->scale().z; 00303 00304 return true; 00305 } 00306 00307 bool CObjTreePlugin::srvGetObjectsInBox(srs_env_model::GetObjectsInBox::Request &req, srs_env_model::GetObjectsInBox::Response &res) 00308 { 00309 objtree::FilterBox filter(objtree::Box(req.position.x, req.position.y, req.position.z, req.size.x, req.size.y, req.size.z)); 00310 getObjects(&filter, res.object_ids); 00311 00312 return true; 00313 } 00314 00315 bool CObjTreePlugin::srvGetObjectsInHalfspace(srs_env_model::GetObjectsInHalfspace::Request &req, srs_env_model::GetObjectsInHalfspace::Response &res) 00316 { 00317 objtree::FilterPlane filter(req.position.x, req.position.y, req.position.z, req.normal.x, req.normal.y, req.normal.z); 00318 getObjects(&filter, res.object_ids); 00319 00320 return true; 00321 } 00322 00323 bool CObjTreePlugin::srvGetObjectsInSphere(srs_env_model::GetObjectsInSphere::Request &req, srs_env_model::GetObjectsInSphere::Response &res) 00324 { 00325 objtree::FilterSphere filter(req.position.x, req.position.y, req.position.z, req.radius); 00326 getObjects(&filter, res.object_ids); 00327 00328 return true; 00329 } 00330 00331 unsigned int CObjTreePlugin::insertPlane(const srs_env_model_msgs::PlaneDesc &plane, CObjTreePlugin::Operation op) 00332 { 00333 printf("insertPlane called, mode %d\n", op); 00334 00335 if(op == INSERT && m_octree.removeObject(plane.id)) 00336 { 00337 //Updating existing plane 00338 removePrimitiveMarker(plane.id); 00339 } 00340 00341 objtree::Point pos(plane.pose.position.x, plane.pose.position.y, plane.pose.position.z); 00342 objtree::Point scale(plane.scale.x, plane.scale.y, plane.scale.z); 00343 00344 //Normal from orientation - quaternion 00345 //Quaternion must be normalized! 00346 Eigen::Quaternionf q(plane.pose.orientation.w, plane.pose.orientation.x, plane.pose.orientation.y, plane.pose.orientation.z); 00347 Eigen::Vector3f normal = q*upVector; 00348 00349 objtree::Plane *newPlane = new objtree::Plane(pos, objtree::Vector(normal.x(), normal.y(), normal.z()), scale); 00350 newPlane->setId(plane.id); 00351 00352 switch(op) 00353 { 00354 case INSERT: return m_octree.insert(newPlane); 00355 case UPDATE: return m_octree.insertUpdate(newPlane); 00356 case GET_SIMILAR: 00357 { 00358 unsigned int id = -1; 00359 const objtree::Object *object = m_octree.getSimilarObject(newPlane); 00360 if(object) 00361 { 00362 id = object->id(); 00363 } 00364 00365 delete newPlane; 00366 return id; 00367 } 00368 } 00369 00370 return -1; 00371 } 00372 00373 unsigned int CObjTreePlugin::insertABox(unsigned int id, const geometry_msgs::Point32 &position, const geometry_msgs::Vector3 &scale, CObjTreePlugin::Operation op) 00374 { 00375 printf("insertAlignedBox called, mode %d\n", op); 00376 00377 if(op == INSERT && m_octree.removeObject(id)) 00378 { 00379 //Updating existing box 00380 removePrimitiveMarker(id); 00381 } 00382 00383 objtree::BBox *newBox = new objtree::BBox(objtree::Box(position.x, position.y, position.z, scale.x, scale.y, scale.z)); 00384 newBox->setId(id); 00385 00386 switch(op) 00387 { 00388 case INSERT: return m_octree.insert(newBox); 00389 case UPDATE: return m_octree.insertUpdate(newBox); 00390 case GET_SIMILAR: 00391 { 00392 unsigned int id = -1; 00393 const objtree::Object *object = m_octree.getSimilarObject(newBox); 00394 if(object) 00395 { 00396 id = object->id(); 00397 } 00398 00399 delete newBox; 00400 return id; 00401 } 00402 } 00403 00404 return -1; 00405 } 00406 00407 unsigned int CObjTreePlugin::insertBBox(unsigned int id, const geometry_msgs::Pose &pose, const geometry_msgs::Vector3 &scale, CObjTreePlugin::Operation op) 00408 { 00409 printf("insertBoundingBox called, mode %d\n", op); 00410 00411 if(op == INSERT && m_octree.removeObject(id)) 00412 { 00413 //Updating existing box 00414 removePrimitiveMarker(id); 00415 } 00416 00417 objtree::Point newPosition(pose.position.x, pose.position.y, pose.position.z); 00418 objtree::Vector4f newOrientation(pose.orientation.x, pose.orientation.y, pose.orientation.z, pose.orientation.w); 00419 objtree::Point newScale(scale.x, scale.y, scale.z); 00420 00421 //Compute minimal aligned bounding box 00422 Eigen::Vector3f min, max; 00423 Eigen::Vector3f vec[4]; 00424 vec[0] = Eigen::Vector3f(-scale.x/2.0f, -scale.y/2.0f, -scale.z/2.0f); 00425 vec[1] = Eigen::Vector3f(-scale.x/2.0f, scale.y/2.0f, -scale.z/2.0f); 00426 vec[2] = Eigen::Vector3f( scale.x/2.0f, -scale.y/2.0f, -scale.z/2.0f); 00427 vec[3] = Eigen::Vector3f( scale.x/2.0f, scale.y/2.0f, -scale.z/2.0f); 00428 00429 Eigen::Quaternionf q(pose.orientation.w, pose.orientation.x, pose.orientation.y, pose.orientation.z); 00430 00431 min = max = q*vec[0]; 00432 00433 for(int i = 1; i < 4; i++) 00434 { 00435 vec[i] = q*vec[i]; 00436 00437 for(int j = 0; j < 3; j++) 00438 { 00439 if(min[j] > vec[i][j]) min[j] = vec[i][j]; 00440 if(max[j] < vec[i][j]) max[j] = vec[i][j]; 00441 } 00442 } 00443 00444 for(int i = 0; i < 4; i++) 00445 { 00446 vec[i] = -vec[i]; 00447 00448 for(int j = 0; j < 3; j++) 00449 { 00450 if(min[j] > vec[i][j]) min[j] = vec[i][j]; 00451 if(max[j] < vec[i][j]) max[j] = vec[i][j]; 00452 } 00453 } 00454 00455 Eigen::Vector3f alignedScale(max-min); 00456 objtree::Box alignedBox(min[0]+newPosition.x, min[1]+newPosition.y, min[2]+newPosition.z, alignedScale[0], alignedScale[1], alignedScale[2]); 00457 00458 objtree::GBBox *newBox = new objtree::GBBox(newPosition, newOrientation, newScale, alignedBox); 00459 newBox->setId(id); 00460 00461 switch(op) 00462 { 00463 case INSERT: return m_octree.insert(newBox); 00464 case UPDATE: return m_octree.insertUpdate(newBox); 00465 case GET_SIMILAR: 00466 { 00467 unsigned int id = -1; 00468 const objtree::Object *object = m_octree.getSimilarObject(newBox); 00469 if(object) 00470 { 00471 id = object->id(); 00472 } 00473 00474 delete newBox; 00475 return id; 00476 } 00477 } 00478 00479 return -1; 00480 } 00481 00482 void CObjTreePlugin::showObject(unsigned int id) 00483 { 00484 const objtree::Object *object = m_octree.object(id); 00485 if(!object) return; 00486 00487 char name[64]; 00488 snprintf(name, sizeof(name), "imn%u", id); 00489 00490 switch(object->type()) 00491 { 00492 case objtree::Object::ALIGNED_BOUNDING_BOX: 00493 { 00494 objtree::BBox *box = (objtree::BBox*)object; 00495 00496 srs_interaction_primitives::AddBoundingBox addBoxSrv; 00497 00498 addBoxSrv.request.frame_id = IM_SERVER_FRAME_ID; 00499 addBoxSrv.request.name = name; 00500 addBoxSrv.request.description = name; 00501 00502 addBoxSrv.request.pose.position.x = box->box().x+box->box().w/2; 00503 addBoxSrv.request.pose.position.y = box->box().y+box->box().h/2; 00504 addBoxSrv.request.pose.position.z = box->box().z+box->box().d/2; 00505 00506 addBoxSrv.request.pose.orientation.x = 0.0f; 00507 addBoxSrv.request.pose.orientation.y = 0.0f; 00508 addBoxSrv.request.pose.orientation.z = 0.0f; 00509 addBoxSrv.request.pose.orientation.w = 1.0f; 00510 00511 addBoxSrv.request.scale.x = box->box().w; 00512 addBoxSrv.request.scale.y = box->box().h; 00513 addBoxSrv.request.scale.z = box->box().d; 00514 00515 addBoxSrv.request.color.r = 1.0; 00516 addBoxSrv.request.color.g = addBoxSrv.request.color.b = 0.0; 00517 00518 addBoxSrv.request.color.a = 1.0; 00519 00520 m_clientAddBoundingBox.call(addBoxSrv); 00521 } 00522 break; 00523 00524 case objtree::Object::GENERAL_BOUNDING_BOX: 00525 { 00526 objtree::GBBox *box = (objtree::GBBox*)object; 00527 00528 srs_interaction_primitives::AddBoundingBox addBoxSrv; 00529 00530 addBoxSrv.request.frame_id = IM_SERVER_FRAME_ID; 00531 addBoxSrv.request.name = name; 00532 addBoxSrv.request.description = name; 00533 00534 addBoxSrv.request.pose.position.x = box->position().x; 00535 addBoxSrv.request.pose.position.y = box->position().y; 00536 addBoxSrv.request.pose.position.z = box->position().z; 00537 00538 addBoxSrv.request.pose.orientation.x = box->orientation().x; 00539 addBoxSrv.request.pose.orientation.y = box->orientation().y; 00540 addBoxSrv.request.pose.orientation.z = box->orientation().z; 00541 addBoxSrv.request.pose.orientation.w = box->orientation().w; 00542 00543 addBoxSrv.request.scale.x = box->scale().x; 00544 addBoxSrv.request.scale.y = box->scale().y; 00545 addBoxSrv.request.scale.z = box->scale().z; 00546 00547 addBoxSrv.request.color.r = 1.0; 00548 addBoxSrv.request.color.g = addBoxSrv.request.color.b = 0.0; 00549 00550 addBoxSrv.request.color.a = 1.0; 00551 00552 m_clientAddBoundingBox.call(addBoxSrv); 00553 } 00554 break; 00555 00556 case objtree::Object::PLANE: 00557 { 00558 objtree::Plane *plane = (objtree::Plane*)object; 00559 00560 srs_interaction_primitives::AddPlane addPlaneSrv; 00561 00562 addPlaneSrv.request.frame_id = IM_SERVER_FRAME_ID; 00563 addPlaneSrv.request.name = name; 00564 addPlaneSrv.request.description = name; 00565 00566 addPlaneSrv.request.pose.position.x = plane->pos().x; 00567 addPlaneSrv.request.pose.position.y = plane->pos().y; 00568 addPlaneSrv.request.pose.position.z = plane->pos().z; 00569 00570 //Quaternion from normal 00571 Eigen::Vector3f normal(plane->normal().x, plane->normal().y, plane->normal().z); 00572 Eigen::Quaternionf q; 00573 q.setFromTwoVectors(upVector, normal.normalized()); 00574 00575 addPlaneSrv.request.pose.orientation.x = q.x(); 00576 addPlaneSrv.request.pose.orientation.y = q.y(); 00577 addPlaneSrv.request.pose.orientation.z = q.z(); 00578 addPlaneSrv.request.pose.orientation.w = q.w(); 00579 00580 addPlaneSrv.request.scale.x = plane->boundingMax().x-plane->boundingMin().x; 00581 addPlaneSrv.request.scale.y = plane->boundingMax().y-plane->boundingMin().y; 00582 addPlaneSrv.request.scale.z = plane->boundingMax().z-plane->boundingMin().z; 00583 00584 addPlaneSrv.request.color.r = 1.0; 00585 addPlaneSrv.request.color.g = addPlaneSrv.request.color.b = 0.0; 00586 addPlaneSrv.request.color.a = 1.0; 00587 00588 m_clientAddPlane.call(addPlaneSrv); 00589 } 00590 break; 00591 } 00592 } 00593 00594 void CObjTreePlugin::removeObject(unsigned int id) 00595 { 00596 m_octree.removeObject(id); 00597 removePrimitiveMarker(id); 00598 } 00599 00600 void CObjTreePlugin::showObjtree() 00601 { 00602 std::set<objtree::Object*> objects; 00603 std::list<objtree::Box> nodes; 00604 objtree::FilterZero filter; 00605 00606 m_octree.nodes(nodes, objects, &filter); 00607 00608 publishOctree(nodes); 00609 00610 printf("Number of objects %zd\n", objects.size()); 00611 } 00612 00613 void CObjTreePlugin::getObjects(const objtree::Filter *filter, std::vector<unsigned int> &output) 00614 { 00615 std::set<objtree::Object*> objects; 00616 00617 m_octree.objects(objects, filter); 00618 output.resize(objects.size()); 00619 00620 unsigned int i = 0; 00621 for(std::set<objtree::Object*>::iterator it = objects.begin(); it != objects.end(); it++, i++) 00622 { 00623 output[i] = (*it)->id(); 00624 } 00625 } 00626 00627 //Methods for octree visualization 00628 00629 void CObjTreePlugin::publishLine(visualization_msgs::Marker &lines, float x1, float y1, float z1, float x2, float y2, float z2) 00630 { 00631 geometry_msgs::Point p; 00632 00633 p.x = x1; 00634 p.y = y1; 00635 p.z = z1; 00636 00637 lines.points.push_back(p); 00638 00639 p.x = x2; 00640 p.y = y2; 00641 p.z = z2; 00642 00643 lines.points.push_back(p); 00644 } 00645 00646 void CObjTreePlugin::publishCube(visualization_msgs::Marker &lines, float x, float y, float z, float w, float h, float d) 00647 { 00648 publishLine(lines, x, y, z, x+w, y, z); 00649 publishLine(lines, x, y+h, z, x+w, y+h, z); 00650 publishLine(lines, x, y, z+d, x+w, y, z+d); 00651 publishLine(lines, x, y+h, z+d, x+w, y+h, z+d); 00652 00653 publishLine(lines, x, y, z, x, y+h, z); 00654 publishLine(lines, x+w, y, z, x+w, y+h, z); 00655 publishLine(lines, x, y, z+d, x, y+h, z+d); 00656 publishLine(lines, x+w, y, z+d, x+w, y+h, z+d); 00657 00658 publishLine(lines, x, y, z, x, y, z+d); 00659 publishLine(lines, x+w, y, z, x+w, y, z+d); 00660 publishLine(lines, x, y+h, z, x, y+h, z+d); 00661 publishLine(lines, x+w, y+h, z, x+w, y+h, z+d); 00662 } 00663 00664 void CObjTreePlugin::removePrimitiveMarker(unsigned int id) 00665 { 00666 srs_interaction_primitives::RemovePrimitive removePrimitiveSrv; 00667 char name[64]; 00668 snprintf(name, sizeof(name), "imn%u", id); 00669 removePrimitiveSrv.request.name = name; 00670 00671 m_clientRemovePrimitive.call(removePrimitiveSrv); 00672 } 00673 00674 void CObjTreePlugin::publishOctree(const std::list<objtree::Box> &nodes) 00675 { 00676 visualization_msgs::Marker lines; 00677 00678 lines.header.frame_id = IM_SERVER_FRAME_ID; 00679 lines.header.stamp = ros::Time::now(); 00680 lines.ns = "objtree"; 00681 lines.action = visualization_msgs::Marker::ADD; 00682 lines.pose.orientation.w = 1.0f; 00683 00684 lines.id = 0; 00685 lines.type = visualization_msgs::Marker::LINE_LIST; 00686 lines.color.r = lines.color.g = lines.color.b = 0.75f; 00687 lines.color.a = 1.0f; 00688 00689 lines.scale.x = 0.03f; 00690 00691 for(std::list<objtree::Box>::const_iterator i = nodes.begin(); i != nodes.end(); i++) 00692 { 00693 publishCube(lines, i->x, i->y, i->z, i->w, i->h, i->d); 00694 } 00695 00696 m_markerPub.publish(lines); 00697 } 00698 00702 void CObjTreePlugin::pause( bool bPause, ros::NodeHandle & node_handle ) 00703 { 00704 if( bPause ) 00705 m_markerPub.shutdown(); 00706 else 00707 m_markerPub = node_handle.advertise<visualization_msgs::Marker>("visualization_marker", 5); 00708 } 00709 00710 }