2013-11-08 2 views
2

Я новичок в ROS ... и пытаюсь создать простой генератор случайных чисел, который будет публиковать случайно генерируемые значения. Для этого я создал класс Должность:Ошибки при построении моего узла ROS

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 класс RandomPositionGenerator :: Положение» не имеет ни одного члена с именем «__getDataType»

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

+0

Кажется, что-то вроде проблемы сборки ... информации здесь недостаточно, чтобы понять, что пошло не так. (Вы не показывали строки кода, которые генерировали эти сообщения об ошибках ... которые могли бы помочь.) Но '#include" Position.cpp "выглядит как проблема - это очень необычно для исходного кода' # include' (.cpp в отличие от .h) файлов; вы должны скомпилировать их отдельно и объединить их с помощью компоновщика. Я не знаком с ROS API, но мне интересно, пытаетесь ли вы переопределить внутренний класс 'Position', который реализует отсутствующие методы или если вы должны наследовать их откуда-то? –

+0

Я думаю, что ROS-msgs не позволяют моей пользовательской позиции класса быть действительным msg_type bcz, не хватает этих членов .... но я не знаю, где их найти или как реализовать их в моем классе. Позиция – Preity

ответ

1

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

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

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

+0

Yea. .. Это лучший подход, я думаю ... и благодарю за то, что вы указали ... действительно полезно. Спасибо! :) – Preity