5

私は 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」という名前のメンバーがありません

およびいくつかの同様のエラー...私を修正してください...どこが間違っているのか、またはこの小さなコードで正しいことをしたかどうかはわかりません!

4

1 に答える 1

4

パブリッシュ/サブスクライブするデータのカスタム クラスではなく、実際の ROS メッセージを使用する必要があります。データを公開するときに使用できる新しいメッセージを作成する方法については、http://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrvを参照してください。ROS メッセージを使用すると、Python やJavarostopicなどの言語バインディング全体などの既存の ROS ツールが、C++ ノードと簡単に相互運用できるようになります。rospyrosjava

この特定のケースでは、3D ポイントの標準 ROS メッセージgeometry_msgs/Pointを単純に使用できます。標準化されたメッセージのかなり包括的なリストは、common_msgsドキュメントにあります。標準化されたメッセージを使用すると、本質的に同じ内容の独自のメッセージを作成するよりも多くの利点があります。最大の利点は、ROS エコシステムに後で利用したいツールやその他のソフトウェアが多数あることです。すでに標準化されたメッセージ タイプを使用している場合は、かなり簡単なプロセスです。

カスタム Position クラスを (単純に ROS メッセージに変換せずに) 使用する必要がある場合は、roscpp シリアライゼーションドキュメントを参照してください。作成した実際の ROS メッセージまたは標準化されたメッセージを使用する代わりに、カスタム クラスをシリアル化しないことを強くお勧めします。

于 2013-11-08T17:28:23.263 に答える