void ImageLandmarksWidget::setTargetLandmark(QString uid, Vector3D p_target)
{
	DataPtr image = this->getCurrentData();
	if (!image)
		return;
	image->getLandmarks()->setLandmark(Landmark(uid, p_target));
}
void ImageLandmarksWidget::importPointMetricsToLandmarkButtonClickedSlot()
{
	DataPtr image = this->getCurrentData();
	if(!image)
		return;

	std::map<QString, DataPtr> point_metrics = mServices->patient()->getChildren(image->getUid(), "pointMetric");
	std::map<QString, DataPtr>::iterator it = point_metrics.begin();

	//Make sure we have enough landmarks
	int number_of_landmarks = mServices->patient()->getLandmarkProperties().size();
	int number_of_metrics = point_metrics.size();
	for(int i=number_of_landmarks; i<number_of_metrics; ++i)
	{
		QString uid = mServices->patient()->addLandmark();
	}

	for(; it != point_metrics.end(); ++it)
	{
		PointMetricPtr point_metric = boost::static_pointer_cast<PointMetric>(it->second);
		if(!point_metric)
			continue;

		Vector3D pos_x = point_metric->getCoordinate();
		//Transform3D d_M_x = mServices->spaceProvider()->get_toMfrom(CoordinateSystem::fromString(image->getSpace()), point_metric->getSpace());
		//Vector3D pos_d = d_M_x.coord(pos_x);
		QString point_metric_name = point_metric->getName();
		image->getLandmarks()->setLandmark(Landmark(point_metric_name, pos_x));
		this->activateLandmark(point_metric_name);
	}
}
std::vector<Landmark> LandmarkRegistrationWidget::getAllLandmarks() const
{
	std::vector<Landmark> retval;
	LandmarkMap targetData = this->getTargetLandmarks();
	std::map<QString, LandmarkProperty> dataData = mServices->patient()->getLandmarkProperties();
	std::map<QString, LandmarkProperty>::iterator iter;

	for (iter = dataData.begin(); iter != dataData.end(); ++iter)
	{
		if (targetData.count(iter->first))
			retval.push_back(targetData[iter->first]);
		else
			retval.push_back(Landmark(iter->first));
	}

	std::sort(retval.begin(), retval.end());

	return retval;
}
void ImageLandmarksWidget::editLandmarkButtonClickedSlot()
{
	PickerRepPtr PickerRep = this->getPickerRep();
	if (!PickerRep)
	{
		reportError("Need a 3D view to edit landmarks.");
		return;
	}

	DataPtr image = this->getCurrentData();
	if (!image)
		return;

	QString uid = mActiveLandmark;
	Vector3D pos_r = PickerRep->getPosition();
	Vector3D pos_d = image->get_rMd().inv().coord(pos_r);
	image->getLandmarks()->setLandmark(Landmark(uid, pos_d));

    this->activateLandmark(this->getNextLandmark());
}
void loadLandmarks(std::string landmarksFileName){
  FileReader fr(landmarksFileName);
  if(!fr.is_open()){
    std::cout << "landmarks file not located, putting landmarks in 'default' position" << std::endl;
    setDefaultLandmarkPositions();
    return;
  }
  
  std::vector<std::string> textline;
  fr.readLine(&textline);
  while(fr.good()){
    if(textline.size() > 1){
      double x = atof(textline[0].c_str());
      double y = atof(textline[1].c_str());
      landmarks.push_back(Landmark(x,y));
    }
    textline.clear();
    fr.readLine(&textline);
  }
}
  /// Init & triangulate landmark observations from validated 3-view correspondences
  void triangulate(
    SfM_Data & sfm_data,
    const std::shared_ptr<Regions_Provider> & regions_provider)
  {
    openMVG::tracks::STLMAPTracks map_tracksCommon;
    openMVG::tracks::TracksBuilder tracksBuilder;
    tracksBuilder.Build(triplets_matches);
    tracksBuilder.Filter(3);
    tracksBuilder.ExportToSTL(map_tracksCommon);
    matching::PairWiseMatches().swap(triplets_matches);

    // Generate new Structure tracks
    sfm_data.structure.clear();

    // Fill sfm_data with the computed tracks (no 3D yet)
    Landmarks & structure = sfm_data.structure;
    IndexT idx(0);
    for (tracks::STLMAPTracks::const_iterator itTracks = map_tracksCommon.begin();
      itTracks != map_tracksCommon.end();
      ++itTracks, ++idx)
    {
      const tracks::submapTrack & track = itTracks->second;
      structure[idx] = Landmark();
      Observations & obs = structure.at(idx).obs;
      for (tracks::submapTrack::const_iterator it = track.begin(); it != track.end(); ++it)
      {
        const size_t imaIndex = it->first;
        const size_t featIndex = it->second;
        const Vec2 pt = regions_provider->regions_per_view.at(imaIndex)->GetRegionPosition(featIndex);
        obs[imaIndex] = Observation(pt, featIndex);
      }
    }

    // Triangulate them using a robust triangulation scheme
    SfM_Data_Structure_Computation_Robust structure_estimator(true);
    structure_estimator.triangulate(sfm_data);
  }
