Example #1
0
void GraphSLAM::addData(SE2 currentOdom, RobotLaser* laser){
  boost::mutex::scoped_lock lockg(graphMutex);

  //Add current vertex
  VertexSE2 *v = new VertexSE2;

  SE2 displacement = _lastOdom.inverse() * currentOdom;
  SE2 currEst = _lastVertex->estimate() * displacement;

  v->setEstimate(currEst);
  v->setId(++_runningVertexId + idRobot() * baseId());
  //Add covariance information
  //VertexEllipse *ellipse = new VertexEllipse;
  //Matrix3f cov = Matrix3f::Zero(); //last vertex has zero covariance
  //ellipse->setCovariance(cov);
  //v->setUserData(ellipse);
  v->addUserData(laser);

  std::cout << std::endl << 
    "Current vertex: " << v->id() << 
    " Estimate: "<< v->estimate().translation().x() << 
    " " << v->estimate().translation().y() << 
    " " << v->estimate().rotation().angle() << std::endl;

  _graph->addVertex(v);

  //Add current odometry edge
  EdgeSE2 *e = new EdgeSE2;
  e->setId(++_runningEdgeId + idRobot() * baseId());
  e->vertices()[0] = _lastVertex;
  e->vertices()[1] = v;
      
  e->setMeasurement(displacement);
  
  // //Computing covariances depending on the displacement
  // Vector3d dis = displacement.toVector();
  // dis.x() = fabs(dis.x());
  // dis.y() = fabs(dis.y());
  // dis.z() = fabs(dis.z());
  // dis += Vector3d(1e-3,1e-3,1e-2);  
  // Matrix3d dis2 = dis*dis.transpose();
  // Matrix3d newcov = dis2.cwiseProduct(_odomK);

  e->setInformation(_odominf);
  _graph->addEdge(e);

  _odomEdges.insert(e);

  _lastOdom = currentOdom;
  _lastVertex = v;
}
Example #2
0
void GraphSLAM::setInitialData(SE2 initialTruePose, SE2 initialOdom, RobotLaser* laser){
  boost::mutex::scoped_lock lockg(graphMutex);

  _lastOdom = initialOdom;
  //Add initial vertex
  _lastVertex = new VertexSE2;

  _lastVertex->setEstimate(initialTruePose);
  _lastVertex->setId(idRobot() * baseId());

  //Add covariance information
  //VertexEllipse *ellipse = new VertexEllipse();
  //Matrix3f cov = Matrix3f::Zero(); //last vertex has zero covariance
  //ellipse->setCovariance(cov);
  //_lastVertex->setUserData(ellipse);
  _lastVertex->setUserData(laser);
  
  std::cout << 
    "Initial vertex: " << _lastVertex->id() << 
    " Estimate: "<< _lastVertex->estimate().translation().x() << 
    " " << _lastVertex->estimate().translation().y() << 
    " " << _lastVertex->estimate().rotation().angle() << std::endl;

  _graph->addVertex(_lastVertex);

  _firstRobotPose = _lastVertex;
  _firstRobotPose->setFixed(true);
}
Example #3
0
	int CategoryTree::OnCompareItems( const wxTreeItemId& p_item1, const wxTreeItemId& p_item2 ) {
		int Result = 0;
		auto itemData1 = static_cast<const CategoryTreeItem*>( this->GetItemData( p_item1 ) );
		auto itemData2 = static_cast<const CategoryTreeItem*>( this->GetItemData( p_item2 ) );

		if ( itemData1->dataType() == CategoryTreeItem::DT_Entry && itemData2->dataType() == CategoryTreeItem::DT_Entry ) {
			auto itemEntry1 = static_cast<const DatIndexEntry*>( itemData1->data() );
			auto itemEntry2 = static_cast<const DatIndexEntry*>( itemData2->data() );

			if ( itemEntry1->baseId() > itemEntry2->baseId() ) {
				Result = 1;
			} else if ( itemEntry1->baseId() < itemEntry2->baseId() ) {
				Result = -1;
			}
		}
		return Result;
	}
