0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ROS msg Topic CPPの勉強メモ

Posted at

ユーザー定義したmsgをpubulisher(Tx),subscriber(Rx)してROSの中最も重要な部分の中の一つであるTopicについて復習する。

1.ws/src/pkg/msgの下にmsgフィアルにてmsgの中身を定義する。(変数宣言みたいなもん)
Screenshot from 2023-05-14 18-31-18.png

string name
uint8  sex
uint8  age

uint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

2.package.xmlファイルにmsgを使うことをROSにわかってもらうため、下記内容を追加する(includ,buildするため必要な記述のイメージ)
Screenshot from 2023-05-14 18-34-40.png

3.cmakelists.txtファイルにmsgを使うことをROSにわかってもらうため、下記内容を追加する(buildするために必要な記述のイメージ)3箇所

1箇所目(message_generation追加)
Screenshot from 2023-05-14 18-39-31.png

2箇所目(catkin情報の追加)
Screenshot from 2023-05-14 18-46-06.png

3箇所目(msgファイル情報の追加)
Screenshot from 2023-05-14 18-49-33.png

これでmsgの追加編集の終わりましたので、buildすればmsgが使えるようになる。試して見る。ターミナルで下記コマンドを実行して確認する

catkin_make
rosmsg show Person

Screenshot from 2023-05-14 18-54-57.png

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に登録する
Screenshot from 2023-05-14 20-59-58.png

これで編集の部分が全部おわったので、動かして見よう〜
ターミナル1

roscore

ターミナル2

rosrun learning_communication person_publisher 

ターミナル3

rosrun learning_communication person_subscriber

Screenshot from 2023-05-14 21-04-39.png

memo:
ros::spinOnce()
その行が実行されるタイミングで1度だけcallback関数にアクセス
ros::spin()
その行が実行された後は、メッセージがパブリッシュされるたびにcallback関数にアクセス

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?