00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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
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
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
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
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
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
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
00345
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
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
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
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
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
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 }