ROS话题消息的定义与使用

Posted 等不到星光等时光呀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS话题消息的定义与使用相关的知识,希望对你有一定的参考价值。

如何定义话题消息

1、定义msg文件

首先,在learning_topic文件夹下创建msg文件夹。

learning_topic工作空间的创建,在前面的教程中有详细过程,不会的可以查看前面的,下面是链接地址。

ROS创建工作空间和功能包(四)

在这里插入图片描述

之后在该文件按夹下创建Person.msg文件。
在终端中输入:

touch Person.msg

在这里插入图片描述

打开该文件,进行消息的定义:

string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2

在这里插入图片描述

保存即可。

2、在package.xml中添加功能包依赖

打开package.xml文件(和msg在同一个目录下)。加入如下内容:

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

在这里插入图片描述

保存即可。

3、在CmakeList.txt添加编译选项

打开CmakeList.txt文件,找到find_package,在里面添加

message_generation
在这里插入图片描述
继续在该文件下,添加如下:
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)
在这里插入图片描述

在如下位置加上message_runtime
在这里插入图片描述
保存退出即可。

在catkin_ws文件夹下,打开终端,进行编译

输入:

catkin_make

在这里插入图片描述

在这里插入图片描述

订阅者和发布者代码的编写

这个在前面的教程有详细的教程。链接如下:
ROS发布者Publisher的编程实现(五)
ROS订阅者Subscriber的编程实现(六)

在src下创建person_publisher.cpp文件,打开编写代码:

/**
 * 该例程将发布/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;
}

在src继续创建person_subscriber.cpp文件,打开编写如下代码:

/***********************************************************************
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;
}

在这里插入图片描述

之后配置代码编译规则

配置CmakeLists.txt中的编译规则,打开该文件,加入如下语句:

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)

在这里插入图片描述

之后在进行编译,输入

catkin_make
在这里插入图片描述

最后,运行代码:

roscore

rosrun learning_topic person_subscriber

rosrun learning_topic person_publisher

最终,我们看到的效果是,发布者发布消息,订阅者接受到我们发布的消息。

在这里插入图片描述

以上是关于ROS话题消息的定义与使用的主要内容,如果未能解决你的问题,请参考以下文章

ROS话题通信服务通信编程

ROS学习笔记- 节点消息话题服务节点管理器

ROS通信机制一---话题通信

ROS-ROS命令rostopic: ROS话题

ROS话题通信章节总结

理解ROS话题---ROS学习第5篇