欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子

程序员文章站 2022-06-04 15:45:04
...

ROS发布器Publisher和订阅器Subscriber(roscpp)

#1 环境

Ubuntu 16.04
ros kinetic

#2 Publisher

#2.1 创建工作区和包

mkdir -p ~/catkin_ws/src # 创建工作区
cd ~/catkin_ws/src # 进入工作区
# catkin_create_pkg package_name(包名称) dependencies(依赖)
catkin_create_pkg my_node_demo roscpp std_msgs #新建一个ROS包, 包名:my_node_demo

Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子

创建完成以后,在目录my_node_demo下多出两个文件(package.xml ,CMakeLists.txt)和两个文件夹(src, include)。

其中的package.xml便是之前提到的ROS包配置文件,描述关于包的信息。CMakeLists.txt是用来配置编译过程。

#2.2 创建publisher

vim ~/catkin_ws/src/my_node_demo/src/publisher.cpp
#include <ros/ros.h>
#include "std_msgs/String.h"


int main(int argc, char **argv) {
    /*
    void ros::init(
        int &argc,
        char **argv,
        const std::string &name,
        uint32_t options=0
        )
    argc:参数个数,一般由int main(int argc, char ** argv) 提供
    argv:指向字符串数组(即参数文本)的指针,一般由int main(int argc, char ** argv) 提供
    name:节点的名字,必须是基础的名字(基础的含义是不能包括命名空间)
    options:可空,默认options=0
    */
    ros::init(argc, argv, "publisher_demo"); // 初始化节点名

    /*
    NodeHandle类:
        advertise():
            Publisher ros::NodeHandle::advertise(
                const std::string & topic,
                uint32_t queue_size,
                bool latch = false
            )
            ros::NodeHandle handle;
            ros::Publisher pub = handle.advertise<std_msgs::Empty>("my_topic", 1);
        topic: 话题
        queue_size: 队列大小
        latch: 可空,默认为false; 如果为true,当有一个新的订阅者时,会向新的订阅者发送最后一条广播(在其订阅之前的最后一条)
    */
    ros::NodeHandle handle;
    ros::Publisher my_publisher_object = handle.advertise<std_msgs::String>("talker_demo",1);

    std_msgs::String publish_msg; // 创建一个发布器将要使用的消息变量
    publish_msg.data = "9";

    while (ros::ok()){
        my_publisher_object.publish(publish_msg); // 发布消息到对应的话题
    }
}

#include <ros/ros.h>表示包含ROS头文件

#include "std_msgs/String.h"表示包含标准消息类型中的String

#2.3 修改CMakeLists.txt

vim ~/catkin_ws/src/my_node_demo/CMakeLists.txt

最后加上下面两行代码:

add_executable(publisher_demo src/publisher.cpp)
target_link_libraries(publisher_demo ${catkin_LIBRARIES})

#2.4 编译运行

  1. 编译
cd ~/catkin_ws/
catkin_make

Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子

  1. **环境
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash
  1. 启动ROS
roscore
  1. 运行publisher
// rosrun 包名 节点名
rosrun my_node_demo publisher_demo 
  1. 测试

订阅topic

// rostopic echo topic
rostopic echo talker_demo

Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子

#3 Subscriber

#3.1 创建publisher

vim ~/catkin_ws/src/my_node_demo/src/subscriber.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"

// 接收到订阅的消息后,会进入消息回调函数
void chatter_callback(const std_msgs::String::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("I heard: [%s]", msg->data.c_str());
}

int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "listener_demo");

    // 创建节点句柄
    ros::NodeHandle handle;

    // 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
    ros::Subscriber sub = handle.subscribe(
            "talker_demo",
            1000,
            chatter_callback
            );

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

    return 0;
}

#3.2 修改CMakeLists.txt

vim ~/catkin_ws/src/my_node_demo/CMakeLists.txt

最后加上:

add_executable(subscriber_demo src/subscriber.cpp)
target_link_libraries(subscriber_demo ${catkin_LIBRARIES})

#2.4 编译运行

  1. 编译
cd ~/catkin_ws/
catkin_make

Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子

  1. **环境

新开一个terminal

source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash
  1. 运行subscriber
// rosrun 包名 节点名
rosrun my_node_demo subscriber_demo 

Cpp ROS(一)发布器Publisher和订阅器Subscriber简单例子