Frage

Ich bin neu in ROS ... und versuche, einen einfachen Zufallszahlengenerator zu erstellen, der die zufällig generierten Werte veröffentlichen. Dafür habe ich eine Positionsklasse erstellt:

include "stdlib.h"

namespace RandomPositionGenerator {


class Position {
private:
double x;
double y;
double z;
public:
Position();
void setPosition();
void getPosition(double &a, double &b, double &c);
};

Position::Position(){}

void Position::setPosition() {
x = rand();
y = rand();
z = rand();
}

void Position::getPosition(double &a, double &b, double &c) {
 a=x;
 b=y;
 c=z;

}

}

Und verwendete diese Klasse, um meinen Verlag zu erstellen:

include "ros/ros.h"
include "std_msgs/String.h"
include "sstream"
include "Position.cpp"

/**
 * This method generates position coordinates at random.
**/
int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");

    ros::NodeHandle n;
    ros::Publisher position_pub = n.advertise<RandomPositionGenerator:: Position>      ("position", 50);
    ros::Rate loop_rate(10);

    double pos_x=0;
    double pos_y=0;
    double pos_z=0;

    while (ros::ok())
    {
   RandomPositionGenerator:: Position pos;
   pos.setPosition();
   pos.getPosition(pos_x,pos_y,pos_z);

       ROS_INFO("The co-ordinates are : x=",pos_x);

       position_pub.publish(pos);
       ros::spinOnce();
       loop_rate.sleep();

    }


   return 0;
}

Und jetzt bekomme ich die folgenden Fehler:

  1. '__s_getDatatype' ist kein Mitglied von 'RandompositionGenerator :: Position' '
  2. '__s_getMd5sum' ist kein Mitglied von 'RandompositionGenerator :: Position' '
  3. 'Const Class RandompositionGenerator :: Position' hat kein Mitglied namens '__getDatatype'

Und ein paar ähnliche Fehler ... bitte korrigieren Sie mich ... Ich bin mir nicht sicher, wo ich falsch lage oder ob ich in diesem kleinen Stück Code etwas richtig gemacht habe!

War es hilfreich?

Lösung

Sie sollten eine tatsächliche ROS -Nachricht anstelle einer benutzerdefinierten Klasse für Daten verwenden, die Sie veröffentlichen/abonnieren möchten. Sehen http://wiki.ros.org/ros/tutorials/creatingmsgandsrv So erstellen Sie eine neue Nachricht, die Sie beim Veröffentlichen von Daten verwenden können. Die Verwendung einer ROS -Nachricht bedeutet auch, dass vorhandene ROS -Tools wie z. rostopic und ganze Sprachbindungen wie z. rospy für Python oder rosjava Für Java kann es leicht mit Ihrem C ++ - Knoten zusammenarbeiten.

Für diesen speziellen Fall können Sie einfach die Standard -ROS -Nachricht für einen 3D -Punkt verwenden. Geometry_msgs/Punkt. Sie finden eine ziemlich umfassende Liste der standardisierten Nachrichten in der Common_msgs Dokumentation. Die Verwendung einer standardisierten Nachricht bietet eine Reihe von Vorteilen beim Erstellen Ihrer eigenen Nachricht mit im Wesentlichen mit demselben Inhalt - das größte ist, dass es im ROS -Ökosystem viele Tools oder andere Softwarestücke gibt, die Sie später nutzen möchten, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein werden, die sein möchten, wird sein Ein ziemlich schmerzloser Prozess, wenn Sie bereits standardisierte Nachrichtentypen verwenden.

Wenn Sie wirklich Ihre benutzerdefinierte Positionsklasse verwenden müssen (ohne sie einfach in eine ROS -Nachricht zu konvertieren), können Sie sich das ansehen ROSCPP -Serialisierung Dokumentation. Ich würde stark Schlagen Sie vor der Serialisierung Ihrer benutzerdefinierten Klasse vor, anstatt entweder eine tatsächliche ROS -Nachricht oder eine standardisierte Nachricht zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top