void RobotState::DVLCallback(const underwater_sensor_msgs::DVLConstPtr &message)
{
    cv::Point3f white_noise(var_nor(),var_nor(),var_nor());
    float elapsed_time;

    if(message->bi_error < 1)
    {
        vel_dvl_.x = message->bi_x_axis;
        vel_dvl_.y = message->bi_y_axis;
        vel_dvl_.z = message->bi_z_axis;

        //vel_dvl_ += white_noise;

        //ROS_DEBUG_STREAM_NAMED("rs","DVL velocity =  " << vel_dvl_);


        if(has_dvl_ && has_imu_)
        {
            elapsed_time = (message->header.stamp - timestamp_).toSec();

            computeTraveledDistances(elapsed_time);
        }

        timestamp_ = message->header.stamp;
        has_dvl_ = true;
    }
    else
    {
        ROS_DEBUG_STREAM_NAMED("rs","O erro da DVL eh " << message->bi_error);
    }


}
Exemple #2
0
double rnorm(double mean, double sd, boost::mt19937& rng) {
    boost::normal_distribution<> nd(mean, sd);
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor(rng, nd);
    double val = -1.0;
    while(val < 0) {
        val = var_nor();
    }
    return val;
}
Exemple #3
0
void initLight(){
	boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)
	boost::normal_distribution<> nd(0.0, 1.0);
	boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor(rng, nd);

	for (int i=0; i < 1024; ++i){
		_aLight[i] = float(abs(var_nor()));
	}
}
osg::Vec3d GPSSensor::getMeasurement() {
	//Should get world coords and then transform to the localizedWorld
	osg::Matrixd *rMs=getWorldCoords(node_);
	osg::Matrixd lMs=*rMs*osg::Matrixd::inverse(rMl_);

	//Now add some gaussian noise
	static boost::normal_distribution<> normal(0,std_);
	static boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor(rng_, normal);

	return lMs.getTrans()+osg::Vec3d(var_nor(), var_nor(), var_nor());
}
Exemple #5
0
double Controller::randn(double mean, double stdev) {
//	static random_device e { };
//	static normal_distribution<double> d(mean, stdev);
//	return d(e);
	boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)

	rng.seed((++seed) + time(NULL));
	boost::normal_distribution<> nd(mean, stdev);
	boost::variate_generator<boost::mt19937&,
	boost::normal_distribution<> > var_nor(rng, nd);
	return var_nor();
}
////////////////////////////////////////////////////////////////////////////////
// Update the controller
void GazeboTreasure::Update()
{
  if ( static_object_ || terminated_ ) {
    return;
  }
  // produces randomness out of thin air
  static boost::random::mt19937 rng;
  // distribution that maps to 0..9
  static boost::random::uniform_int_distribution<> change_direction(0,299);

  // normal distribution
  static boost::normal_distribution<> nd(0.0, 1.0);

  static boost::variate_generator<boost::mt19937&, 
                                  boost::normal_distribution<> > var_nor(rng, nd);


  // max 5km/h = 1.38889 = 5 km/h
  if ( change_direction(rng) == 0 )
  {
    vel_x += var_nor();
    vel_y += var_nor();
    vel_yaw += var_nor();
    double vel = sqrt((vel_x*vel_x)+(vel_y*vel_y));
    if ( vel > 1.3889 ) {
      vel_x *= 1.3389/vel;
      vel_y *= 1.3389/vel;
    }
    if (fabs(vel_yaw) > 1.3389) {
      vel_yaw *= 1.3389/fabs(vel_yaw);
    }
  }
  
  math::Pose pose = link_->GetWorldPose();
  // 100 x 60
  if ( pose.pos.x > 45 ) {
    vel_x = -fabs(vel_x);
  }
  if ( pose.pos.x < -45 ) {
    vel_x = fabs(vel_x);
  }
  if ( pose.pos.y > 25 ) {
    vel_y = -fabs(vel_y);
  }
  if ( pose.pos.y < -25 ) {
    vel_y = fabs(vel_y);
  }
  model_->SetLinearVel(math::Vector3(vel_x, vel_y, 0));
  model_->SetAngularVel(math::Vector3(0, 0, vel_yaw));
  last_time_ = world_->GetSimTime();

  // check score
}
pcl::PointCloud<pcl::PointXYZ> generateData(int data) {
  //normal distribution
  boost::mt19937 rng;
  rng.seed(clock());

  boost::normal_distribution<> nd(0, 0.1*data);

  boost::variate_generator<boost::mt19937&,
  boost::normal_distribution<> > var_nor(rng, nd);

  pcl::PointCloud<pcl::PointXYZ> pc;
  for(int i=0; i<100; i++) {
    pcl::PointXYZ p;

    p.x=(i-50)/50.;
    p.y=0;
    p.z=1;
    ADD_NOISE();
    pc.push_back(p);

    p.y=1;
    ADD_NOISE();
    pc.push_back(p);

    p.z=2;
    ADD_NOISE();
    pc.push_back(p);

    p.y=0;
    ADD_NOISE();
    pc.push_back(p);
  }
  for(int i=1; i<99; i++) {
    pcl::PointXYZ p;

    p.x=-1;
    p.y=0;
    p.z=1+i/100.;
    ADD_NOISE();
    pc.push_back(p);

    p.x=1;
    ADD_NOISE();
    pc.push_back(p);

    p.y=1;
    ADD_NOISE();
    pc.push_back(p);

    p.x=-1;
    ADD_NOISE();
    pc.push_back(p);
  }

  return pc;
}
void addNoise(pcl::PointCloud<pcl::PointXYZ> &pc, int noise)
{
  //normal distribution
  boost::mt19937 rng;
  rng.seed(clock());

  boost::normal_distribution<> nd(0, 0.02*noise);

  boost::variate_generator<boost::mt19937&,
  boost::normal_distribution<> > var_nor(rng, nd);

  for(int i=0; i<pc.size(); i++) {
    pcl::PointXYZ &p = pc[i];
    ADD_NOISE();
  }

}
/**
 * Generates sample points using a few gauissians.
 * Then applies gmm fitting on these generated points.
 * Provides a heuristic score for each gmm fitting result.
 *
 */
