• ros 自定义订阅者Subscriber的编程实现


    话题模型

    在这里插入图片描述
    图中,我们使用ROS Master管理节点。
    有两个主要节点:

    • Publisher,名为Turtle Velocity(即海龟的速度)
    • Subscriber,即海龟仿真器节点 /turtlesim

    Publisher(Turtle Velocity),发布Message(即海龟的速度信息,以geometry_msgs::Twist的数据结构,包括线速度和角速度),通过Topic(/turtle1/cmd_vel)总线管道,将数据传输给Subscriber。Subscriber订阅得到的速度信息,来控制海龟发生运动。

    “/turtle1/cmd_vel”这个topic是海归仿真器节点/turtlesim下自带的topic,可直接拿来用。

    创建功能包

    这个上一节创建发布的功能已经创建了,可直接在功能包新增 监听的代码

    创建Subscriber代码

    步骤:
    初始化ROS节点
    订阅需要的话题
    循环等待话题消息,接收到消息后进入回调函数
    在回调函数中完成消息处理

    我们需要在src里创建C++的代码文件以输入代码,文件名称为:pose_subscriber.cpp

    /**
     * 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
     */
     
    #include <ros/ros.h>
    #include "turtlesim/Pose.h"
    
    // 接收到订阅的消息后,会进入消息回调函数
    void poseCallback(const turtlesim::Pose::ConstPtr& msg)
    {
        // 将接收到的消息打印出来
        ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
    }
    
    int main(int argc, char **argv)
    {
        // 初始化ROS节点
        ros::init(argc, argv, "pose_subscriber");
    
        // 创建节点句柄
        ros::NodeHandle n;
    
        // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
        ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
    
        // 循环等待回调函数
        ros::spin();
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    文件目录如下:

    在这里插入图片描述

    配置发布者代码编译规则

    配置CMakeLists.txt中的编译规则:

    设置需要编译的代码和生成的可执行文件
    设置链接库

    将下列代码拷贝至CMakeLists.txt中:

    add_executable(pose_subscriber src/pose_subscriber.cpp)
    target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
    
    • 1
    • 2

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

    编译

    cd ~/catkin_ws
    catkin_make
    
    • 1
    • 2

    补坑说明:

    如果是新增的代码文件,如上面添加的 pose_subscriber CMakeKLists.txt 中的上面的方式是错的,因为编译后你会发现这个新增的文件根本不会被编译到,所以新增的要放到历史的上面

    如下图所示:
    在这里插入图片描述

    然后再编译,会提示权限报错,切换到root 用户即可

    测试

    接下来再验证就可以了

    rosrun learning_topic pose_subscriber
    
    • 1

    启动成功后会发现不会的监听小乌龟的点位信息,如下图所示:

    在这里插入图片描述

  • 相关阅读:
    AWS SAA-C03 #113
    【HTML5入门指北】第二篇 网页相关的标签
    详细介绍如何使用Ipopt非线性求解器求解带约束的最优化问题
    C++ day4
    以学工管理系统打造一体化智慧校园平台
    shell脚本使用 curl 获取服务器目录的最新文件
    leetcode-每日一题-1779-找到最近的有相同 X 或 Y 坐标的点(简单,数学思想)
    YOLOv5改进之二:添加CBAM注意力机制
    一网打尽!10款数据可视化软件介绍
    【二进制部署k8s-1.29.4】五、kube-controller-manager安装配置
  • 原文地址:https://blog.csdn.net/hai411741962/article/details/134272722