Ошибки при создании узла ROS

Я новичок в ROS... и пытаюсь создать простой генератор случайных чисел, который будет публиковать случайно сгенерированные значения. Для этого я создал класс 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;

}

}

и использовал этот класс для создания моего издателя:

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

И теперь я получаю следующие ошибки:

  1. ‘__s_getDataType’ не является членом ‘RandomPositionGenerator::Position’
  2. ‘__s_getMD5Sum’ не является членом ‘RandomPositionGenerator::Position’
  3. ‘const class RandomPositionGenerator::Position’ не имеет члена с именем ‘__getDataType’

и еще несколько подобных ошибок... Пожалуйста, поправьте меня... Я не уверен, где я ошибаюсь, или есть ли что-то, что я сделал правильно в этом небольшом фрагменте кода!


person Preity    schedule 08.11.2013    source источник
comment
Похоже на какую-то проблему со сборкой... здесь недостаточно информации, чтобы понять, что пошло не так. (Вы не показали строки кода, которые генерировали эти сообщения об ошибках... это могло бы помочь.) Но #include "Position.cpp" выглядит как проблема - это очень необычно для файлов #include исходного кода (.cpp, а не .h); вы должны скомпилировать их по отдельности и объединить с помощью компоновщика. Я не знаком с ROS API, но мне интересно, пытались ли вы переопределить внутренний класс Position, который реализует отсутствующие методы, или вы должны их где-то наследовать?   -  person Jim Lewis    schedule 08.11.2013
comment
Я думаю, что сообщения ROS не позволяют моему пользовательскому классу Position быть допустимым msg_type, потому что в нем отсутствуют эти члены.... но я не знаю, где их найти или как реализовать их в моем классе Position   -  person Preity    schedule 08.11.2013


Ответы (1)


Вы должны использовать фактическое сообщение ROS вместо пользовательского класса для данных, которые вы хотите опубликовать/подписаться. Подробнее о том, как создайте новое сообщение, которое затем можно будет использовать при публикации данных. Использование сообщения ROS также означает, что существующие инструменты ROS, такие как rostopic, и целые языковые привязки, такие как rospy для Python или rosjava для Java, смогут легко взаимодействовать с вашим узлом C++.

В этом конкретном случае вы можете просто использовать стандартное сообщение ROS для трехмерной точки, geometry_msgs/Точка. Достаточно полный список стандартных сообщений можно найти в документации common_msgs. Использование стандартизированного сообщения имеет ряд преимуществ по сравнению с созданием собственного сообщения с практически таким же содержанием. Самым большим из них является то, что в экосистеме ROS существует множество инструментов или других программ, которыми вы, возможно, захотите воспользоваться позже, что будет довольно безболезненный процесс, если вы уже используете стандартизированные типы сообщений.

Если вам действительно нужно использовать собственный класс Position (без простого преобразования его в сообщение ROS), вы можете посмотреть ссылку сериализации roscpp. Я бы настоятельно не советовал бы сериализовать ваш пользовательский класс вместо использования фактического сообщения ROS, которое вы создаете, или стандартизированного сообщения.

person Eric Perko    schedule 08.11.2013
comment
Да... Думаю, это лучший подход... и большое спасибо за подсказки... действительно полезно. Спасибо! :) - person Preity; 09.11.2013