int main(int argc, char *argv[]) { // Create the world Enki::World world(200, 200); // Create a Khepera and position it Enki::EPuck *ePuck = new Enki::EPuck; ePuck->pos = Enki::Point(100, 100); ePuck->leftSpeed = 30; ePuck->rightSpeed = 20; // objects are garbage collected by the world on destruction world.addObject(ePuck); Enki::Polygone p; const double amount = 9; const double radius = 5; const double height = 20; for (double a = 0; a < 2*M_PI; a += 2*M_PI/amount) p.push_back(Enki::Point(radius * cos(a), radius * sin(a))); Enki::PhysicalObject* o = new Enki::PhysicalObject; Enki::PhysicalObject::Hull hull(Enki::PhysicalObject::Part(p, height)); o->setCustomHull(hull, 1); o->pos = Enki::Point(100, 100); o->setColor(Enki::Color(0.4,0.6,0.8)); world.addObject(o); // Run for some times for (unsigned i=0; i<10; i++) { // step of 50 ms world.step(0.05); std::cout << "E-puck pos is (" << ePuck->pos.x << "," << ePuck->pos.y << ")" << std::endl; } }
void TEnkiEnvironment::addCubeWithParameters (double x, double y, Enki::Color color, int objectNumber) { // Создаем полигон, являющийся основнанием куба Enki::Polygone p; p.push_back(Enki::Point(cubeSize/2.0,cubeSize/2.0)); p.push_back(Enki::Point(-cubeSize/2.0,cubeSize/2.0)); p.push_back(Enki::Point(-cubeSize/2.0,-cubeSize/2.0)); p.push_back(Enki::Point(cubeSize/2.0,-cubeSize/2.0)); Enki::PhysicalObject* o = new Enki::PhysicalObject; Enki::PhysicalObject::Hull hull(Enki::PhysicalObject::Part(p, cubeSize)); // Задаем форму куба o->setCustomHull(hull, -100000); // Отрицательная масса - то же, что бесконечная, поэтому куб сдвинуть с места будет невозможно )); o->collisionElasticity = 0; // Все тепло от столкновения поглощается o->setColor(color); o->pos = Enki::Point(x, y); o->objectNumber = objectNumber; world->addObject(o); }
void TEnkiEnvironment::loadEnvironment(std::string environmentFilename) { // Получаем параметры среды из файла std::ifstream environmentFile; environmentFile.open(environmentFilename.c_str()); string tmp_str; environmentFile >> tmp_str; // Считываем размеры прямоугольной арены xSize = atof(tmp_str.c_str()); environmentFile >> tmp_str; ySize = atof(tmp_str.c_str()); environmentFile >> tmp_str; xBirthMin = atof(tmp_str.c_str()); environmentFile >> tmp_str; xBirthMax = atof(tmp_str.c_str()); environmentFile >> tmp_str; yBirthMin = atof(tmp_str.c_str()); environmentFile >> tmp_str; yBirthMax = atof(tmp_str.c_str()); environmentFile >> tmp_str; // Считываем количество объектов в среде (по умолчанию - кубы) objectsNumber = atoi(tmp_str.c_str()); for (int i=0; i<objectsNumber; i++) { // Заполняем массив объектов, каждый из которых имеет позицию своего центра и цвет TEnkiObject someNewObject = TEnkiObject(); environmentFile >> tmp_str; someNewObject.x = atof(tmp_str.c_str()); environmentFile >> tmp_str; someNewObject.y = atof(tmp_str.c_str()); environmentFile >> tmp_str; someNewObject.color[0] = atof(tmp_str.c_str()); environmentFile >> tmp_str; someNewObject.color[1] = atof(tmp_str.c_str()); environmentFile >> tmp_str; someNewObject.color[2] = atof(tmp_str.c_str()); objectsArray.push_back(someNewObject); } environmentFile >> tmp_str; goalsNumber = atoi(tmp_str.c_str()); // Считываем количество целей for (int i=0; i<goalsNumber; i++) { // Заполняем массив целей, каждая из которых имеет длину последовательности, награду и саму последовательность посещения объектов TEnkiAim someNewAim = TEnkiAim(); environmentFile >> tmp_str; someNewAim.aimComplexity = atoi(tmp_str.c_str()); if (someNewAim.aimComplexity > someNewAim.MAX_AIM_COMPLEXITY) { cout << "Warning in TEnkiEnvironment: aim complexity can't be greater than the MAX_AIM_COMPLEXITY. Setting it to the MAX_AIM_COMPLEXITY by force now to avoid crash."; someNewAim.aimComplexity = someNewAim.MAX_AIM_COMPLEXITY; } environmentFile >> tmp_str; someNewAim.reward = atof(tmp_str.c_str()); for (int j=0; j<someNewAim.aimComplexity; j++) { environmentFile >> tmp_str; someNewAim.actionsSequence[j] = atoi(tmp_str.c_str()); if (someNewAim.actionsSequence[j] > objectsNumber) { cout << "Warning in TEnkiEnvironment: action number can't be greater than the number of objects. Setting it to the number of objects by force now to avoid crash."; someNewAim.actionsSequence[j] = objectsNumber; } } goalsArray.push_back(someNewAim); } //Переходим к постройке мира исходя из параметров, полученных из файла // Создаем саму арену world = new Enki::World(xSize, ySize, Enki::Color(0.1, 0.1, 0.1)); // Создаем объекты Enki::Polygone p2; p2.push_back(Enki::Point(cubeSize/2.0,cubeSize/2.0)); p2.push_back(Enki::Point(-cubeSize/2.0,cubeSize/2.0)); p2.push_back(Enki::Point(-cubeSize/2.0,-cubeSize/2.0)); p2.push_back(Enki::Point(cubeSize/2.0,-cubeSize/2.0)); for (int i = 0; i < objectsNumber; i++) { Enki::PhysicalObject* o = new Enki::PhysicalObject; Enki::PhysicalObject::Hull hull(Enki::PhysicalObject::Part(p2, cubeSize)); o->setCustomHull(hull, -100000); // Отрицательная масса - то же, что бесконечная, поэтому объекты сдвинуть с места будет невозможно o->setColor(Enki::Color(objectsArray.at(i).color[0]/255.0, objectsArray.at(i).color[1]/255.0, objectsArray.at(i).color[2]/255.0 )); o->collisionElasticity = 0; // Все тепло от столкновения поглощается o->pos = Enki::Point(objectsArray.at(i).x, objectsArray.at(i).y); o->objectNumber = i; world->addObject(o); //objectsInTheWorld.push_back(o); } // Создаем E-PUCK и размещаем его в среде ePuckBot = new Enki::EPuck(); ePuckBot->pos = Enki::Point(4.0, 4.0); ePuckBot->angle = 0; ePuckBot->leftSpeed = 0; ePuckBot->rightSpeed = 0; ePuckBot->objectNumber = -1; ePuckBot->setColor(Enki::Color(1, 0, 0)); world->addObject(ePuckBot); }