Example #4
0
bool DatIndexWriter::write(uint p_amount)
{
    for (uint i = 0; i < p_amount; i++) {
        ssize_t bytesWritten;

        // First write categories, one at a time
        if (m_categoriesWritten < m_index.numCategories()) {
            auto category    = m_index.category(m_categoriesWritten);
            auto parent      = category->parent();
            wxScopedCharBuffer nameBuffer = category->name().ToUTF8();
            // Fixed-width fields
            DatIndexCategoryFields fields;
            fields.parent     = (parent ? parent->index() : -1);
            fields.nameLength = nameBuffer.length();
            bytesWritten = m_file.Write(&fields, sizeof(fields));
            if (bytesWritten < sizeof(fields)) { return false; }
            // Name
            bytesWritten = m_file.Write(nameBuffer, fields.nameLength);
            if (bytesWritten < fields.nameLength) { return false; }
            // Increase the counter
            m_categoriesWritten++;
        }

        // Then, write entries one at a time (note the 'else')
        else if (m_entriesWritten < m_index.numEntries()) {
            auto entry      = m_index.entry(m_entriesWritten);
            auto category   = entry->category();
            auto nameBuffer = entry->name().ToUTF8();
            // Fixed-width fields
            DatIndexEntryFields fields;
            fields.category   = category->index();
            fields.baseId     = entry->baseId();
            fields.fileId     = entry->fileId();
            fields.mftEntry   = entry->mftEntry();
            fields.fileType   = entry->fileType();
            fields.nameLength = nameBuffer.length();
            bytesWritten = m_file.Write(&fields, sizeof(fields));
            if (bytesWritten < sizeof(fields)) { return false; }
            // Name
            bytesWritten = m_file.Write(nameBuffer, fields.nameLength);
            if (bytesWritten < fields.nameLength) { return false; }
            // Increase the counter
            m_entriesWritten++;
        }

        // Both done = ditch this loop
        else {
            break;
        }
    }

    // Remove dirty flag if everything is saved
    if (this->isDone()) {
        m_index.setDirty(false);
    }

    return true;
}
				void WordParagraphReader::Accept(DocumentText::ptr_type docText, const WrdTextRun& textRun, const long startIndex, const std::wcstring& currentText)
				{
					if(docText == 0)
						return;

					try
					{
						std::wcstring bufferText(currentText);

						std::string::size_type localStartPos = startIndex;
						AbstractTextNode::id_type baseId(_LL("METADATA_"));
						baseId += ReaderHelpers::MakeNumberString((TEXT_TYPE_MAIN));
						baseId += _LL("_");

						if(!bufferText.empty())
						{
							m_currentText.push_back(bufferText);
							std::wcstring currentParagraphText;
							while(ReaderHelpers::GetNextStringFromStringList(m_currentText, currentParagraphText, m_iPos))
							{
								AbstractTextNode::id_type id = baseId + ReaderHelpers::MakeNumberString((localStartPos));
								id += _LL("_");
								id += ReaderHelpers::MakeNumberString((currentParagraphText.size()));
								
								localStartPos += currentParagraphText.size();

								AbstractTextNode::ptr_type textNode = docText->GetTextNode(id);
								if(textNode == 0)
								{
									textNode = new TextNode(id);
									textNode->AddAdditionalInfo(docText, _LL("Content"), currentParagraphText, AbstractTextNode::String);
								}

								docText->AddTextNode(AbstractTextType::Paragraph, textNode);
							}
						}
					}
					catch (CsException& ex)
					{
						throw std::logic_error("An error occurred reading the paragraph text of the word document : " + ReaderHelpers::ConstructErrorText(ex));
					}
					catch(...)
					{
						throw std::logic_error("An unhandled exception occurred while reading the paragraph text of the word document");
					}
				}
Example #6
0
CurrDisplay::CurrDisplay(QWidget * parent, const char* name)
    : QWidget(parent, name)
{
    setObjectName("CurrDisplay");
    setWindowTitle("CurrDisplay");

    _grid = new QGridLayout(this);
    _grid->setMargin(2);
    _grid->setSpacing(2);

    _valueLocalWidget = new XLineEdit(this);
    _valueLocalWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
    _valueLocalWidget->setMinimumWidth(QFontMetrics(QFont()).width("99999.9999"));
    _grid->addWidget(_valueLocalWidget, 0, 0);

    _valueLocalWidget->setAlignment(Qt::AlignRight|Qt::AlignTop);

    setLayout(_grid);
    connect(this, SIGNAL(valueLocalChanged(const double)),
            this, SIGNAL(valueChanged()));
    connect(this, SIGNAL(valueBaseChanged(const double)),
            this, SIGNAL(valueChanged()));
    _localId = baseId();
    _localScale = _baseScale;

    _effective = QDate().currentDate();
    _decimals = 0;
    _format = Money;
    _default = 0;
    clear();

    setEnabled(FALSE);
    setLocalControl(TRUE);
    setMinimumSize(MINWIDTH, 0);
    setMaximumSize(MAXWIDTH, MAXHEIGHT);

    _mapper = new XDataWidgetMapper(this);
}
Example #7
0
QString CurrDisplay::baseCurrAbbr()
{
    (void)baseId();
    return _baseAbbr;
}
Example #8
0
/* compute statistics on leaving variable 
   Compute a set of statistical values on the variable selected for leaving the
   basis.
 */
