Question

Je suis nouveau sur ROS ... et j'essaie de créer un simple générateur de nombres aléatoires, qui publiera les valeurs générées au hasard. Pour cela, j'ai créé une classe de position:

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;

}

}

et a utilisé cette classe pour créer mon éditeur:

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;
}

Et maintenant, j'obtiens les erreurs suivantes:

  1. '__s_getDatatype' n'est pas membre de 'RandompositionGenerator :: Position'
  2. '__s_getmd5sum' n'est pas membre de 'RandompositionGenerator :: Position'
  3. 'const Class RandompositionGenerator :: Position' n'a aucun membre nommé «__getDatatype»

Et quelques erreurs plus similaires ... s'il vous plaît, corrigez-moi ... Je ne sais pas où je vais mal, ou s'il y a quelque chose que j'ai fait correctement dans ce petit peu de code!

Était-ce utile?

La solution

Vous devez utiliser un message ROS réel au lieu d'une classe personnalisée pour les données auxquelles vous souhaitez publier / vous abonner. Voir http://wiki.ros.org/ros/tutorials/creatingmsgandsrv Pour créer un nouveau message que vous pouvez ensuite utiliser lors de la publication de données. L'utilisation d'un message ROS signifie également que les outils ROS existants tels que rostopic et des liaisons linguistiques entières telles que rospy pour python ou rosjava pour Java pourra facilement interagir avec votre nœud C ++.

Pour ce cas particulier, vous pouvez simplement utiliser le message ROS standard pour un point 3D, geometry_msgs / point. Vous pouvez trouver une liste assez complète des messages standardisés dans le Common_msgs Documentation. L'utilisation d'un message standardisé présente un certain nombre d'avantages sur la création de votre propre message avec essentiellement le même contenu - le plus important est qu'il existe de nombreux outils ou autres logiciels dans l'écosystème ROS que vous voudrez peut-être profiter plus tard, qui sera Un processus assez indolore si vous utilisez déjà des types de messages standard.

Si vous avez vraiment besoin d'utiliser votre classe de position personnalisée (sans simplement la convertir en un message ROS), vous pouvez consulter le Série ROSCPP Documentation. Je voudrais fortement Suggérez contre le sérialisation de votre classe personnalisée au lieu d'utiliser soit un message ROS réel que vous créez ou un message standardisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top