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
00029
00030 #include "rviz_interaction_tools/gripper.h"
00031
00032
00033 #include <tf/transform_datatypes.h>
00034
00035 #include <geometry_msgs/PoseStamped.h>
00036
00037 #include <rviz/render_panel.h>
00038 #include <rviz/mesh_loader.h>
00039
00040 #include <OGRE/OgreEntity.h>
00041 #include <OGRE/OgreLight.h>
00042 #include <OGRE/OgreSceneManager.h>
00043 #include <OGRE/OgreSceneNode.h>
00044 #include <OGRE/OgreSubEntity.h>
00045 #include <OGRE/OgreTechnique.h>
00046
00047 #include <rviz_interaction_tools/unique_string_manager.h>
00048
00049 namespace rviz_interaction_tools
00050 {
00051
00052 Gripper::Gripper( Ogre::SceneManager* scene_manager, Ogre::SceneNode* scene_root ) :
00053 gripper_transform_(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0, 0, 0.5))
00054 {
00055 scene_manager_ = scene_manager;
00056
00057 std::string palm_string("package://pr2_description/meshes/gripper_v0/gripper_palm.dae");
00058 std::string proximal_finger_string("package://pr2_description/meshes/gripper_v0/l_finger.dae");
00059 std::string distal_finger_string("package://pr2_description/meshes/gripper_v0/l_finger_tip.dae");
00060
00061 Ogre::MeshPtr palm_mesh = rviz::loadMeshFromResource(palm_string);
00062 Ogre::MeshPtr proximal_finger_mesh = rviz::loadMeshFromResource(proximal_finger_string);
00063 Ogre::MeshPtr distal_finger_mesh = rviz::loadMeshFromResource(distal_finger_string);
00064
00065 if (!palm_mesh.get() || !proximal_finger_mesh.get() || !distal_finger_mesh.get())
00066 {
00067 ROS_ERROR("Failed to load resource");
00068 }
00069
00070 rviz_interaction_tools::UniqueStringManager usm;
00071
00072 resource_group_name_ = usm.unique("rviz_interaction_tools::Gripper");
00073 Ogre::ResourceGroupManager::getSingleton().createResourceGroup(resource_group_name_);
00074 Ogre::ResourceGroupManager::getSingleton().initialiseResourceGroup(resource_group_name_);
00075
00076 Ogre::Entity* palm_entity = scene_manager->createEntity(usm.unique("palm_entity"), palm_string, resource_group_name_);
00077 Ogre::Entity* l_proximal_finger_entity = scene_manager->createEntity(usm.unique("l_proximal_finger_entity"),
00078 proximal_finger_string, resource_group_name_);
00079 Ogre::Entity* l_distal_finger_entity = scene_manager->createEntity(usm.unique("l_distal_finger_entity"),
00080 distal_finger_string, resource_group_name_);
00081 Ogre::Entity* r_proximal_finger_entity = scene_manager->createEntity(usm.unique("r_proximal_finger_entity"),
00082 proximal_finger_string);
00083 Ogre::Entity* r_distal_finger_entity = scene_manager->createEntity(usm.unique("r_distal_finger_entity"),
00084 distal_finger_string, resource_group_name_);
00085
00086 entities_.push_back( palm_entity );
00087 entities_.push_back( l_proximal_finger_entity );
00088 entities_.push_back( l_distal_finger_entity );
00089 entities_.push_back( r_proximal_finger_entity );
00090 entities_.push_back( r_distal_finger_entity );
00091
00092 material_.push_back( palm_entity->getSubEntity(0)->getMaterial()->clone( usm.unique("gripper_mat1"), true, resource_group_name_ ) );
00093 palm_entity->setMaterial(material_.back());
00094
00095 material_.push_back( l_proximal_finger_entity->getSubEntity(0)->getMaterial()->clone( usm.unique("gripper_mat2"), true, resource_group_name_ ) );
00096 l_proximal_finger_entity->setMaterial(material_.back());
00097 r_proximal_finger_entity->setMaterial(material_.back());
00098
00099 material_.push_back( l_distal_finger_entity->getSubEntity(0)->getMaterial()->clone( usm.unique("gripper_mat3"), true, resource_group_name_ ) );
00100 l_distal_finger_entity->setMaterial(material_.back());
00101 r_distal_finger_entity->setMaterial(material_.back());
00102
00103 setColour(1,1,0,0.5);
00104
00105 gripper_root_ = scene_root->createChildSceneNode();
00106
00107 gripper_root_->setPosition(-0.1, 0.0, 0.5);
00108 gripper_root_->attachObject(palm_entity);
00109
00110 l_proximal_finger_node_ = gripper_root_->createChildSceneNode();
00111 l_proximal_finger_node_->setPosition(0.07691, 0.01, 0);
00112 l_proximal_finger_node_->attachObject(l_proximal_finger_entity);
00113
00114 l_distal_finger_node_ = l_proximal_finger_node_->createChildSceneNode();
00115 l_distal_finger_node_->setPosition(0.09137, 0.00495, 0);
00116 l_distal_finger_node_->attachObject(l_distal_finger_entity);
00117
00118 Ogre::SceneNode* r_flip_node = gripper_root_->createChildSceneNode();
00119 r_flip_node->setOrientation(0, 1, 0, 0);
00120
00121 r_proximal_finger_node_ = r_flip_node->createChildSceneNode();
00122 r_proximal_finger_node_->setPosition(0.07691, 0.01, 0);
00123 r_proximal_finger_node_->attachObject(r_proximal_finger_entity);
00124
00125 r_distal_finger_node_ = r_proximal_finger_node_->createChildSceneNode();
00126 r_distal_finger_node_->setPosition(0.09137, 0.00495, 0);
00127 r_distal_finger_node_->attachObject(r_distal_finger_entity);
00128 }
00129
00130 Gripper::~Gripper()
00131 {
00132 scene_manager_->destroySceneNode(l_proximal_finger_node_);
00133 scene_manager_->destroySceneNode(l_distal_finger_node_);
00134 scene_manager_->destroySceneNode(r_proximal_finger_node_);
00135 scene_manager_->destroySceneNode(r_distal_finger_node_);
00136 scene_manager_->destroySceneNode(gripper_root_);
00137 Ogre::ResourceGroupManager::getSingleton().destroyResourceGroup(resource_group_name_);
00138 }
00139
00140 void Gripper::setColour( float r, float g, float b, float a )
00141 {
00142 for ( unsigned i=0; i<material_.size(); i++ )
00143 {
00144 Ogre::MaterialPtr material = material_[i];
00145
00146 material->getBestTechnique()->getPass(0)->setDiffuse(r,g,b,a);
00147 material->getBestTechnique()->getPass(0)->setAmbient(r,g,b);
00148
00149 if ( a < 0.9998 )
00150 {
00151 material->getTechnique(0)->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA );
00152 material->getTechnique(0)->setDepthWriteEnabled( false );
00153 }
00154 else
00155 {
00156 material->getTechnique(0)->setSceneBlending( Ogre::SBT_REPLACE );
00157 material->getTechnique(0)->setDepthWriteEnabled( true );
00158 }
00159 }
00160 }
00161
00162 void Gripper::setDepthCheckEnabled( bool enabled )
00163 {
00164 for ( unsigned i=0; i<material_.size(); i++ )
00165 {
00166 material_[i]->setDepthCheckEnabled( enabled );
00167 }
00168 }
00169
00170 void Gripper::setRenderQueueGroup( unsigned group )
00171 {
00172 for ( unsigned i=0; i<entities_.size(); i++ )
00173 {
00174 entities_[i]->setRenderQueueGroup(group);
00175 }
00176 }
00177
00178 void Gripper::setVisible( bool visible )
00179 {
00180 gripper_root_->setVisible(visible);
00181 }
00182
00183 void Gripper::setGripperAngle(float angle)
00184 {
00185 gripper_angle_ = angle;
00186
00187 l_proximal_finger_node_->resetOrientation();
00188 l_proximal_finger_node_->roll(Ogre::Radian(angle));
00189 l_distal_finger_node_->resetOrientation();
00190 l_distal_finger_node_->roll(Ogre::Radian(-angle));
00191
00192 r_proximal_finger_node_->resetOrientation();
00193 r_proximal_finger_node_->roll(Ogre::Radian(angle));
00194 r_distal_finger_node_->resetOrientation();
00195 r_distal_finger_node_->roll(Ogre::Radian(-angle));
00196 }
00197
00198 void Gripper::setPosition( Ogre::Vector3 &position )
00199 {
00200 gripper_root_->setPosition(position);
00201 }
00202
00203 void Gripper::setOrientation( Ogre::Quaternion &orientation )
00204 {
00205 gripper_root_->setOrientation( orientation );
00206 }
00207
00208 }