void SPxSolver::getLeaveVals(
   int leaveIdx,
   SPxBasis::Desc::Status& leaveStat,
   SPxId& leaveId,
   Real& leaveMax,
   Real& leavebound,
   int& leaveNum)
{
   METHOD( "SPxSolver::getLeaveVals()" );
   SPxBasis::Desc& ds = desc();
   leaveId = baseId(leaveIdx);

   if (leaveId.isSPxRowId())
   {
      leaveNum = number(SPxRowId(leaveId));
      leaveStat = ds.rowStatus(leaveNum);

      assert(isBasic(leaveStat));
      switch (leaveStat)
      {
      case SPxBasis::Desc::P_ON_UPPER :
         assert( rep() == ROW );
         ds.rowStatus(leaveNum) = dualRowStatus(leaveNum);
         leavebound = 0;
         leaveMax = -infinity;
         break;
      case SPxBasis::Desc::P_ON_LOWER :
         assert( rep() == ROW );
         ds.rowStatus(leaveNum) = dualRowStatus(leaveNum);
         leavebound = 0;
         leaveMax = infinity;
         break;
      case SPxBasis::Desc::P_FREE :
         assert( rep() == ROW );
         throw SPxInternalCodeException("XLEAVE01 This should never happen.");
      case SPxBasis::Desc::D_FREE :
         assert( rep() == COLUMN );
         ds.rowStatus(leaveNum) = SPxBasis::Desc::P_FIXED;
         assert(lhs(leaveNum) == rhs(leaveNum));
         leavebound = -rhs(leaveNum);
         if ((*theFvec)[leaveIdx] < theLBbound[leaveIdx])
            leaveMax = infinity;
         else
            leaveMax = -infinity;
         break;
      case SPxBasis::Desc::D_ON_LOWER :
         assert( rep() == COLUMN );
         ds.rowStatus(leaveNum) = SPxBasis::Desc::P_ON_UPPER;
         leavebound = -rhs(leaveNum);                // slack !!
         leaveMax = infinity;
         break;
      case SPxBasis::Desc::D_ON_UPPER :
         assert( rep() == COLUMN );
         ds.rowStatus(leaveNum) = SPxBasis::Desc::P_ON_LOWER;
         leavebound = -lhs(leaveNum);                // slack !!
         leaveMax = -infinity;
         break;
      case SPxBasis::Desc::D_ON_BOTH :
         assert( rep() == COLUMN );
         if ((*theFvec)[leaveIdx] > theLBbound[leaveIdx])
         {
            ds.rowStatus(leaveNum) = SPxBasis::Desc::P_ON_LOWER;
            theLRbound[leaveNum] = -infinity;
            leavebound = -lhs(leaveNum);            // slack !!
            leaveMax = -infinity;
         }
         else
         {
            ds.rowStatus(leaveNum) = SPxBasis::Desc::P_ON_UPPER;
            theURbound[leaveNum] = infinity;
            leavebound = -rhs(leaveNum);            // slack !!
            leaveMax = infinity;
         }
         break;

      default:
         throw SPxInternalCodeException("XLEAVE02 This should never happen.");
      }
      MSG_DEBUG( spxout << "DLEAVE51 SPxSolver::getLeaveVals() : row " << leaveNum
                        << ": " << leaveStat
                        << " -> " << ds.rowStatus(leaveNum)
                        << std::endl; )
   }
Example #9
0
bool GraphSLAM::isMyVertex(OptimizableGraph::Vertex *v){
  return (v->id()/baseId()) == idRobot();
}
Example #10
0
void GraphSLAM::addDataSM(SE2 currentOdom, RobotLaser* laser){
  boost::mutex::scoped_lock lockg(graphMutex);

  //Add current vertex
  VertexSE2 *v = new VertexSE2;

  SE2 displacement = _lastOdom.inverse() * currentOdom;
  SE2 currEst = _lastVertex->estimate() * displacement;

  v->setEstimate(currEst);
  v->setId(++_runningVertexId + idRobot() * baseId());
  //Add covariance information
  //VertexEllipse *ellipse = new VertexEllipse;
  //Matrix3f cov = Matrix3f::Zero(); //last vertex has zero covariance
  //ellipse->setCovariance(cov);
  //v->setUserData(ellipse);
  v->addUserData(laser);

  std::cout << endl << 
    "Current vertex: " << v->id() << 
    " Estimate: "<< v->estimate().translation().x() << 
    " " << v->estimate().translation().y() << 
    " " << v->estimate().rotation().angle() << std::endl;

  _graph->addVertex(v);

  //Add current odometry edge
  EdgeSE2 *e = new EdgeSE2;
  e->setId(++_runningEdgeId + idRobot() * baseId());
  e->vertices()[0] = _lastVertex;
  e->vertices()[1] = v;
      

  OptimizableGraph::VertexSet vset;
  vset.insert(_lastVertex);
  int j = 1;
  int gap = 5;
  while (j <= gap){
    VertexSE2 *vj =  dynamic_cast<VertexSE2 *>(graph()->vertex(_lastVertex->id()-j));
    if (vj)
      vset.insert(vj);
    else
      break;
    j++;
  }

  SE2 transf;
  bool shouldIAdd = _closeMatcher.closeScanMatching(vset, _lastVertex, v,  &transf, maxScore);

  if (shouldIAdd){
    e->setMeasurement(transf);
    e->setInformation(_SMinf);
  }else{ //Trust the odometry
    e->setMeasurement(displacement);
    // Vector3d dis = displacement.toVector();
    // dis.x() = fabs(dis.x());
    // dis.y() = fabs(dis.y());
    // dis.z() = fabs(dis.z());
    // dis += Vector3d(1e-3,1e-3,1e-2);  
    // Matrix3d dis2 = dis*dis.transpose();
    // Matrix3d newcov = dis2.cwiseProduct(_odomK);
    // e->setInformation(newcov.inverse());

    e->setInformation(_odominf);
  }

  _graph->addEdge(e);

  _lastOdom = currentOdom;
  _lastVertex = v;
}
Example #11
0
// -----------------------------------------------------------------
void SPxSolver::perturbMax(
   const UpdateVector& uvec,
   Vector& p_low,
   Vector& p_up,
   Real eps,
   Real p_delta,
   int start,
   int incr) 
{
   assert(uvec.dim() == p_low.dim());
   assert(uvec.dim() == p_up.dim());

   const Real* vec = uvec.get_const_ptr();
   const Real* upd = uvec.delta().values();
   const IdxSet& idx = uvec.delta().indices();
   Random mult(10.0 * p_delta, 100.0 * p_delta);
   Real x, l, u;
   int i, j;

#ifdef  FULL_SHIFT
   eps = p_delta;
   for (i = uvec.dim() - start - 1; i >= 0; i -= incr)
   {
      u = p_up[i];
      l = p_low[i];
      if (p_up[i] <= vec[i] + eps)
      {
         p_up[i] = vec[i] + Real(mult);
         theShift += p_up[i] - u;
      }
      if (p_low[i] >= vec[i] - eps)
      {
         p_low[i] = vec[i] - Real(mult);
         theShift -= p_low[i] - l;
      }
   }

#else   // !FULL_SHIFT
   for (j = uvec.delta().size() - start - 1; j >= 0; j -= incr)
   {
      i = idx.index(j);
      x = upd[i];
      u = p_up[i];
      l = p_low[i];

      // do not permute these bounds! c.f. computeFrhs2() in spxvecs.cpp
      if( dualStatus(baseId(i)) == SPxBasis::Desc::D_ON_BOTH )
      {
         continue;
      }

      if (x > eps)
      {
         if (u != l && vec[i] >= u - eps)
         {
            p_up[i] = vec[i] + Real(mult);
            theShift += p_up[i] - u;
         }
      }
      else if (x < -eps)
      {
         if (u != l && vec[i] <= l + eps)
         {
            p_low[i] = vec[i] - Real(mult);
            theShift -= p_low[i] - l;
         }
      }
   }
#endif  // !FULL_SHIFT
}