-         

Ergebnis 1 bis 5 von 5

Thema: Path Planning mit A*, C++ und Player

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    27.10.2006
    Beiträge
    22

    Path Planning mit A*, C++ und Player

    Anzeige

    Servus Leute,

    ich versuche gerade einen "Path Planning" Client zu schreiben der den A* Algorithmus verwendet. Dabei soll ein Roboter durch eine bekannte Umgebung mit bekannter Lokalisierung schnellst moeglich zu einem beliebigen Ziel befoerdert werden. Das ganze wird in C++ gemacht und die Sensordaten, Map Roboterdaten werden alle von Player (Libraries) geliefert. Zur Simulation wird "Stage" verwendet. Ein solcher Client hat die folgende Form:


    #include <libplayerc++/playerc++.h>
    #include <iostream>

    #include "args.h"

    #define RAYS 32

    int main(int argc, char **argv)
    {
    parse_args(argc,argv);

    // we throw exceptions on creation if we fail
    try
    {
    using namespace PlayerCc;

    PlayerClient robot(gHostname, gPort);
    Position2dProxy pp(&robot, gIndex);
    LaserProxy lp(&robot, gIndex);

    std::cout << robot << std::endl;

    pp.SetMotorEnable (true);

    // go into read-think-act loop
    for( ; ; )
    {
    double newspeed = 0;
    double newturnrate = 0;
    double minR = 1e9;
    double minL = 1e9;

    // this blocks until new data comes; 10Hz by default
    robot.Read();

    // laser avoid (stolen from esben's java example)
    uint count = lp.GetCount();
    for (uint j=0; j < count/2; ++j)
    {
    if (minR > lp[j])
    minR = lp[j];
    }
    for (uint j = count/2; j < count; ++j)
    {
    if (minL > lp[j])
    minL = lp[j];
    }
    std::cout << "minR: " << minR
    << "minL: " << minL
    << std::endl;

    double l = (1e5*minR)/500-100;
    double r = (1e5*minL)/500-100;

    if (l > 100)
    l = 100;
    if (r > 100)
    r = 100;

    newspeed = (r+l)/1e3;

    newturnrate = (r-l);
    newturnrate = limit(newturnrate, -40.0, 40.0);
    newturnrate = dtor(newturnrate);

    std::cout << "speed: " << newspeed
    << "turn: " << newturnrate
    << std::endl;

    // write commands to robot
    pp.SetSpeed(newspeed, newturnrate);
    }
    }
    catch (PlayerCc::PlayerError e)
    {
    std::cerr << e << std::endl;
    return -1;
    }
    }



    Dieser Client verwendet Laserdaten und verhindert durch seine Steuerung das kollidieren des Roboters mit Hindernissen.
    Falls sich jemand von euch schon mal mit "Path Planning" beschaeftigt hat und weiss, wie man das Ganze in C/C++ implementiert koennte er mir sehr weiterhelfen.

    Danke schonmal, Michi

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    03.01.2004
    Ort
    Pottenstein
    Alter
    38
    Beiträge
    265
    Moin moin!

    Weiß nicht, ob du die Seite vielleicht schon kennst:

    http://www.policyalmanac.org/games/aStarTutorial.htm

    Da gibt's auch ein paar Links und ich glaube auch Beispielcode.

    Gruß,
    Nils

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.03.2004
    Alter
    68
    Beiträge
    487
    ... oder diese Seite:
    http://theory.stanford.edu/%7Eamitp/...ing/index.html
    Sie hat unter
    3. Implementation notes
    b. Source code
    auch links zu C++ A*-Code.

    Gruß, Günter

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    27.10.2006
    Beiträge
    22
    Danke Jungs, dann werd ich mich da mal schlau machen.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    31.01.2004
    Ort
    36399
    Alter
    43
    Beiträge
    1.517
    Ich weiß zwar nicht was es mit dem Player auf sich hat.
    Aber ich habe den A* in einem Roboter Projekt realisiert.
    Der Code ist aus einen Packman spiel entliehen.

    In meiner Fuß zeile ist ein link auf das Projekt.

    Was brauchst du genau ?

    Gruß
    Home
    P: Meine Tochter (06.11.07) und Link
    M: Träumen hat nix mit Dummheit zu tun es ist die Möglichkeit neues zu erdenken

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •