Example #1
0
void Simulation::move(VelocityControl *control) {
    if (!m_motionModel || !m_sensorModel) {
        return;
    }

    pfcpp::OdometryMotionModelSampler motion_model(m_motionModel->params());

    pfcpp::BeamSensorModel sensor_model(
        {m_sensorModel->maxRange(),
         {m_sensorModel->a0(), m_sensorModel->a1(), m_sensorModel->a2(), m_sensorModel->a3()},
         m_sensorModel->sigma(),
         m_sensorModel->lambda()});
    pfcpp::VelocityMotionModelSampler movement;
    pimpl->robot_pos = movement(pimpl->robot_pos, *control);

    std::vector<double> actual_measument;
    std::vector<pfcpp::maps::ShapesMap::Position> sense_points;
    std::tie(actual_measument, sense_points) = flatworld::measurement_with_coords(
        pimpl->robot_pos, pimpl->map, m_mcl->numberOfBeams(), m_sensorModel->maxRange());
    auto expected_measument = [&](auto p) {
        return flatworld::measurement(p, pimpl->map, m_mcl->numberOfBeams(),
                                      m_sensorModel->maxRange());
    };

    pimpl->pf([&](auto p) { return sensor_model(actual_measument, expected_measument(p)); },
              [&](auto p) { return motion_model(p, movement(p, *control)); });

    m_sensorBeams.clear();
    for (auto p : sense_points) {
        m_sensorBeams.push_back(std::make_shared<PointW>(QPointF{std::get<0>(p), std::get<1>(p)}));
    }

    m_currentPose->setPosition({pimpl->robot_pos.x, pimpl->robot_pos.y});

    updateParticlesList();
    emit updated();
}
int main(int argc,char** argv)
{
   double value;
   bool odom_laser_flag=false;
   string meas,meas_id;
   ifstream log_file;					// input file stream for log file
   istringstream log_stream;				// stream to parse log values
   
   mat laser_meas = zeros<mat>(n_laser_meas,1); 	// vector for laser measure
   mat odom_meas = zeros<mat>(n_odom_meas,1);   	// vector for odom measure
    
   mat map = parse_map(map_file_name);   	        // map in matrix form
   mat particles = initialize_particles(map); 	        // particles as (x,y,p)
   mat previous_pose = zeros<mat>(3,1);
   log_file.open(log_file_name.c_str());
   if(!log_file.is_open()){
    cout<<"log file not open\n";
    return 1;
   }
 // cout << particles << endl;
 for(int j=0;j<=log_length ;j++)
 {
   getline(log_file,meas);
   log_stream.str(meas + " ");
   log_stream >> meas_id;
  if(odom_laser_flag == false){
   if(meas_id == "O"){
     odom_laser_flag = true;
     for(int i=0;i<n_odom_meas;i++){
      log_stream >> value;
      odom_meas(i,0) = value; }
      if(j==1){
      previous_pose(0,0) = odom_meas(0,0);
      previous_pose(1,0) = odom_meas(1,0);
      previous_pose(2,0) = odom_meas(2,0);
      }
      particles=motion_model(particles,odom_meas,previous_pose);
      previous_pose(0,0) = odom_meas(0,0);
      previous_pose(1,0) = odom_meas(1,0);
      previous_pose(2,0) = odom_meas(2,0);
    }
  }
   if(odom_laser_flag == true)
   {  
   if(meas_id == "L"){
     odom_laser_flag = false;
     for(int i=0;i<n_laser_meas;i++){
      log_stream >> value;
      laser_meas(i,0) = value; }
      odom_meas(0,0) = laser_meas(0,0);
      odom_meas(1,0) = laser_meas(1,0);
      odom_meas(2,0) = laser_meas(2,0);
      particles=motion_model(particles,odom_meas,previous_pose);
      particles=sensor_model(map,particles,laser_meas,j);
      previous_pose(0,0) = laser_meas(0,0);
      previous_pose(1,0) = laser_meas(1,0);
      previous_pose(2,0) = laser_meas(2,0);
      particles = resample(particles,j);
    }
   to_cvmat(map,particles,j);
  }