ROS学习第五天

今天学习话题消息的定义和使用。首先看下实现的框架图:
在这里插入图片描述
首先定义一个发布者,也就是图中的person_publisher作为发布者,订阅者为person_subscriber。话题为/person_info。消息为:Person。

1:定义话题消息

首先定义msg文件。在你功能包文件夹下也就是如下图所示新建一个msg文件夹,然后在文件夹里建立一个Person.msg的文件,输入指令touch Person.msg

msg文件夹所在路径
创建之后,打开新建的文件。在这里插入图片描述
向新建的文件里面添加这样自定义的话题消息,如下面:

string name

uint8  age

uint8  sex



uint8 unknown = 0

uint8 male    = 1

uint8 female  = 2

接着要在package.xml中添加功能包依赖,添加以下这俩句指令。

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

接着要在CMakeLists.txt添加编译选项。如下几句指令:

1:message_generation

在这里插入图片描述
添加如下内容:

add_message_files(
  FILES
  Person.msg
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

在这里插入图片描述
接着把这一行的注释去掉,添加message_runtime
在这里插入图片描述
最后编译生成语言相关文件。编译成功就会在这个文件夹下看到
Person.h的文件。
在这里插入图片描述
接下来就是编写发布者和订阅者的程序,也就是前面学习的东西。发布者的c++程序为:

/***********************************************************************

Copyright 2020 GuYueHome (www.guyuehome.com).

***********************************************************************/



/**

 * 该例程将发布/person_info话题,自定义消息类型learning_topic::Person

 */

 

#include <ros/ros.h>

#include "learning_topic/Person.h"



int main(int argc, char **argv)

{

    // ROS节点初始化

    ros::init(argc, argv, "person_publisher");



    // 创建节点句柄

    ros::NodeHandle n;



    // 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10

    ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);



    // 设置循环的频率

    ros::Rate loop_rate(1);



    int count = 0;

    while (ros::ok())

    {

        // 初始化learning_topic::Person类型的消息

    	learning_topic::Person person_msg;

		person_msg.name = "Tom";

		person_msg.age  = 18;

		person_msg.sex  = learning_topic::Person::male;



        // 发布消息

		person_info_pub.publish(person_msg);



       	ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", 

				  person_msg.name.c_str(), person_msg.age, person_msg.sex);



        // 按照循环频率延时

        loop_rate.sleep();

    }



    return 0;

}

订阅者的程序为:

/***********************************************************************

Copyright 2020 GuYueHome (www.guyuehome.com).

***********************************************************************/



/**

 * 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person

 */

 

#include <ros/ros.h>

#include "learning_topic/Person.h"



// 接收到订阅的消息后,会进入消息回调函数

void personInfoCallback(const learning_topic::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节点

    ros::init(argc, argv, "person_subscriber");



    // 创建节点句柄

    ros::NodeHandle n;



    // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback

    ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);



    // 循环等待回调函数

    ros::spin();



    return 0;

}

接下来编译的时候,仍然要往CMake.lists添加如下部分:

add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)

add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)

接下来输入编译指令。运行俩个程序,如下图:
在这里插入图片描述
证明成功。

posted @ 2022-01-08 16:20  Bathwind_W  阅读(5)  评论(0编辑  收藏  举报  来源