ユーザー定義したmsgをpubulisher(Tx),subscriber(Rx)してROSの中最も重要な部分の中の一つであるTopicについて復習する。
1.ws/src/pkg/msgの下にmsgフィアルにてmsgの中身を定義する。(変数宣言みたいなもん)
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
2.package.xmlファイルにmsgを使うことをROSにわかってもらうため、下記内容を追加する(includ,buildするため必要な記述のイメージ)
3.cmakelists.txtファイルにmsgを使うことをROSにわかってもらうため、下記内容を追加する(buildするために必要な記述のイメージ)3箇所
これでmsgの追加編集の終わりましたので、buildすればmsgが使えるようになる。試して見る。ターミナルで下記コマンドを実行して確認する
catkin_make
rosmsg show Person
ROS上にmsgを使えるように認識できたことをわかったので、今度定義したmsgを使ってnode間に通信して見る。
1.TX側、発表者側 person_publisher.cpp編集
#include <ros/ros.h>
#include "learning_communication/Person.h"
int main(int argc, char **argv)
{
ros::init(argc, argv, "person_publisher");
ros::NodeHandle n;
ros::Publisher person_info_pub = n.advertise<learning_communication::Person>("/person_info", 10);
ros::Rate loop_rate(1);
int count = 0;
while (ros::ok())
{
learning_topic::Person person_msg;
person_msg.name = "Tom";
person_msg.age = 18;
person_msg.sex = learning_communication::Person::male;
ROS_INFO("%s", person_msg.data.c_str());
person_info_pub.publish(person_msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
2.RX側、清聴者側 person_subscriber.cpp編集
#include <ros/ros.h>
#include "learning_communication/Person.h"
//割り込みcallback function、ここでは表示しているだけだが、実際実用の場面でセンサーのリアルタイムの値に対して動きを変えたり、判断した上アクションするようなことを入れる
void personInfoCallback(const learning_communication::Person::ConstPtr& msg)
{
ROS_INFO("Subcribe Person Info: name:%s age:%d sex:%d",
msg->name.c_str(), msg->age, msg->sex);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "person_subscriber");
ros::NodeHandle n;
ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);//"/person_info"は
ros::spin();//継続的な割り込み待ち
return 0;
}
最後、person_publisher.cppとperson_subscriber.cppをビルトしてくれるようにCmakeLists.txtに登録する
これで編集の部分が全部おわったので、動かして見よう〜
ターミナル1
roscore
ターミナル2
rosrun learning_communication person_publisher
ターミナル3
rosrun learning_communication person_subscriber
memo:
ros::spinOnce()
その行が実行されるタイミングで1度だけcallback関数にアクセス
ros::spin()
その行が実行された後は、メッセージがパブリッシュされるたびにcallback関数にアクセス