int main(void)
{
    boost::mt19937 engine;
    engine.seed(1340818006);

    // generate random data using gauissians below
    std::vector< boost::normal_distribution<double> > distributions;
    distributions.push_back(boost::normal_distribution<double>(0.1, 0.05));
    distributions.push_back(boost::normal_distribution<double>(0.4, 0.1));
    distributions.push_back(boost::normal_distribution<double>(0.55, 0.05));
    distributions.push_back(boost::normal_distribution<double>(0.7, 0.1));
    distributions.push_back(boost::normal_distribution<double>(0.9, 0.05));
    distributions.push_back(boost::normal_distribution<double>(1.0, 0.05));
    
    std::vector<double> data;    
    for(std::vector< boost::normal_distribution<double> >::iterator it = distributions.begin();
      it != distributions.end(); ++it)
    {
        boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > var_nor(engine, *it);
        
        for(std::size_t i = 0; i < 300; ++i) { data.push_back(var_nor()); }
    }
    
    // calculate closest center (using above gauissians) for each generated points
    // we will compare it with gmm fitting results
    // also we might want to compute mixing coef for each center and select centers according to mixing_coef * prob(data)
    std::vector<std::size_t> data_centers;
    for(std::vector<double>::iterator it = data.begin(); it != data.end(); ++it)
    {
        std::size_t center_id = (std::numeric_limits<std::size_t>::max)(), center_counter = 0;;
        double min_distance = (std::numeric_limits<double>::max)();        
        for(std::vector< boost::normal_distribution<double> >::iterator dis_it = distributions.begin();
          dis_it != distributions.end(); ++dis_it, ++center_counter)
        {
            double distance = std::abs(*it - dis_it->mean());            
            if(min_distance > distance) 
            {
                min_distance = distance;
                center_id = center_counter;
            }            
        }
        data_centers.push_back(center_id);
    }
    
    // apply gmm fitting clustering
    typedef CGAL::internal::Expectation_maximization E_M;
    std::vector<E_M> gmm_fitters;
    gmm_fitters.push_back(E_M(distributions.size(), data, E_M::PLUS_INITIALIZATION));
    gmm_fitters.push_back(E_M(distributions.size(), data, E_M::RANDOM_INITIALIZATION));
    gmm_fitters.push_back(E_M(distributions.size(), data, E_M::K_MEANS_INITIALIZATION));

    std::vector< std::vector<std::size_t> > calculated_centers(gmm_fitters.size());
    std::vector< std::vector<std::size_t> >::iterator calc_centers_it = calculated_centers.begin();
    for(std::vector<E_M>::iterator it = gmm_fitters.begin(); it != gmm_fitters.end(); ++it, ++calc_centers_it)
    {
        it->fill_with_center_ids(*calc_centers_it);
    }
    
    std::cout << "Compare results of EM with 'expected' (but be aware, it is not optimal result in terms of likelihood)" << std::endl;
    std::cout << "Another words a clustering which has higher likelihood can result in worse score in here" << std::endl;
    for(std::vector< std::vector<std::size_t> >::iterator calc_centers_it = calculated_centers.begin();
        calc_centers_it != calculated_centers.end(); ++calc_centers_it)
    {
        std::size_t true_count = 0;
        std::vector<std::size_t>::iterator calculated_it = calc_centers_it->begin();
        for(std::vector<std::size_t>::iterator it = data_centers.begin(); it != data_centers.end(); ++it, ++calculated_it)
        {
            if( (*it) == (*calculated_it) ) { ++true_count; }
        }
        double app_fit = static_cast<double>(true_count) / data_centers.size();
        std::cout << "[0,1]: " << app_fit << std::endl;
        if(app_fit < 0.7) {
            std::cerr << "There might be a problem if above printed comparison is too low." << std::endl;
            return EXIT_FAILURE;
        }
    }
}
Exemple #10
0
 inline double gaussian(const double mean, const double sigma)
 {
   boost::normal_distribution<> g(mean,sigma);
   boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor(random::generator,g);
   return var_nor();
 }