void PatientLandMarksWidget::toolSampleButtonClickedSlot()
{
	ToolPtr tool = mServices->tracking()->getActiveTool();

	if (!tool)
	{
		reportError("mToolToSample is NULL!");
		return;
	}
	//TODO What if the reference frame isnt visible?
	Transform3D lastTransform_prMt = tool->get_prMt();
	Vector3D p_pr = lastTransform_prMt.coord(Vector3D(0, 0, tool->getTooltipOffset()));

	// TODO: do we want to allow sampling points not defined in image??
	if (mActiveLandmark.isEmpty() && !mServices->patient()->getLandmarkProperties().empty())
		mActiveLandmark = mServices->patient()->getLandmarkProperties().begin()->first;

	mServices->patient()->getPatientLandmarks()->setLandmark(Landmark(mActiveLandmark, p_pr));
	reporter()->playSampleSound();

	this->activateLandmark(this->getNextLandmark());

	this->performRegistration(); // automatic when sampling in physical patient space (Mantis #0000674)s
}
void InformationFilterFtr::CreateMap(Mat *u, vector<int> *ptpairsCMin, vector<CvPoint3D64f> *pointsCMin)
{
  //re-mapping
  Map* Map3D = map3d_ptr_;
  typedef struct
  {
    vector<RoverState> tEST;
  } RoverTrajectory_t;
  RoverTrajectory_t* RoverTrajectory = new RoverTrajectory_t;
  RoverTrajectory->tEST.resize(step_ptr_ + 1);
  RoverTrajectory->tEST[step_ptr_] = curr_pose_ptr_;
  int* STEP = &step_ptr_;
  vector<sscrovers_pmslam_common::SPoint>* SDatabase = &db_ptr_;

  int id;
  vector<CvPoint3D64f> vn, vf;
  vector<double> vrn, vrf;
  vector<int> ids;
  int idx = slam_filter_ptr_->idx;

  PMSLAM_Data_msg.MapOut.ID.clear();
  PMSLAM_Data_msg.MapOut.positions.x.clear();
  PMSLAM_Data_msg.MapOut.positions.y.clear();
  PMSLAM_Data_msg.MapOut.positions.z.clear();

  if (*STEP > 0)
  {
    slam_filter_ptr_->predict(*u);
    vn.clear();
    vf.clear();
    vrn.clear();
    vrf.clear();
    ids.clear();

    CvPoint3D64f temp;

    // Split landmarks into new (vn) and re-observed (vf) ones
    for (unsigned int j = 0; j < ptpairsCMin->size(); j ++)
    {

      ros::param::set("filter", true);	
      temp.x = (*pointsCMin)[j ].x;
      temp.y = (*pointsCMin)[j ].y;
      temp.z = (*pointsCMin)[j ].z;

      if ((*SDatabase)[(*ptpairsCMin)[j]].id == 0) // if new landmark
      {
//ROS_INFO("New Landmark");
//lnadmark added
	

        vn.push_back(temp);
        vrn.push_back(0.001);

        (*SDatabase)[(*ptpairsCMin)[j]].id = Map3D->map.size();
	idVec[(*ptpairsCMin)[j]] = Map3D->map.size();
        (*pointsCMin)[j].x = (*pointsCMin)[j].x + RoverTrajectory->tEST[*STEP].x;
        (*pointsCMin)[j].y = (*pointsCMin)[j].y + RoverTrajectory->tEST[*STEP].y;
        (*pointsCMin)[j].z = (*pointsCMin)[j].z + RoverTrajectory->tEST[*STEP].z;

        Map3D->addLandmark(Landmark(Map3D->map.size(), (*pointsCMin)[j], (idx - 3) / 3, 0.05));

        idx = idx + 3;
      }
      else
      {
        // Update EIF
//ROS_INFO("Update Landmark");
        ids.push_back(Map3D->map[idVec[(*ptpairsCMin)[j]]].matPos);

        vrf.push_back(Map3D->map[idVec[(*ptpairsCMin)[j]]].stddev);


        vf.push_back(temp);
      }
    }

    slam_filter_ptr_->recoverMean();
    slam_filter_ptr_->augment(vn, vrn);
    slam_filter_ptr_->update(vf, vrf, &ids);
    slam_filter_ptr_->recoverMean();


    RoverTrajectory->tEST[*STEP].x = (*slam_filter_ptr_->mu).at<double>(0, 0);
    RoverTrajectory->tEST[*STEP].y = (*slam_filter_ptr_->mu).at<double>(1, 0);
    RoverTrajectory->tEST[*STEP].z = (*slam_filter_ptr_->mu).at<double>(2, 0);

    // Publishing the rover's estimated position in ROS
    PMSLAM_Data_msg.TrajectoryOut.x = RoverTrajectory->tEST[*STEP].x;
    PMSLAM_Data_msg.TrajectoryOut.y = RoverTrajectory->tEST[*STEP].y;
    PMSLAM_Data_msg.TrajectoryOut.z = RoverTrajectory->tEST[*STEP].z;

//ROS_INFO("(%f, %f, %f)",PMSLAM_Data_msg.TrajectoryOut.x,PMSLAM_Data_msg.TrajectoryOut.y,PMSLAM_Data_msg.TrajectoryOut.z);

    // update map
    //#seg fault----------

    for (unsigned int i = 0; i < SDatabase->size(); ++i)
    {
      if ((idVec[i] > 0) && (idVec[i]< (int)Map3D->map.size()))
      {
        //ROS_INFO("IDIDID: %d\nsizesize: %d",(*SURFDatabase)[i].id, Map3D->map.size());
        //wrong id in database
        id = Map3D->map[idVec[i]].matPos * 3 + 3;

        Map3D->map[idVec[i]].position.x = (*slam_filter_ptr_->mu).at<double>(id, 0);
        Map3D->map[idVec[i]].position.y = (*slam_filter_ptr_->mu).at<double>(id + 1, 0);
        Map3D->map[idVec[i]].position.z = (*slam_filter_ptr_->mu).at<double>(id + 2, 0);

        // Assigning data to the feature position and gtruth vectors
        PMSLAM_Data_msg.MapOut.ID.push_back(idVec[i]);
        PMSLAM_Data_msg.MapOut.positions.y.push_back(Map3D->map[idVec[i]].position.x);
        PMSLAM_Data_msg.MapOut.positions.x.push_back(Map3D->map[idVec[i]].position.y);
        PMSLAM_Data_msg.MapOut.positions.z.push_back(Map3D->map[idVec[i]].position.z);
      }
    }
  }

  //remove re-mappings
  RoverTrajectory->tEST.clear();
  delete RoverTrajectory;
}
void PatientLandMarksWidget::setTargetLandmark(QString uid, Vector3D p_target)
{
	mServices->patient()->getPatientLandmarks()->setLandmark(Landmark(uid, p_target));
	reporter()->playSampleSound();
}
void LandmarkPatientRegistrationWidget::setTargetLandmark(QString uid, Vector3D p_target)
{
	mServices.patientModelService->getPatientLandmarks()->setLandmark(Landmark(uid, p_target));
	reporter()->playSampleSound();
}
Exemple #11
0
std::vector<Landmark> createLandmarks()
{
    std::vector<Landmark> lmks;

    SDL_Color color_red = {.r = 255, .g = 0, .b = 0, .a = 255 };
    SDL_Color color_green = {.r = 0, .g = 255, .b = 0, .a = 255 };
    SDL_Color color_blue = {.r = 0, .g = 0, .b = 255, .a = 255 };
    SDL_Color color_purple = {.r = 255, .g = 0, .b = 255, .a = 255 };

    lmks.push_back( Landmark(300.,300.,color_red));
    lmks.push_back( Landmark(124.,478.,color_blue));
//    lmks.push_back( Landmark(214.,312.,color_purple));

    return lmks;
}


