ROS系列教程二:自定义消息类型话题的发布及订阅

  • Post author:
  • Post category:其他


个人学习记录~~~

本节将结合自定义消息类型(msg)来介绍一下怎么发布话题消息及订阅话题消息,可以让大家更深刻地理解。

一、功能包创建

进入上节课创建的my_workspace工作目录下的

src文件夹

,右键打开终端。利用

catkin_create_pkg

指令创建名为my_topic的功能包,同时添加依赖:

roscpp rospy std_msgs geometry_msgs

catkin_create_pkg my_topic roscpp std_msgs geometry_msgs

创建功能包成功后,可以看到在src文件夹下面多了一个my_topic文件夹


二、自定义msg创建

自定义消息类型是基于xxx.msg文件创建的,所以需要在功能包里添加对应的msg文件。我们先在my_topic文件夹内创建一个msg文件夹,然后再创建一个my_msg.msg文件,并在其中声明两个变量。

第一步:在my_topic文件夹内创建msg文件夹,并创建名为


my_msg.msg


的文件

$ cd my_workspace
~/my_workspace$ cd src
~/my_workspace/src$ cd my_topic
~/my_workspace/src/my_topic$ mkdir msg
~/my_workspace/src/my_topic$ cd msg
~/my_workspace/src/my_topic/msg$ touch my_msg.ms

第二步:利用nano编辑器打开my_msg.msg,在其中声明

m_Name、m_Age

两个变量,注意不需要“;”隔开,换行就好了。

创建好了之后可以直接双击打开my_msg文件,看看里面是否成功添加了变量。

三、发布及订阅编程

基于C++创建话题发布者及订阅者程序:

第一步:编写发布者程序。在my_topic内的src文件夹内创建名为msg_pub.cpp文件,程序具体内容如下

#include <ros/ros.h>
#include "my_topic/my_msg.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "msg_pub");   //初始化

    ros::NodeHandle nh;  //节点句柄初始化

    ros::Publisher pb = nh.advertise<my_topic::my_msg>("/role_details", 5);  //发布 名为"role_details"的话题,缓存设置5

    ros::Rate loop_rate(1); //设置发布频率为1hz

    while (ros::ok())  //判定ros是否准备就绪
    {
        my_topic::my_msg new_msg;  //实例化new_msg对象
        new_msg.m_Name = "曹操";  //成员变量赋值
        new_msg.m_Age  = 99;  //成员变量赋值

        pb.publish(new_msg);

        ROS_INFO("Publish role name:%s  Age:%d", new_msg.m_Name.c_str(), new_msg.m_Age);

        // 按照循环频率延时
        loop_rate.sleep();
    }

    return 0;
}

第二步:编写订阅者程序。在同目录下创建msg_sub.cpp文件,程序具体内容如下

#include <ros/ros.h>
#include "my_topic/my_msg.h"

//创建回调函数
void msg_Callback(const my_topic::my_msg::ConstPtr& msg)
{
    ROS_INFO("Subcribe role: Name:%s  Age:%d", msg->m_Name.c_str(), msg->m_Age);  //提示消息
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "msg_sub");  //初始化

    ros::NodeHandle nh; //节点句柄初始化

    ros::Subscriber pb = nh.subscribe("/role_details", 5, msg_Callback); //订阅"role_details"话题

    // 循环等待回调函数
    ros::spin();

    return 0;
}

四、配置文件修改

在这部分主要对my_topic文件夹内的CMakeLists.txt、package.xml两个文件进行修改。


第一步:修改CMakeLists.txt



part1:


打开my_topic文件夹内的CMakeLists.txt,在find_package的括号里,添加message_generation



part2:


把我们创建的my_msg.msg文件加载进去,添加内容:

add_message_files(

FILES

my_msg.msg

)

generate_messages(

DEPENDENCIES

std_msgs

)



part3:


找到catkin_package,找到

#  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs,

把注释符#删掉,同时在后面添加message_runtime



part4:


把我们创建的发布者及订阅者cpp文件添加进去,拉倒下面添加如下字段。

add_executable(msg_pub src/msg_pub.cpp)

target_link_libraries(msg_pub ${catkin_LIBRARIES})

add_dependencies(msg_pub ${PROJECT_NAME}_generate_messages_cpp)

add_executable(msg_sub src/msg_sub.cpp)

target_link_libraries(msg_sub ${catkin_LIBRARIES})

add_dependencies(msg_sub ${PROJECT_NAME}_generate_messages_cpp)


第二步:修改package.xml

添加字段

<build_depend>message_generation</build_depend>

<exec_depend>message_runtime</exec_depend>

五、运行

好了,基本改完了,历史惯例,回到工作空间根目录下面,利用catkin_make指令进行编译,看看有没有问题,有问题再根据提示逐一排查,跟着步骤来做一般不会有什么问题。

编译完成后,启动roscore

roscore

并依次运行my_topic下面的

msg_pub以及msg_sub

rosrun my_topic msg_pub
rosrun my_topic msg_sub

可以看到自定义消息在发布及接收了~~我前面m_Name设置成了中文“曹操”,ros不支持中文显示,所以显示成了

???

哈哈哈哈,无伤大雅!

本章完结~




转载卖钱者,子无屁眼。




版权声明:本文为prolop87原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。