main.cpp

Simple example for a simulation of one robot (lpzrobots/ode_robots/simulations/template_onerobot/main.cpp).

00001 /***************************************************************************
00002  *   Copyright (C) 2005 by Robot Group Leipzig                             *
00003  *    martius@informatik.uni-leipzig.de                                    *
00004  *    fhesse@informatik.uni-leipzig.de                                     *
00005  *    der@informatik.uni-leipzig.de                                        *
00006  *                                                                         *
00007  *   This program is free software; you can redistribute it and/or modify  *
00008  *   it under the terms of the GNU General Public License as published by  *
00009  *   the Free Software Foundation; either version 2 of the License, or     *
00010  *   (at your option) any later version.                                   *
00011  *                                                                         *
00012  *   This program is distributed in the hope that it will be useful,       *
00013  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00014  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00015  *   GNU General Public License for more details.                          *
00016  *                                                                         *
00017  *   You should have received a copy of the GNU General Public License     *
00018  *   along with this program; if not, write to the                         *
00019  *   Free Software Foundation, Inc.,                                       *
00020  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00021  *                                                                         *
00022  *   $Log: main.cpp,v $
00023  *   Revision 1.14.4.12  2006/03/31 12:14:49  fhesse
00024  *   orange color for nimm robot
00025  *
00026  *   Revision 1.14.4.11  2006/03/31 11:27:53  fhesse
00027  *   documentation updated
00028  *   one sphere removed (todo: fix prob;em with sphere placing)
00029  *
00030  *   Revision 1.14.4.10  2006/01/12 15:17:46  martius
00031  *   *** empty log message ***
00032  *
00033  *   Revision 1.14.4.9  2005/12/29 15:55:33  martius
00034  *   end is obsolete
00035  *
00036  *   Revision 1.14.4.8  2005/12/29 15:47:12  martius
00037  *   changed to real Sim class
00038  *
00039  *   Revision 1.14.4.7  2005/12/14 15:37:25  martius
00040  *   *** empty log message ***
00041  *
00042  *   Revision 1.14.4.6  2005/12/13 18:12:09  martius
00043  *   switched to nimm2
00044  *
00045  *   Revision 1.14.4.5  2005/12/11 23:35:08  martius
00046  *   *** empty log message ***
00047  *
00048  *   Revision 1.14.4.4  2005/12/09 16:53:17  martius
00049  *   camera is working now
00050  *
00051  *   Revision 1.14.4.3  2005/12/06 10:13:25  martius
00052  *   openscenegraph integration started
00053  *
00054  *   Revision 1.14.4.2  2005/11/24 16:19:12  fhesse
00055  *   include corrected
00056  *
00057  *   Revision 1.14.4.1  2005/11/15 12:30:07  martius
00058  *   new selforg structure and OdeAgent, OdeRobot ...
00059  *
00060  *   Revision 1.14  2005/11/09 13:41:25  martius
00061  *   GPL'ised
00062  *
00063  ***************************************************************************/
00064 #include <stdio.h>
00065 
00066 // include ode library
00067 #include <ode/ode.h>
00068 
00069 // include noisegenerator (used for adding noise to sensorvalues)
00070 #include <selforg/noisegenerator.h>
00071 
00072 // include simulation environment stuff
00073 #include "simulation.h"
00074 
00075 // include agent (class for holding a robot, a controller and a wiring)
00076 #include "odeagent.h"
00077 
00078 // used wiring
00079 #include <selforg/one2onewiring.h>
00080 
00081 // used robot
00082 #include "nimm2.h"
00083 #include "nimm4.h"
00084 
00085 // used arena
00086 #include "playground.h"
00087 // used passive spheres
00088 #include "passivesphere.h"
00089 
00090 // used controller
00091 //#include <selforg/invertnchannelcontroller.h>
00092 #include <selforg/invertmotorspace.h>
00093 
00094 // fetch all the stuff of lpzrobots into scope
00095 using namespace lpzrobots;
00096 
00097 // plotoptions is a list of possible online output, 
00098 // if the list is empty no online gnuplot windows and no logging to file occurs.
00099 // The list is modified with commandline options, see main() at the bottom of this file
00100 list<PlotOption> plotoptions;
00101 
00102 class ThisSim : public Simulation {
00103 public:
00104 
00105   // starting function (executed once at the beginning of the simulation loop)
00106   void start(const OdeHandle& odeHandle, const OsgHandle& osgHandle, GlobalData& global) 
00107   {
00108     setCameraHomePos(Pos(5.2728, 7.2112, 3.31768), Pos(140.539, -13.1456, 0));
00109     // initialization
00110     // - set noise to 0.1
00111     // - register file chess.ppm as a texture called chessTexture (used for the wheels)
00112     global.odeConfig.noise=0.1;
00113     //  global.odeConfig.setParam("gravity", 0);
00114     //  int chessTexture = dsRegisterTexture("chess.ppm");
00115 
00116     // use Playground as boundary:
00117     // - create pointer to playground (odeHandle contains things like world and space the 
00118     //   playground should be created in; odeHandle is generated in simulation.cpp)
00119     // - setting geometry for each wall of playground: 
00120     //   setGeometry(double length, double width, double        height)
00121     // - setting initial position of the playground: setPosition(double x, double y, double z)
00122     // - push playground in the global list of obstacles(globla list comes from simulation.cpp)
00123     Playground* playground = new Playground(odeHandle, osgHandle, osg::Vec3(30, 0.2, 0.5));
00124     playground->setPosition(osg::Vec3(0,0,0)); // playground positionieren und generieren
00125     global.obstacles.push_back(playground);
00126 
00127     // add passive spheres as obstacles
00128     // - create pointer to sphere (with odehandle, osghandle and 
00129     //   optional parameters radius and mass,where the latter is not used here) )
00130     // - set Pose(Position) of sphere 
00131     // - set a texture for the sphere
00132     // - add sphere to list of obstacles
00133     for (int i=0; i<= 1/*2*/; i+=2){
00134       PassiveSphere* s1 = new PassiveSphere(odeHandle, osgHandle, 0.5);
00135       s1->setPosition(osg::Vec3(-4.5+i*4.5,0,0));
00136       s1->setTexture("Images/dusty.rgb");
00137       global.obstacles.push_back(s1);
00138     }
00139 
00140     // set color for nimm robot
00141     OsgHandle osgHandle_orange = osgHandle.changeColor(Color(2, 156/255.0, 0));
00142 
00143     // use Nimm2 vehicle as robot:
00144     // - get default configuration for nimm2
00145     // - activate bumpers, cigar mode and infrared front sensors of the nimm2 robot
00146     // - create pointer to nimm2 (with odeHandle, osg Handle and configuration)
00147     // - place robot
00148      Nimm2Conf c = Nimm2::getDefaultConf();
00149      c.bumper  = true;
00150      c.cigarMode  = true;
00151      c.irFront = true;
00152      OdeRobot* vehicle = new Nimm2(odeHandle, osgHandle_orange, c);    
00153      vehicle->place(Pos(2,0,0));
00154 
00155     // use Nimm4 vehicle as robot:
00156     // - create pointer to nimm4 (with odeHandle and osg Handle and possible other settings, see nimm4.h)
00157     // - place robot
00158     //OdeRobot* vehicle = new Nimm4(odeHandle, osgHandle);
00159     //vehicle->place(Pos(0,2,0));
00160 
00161     // create pointer to controller
00162     // push controller in global list of configurables
00163     //  AbstractController *controller = new InvertNChannelController(10);  
00164     AbstractController *controller = new InvertMotorSpace(10);  
00165     global.configs.push_back(controller);
00166   
00167     // create pointer to one2onewiring
00168     One2OneWiring* wiring = new One2OneWiring(new ColorUniformNoise(0.1));
00169 
00170     // create pointer to agent
00171     // initialize pointer with controller, robot and wiring
00172     // push agent in globel list of agents
00173     OdeAgent* agent = new OdeAgent(plotoptions);
00174     agent->init(controller, vehicle, wiring);
00175     global.agents.push_back(agent);
00176   
00177     showParams(global.configs);
00178   }
00179 
00180 
00181 };
00182 
00183 // print command line options
00184 void printUsage(const char* progname){
00185   printf("Usage: %s [-g] [-l]\n\t-g\tuse guilogger\n\t-l\tuse guilogger with logfile\n", progname);
00186 }
00187 
00188 int main (int argc, char **argv)
00189 { 
00190   // start with online windows (default: start without plotting and logging)
00191   if(contains(argv, argc, "-g")) plotoptions.push_back(PlotOption(GuiLogger));
00192   
00193   // start with online windows and logging to file
00194   if(contains(argv, argc, "-l")) plotoptions.push_back(PlotOption(GuiLogger_File));
00195   
00196   // display help
00197   if(contains(argv, argc, "-h")) printUsage(argv[0]);
00198 
00199   ThisSim sim;
00200   return sim.run(argc, argv) ? 0 : 1;
00201 
00202 }
00203  

Generated on Tue Apr 4 19:05:03 2006 for Robotsystem from Robot Group Leipzig by  doxygen 1.4.5