int main() {

    if (SDL_Init(SDL_INIT_VIDEO) != 0){
        std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;
        return 1;
    }


    SDL_Window *win = SDL_CreateWindow("Robot Program", XSTART, YSTART, WWIDTH, WHEIGHT, SDL_WINDOW_SHOWN);
    if (win == nullptr){
        std::cout << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }

    SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    if (ren == nullptr){
        SDL_DestroyWindow(win);
        std::cout << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return 1;
    }


    std::vector<Landmark> landmarks = createLandmarks();

    SDL_Color orange {.r=255, .g=165, .b=0, .a=255};
    SDL_Color red {.r=255, .g=0, .b=0, .a=255};
    SDL_Color gray {.r=128, .g=128, .b=128, .a=255};

    Robot robby(200, 200, 0.0, 20, red);

    // Kalman filter stuff
    int n = 3; // number of state variables (x,y,phi)
    int m = 3; // number of measurements (landmark x, y, index)

    // Best guess of initial states
    Eigen::VectorXf x0(n); //[x, y, phi]
    x0 << 200., 200., 0.0;
    Robot robby_estimate(x0(0), x0(1), x0(2), 18, gray);

    // control vector:
    Eigen::VectorXf control(2); //  [v, omega]


    Eigen::MatrixXf A(n, n); // System dynamics matrix
    Eigen::MatrixXf C(m, n); // Output matrix
    Eigen::MatrixXf Q(n, n); // Process noise covariance
    Eigen::MatrixXf R(m, m); // Measurement noise covariance
    Eigen::MatrixXf covariance(n, n); // Estimate error covariance


    // Reasonable covariance matrices
    covariance <<    5., .0, .0,
                     .0, 5., .0,
                    .0, .0,  5.;

    R <<    1.0, 0., 0.,
            0., 1.0, 0.,
            0., 0.,  0.1;

    Q <<    0.1, 0.1, 0.1,
            0.1, 0.1, 0.1,
            0.1, 0.1, 0.1;

    KalmanFilter kf(DT, A, C, Q, R, covariance);

    float t0 = 0.0;
    kf.init(t0, x0);

    // rendering loop
    int i = 0;
    while (i < 10000) {

        //First clear the renderer
        SDL_RenderClear(ren);

        //Draw the texture
        SDL_SetRenderDrawColor(ren, 200, 200, 255, 255);

        SDL_RenderClear(ren); // fill the scene with white

        SDL_SetRenderDrawColor(ren, 0, 0, 0, 255);

        // update renderer
        SDL_RenderPresent(ren);

        // move robot
        SDL_PumpEvents();
        const Uint8 *key_pressed = SDL_GetKeyboardState(NULL);
        robby.move(key_pressed, control);

        // measure landmark positions
        auto observed_landmarks = robby.measureLandmarks(landmarks);

        // get robot state
        Eigen::VectorXf state = robby.get_state();

        // Localize via Landmarks
        kf.localization_landmarks(observed_landmarks, landmarks, control);

        // get estimated state (x,y,phi) as estimated by the EKF
        auto x_hat = kf.get_state();

        printf("True x,y,phi: %f, %f, %f\n", state(0), state(1),state(2));
        printf("Estimated x,y,phi: %f, %f, %f\n", x_hat(0), x_hat(1), x_hat(2));

        // move robby estimate to new pose as calculated by kalman filter:
        robby_estimate.setPose(x_hat(0), x_hat(1), x_hat(2));
        robby_estimate.render(ren);

        // render robot
        robby.render(ren);

        // render landmarks
        for (auto lm = landmarks.begin(); lm != landmarks.end(); ++lm)
        {
            SDL_SetRenderDrawColor(ren, lm->id.r, lm->id.g, lm->id.b, lm->id.a);
            lm->render(ren);
        }

        SDL_SetRenderDrawColor(ren, gray.r, gray.g, gray.b, gray.a);

        // render sampled probability distribution
        kf.renderSamples(ren);

        SDL_RenderPresent(ren);

        //Take a quick break after all that hard work
        SDL_Delay(30);


        if (key_pressed[SDL_SCANCODE_RETURN])
        {
            printf("Exiting Program!\n");
            break;
        }

        i+=1;
    }

    SDL_DestroyRenderer(ren);
    SDL_DestroyWindow(win);
    SDL_Quit();


    return EXIT_SUCCESS;
}
void mouseLeftPressed(float x, float y){
  landmarks.push_back(Landmark(x - (float)window_width/2 , ((float)window_height/2) - y));
}
void setDefaultLandmarkPositions(){
  landmarks.push_back(Landmark(-100,200));
  landmarks.push_back(Landmark(300,0));
  landmarks.push_back(Landmark(100,70));
}