rosトピック通信について

1,182 views
Skip to first unread message

牧原昂志

unread,
Jan 13, 2017, 6:39:30 AM1/13/17
to ROS JAPAN Users Group

学生です.コールバック関数について質問があります.

配信者側のプログラムで
    ros::NodeHandle nh;

    ros::Publisher ros_tutorial_point = nh.advertise<geometry_msgs::Point>("ros_tutorial_msg",100);

    ros::Publisher ros_tutorial_vector = nh.advertise<geometry_msgs::Vector3>("ros_tutorial_msgg",100);

と宣言して,

        ros_tutorial_point.publish(point);
        ros_tutorial_vector.publish(vector);

と2種類のメッセージを送るとします.

次に,購読者側のプログラムで,

    ros::NodeHandle nh;

    ros::Subscriber ros_tutorial_point = nh.subscribe("ros_tutorial_msg", 100, msgCallback);
    ros::Subscriber ros_tutorial_vector = nh.subscribe("ros_tutorial_msgg", 100, msgCallbacks);

と宣言し,2種類のメッセージを購読します.
その後,コールバック関数で

void msgCallback(const geometry_msgs::Point::ConstPtr& point)
{
    ROS_INFO("recieve point: %f", point->x);
}

void msgCallbacks(const geometry_msgs::Vector3::ConstPtr& vector)
{
    ROS_INFO("recieve vector: %f", vector->x);
}

と2つの関数はそれぞれ1種類ずつのメッセージを引数としてあります

この場合は問題なく2つのメッセージを受信できるのですが,

コールバック関数を一つにすることは可能でしょうか.

単純に,

void msgCallback(const geometry_msgs::Point::ConstPtr& point, const geometry_msgs::Vector3::ConstPtr& vector)
{
    ROS_INFO("recieve point: %f", point->x);
    ROS_INFO("recieve vector: %f", vector->x);
}

としてしまうとエラーが出てしまいます.

何か方法があればお願いします.

Ryosuke Tajima

unread,
Jan 13, 2017, 8:07:39 PM1/13/17
to ROS JAPAN Users Group
コールバック関数を1つにしたい理由はなんなんでしょう?

1. 2つのメッセージを同期して処理したい

message_filtersを使う。
http://wiki.ros.org/message_filters

前川さんの解説
http://daikimaekawa.github.io/ros/2014/12/01/message_filters/

2. 単に2つの情報を同時に扱いたい

自分で2つを合わせたメッセージを作成して使う。

http://wiki.ros.org/ja/ROS/Tutorials/CreatingMsgAndSrv

たじま

2017年1月13日(金) 20:39 牧原昂志 <s1...@st.sasebo.ac.jp>:
--

このメールは Google グループのグループ「ROS JAPAN Users Group」に登録しているユーザーに送られています。

このグループから退会し、グループからのメールの配信を停止するには ros-japan-use...@googlegroups.com にメールを送信してください。

その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Yuki Suga

unread,
Jan 13, 2017, 8:33:57 PM1/13/17
to ROS JAPAN Users Group
SSRの菅です。

おそらく二つの指令値を合わせてフィルターで一つにするなどの処理をしたいんだと思います。

僕ならメイン関数に処理を書き、コールバックでは受け取ったデータをストアするのみにします。Rateとwhileループを使うシンプルな方法です。

どちらかのメッセージに同期させるなら、もう片方をストアのみにしてもう片方で処理、とします。

複数の同期しないトピックを購読する場合は、コールバックには小さな処理しか書かない方が経験的にはトラブルが少ないです。


2017年1月14日(土) 10:07 Ryosuke Tajima <ryosuke...@gmail.com>:

牧原昂志

unread,
Jan 13, 2017, 9:44:38 PM1/13/17
to ROS JAPAN Users Group
 たじま様

 理由を提示していませんでした.申し訳ありません.

 2の理由に近く,メッセージの型も決定していません.
 
 なので随時メッセージ型の追加ができるこの方法も試してみたいと思います.

 ご指摘ありがとうございます.

 牧原

2017年1月14日土曜日 10時07分39秒 UTC+9 longjie0723:

牧原昂志

unread,
Jan 13, 2017, 9:56:11 PM1/13/17
to ROS JAPAN Users Group, ys...@ysuga.net

 菅様

 メイン関数で処理をするという考えがなかったので参考にしたいと思います.

 トラブルが少なくなることは知りませんでした.メッセージの数が増えることも考えられるので,教えていただいた方法を用いたいと思います.

 ご指摘ありがとうございます.

 牧原

 
 

2017年1月14日土曜日 10時33分57秒 UTC+9 Yuki Suga:
Reply all
Reply to author
Forward
0 new messages