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; }
//---------------------------------------------------------------------------- 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(); }
//---------------------------------------------------------------------------- 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); }