Announcement

Collapse
No announcement yet.

Auslesen des Hokuyo Laserscanners mit der RobotinoAPI2

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Auslesen des Hokuyo Laserscanners mit der RobotinoAPI2

    Hallo zusammen,

    wie mit dem Vertrieb von FESTO besprochen, wende ich mich mit meinem Problem um das Auslesen eines Laserscanners in das Forum.

    Ich verwende den Robotino3 mit der RobotinoAPI2 und habe langfristig das Ziel, in C++ einen SLAM-Algorithmus zu implementieren.
    Hierfür benötige ich unter anderem die Daten eines nachträglich installierten Hokuyo URG.

    Ich habe nach Vorlage aus Beispielprogrammen und dem ROS package "robotino_node" folgenden Code verwendet:




    #include <Eigen/Dense>
    #include <chrono>
    #include <cmath>
    #include <iostream>
    #include <thread>

    #include "RobotinoCommunication.h"
    #include "RobotinoDrive.h"
    #include "RobotinoSense.h"
    #include "Room.h"
    #include "rec/robotino/api2/all.h"

    using namespace rec::robotino::api2;
    using namespace Eigen;
    using namespace std;

    void init(RobotinoCommunication &com, OmniDrive &omniDrive)
    {

    omniDrive.setComId(com.id());

    std::cout << "Connecting..." << std::endl;
    com.setAddress("172.26.1.1");
    com.connectToServer();
    std::cout << std::endl << "Connected" << std::endl;
    }


    void scanEvent(const LaserRangeFinderReadings &scan)
    {
    const float *readings;
    unsigned int numReadings = scan.numRanges();
    scan.ranges(&readings, &numReadings);

    cout << "ranges = " << readings << endl;

    std::vector<double> ranges(numReadings);
    for(int i = 0; i < numReadings; i++)
    {
    ranges[i] = readings[i];
    }

    for(int i = 0; i < numReadings; i++)
    {
    cout << "ranges " << i << " = " << ranges[i] << endl;
    }
    }

    void destroy(RobotinoCommunication &com)
    {
    com.disconnectFromServer();
    }

    int main()
    {
    OmniDrive omniDrive;
    RobotinoCommunication com;
    LaserRangeFinder laser;
    LaserRangeFinderReadings scan;

    init(com, omniDrive);

    scan = laser.readings();
    scanEvent(scan);

    destroy(com);
    }


    Beim Ausführen des Programmes erhalte ich folgenden Output:

    Constructor of RobotinoCommunication
    Connecting...

    Connected
    sizeof readings: 0
    ranges = 0

    Nach mehrfachem Probieren wurde mir tatsächlich einmalig Array mit ranges ausgegeben, ohne an dem Programmcode eine Änderung durchzuführen. Beim wiederholten Ausführen erhielt ich jedoch erneut den oben beschriebenen Output.


    Dem Anschein nach wird die erzeugte Instanz "scan" nicht mit Informationen gefüllt und wie im Header "LaserRangeFinderReadings.h" beschrieben lediglich mit Default-Werten initialisiert.


    Vielen Dank im Voraus!

  • #2
    Das Programm ist ja immer sofort wieder zu Ende. Es dauert natürlich eine Weile, bis mal Werte da sind.

    Code:
    for(;;)
    {
      com.processEvents();
      rec::robotino::api2::msleep( 100 );
    }

    Comment


    • #3
      Vielen Dank für die Antwort. Ich hab es allerdings auch mit Sleeps versucht und ohne die 'processEvents'-Funktion leider keinen Erfolg gehabt.

      Comment

      Working...
      X