我是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;
}
现在我收到以下错误:
以及一些更类似的错误...请纠正我......我不确定我哪里出错了,或者我在这一小段代码中做了什么!
答案 0 :(得分:1)
对于您要发布/订阅的数据,您应该使用实际的ROS消息而不是自定义类。有关如何创建可在发布数据时使用的新消息,请参阅http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv。使用ROS消息还意味着现有的ROS工具(如rostopic
)和整个语言绑定(例如Python的rospy
或Java的rosjava
将能够轻松地与您的C ++节点进行互操作。 / p>
对于这种特殊情况,您可以简单地将标准ROS消息用于3D点geometry_msgs/Point。您可以在common_msgs文档中找到相当全面的标准化消息列表。使用标准化消息比使用基本相同的内容创建自己的消息有许多好处 - 最大的一点是ROS生态系统中有许多工具或其他软件,您可能希望以后利用它们,这将是如果您已经使用了标准化的消息类型,那么这是一个相当轻松的过程。
如果您确实需要使用自定义Position类(而不是简单地将其转换为ROS消息),则可以查看roscpp serialization文档。我强烈建议不要使用您创建的实际ROS消息或标准化消息来序列化您的自定义类。