// This is our callback to handle an incoming message.
  void MoveItCollisionMapDisplay::processMessage(const moveit_msgs::CollisionMap::ConstPtr& msg) {
    // Here we call the rviz::FrameManager to get the transform from the
    // fixed frame to the frame in the header of this Imu message. If
    // it fails, we can't do anything else so we return.
    Ogre::Quaternion orientation;
    Ogre::Vector3 position;
    if(!context_->getFrameManager()->getTransform(msg->header.frame_id,
						  msg->header.stamp,
						  position, orientation)) {
      ROS_DEBUG("Error transforming from frame '%s' to frame '%s'",
		msg->header.frame_id.c_str(), qPrintable(fixed_frame_));
      return;
    }
    
    // We are keeping a circular buffer of visual pointers. This gets
    // the next one, or creates and stores it if the buffer is not full
    visuals_.clear();
    boost::shared_ptr<MoveItCollisionMapVisual> visual;
    
    vector<moveit_msgs::OrientedBoundingBox> vecBoxes = msg->boxes;
    for(vector<moveit_msgs::OrientedBoundingBox>::iterator itBox = vecBoxes.begin();
    	itBox != vecBoxes.end();
    	itBox++) {
      moveit_msgs::OrientedBoundingBox bxBox = *itBox;
      const geometry_msgs::Point& ptPosition = bxBox.pose.position;
      const geometry_msgs::Point32& ptExtents = bxBox.extents;
      
      Ogre::Vector3 vecPosition(ptPosition.x, ptPosition.y, ptPosition.z);
      Ogre::Vector3 vecExtents(ptExtents.x - 0.01, ptExtents.y - 0.01, ptExtents.z - 0.01);
      
      //visual->setFramePosition(vecPosition);
      //cube_->setPosition(vecPosition);
      //cube_->setScale(vecExtents);
      
      if(visuals_.full()) {
	visual = visuals_.front();
      } else {
	visual.reset(new MoveItCollisionMapVisual(context_->getSceneManager(), scene_node_));
      }
      
      // Now set or update the contents of the chosen visual.
      visual->setMessage(msg);
      visual->setFramePosition(vecPosition);
      visual->setExtents(vecExtents);
      
      float alpha = alpha_property_->getFloat();
      Ogre::ColourValue color = color_property_->getOgreColor();
      visual->setColor(color.r, color.g, color.b, alpha);
      
      // And send it to the end of the circular buffer
      
      // NOTE(winkler): Check here if this cube is already in the buffer.
      visuals_.push_back(visual);
    }
  }
Exemplo n.º 2
0
//-----------------------------------------------------------------------------
// Expand trigger bounds..
//-----------------------------------------------------------------------------
void CCollisionProperty::ComputeVPhysicsSurroundingBox( Vector *pVecWorldMins, Vector *pVecWorldMaxs )
{
	bool bSetBounds = false;
	IPhysicsObject *pPhysicsObject = GetOuter()->VPhysicsGetObject();
	if ( pPhysicsObject )
	{
		if ( pPhysicsObject->GetCollide() )
		{
			physcollision->CollideGetAABB( pVecWorldMins, pVecWorldMaxs, 
				pPhysicsObject->GetCollide(), GetCollisionOrigin(), GetCollisionAngles() );
			bSetBounds = true;
		}
		else if ( pPhysicsObject->GetSphereRadius( ) )
		{
			float flRadius = pPhysicsObject->GetSphereRadius( );
			Vector vecExtents( flRadius, flRadius, flRadius );
			VectorSubtract( GetCollisionOrigin(), vecExtents, *pVecWorldMins );
			VectorAdd( GetCollisionOrigin(), vecExtents, *pVecWorldMaxs );
			bSetBounds = true;
		}
	}

	if ( !bSetBounds )
	{
		*pVecWorldMins = GetCollisionOrigin();
		*pVecWorldMaxs = *pVecWorldMins;
	}

	// Also, lets expand for the trigger bounds also
	if ( IsSolidFlagSet( FSOLID_USE_TRIGGER_BOUNDS ) )
	{
		Vector vecWorldTriggerMins, vecWorldTriggerMaxs;
		WorldSpaceTriggerBounds( &vecWorldTriggerMins, &vecWorldTriggerMaxs );
		VectorMin( vecWorldTriggerMins, *pVecWorldMins, *pVecWorldMins );
		VectorMax( vecWorldTriggerMaxs, *pVecWorldMaxs, *pVecWorldMaxs );
	}
}