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

个人学习记录~~~

本节将结合自定义消息类型(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文件夹

ROS系列教程二:自定义消息类型话题的发布及订阅_第1张图片

二、自定义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两个变量,注意不需要“;”隔开,换行就好了。

ROS系列教程二:自定义消息类型话题的发布及订阅_第2张图片

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

ROS系列教程二:自定义消息类型话题的发布及订阅_第3张图片

三、发布及订阅编程

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

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

#include 
#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("/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 
#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

ROS系列教程二:自定义消息类型话题的发布及订阅_第4张图片

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

add_message_files(
  FILES
  my_msg.msg
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

ROS系列教程二:自定义消息类型话题的发布及订阅_第5张图片

 part3:找到catkin_package,找到#  CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs,把注释符#删掉,同时在后面添加message_runtime

ROS系列教程二:自定义消息类型话题的发布及订阅_第6张图片

  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)

ROS系列教程二:自定义消息类型话题的发布及订阅_第7张图片

第二步:修改package.xml

添加字段

message_generation
  message_runtime

ROS系列教程二:自定义消息类型话题的发布及订阅_第8张图片

五、运行

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

ROS系列教程二:自定义消息类型话题的发布及订阅_第9张图片

 编译完成后,启动roscore

roscore

并依次运行my_topic下面的msg_pub以及msg_sub

rosrun my_topic msg_pub
rosrun my_topic msg_sub

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

ROS系列教程二:自定义消息类型话题的发布及订阅_第10张图片

 本章完结~

转载卖钱者,子无屁眼。

你可能感兴趣的:(ROS开发,自动驾驶,人工智能,机器学习)