下面是一个简单的 ROS 1 demo,包括创建一个 Catkin 工作空间、创建一个 ROS 节点以发布一个字符串消息到一个话题上,并创建一个订阅器来接收并打印这个消息。这个 demo 包含两个文件:CMakeLists.txttalker_listener_demo.cpp

首先,创建一个 Catkin 工作空间:

  1. 打开终端。
  2. 运行以下命令,创建一个名为 catkin_ws 的 Catkin 工作空间:
    1
    2
    3
    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws/src
    catkin_init_workspace

接下来,创建 ROS 节点和订阅器的源文件:

  1. ~/catkin_ws/src 目录下创建一个名为 talker_listener_demo 的包,并进入该目录:

    1
    2
    3
    cd ~/catkin_ws/src
    catkin_create_pkg talker_listener_demo roscpp std_msgs
    cd talker_listener_demo
  2. talker_listener_demo 包中创建一个名为 talker_listener_demo.cpp 的 C++ 源文件,并在其中添加以下代码:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include "ros/ros.h"
    #include "std_msgs/String.h"

    // 回调函数,用于处理接收到的消息
    void chatterCallback(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, "talker_listener_demo");

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

    // 创建一个发布者,用于向 "chatter" 话题发布字符串消息
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

    // 创建一个订阅器,用于订阅 "chatter" 话题的消息,并调用回调函数进行处理
    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

    // 定义一个循环,发布消息并休眠一段时间
    ros::Rate loop_rate(10);
    int count = 0;
    while (ros::ok())
    {
    std_msgs::String msg;
    std::stringstream ss;
    ss << "hello world " << count;
    msg.data = ss.str();

    ROS_INFO("%s", msg.data.c_str());

    chatter_pub.publish(msg);

    ros::spinOnce();

    loop_rate.sleep();
    ++count;
    }

    return 0;
    }
  3. 确保 CMakeLists.txt 文件包含以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    cmake_minimum_required(VERSION 2.8.3)
    project(talker_listener_demo)

    ## 找到 catkin 并包含设置好的功能
    find_package(catkin REQUIRED COMPONENTS
    roscpp
    std_msgs
    )

    ## 包含 catkin 工程设置的头文件和库
    catkin_package(
    CATKIN_DEPENDS roscpp std_msgs
    )

    ## 添加包含目录
    include_directories(
    ${catkin_INCLUDE_DIRS}
    )

    ## 添加可执行文件
    add_executable(talker_listener_demo src/talker_listener_demo.cpp)
    ## 链接库
    target_link_libraries(talker_listener_demo ${catkin_LIBRARIES})
  4. 构建 Catkin 工作空间:

    1
    2
    cd ~/catkin_ws
    catkin_make

现在,您已经成功创建了一个简单的 ROS 节点和订阅器的 demo。要运行它,请执行以下步骤:

  1. 在一个终端中启动 ROS Master:

    1
    roscore
  2. 在另一个终端中运行 talker_listener_demo

    1
    2
    source ~/catkin_ws/devel/setup.bash
    rosrun talker_listener_demo talker_listener_demo

您将会看到一个发布者不断地发布 “hello world” 消息,并且一个订阅器接收并打印这些消息。