2017-11-01 19 views
2

私は最近、Protobufメッセージを利用してMOOS &の仕事で大きなコードベースを継承しました。Protobufを同様の機能を持つROSメッセージに変換する

私のプロジェクトリーダーの要請で、私はROSをprotobufの代わりに使用するROSのみを使うように移植しています。コードベースは、列挙子の最小/最大などのprotobuf機能の利用、変数フィールドからの文字列の抽出、 - > has_variable()関数、 - > isValid()などに依存します。

これまでのところ、非常に基本的なROSメッセージ機能をwikiから見つけることができます。

このタイプの可撓性を持つ「ハック」などはありますか?

例:Protbufsサポート列挙子が、ROSのメッセージがないので、私は持っている:

uint8 TYPE_FAILED  = 0 
    uint8 TYPE_OPERATIONAL = 1 
    uint8 TYPE_INITIALIZING = 2 

    uint8 health_state_type 

health_state_typeは私の「列挙」ですが、私は1をハードコードしない限り、私はminまたはmaxを持っていません、私はTYPE_FAILEDを文字列として抽出できません。私はゆっくりと

my_message::custom_msg health; 
health.health_state_type = health.TYPE_FAILED 

を使用して、このための回避策を見つけてきた。しかし、私は、文字列ではなく整数としてそれを使用する多くの異なる領域を変更することです。

答えて

2

はいいいえ、ハックがあります。しかし、あなたはそれにいくつかの作業を入力する必要があります。 ROSでパブリッシャ/サブスクライバのメソッドを使用するには、すべてのトピックのメッセージを.msgファイルに定義する必要があります。

このファイルから、C++クラスが自動的に生成されます。しかし、あなたはその自動生成されたファイルに触れたくありません!代わりにあなたのクラスを定義し、それを自動生成されたクラスに関連付けることができます。

ルックの例はhereです。次に、isValidのようなメソッドを使用してカスタムクラスを拡張することができます。

別の(おそらくもっと単純な)方法は、メッセージの各タイプに対して望ましい作業を行うヘルパークラスを宣言することです。

また、protobufをそのまま使用することもできます。 ROSにもない場合は、少なくともガゼボでも使用されます。

0

いつか私はProtobufsを消費し、ROS通信経由でProtobufブロブを送信するためにROSヘッダ(ではなく、 msgファイル)を生成するいくつかの自動生成スクリプトを書きました。これは、Protobufの定義をサポートするROS msg定義と重複させることなく、あなたの必要性を満たすでしょう。 Code

関連する問題