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

本文档详细介绍了如何在ROS中创建功能包、定义自定义消息类型,并实现发布者和订阅者程序。通过实例展示了C++代码编写过程,包括msg文件的创建、发布者和订阅者的实现,以及配置文件的修改。最后,演示了运行结果,成功实现了自定义消息的发布和接收。
摘要由CSDN通过智能技术生成

个人学习记录~~~

本节将结合自定义消息类型(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不支持中文显示,所以显示成了???哈哈哈哈,无伤大雅!

 本章完结~

转载卖钱者,子无屁眼。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮爹地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值