Go to the documentation of this file.00001 #include <OGRE/OgreVector3.h>
00002 #include <OGRE/OgreSceneNode.h>
00003 #include <OGRE/OgreSceneManager.h>
00004 #include <Eigen/Dense>
00005 #include <ros/ros.h>
00006 #include <rviz/ogre_helpers/shape.h>
00007 #include "ndt_visual.hpp"
00008
00009 namespace lslgeneric{
00010 NDTVisual::NDTVisual( Ogre::SceneManager* scene_manager, Ogre::SceneNode* parent_node ){
00011 scene_manager_ = scene_manager;
00012 frame_node_ = parent_node->createChildSceneNode();
00013 NDT_elipsoid_.reset(new rviz::Shape(rviz::Shape::Sphere,scene_manager_,frame_node_ ));
00014 }
00015
00016 NDTVisual::~NDTVisual()
00017 {
00018 scene_manager_->destroySceneNode( frame_node_ );
00019 }
00020
00021 void NDTVisual::setCell(ndt_map::NDTCellMsg cell, double resolution){
00022 Ogre::Vector3 position(cell.mean_x,cell.mean_y,cell.mean_z);
00023
00024 Eigen::Matrix3d cov;
00025 int m_itr=0;
00026 for(int i=0;i<3;i++){
00027 for(int j=0;j<3;j++){
00028 cov(j,i)=cell.cov_matrix[m_itr];
00029 m_itr++;
00030 }
00031 }
00032 Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> Sol (cov);
00033 Eigen::Matrix3d evecs;
00034 Eigen::Vector3d evals;
00035 evecs = Sol.eigenvectors().real();
00036 evals = Sol.eigenvalues().real();
00037 Eigen::Quaternion<double> q(evecs);
00038
00039 Ogre::Vector3 scale(30*evals(0),30*evals(1),30*evals(2));
00040 Ogre::Quaternion orient(q.w(),q.x(),q.y(),q.z());
00041 NDT_elipsoid_->setScale(scale);
00042 NDT_elipsoid_->setPosition(position);
00043 NDT_elipsoid_->setOrientation(orient);
00044
00045 }
00046
00047 void NDTVisual::setFramePosition( const Ogre::Vector3& position ){
00048 frame_node_->setPosition( position );
00049 }
00050
00051 void NDTVisual::setFrameOrientation( const Ogre::Quaternion& orientation ){
00052 frame_node_->setOrientation( orientation );
00053 }
00054
00055 void NDTVisual::setColor( float r, float g, float b, float a ){
00056 NDT_elipsoid_->setColor( r, g, b, a );
00057 }
00058 }
00059