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 "robot.h"
00031 #include "robot_link.h"
00032 #include "properties/property.h"
00033 #include "properties/property_manager.h"
00034 #include "visualization_manager.h"
00035
00036 #include "ogre_tools/object.h"
00037 #include "ogre_tools/shape.h"
00038 #include "ogre_tools/axes.h"
00039
00040 #include <urdf/model.h>
00041
00042 #include <OGRE/OgreSceneNode.h>
00043 #include <OGRE/OgreSceneManager.h>
00044 #include <OGRE/OgreRibbonTrail.h>
00045 #include <OGRE/OgreEntity.h>
00046 #include <OGRE/OgreMaterialManager.h>
00047 #include <OGRE/OgreMaterial.h>
00048 #include <OGRE/OgreResourceGroupManager.h>
00049
00050 #include <ros/console.h>
00051
00052 namespace rviz
00053 {
00054
00055 Robot::Robot( VisualizationManager* manager, const std::string& name )
00056 : scene_manager_(manager->getSceneManager())
00057 , visual_visible_( true )
00058 , collision_visible_( false )
00059 , vis_manager_(manager)
00060 , property_manager_(NULL)
00061 , name_( name )
00062 {
00063 root_visual_node_ = scene_manager_->getRootSceneNode()->createChildSceneNode();
00064 root_collision_node_ = scene_manager_->getRootSceneNode()->createChildSceneNode();
00065 root_other_node_ = scene_manager_->getRootSceneNode()->createChildSceneNode();
00066
00067 setVisualVisible( visual_visible_ );
00068 setCollisionVisible( collision_visible_ );
00069 setAlpha(1.0f);
00070 }
00071
00072 Robot::~Robot()
00073 {
00074 clear();
00075
00076 scene_manager_->destroySceneNode( root_visual_node_->getName() );
00077 scene_manager_->destroySceneNode( root_collision_node_->getName() );
00078 scene_manager_->destroySceneNode( root_other_node_->getName() );
00079 }
00080
00081 void Robot::setVisible( bool visible )
00082 {
00083 if ( visible )
00084 {
00085 root_visual_node_->setVisible( visual_visible_ );
00086 root_collision_node_->setVisible( collision_visible_ );
00087 }
00088 else
00089 {
00090 root_visual_node_->setVisible( false );
00091 root_collision_node_->setVisible( false );
00092 }
00093 }
00094
00095 void Robot::setVisualVisible( bool visible )
00096 {
00097 visual_visible_ = visible;
00098 root_visual_node_->setVisible( visible );
00099 }
00100
00101 void Robot::setCollisionVisible( bool visible )
00102 {
00103 collision_visible_ = visible;
00104 root_collision_node_->setVisible( visible );
00105 }
00106
00107 bool Robot::isVisualVisible()
00108 {
00109 return visual_visible_;
00110 }
00111
00112 bool Robot::isCollisionVisible()
00113 {
00114 return collision_visible_;
00115 }
00116
00117 void Robot::setAlpha(float a)
00118 {
00119 alpha_ = a;
00120
00121 M_NameToLink::iterator it = links_.begin();
00122 M_NameToLink::iterator end = links_.end();
00123 for ( ; it != end; ++it )
00124 {
00125 RobotLink* info = it->second;
00126
00127 info->setAlpha(alpha_);
00128 }
00129 }
00130
00131 void Robot::clear()
00132 {
00133 if ( property_manager_ )
00134 {
00135 property_manager_->deleteByUserData( this );
00136 }
00137
00138 M_NameToLink::iterator link_it = links_.begin();
00139 M_NameToLink::iterator link_end = links_.end();
00140 for ( ; link_it != link_end; ++link_it )
00141 {
00142 RobotLink* info = link_it->second;
00143 delete info;
00144 }
00145
00146 links_category_.reset();
00147 links_.clear();
00148 root_visual_node_->removeAndDestroyAllChildren();
00149 root_collision_node_->removeAndDestroyAllChildren();
00150 }
00151
00152 void Robot::setPropertyManager( PropertyManager* property_manager, const CategoryPropertyWPtr& parent )
00153 {
00154 ROS_ASSERT( property_manager );
00155 ROS_ASSERT( parent.lock() );
00156
00157 property_manager_ = property_manager;
00158 parent_property_ = parent;
00159
00160 links_category_ = property_manager_->createCategory( "Links", name_, parent_property_, this );
00161
00162 if ( !links_.empty() )
00163 {
00164 M_NameToLink::iterator link_it = links_.begin();
00165 M_NameToLink::iterator link_end = links_.end();
00166 for ( ; link_it != link_end; ++link_it )
00167 {
00168 RobotLink* info = link_it->second;
00169
00170 info->setPropertyManager(property_manager);
00171 info->createProperties();
00172 }
00173 }
00174
00175 CategoryPropertyPtr cat_prop = links_category_.lock();
00176 cat_prop->collapse();
00177 }
00178
00179 class LinkComparator
00180 {
00181 public:
00182 bool operator()(const boost::shared_ptr<urdf::Link>& lhs, const boost::shared_ptr<urdf::Link>& rhs)
00183 {
00184 return lhs->name < rhs->name;
00185 }
00186 };
00187
00188 void Robot::load( TiXmlElement* root_element, urdf::Model &descr, bool visual, bool collision )
00189 {
00190 clear();
00191
00192 if ( property_manager_ )
00193 {
00194 ROS_ASSERT(!links_category_.lock());
00195 links_category_ = property_manager_->createCategory( "Links", name_, parent_property_, this );
00196 }
00197
00198 typedef std::vector<boost::shared_ptr<urdf::Link> > V_Link;
00199 V_Link links;
00200 descr.getLinks(links);
00201 std::sort(links.begin(), links.end(), LinkComparator());
00202 V_Link::iterator it = links.begin();
00203 V_Link::iterator end = links.end();
00204 for (; it != end; ++it)
00205 {
00206 const boost::shared_ptr<urdf::Link>& link = *it;
00207
00208 RobotLink* link_info = new RobotLink(this, vis_manager_);
00209
00210 if (property_manager_)
00211 {
00212 link_info->setPropertyManager(property_manager_);
00213 }
00214 link_info->load(root_element, descr, link, visual, collision);
00215
00216 if (!link_info->isValid())
00217 {
00218 delete link_info;
00219 continue;
00220 }
00221
00222 bool inserted = links_.insert( std::make_pair( link_info->getName(), link_info ) ).second;
00223 ROS_ASSERT( inserted );
00224
00225 link_info->setAlpha(alpha_);
00226 }
00227
00228 if (property_manager_)
00229 {
00230 CategoryPropertyPtr cat_prop = links_category_.lock();
00231 cat_prop->collapse();
00232 }
00233
00234 setVisualVisible(isVisualVisible());
00235 setCollisionVisible(isCollisionVisible());
00236 }
00237
00238 RobotLink* Robot::getLink( const std::string& name )
00239 {
00240 M_NameToLink::iterator it = links_.find( name );
00241 if ( it == links_.end() )
00242 {
00243 ROS_WARN( "Link [%s] does not exist", name.c_str() );
00244 return NULL;
00245 }
00246
00247 return it->second;
00248 }
00249
00250 void Robot::update(const LinkUpdater& updater)
00251 {
00252 M_NameToLink::iterator link_it = links_.begin();
00253 M_NameToLink::iterator link_end = links_.end();
00254 for ( ; link_it != link_end; ++link_it )
00255 {
00256 RobotLink* info = link_it->second;
00257
00258 info->setToNormalMaterial();
00259
00260 Ogre::Vector3 visual_position, collision_position;
00261 Ogre::Quaternion visual_orientation, collision_orientation;
00262 bool apply_offset_transforms;
00263 if (updater.getLinkTransforms(info->getName(), visual_position, visual_orientation, collision_position, collision_orientation, apply_offset_transforms))
00264 {
00265 info->setTransforms( visual_position, visual_orientation, collision_position, collision_orientation, apply_offset_transforms );
00266 }
00267 else
00268 {
00269 info->setToErrorMaterial();
00270 }
00271 }
00272 }
00273
00274 void Robot::setPosition( const Ogre::Vector3& position )
00275 {
00276 root_visual_node_->setPosition( position );
00277 root_collision_node_->setPosition( position );
00278 }
00279
00280 void Robot::setOrientation( const Ogre::Quaternion& orientation )
00281 {
00282 root_visual_node_->setOrientation( orientation );
00283 root_collision_node_->setOrientation( orientation );
00284 }
00285
00286 void Robot::setScale( const Ogre::Vector3& scale )
00287 {
00288 root_visual_node_->setScale( scale );
00289 root_collision_node_->setScale( scale );
00290 }
00291
00292 const Ogre::Vector3& Robot::getPosition()
00293 {
00294 return root_visual_node_->getPosition();
00295 }
00296
00297 const Ogre::Quaternion& Robot::getOrientation()
00298 {
00299 return root_visual_node_->getOrientation();
00300 }
00301
00302 }