ros1 基础学习06- 自定义topic 主题的发布,监听以及和消息体的定义

67 篇文章 2 订阅
12 篇文章 3 订阅
本文详细介绍了如何在ROS(RobotOperatingSystem)环境中创建自定义topic,包括新增msg文件、编辑package.xml和CMakeLists.txt,实现Publisher发布和Subscriber监听。步骤涉及消息实体定义、依赖添加和编译测试。
摘要由CSDN通过智能技术生成

1. 在功能包下新增msg 文件夹

在功能包的下面新建 msg 文件夹,如下图所示

在这里插入图片描述

2. 新增Person.msg 消息实体

右键打开命令框,输入 touch Person.msg
就会在msg 目录下新增 Person.msg 文件
在这里插入图片描述
在Person.msg中输入如下内容完成.msg文件的创建,msg文件是ROS独有的格式

在这里插入图片描述

string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2

3 修改package.xml文件

需要加入编译依赖和执行依赖,编译和执行均需要相关依赖功能包,在package.xml文件中添加以下内容

<build_depend>message_generation</build_depend>     //编译的支持项
<exec_depend>message_runtime</exec_depend>     //生成可执行文件的支持项

在这里插入图片描述

4 修改CMakeLists.txt文件

//在功能包的CMakeList.txt文件夹下添加message_generation库,这一块主要是编译会用到的支持包
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

//在声明ROS消息时需要加入以下内容
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)

//取消对编译选项的注释,在原本的内容下加入message_runtime,此处为生成可执行文件所需依赖包
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES package1
   CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

// 添加编译及链接文件,增加add_dependencies表明优先编译消息头文件,避免后续使用时候编译程序报错


回到catkin_ws 再编译

cd ~/catkin_ws
 catkin_make

5 新增Publisher 发布消息代码cpp

#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<package1::Person>("/person_info",10); 
    
    //设置循环频率(HZ),与loop_rate.sleep()函数关联,如果下一帧信息不满足频率要求则系统延时
    ros::Rate loop_rate(1);   

    while(ros::ok())
    {   //初始化learning_topic::Person类型的消息,并赋值
        learning_topic::Person person_msg;
        person_msg.name = "Bob";
        person_msg.age = 6;
        person_msg.sex =  package1::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;
}

6 新增监听类Subscriber

#include  <ros/ros.h>
#include "learning_topic/Person.h"


void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
    //将接收到的消息打印出来,注意在这里需要使用->指针,因为传进来的参数也是指针,当前对象还没有.属性
    ROS_INFO("Subscribe 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;    

    //创建一个Publisher,发布名为/person_info的话题,消息类型为learning_topic::Person,队列长度为10        
    ros::Subscriber person_info_sub  =  n.subscribe("/person_info",10,personInfoCallback); 
    ros::spin();
    return 0;
}

目录结构如下图
在这里插入图片描述

7 再次修改CMakeLists.txt文件

// 添加编译及链接文件,增加add_dependencies表明优先编译消息头文件,避免后续使用时候编译程序报错
add_executable(person_publishersrc/person_publisher.cpp)
target_link_libraries(person_publisher${catkin_LIBRARIES})
add_dependencies(person_publisher${PROJECT_NAME}_generate_messages_cpp)

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

如图:
在这里插入图片描述

8 再次编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash

编译成功如下图
在这里插入图片描述

9.测试

先启动监听端

 rosrun learning_topic person_subscriber

启动发布者

rosrun learning_topic person_publisher

效果如下图所示:

在这里插入图片描述
这样自定义topic 的发布和订阅就已经完成了,有问题评论区见

  • 19
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小海聊智造

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

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

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

打赏作者

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

抵扣说明:

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

余额充值