Example #1
0
  bool Esbot::
  Initialize(npm::RobotServer &server)
  {
    if ( !npm::RobotClient::Initialize(server))
      return false;

    m_cheat = server.CreateCheatSheet();

  shared_ptr<Hull> hull(CreateHull());
  for(HullIterator ih(*hull); ih.IsValid(); ih.Increment())
    server.AddLine(Line(ih.GetX0(), ih.GetY0(), ih.GetX1(), ih.GetY1()));
  const_cast<double &>(m_radius) = hull->CalculateRadius();
  
  robox_parameters params;	// make configurable... should we just subclass npm::Robox?
  
  m_front = server.DefineLidar(Frame(params.front_mount_x,
			      params.front_mount_y,
			      params.front_mount_theta),
			params.front_nscans,
			params.front_rhomax,
			params.front_phi0,
			params.front_phirange,
			params.front_channel)->GetScanner();
  m_rear = server.DefineLidar(Frame(params.rear_mount_x,
			     params.rear_mount_y,
			     params.rear_mount_theta),
		       params.rear_nscans,
		       params.rear_rhomax,
		       params.rear_phi0,
		       params.rear_phirange,
		       params.rear_channel)->GetScanner();

  m_drive = server.DefineDiffDrive(params.model_wheelbase, params.model_wheelradius);
  const RobotModel::Parameters modelParms(CreateRobotParameters(params));
  m_robotModel.reset(new RobotModel(modelParms, hull));
  m_motionController.reset(new MotionController(m_robotModel, m_hal));
  m_odometry.reset(new Odometry(m_hal));
  m_multiscanner.reset(new Multiscanner(m_hal));
  m_dynamicWindow.reset(new LegacyDynamicWindow(params.dwa_dimension,
						params.dwa_grid_width,
						params.dwa_grid_height,
						params.dwa_grid_resolution,
						m_robotModel,
						params.dwa_alpha_distance,
						params.dwa_alpha_heading,
						params.dwa_alpha_speed,
						true));
  
  m_multiscanner->Add(m_front);
  m_multiscanner->Add(m_rear);
  
  CreateGfxStuff(server, name);

  return true;
}
Example #2
0
//----------------------------------------------------------------------------
void ConvexHull3D::LoadData ()
{
    char filename[32];
    if (mCurrentFile < 10)
    {
        sprintf(filename, "data0%d.txt", mCurrentFile);
    }
    else
    {
        sprintf(filename, "data%d.txt", mCurrentFile);
    }

    std::string path = Environment::GetPathR(filename);
    std::ifstream inFile(path.c_str());
    assert(inFile);
    inFile >> mNumVertices;

    delete1(mVertices);
    mVertices = new1<Vector3f>(mNumVertices);
    int i;
    for (i = 0; i < mNumVertices; ++i)
    {
        inFile >> mVertices[i][0];
        inFile >> mVertices[i][1];
        inFile >> mVertices[i][2];
    }

    delete1(mColors);
    mColors = new1<Float3>(mNumVertices);
    for (i = 0; i < mNumVertices; ++i)
    {
        mColors[i] = Float3(Mathf::UnitRandom(), Mathf::UnitRandom(),
            Mathf::UnitRandom());
    }

    // Discard previous scene spheres.
    for (i = 2; i < mLimitedQuantity + 2; ++i)
    {
        mTrnNode->DetachChildAt(i);
    }

    mLimitedQuantity = mNumVertices;
    CreateHull();
}
Example #3
0
//----------------------------------------------------------------------------
bool ConvexHull3D::OnKeyDown (unsigned char key, int x, int y)
{
    switch (key)
    {
    // load a new data set
    case 'd':
    case 'D':
        if (++mCurrentFile == mFileQuantity)
        {
            mCurrentFile = 1;
        }

        LoadData();
        return true;

    // query type INT64
    case 'n':
    case 'N':
        mQueryType = Query::QT_INT64;
        strcpy(mHeader, "query type = INT64");
        RegenerateHull();
        return true;

    // query type INTEGER
    case 'i':
    case 'I':
        mQueryType = Query::QT_INTEGER;
        strcpy(mHeader, "query type = INTEGER");
        RegenerateHull();
        return true;

    // query type RATIONAL
    case 'r':
    case 'R':
        mQueryType = Query::QT_RATIONAL;
        strcpy(mHeader, "query type = RATIONAL");
        RegenerateHull();
        return true;

    // query type REAL (float)
    case 'f':
    case 'F':
        mQueryType = Query::QT_REAL;
        strcpy(mHeader, "query type = REAL");
        RegenerateHull();
        return true;

    // query type FILTERED
    case 'c':
    case 'C':
        mQueryType = Query::QT_FILTERED;
        strcpy(mHeader, "query type = FILTERED");
        RegenerateHull();
        return true;

    case 'w':
    case 'W':
        mWireState->Enabled = !mWireState->Enabled;
        return true;

    // Read the notes in ConvexHul3D.h about how to use mLimitedQuantity.
    case '+':
    case '=':
        if (mLimitedQuantity < mNumVertices)
        {
            for (int i = 2; i < mLimitedQuantity + 2; ++i)
            {
                mTrnNode->DetachChildAt(i);
            }
            ++mLimitedQuantity;
            CreateHull();
        }
        return true;
    case '-':
    case '_':
        if (mLimitedQuantity > 3)
        {
            for (int i = 2; i < mLimitedQuantity + 2; ++i)
            {
                mTrnNode->DetachChildAt(i);
            }
            --mLimitedQuantity;
            CreateHull();
        }
        return true;
    }

    return WindowApplication::OnKeyDown(key, x, y);
}