void
DoSampleRun2 ()
{
  cob_3d_mapping_filters::SpeckleFilter<PointXYZ> filter;
  pcl::PointCloud<PointXYZ>::Ptr cloud (new pcl::PointCloud<PointXYZ> ());
  pcl::PointCloud<PointXYZ>::Ptr cloud_out (new pcl::PointCloud<PointXYZ> ());
  cloud->width = 640;
  cloud->height = 480;
  double x = 0, y = 0;
  for (unsigned int i = 0; i < cloud->width; i++, y += 0.001)
  {
    x = 0;
    for (unsigned int j = 0; j < cloud->height; j++, x += 0.001)
    {
      PointXYZ pt;
      pt.x = x;
      pt.y = y;
      pt.z = 1;
      cloud->points.push_back (pt);
    }
  }
  boost::mt19937 rng; // I don't seed it on purpouse (it's not relevant)
  boost::normal_distribution<> nd (0.0, 0.05);
  boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor (rng, nd);

  for (unsigned int i = 0; i < 3000; i++)
    cloud->points[i * 100].z += var_nor ();

  //pcl::io::savePCDFileASCII("/tmp/spk_cloud.pcd", *cloud);
  filter.setInputCloud (cloud);
  for (unsigned int s = 10; s <= 100; s += 10)
  {
    std::stringstream ss;
    ss << "/tmp/spk_acc_" << s << ".txt";
    std::ofstream file;
    file.open (ss.str ().c_str ());
    file << "thr\ttp\tfn\tfp\n";
    for (double c = 0.01; c <= 0.1; c += 0.01)
    {
      filter.setFilterParam (s, c);
      filter.filter (*cloud_out);
      pcl::PointIndices::Ptr ind = filter.getRemovedIndices ();
      std::cout << "Cloud size " << cloud_out->size () << ", ind: " << ind->indices.size () << std::endl;
      int fn_ctr = 0, tp_ctr = 0;
      for (unsigned int i = 0; i < 3000; i++)
      {
        bool found = false;
        for (unsigned int j = 0; j < ind->indices.size (); j++)
        {
          if (ind->indices[j] == i * 100)
          {
            tp_ctr++;
            found = true;
            break;
          }
        }
        if (!found)
          fn_ctr++;
      }
      int fp_ctr = ind->indices.size () - tp_ctr;
      double fn_ratio = (double)fn_ctr / 3000;
      double fp_ratio = (double)fp_ctr / 3000;
      double tp_ratio = (double)tp_ctr / 3000;
      file << c << "\t" << tp_ratio << "\t" << fn_ratio << "\t" << fp_ratio << "\n";
      std::cout << "c: " << c << " fn: " << fn_ratio << ", tp: " << tp_ratio << " fp: " << fp_ratio << std::endl;
    }
    file.close ();
  }
}
Exemple #12
0
void SphereGenerator::Generate() {
//generate 
	if (nr_of_outliers > nr_of_points)
		nr_of_outliers = 0;
 
  // Fill in the cloud data
  cloud.width  = nr_of_points;
  cloud.height = 1;
  cloud.points.resize (cloud.width * cloud.height);

  // Generate the data
  for (size_t i = 0; i < cloud.points.size (); ++i)
  {
    cloud.points[i].x =  rand () / (RAND_MAX + 1.0f) * r;
    if (rand()%2)
		cloud.points[i].x = - cloud.points[i].x;
    cloud.points[i].y =  rand () / (RAND_MAX + 1.0f) * sqrt(r*r- cloud.points[i].x*cloud.points[i].x);
    if (rand()%2)
		cloud.points[i].y = - cloud.points[i].y;
    cloud.points[i].z =  sqrt(r*r - cloud.points[i].x*cloud.points[i].x - cloud.points[i].y*cloud.points[i].y);
    if (rand()%2)
		cloud.points[i].z = - cloud.points[i].z;
		
		cloud.points[i].x+=x;
		cloud.points[i].y+=y;
		cloud.points[i].z+=z;
  }




  // Set a few outliers
   for (int i = 0; i < nr_of_outliers; ++i){
	   cloud.points[i].x += (rand () / (RAND_MAX + 1.0f) * 10) -5;
	   cloud.points[i].y += (rand () / (RAND_MAX + 1.0f) * 10) -5;
	   cloud.points[i].z += (rand () / (RAND_MAX + 1.0f) * 10) -5;
   }
  
//noise
        struct timeval start; 
        gettimeofday (&start, NULL); 
        boost::mt19937 rng; 
        rng.seed (start.tv_usec); 
        boost::normal_distribution<> nd (mi, sigma); 
        boost::variate_generator<boost::mt19937&, 
			boost::normal_distribution<> > var_nor (rng, nd); 
        // Noisify each point in the dataset 
        for (size_t i = nr_of_outliers; i < cloud.points.size (); ++i) 
        { 
          cloud.points[i].x += var_nor ();
          cloud.points[i].y += var_nor ();
          cloud.points[i].z += var_nor (); 
        } 

  

	
	out_pcl.write(cloud);	
	cloudPtr = cloud.makeShared();
	out_pcl_ptr.write(cloudPtr);
	
}
Exemple #13
0
void PlaneGenerator::Generate() {
	
if (nr_of_outliers > nr_of_points)
		nr_of_outliers = 0;
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  
  cloud->width  = nr_of_points;
  cloud->height = 1;
  cloud->points.resize (cloud->width * cloud->height);

  for (size_t i = 0; i < cloud->points.size (); ++i)
  {
    cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
    cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
  }

// Create a set of planar coefficients 
  pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
  coefficients->values.resize (4);
  coefficients->values[0] = a;
  coefficients->values[1] = b;
  coefficients->values[2] = c;
  coefficients->values[3] = d;


  // Create the filtering object
  pcl::ProjectInliers<pcl::PointXYZ> proj;
  proj.setModelType (pcl::SACMODEL_PLANE);
  proj.setInputCloud (cloud);
  proj.setModelCoefficients (coefficients);
  proj.filter (*cloud);


 // Set a few outliers
   for (int i = 0; i < nr_of_outliers; ++i){
	   cloud->points[i].x += (rand () / (RAND_MAX + 1.0f) * 5) +1;
	   if (rand()%2)
			cloud->points[i].x=-cloud->points[i].x;
	   cloud->points[i].y += (rand () / (RAND_MAX + 1.0f) * 5) +1;
	   if (rand()%2)
			cloud->points[i].y=-cloud->points[i].y;
	   cloud->points[i].z += (rand () / (RAND_MAX + 1.0f) * 5) +1;
	   if (rand()%2)
			cloud->points[i].z=-cloud->points[i].z;
   }
	
//noise
        struct timeval start; 
        gettimeofday (&start, NULL); 
        boost::mt19937 rng; 
        rng.seed (start.tv_usec); 
        boost::normal_distribution<> nd (mi, sigma); 
        boost::variate_generator<boost::mt19937&, 
			boost::normal_distribution<> > var_nor (rng, nd); 
        // Noisify each point in the dataset 
        for (size_t i = nr_of_outliers; i < cloud->points.size (); ++i) 
        { 
          cloud->points[i].x += var_nor ();
          cloud->points[i].y += var_nor ();
          cloud->points[i].z += var_nor (); 
        } 



	out_pcl.write(cloud); 
	
}
  void
  pcl::rec_3d_framework::GlobalNNCVFHRecognizer<Distance, PointInT, FeatureT>::initialize (bool force_retrain)
  {

    //use the source to know what has to be trained and what not, checking if the descr_name directory exists
    //unless force_retrain is true, then train everything
    boost::shared_ptr < std::vector<ModelT> > models = source_->getModels ();
    std::cout << "Models size:" << models->size () << std::endl;

    if (force_retrain)
    {
      for (size_t i = 0; i < models->size (); i++)
      {
        source_->removeDescDirectory (models->at (i), training_dir_, descr_name_);
      }
    }

    for (size_t i = 0; i < models->size (); i++)
    {
      if (!source_->modelAlreadyTrained (models->at (i), training_dir_, descr_name_))
      {
        for (size_t v = 0; v < models->at (i).views_->size (); v++)
        {
          PointInTPtr processed (new pcl::PointCloud<PointInT>);
          PointInTPtr view = models->at (i).views_->at (v);

          if (view->points.size () == 0)
            PCL_WARN("View has no points!!!\n");

          if (noisify_)
          {
            double noise_std = noise_;
            boost::posix_time::ptime time = boost::posix_time::microsec_clock::local_time();
            boost::posix_time::time_duration duration( time.time_of_day() );
            boost::mt19937 rng;
            rng.seed (static_cast<unsigned int> (duration.total_milliseconds()));
            boost::normal_distribution<> nd (0.0, noise_std);
            boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor (rng, nd);
            // Noisify each point in the dataset
            for (size_t cp = 0; cp < view->points.size (); ++cp)
              view->points[cp].z += static_cast<double> (var_nor ());

          }

          //pro view, compute signatures
          std::vector<pcl::PointCloud<FeatureT>, Eigen::aligned_allocator<pcl::PointCloud<FeatureT> > > signatures;
          std::vector < Eigen::Vector3d > centroids;
          micvfh_estimator_->estimate (view, processed, signatures, centroids);

          std::vector<bool> valid_trans;
          std::vector < Eigen::Matrix4d, Eigen::aligned_allocator<Eigen::Matrix4d> > transforms;

          micvfh_estimator_->getValidTransformsVec (valid_trans);
          micvfh_estimator_->getTransformsVec (transforms);

          std::string path = source_->getModelDescriptorDir (models->at (i), training_dir_, descr_name_);

          bf::path desc_dir = path;
          if (!bf::exists (desc_dir))
            bf::create_directory (desc_dir);

          std::stringstream path_view;
          path_view << path << "/view_" << v << ".pcd";
          pcl::io::savePCDFileBinary (path_view.str (), *processed);

          std::stringstream path_pose;
          path_pose << path << "/pose_" << v << ".txt";
          PersistenceUtils::writeMatrixToFile (path_pose.str (), models->at (i).poses_->at (v));

          std::stringstream path_entropy;
          path_entropy << path << "/entropy_" << v << ".txt";
          PersistenceUtils::writeFloatToFile (path_entropy.str (), models->at (i).self_occlusions_->at (v));

          //save signatures and centroids to disk
          for (size_t j = 0; j < signatures.size (); j++)
          {
            if (valid_trans[j])
            {
              std::stringstream path_centroid;
              path_centroid << path << "/centroid_" << v << "_" << j << ".txt";
              Eigen::Vector3d centroid (centroids[j][0], centroids[j][1], centroids[j][2]);
              PersistenceUtils::writeCentroidToFile (path_centroid.str (), centroid);

              std::stringstream path_descriptor;
              path_descriptor << path << "/descriptor_" << v << "_" << j << ".pcd";
              pcl::io::savePCDFileBinary (path_descriptor.str (), signatures[j]);

              //save roll transform
              std::stringstream path_pose;
              path_pose << path << "/roll_trans_" << v << "_" << j << ".txt";
              PersistenceUtils::writeMatrixToFile (path_pose.str (), transforms[j]);
            }
          }
        }

      }
      else
      {
        //else skip model
        std::cout << "The model has already been trained..." << std::endl;
        //there is no need to keep the views in memory once the model has been trained
        models->at (i).views_->clear ();
      }
    }

    //load features from disk
    //initialize FLANN structure
    loadFeaturesAndCreateFLANN ();
  }
