Esempio n. 1
0
void PointCloudBase::onPluginUnloading(const PluginStatus& status)
{
  boost::recursive_mutex::scoped_lock lock(transformers_mutex_);

  typedef std::set<std::string> S_string;
  S_string to_erase;

  bool xyz_unloaded = false;
  bool color_unloaded = false;

  M_TransformerInfo::iterator it = transformers_.begin();
  M_TransformerInfo::iterator end = transformers_.end();
  for (; it != end; ++it)
  {
    const std::string& name = it->first;
    TransformerInfo& info = it->second;
    if (info.plugin != status.plugin)
    {
      continue;
    }

    if (name == xyz_transformer_)
    {
      xyz_unloaded = true;
    }

    if (name == color_transformer_)
    {
      color_unloaded = true;
    }

    to_erase.insert(it->first);

    if (property_manager_)
    {
      deleteProperties(property_manager_, info.xyz_props);
      deleteProperties(property_manager_, info.color_props);
    }

    info.transformer.reset();
  }

  {
    S_string::iterator it = to_erase.begin();
    S_string::iterator end = to_erase.end();
    for (; it != end; ++it)
    {
      transformers_.erase(*it);
    }
  }

  if (xyz_unloaded || color_unloaded)
  {
    boost::mutex::scoped_lock lock(clouds_mutex_);
    if (!clouds_.empty())
    {
      updateTransformers((*clouds_.rbegin())->message_, true);
    }
  }
}
Esempio n. 2
0
bool MapCloudDisplay::transformCloud(const CloudInfoPtr& cloud_info, bool update_transformers)
{
	rviz::V_PointCloudPoint& cloud_points = cloud_info->transformed_points_;
	cloud_points.clear();

	size_t size = cloud_info->message_->width * cloud_info->message_->height;
	rviz::PointCloud::Point default_pt;
	default_pt.color = Ogre::ColourValue(1, 1, 1);
	default_pt.position = Ogre::Vector3::ZERO;
	cloud_points.resize(size, default_pt);

	{
		boost::recursive_mutex::scoped_lock lock(transformers_mutex_);
		if( update_transformers )
		{
			updateTransformers( cloud_info->message_ );
		}
		rviz::PointCloudTransformerPtr xyz_trans = getXYZTransformer(cloud_info->message_);
		rviz::PointCloudTransformerPtr color_trans = getColorTransformer(cloud_info->message_);

		if (!xyz_trans)
		{
			std::stringstream ss;
			ss << "No position transformer available for cloud";
			this->setStatusStd(rviz::StatusProperty::Error, "Message", ss.str());
			return false;
		}

		if (!color_trans)
		{
			std::stringstream ss;
			ss << "No color transformer available for cloud";
			this->setStatusStd(rviz::StatusProperty::Error, "Message", ss.str());
			return false;
		}

		xyz_trans->transform(cloud_info->message_, rviz::PointCloudTransformer::Support_XYZ, Ogre::Matrix4::IDENTITY, cloud_points);
		color_trans->transform(cloud_info->message_, rviz::PointCloudTransformer::Support_Color, Ogre::Matrix4::IDENTITY, cloud_points);
	}

	for (rviz::V_PointCloudPoint::iterator cloud_point = cloud_points.begin(); cloud_point != cloud_points.end(); ++cloud_point)
	{
		if (!rviz::validateFloats(cloud_point->position))
		{
			cloud_point->position.x = 999999.0f;
			cloud_point->position.y = 999999.0f;
			cloud_point->position.z = 999999.0f;
		}
	}

	return true;
}