Pregunta

Soy nuevo en ROS ... e intento crear un generador de números aleatorios simples, que publicará los valores generados al azar. Para esto creé una clase de posición:

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;

}

}

y usé esta clase para crear mi editor:

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

Y ahora recibo los siguientes errores:

  1. '__s_getDatatype' no es miembro de 'randompositionGenerator :: posición'
  2. '__s_getmd5sum' no es miembro de 'randompositionGenerator :: posición'
  3. 'const class randompositionGenerator :: position' no tiene miembro llamado '__getDatatype'

Y algunos errores más similares ... por favor, corrígeme ... ¡No estoy seguro de dónde me estoy equivocando, o si hay algo que hice bien en este pequeño código!

¿Fue útil?

Solución

Debe usar un mensaje ROS real en lugar de una clase personalizada para datos a los que le gustaría publicar/suscribirse. Ver http://wiki.ros.org/ros/tutorials/creatingmsgandsrv Para cómo crear un nuevo mensaje que pueda usar al publicar datos. Usar un mensaje ROS también significa que las herramientas ROS existentes como rostopic y enlaces de lenguaje enteros como rospy para python o rosjava Para Java podrá interoperar fácilmente con su nodo C ++.

Para este caso particular, simplemente puede usar el mensaje ROS estándar para un punto 3D, geometry_msgs/punto. Puede encontrar una lista bastante completa de los mensajes estandarizados en el común_msgs documentación. El uso de un mensaje estandarizado tiene una serie de beneficios sobre la creación de su propio mensaje con esencialmente el mismo contenido: lo más grande es que hay muchas herramientas u otras piezas de software en el ecosistema ROS que puede aprovechar más adelante, que será. Un proceso bastante indoloro si ya está utilizando tipos de mensajes estándar.

Si realmente tiene la necesidad de usar su clase de posición personalizada (sin simplemente convertirla en un mensaje ROS), puede mirar el serialización de Roscpp documentación. me gustaría fuertemente Sugiera que esté en serie su clase personalizada en lugar de usar un mensaje ROS real que cree o un mensaje estandarizado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top