Exemple #15
0
int main(int argc, char** argv)
{
  ros::init(argc, argv, "model_fitting");
  ros::NodeHandle n;
  ros::Rate loop_rate(0.8);

  boost::normal_distribution<> nd(0.0, 0.01);
  boost::mt19937 rng;
  boost::variate_generator<boost::mt19937&, boost::normal_distribution<> >
                  var_nor(rng, nd);

  ros::Publisher model_pub = n.advertise<articulation_model_msgs::ModelMsg> ("model_track", 5);



  // ------------------- generate data ----------------------------------
  bool rotational = true;
  bool prismatic = false;
  bool rigid = false;

  const int datapoints_number = 300;

  std::vector <geometry_msgs::Pose> generated_poses;

  for (int i = 0; i < datapoints_number; i++)
  {
    geometry_msgs::Pose pose;

    if (prismatic)
    {
      pose.position.x = 2 + (static_cast<float> (i)/100.0) + var_nor();
      pose.position.y = (static_cast<float> (i)/100.0) + var_nor();
      pose.position.z = (static_cast<float> (i)/100.0) + var_nor();
    }
    else if (rotational)
    {
      pose.position.x = 2 + cos(static_cast<float> (i) / 100.0) + var_nor();
      pose.position.y = sin(static_cast<float> (i) / 100.0) + var_nor();
      pose.position.z = var_nor();
    }
    else if(rigid)
    {
      pose.position.x = 2 + var_nor();
      pose.position.y = 4 + var_nor();
      pose.position.z = 1 + var_nor();
    }

    if (rotational)
    {
      double yaw = static_cast<float> (i)/100;
      double roll = M_PI/4;
      double pitch = 0;

      tf::Quaternion tf_pose_quat;
      tf_pose_quat.setRPY(roll, pitch, yaw);

      pose.orientation.w = tf_pose_quat.getW();
      pose.orientation.x = tf_pose_quat.getX();
      pose.orientation.y = tf_pose_quat.getY();
      pose.orientation.z = tf_pose_quat.getZ();
    }
    else
    {
      pose.orientation.x = 0;
      pose.orientation.y = 0;
      pose.orientation.z = 0;
      pose.orientation.w = 1;
    }
  generated_poses.push_back(pose);
  }



  const int initial_datapoints_number = 40;

  articulation_model_msgs::ModelMsg model_msg;
  articulation_model_msgs::ParamMsg sigma_param;



  sigma_param.name = "sigma_position";
  sigma_param.value = 0.02;
  sigma_param.type = articulation_model_msgs::ParamMsg::PRIOR;
  model_msg.params.push_back(sigma_param);


  model_msg.track = generateMeasurement(generated_poses, 0, initial_datapoints_number);



  std::cout << "creating object" << std::endl;
  ArticulationModelPtr rotational_instance(new RotationalModel);
  ArticulationModelPtr prismatic_instance(new PrismaticModel);
  ArticulationModelPtr rigid_instance(new RigidModel);


  model_msg.name = "rotational";
  rotational_instance->setModel(model_msg);
  model_msg.name = "prismatic";
  prismatic_instance->setModel(model_msg);
  model_msg.name = "rigid";
  rigid_instance->setModel(model_msg);

  std::cout << "fitting" << std::endl;
//  rotational_instance->fitModel();
//  prismatic_instance->fitModel();
//  rigid_instance->fitModel();


  int loop_count = 1;
  int generate_measurement_every_so_many = 10;

  while (ros::ok())
  {


    if (loop_count % generate_measurement_every_so_many == 0)
    {
      // ------------------------ generate measurement -------------------------------
      articulation_model_msgs::TrackMsg z;
      z = generateMeasurement(generated_poses, loop_count + initial_datapoints_number - generate_measurement_every_so_many, loop_count + initial_datapoints_number + 10);
      rotational_instance->addTrack(z);
      prismatic_instance->addTrack(z);
      rigid_instance->addTrack(z);
      std::cout << "measurement taken" << std::endl;
    }


    std::cout << "evaluating" << std::endl;
    rotational_instance->fitModel();
    prismatic_instance->fitModel();
    rigid_instance->fitModel();


    rotational_instance->evaluateModel();
    prismatic_instance->evaluateModel();
    rigid_instance->evaluateModel();

    std::cout << "done" << std::endl;


//    std::cout << "model class = "<< model_instance->getModelName() << std::endl;

//    std::cout << "       radius = "<<rotational_instance->getParam("rot_radius")<< std::endl;

//    boost::shared_ptr<RotationalModel> rotational = boost::dynamic_pointer_cast< RotationalModel > (model_instance);
//    std::cout << "    rotational   radius = "<<rotational->rot_radius<< std::endl;

//    tf::Matrix3x3 m(rotational->rot_axis);
//    double yaw, pitch, roll;
//    m.getEulerYPR(yaw, pitch, roll);
//    std::cout << "    rotational   yaw = "<<yaw<< std::endl;
//    std::cout << "    rotational   pitch = "<<pitch<< std::endl;
//    std::cout << "    rotational   roll = "<<roll<< std::endl;


////    std::cout << "       rigid_position.x = "<<model_instance->getParam("rigid_position.x")<< std::endl;
////    boost::shared_ptr<RigidModel> rigid = boost::dynamic_pointer_cast< RigidModel > (model_instance);
////    std::cout << "     pos.x = " << rigid->pos_x << std::endl;

    double rotational_loglikelihood = rotational_instance->getParam("loglikelihood");
    double prismatic_loglikelihood = prismatic_instance->getParam("loglikelihood");
    double rigid_loglikelihood = rigid_instance->getParam("loglikelihood");

    std::cout << "     rotational log LH = " << rotational_loglikelihood<< "\n " << std::endl;
    std::cout << "     prismatic log LH = " << prismatic_loglikelihood<< "\n "  << std::endl;
    std::cout << "     rigid log LH = " << rigid_loglikelihood << "\n \n" << std::endl;


    double max_loglikehood = std::max(std::max(rotational_loglikelihood, prismatic_loglikelihood), rigid_loglikelihood);
    rotational_loglikelihood = rotational_loglikelihood - max_loglikehood;
    prismatic_loglikelihood = prismatic_loglikelihood - max_loglikehood;
    rigid_loglikelihood = rigid_loglikelihood - max_loglikehood;

    double rotational_likelihood = exp(rotational_loglikelihood);
    double prismatic_likelihood = exp(prismatic_loglikelihood);
    double rigid_likelihood = exp(rigid_loglikelihood);

    double sum_likelihoods = rotational_likelihood + prismatic_likelihood + rigid_likelihood;

    rotational_likelihood = rotational_likelihood/sum_likelihoods;
    prismatic_likelihood = prismatic_likelihood/sum_likelihoods;
    rigid_likelihood = rigid_likelihood/sum_likelihoods;

    std::cout << "     rotational normalized likelihood = " << rotational_likelihood<< "\n " << std::endl;
    std::cout << "     prismatic normalized likelihood = " << prismatic_likelihood<< "\n "  << std::endl;
    std::cout << "     rigid normalized likelihood = " << rigid_likelihood << "\n \n" << std::endl;


    rotational_instance->setParam("weight",rotational_likelihood,articulation_model_msgs::ParamMsg::EVAL);
    prismatic_instance->setParam("weight",prismatic_likelihood,articulation_model_msgs::ParamMsg::EVAL);
    rigid_instance->setParam("weight",rigid_likelihood,articulation_model_msgs::ParamMsg::EVAL);



    std::cout << "     rotational BIC = " << rotational_instance->getParam("bic")<< "\n " << std::endl;
    std::cout << "     prismatic BIC = " << prismatic_instance->getParam("bic")<< "\n "  << std::endl;
    std::cout << "     rigid BIC = " << rigid_instance->getParam("bic") << "\n \n" << std::endl;


//    std::cout << " points= "<<model_msg.track.pose.size() << "\n " << std::endl;

    model_pub.publish(rotational_instance->getModel());

    model_pub.publish(prismatic_instance->getModel());

    model_pub.publish(rigid_instance->getModel());



    ros::spinOnce();
    loop_rate.sleep();
    loop_count++;
  }
}