介绍ROS中的std_msgs

介绍ROS中的std_msgs

Robot Operating System (ROS) 是一个用于编写机器人软件的灵活框架。在 ROS 中,std_msgs 是标准消息包,提供了一系列简单的消息类型,这些消息类型可以在不同的 ROS 节点之间进行通信。std_msgs 包含了一些基本的数据类型,如整数、浮点数、字符串等。以下是 std_msgs 中一些常用消息类型的例子:

  • std_msgs::Bool
  • std_msgs::Int8、Int16、Int32、Int64
  • std_msgs::UInt8、UInt16、UInt32、UInt64
  • std_msgs::Float32、Float64
  • std_msgs::String
  • std_msgs::ColorRGBA
  • std_msgs::Header
    下面是一个使用 C++ 编写的 ROS 节点例子,展示了如何使用 std_msgs::String 类型来发布和接收字符串消息:
  1. 首先,创建一个名为 “example_publisher” 的发布者节点:
    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
    #include <ros/ros.h>
    #include <std_msgs/String.h>

    int main(int argc, char **argv) {
    ros::init(argc, argv, "example_publisher");
    ros::NodeHandle nh;

    ros::Publisher publisher = nh.advertise<std_msgs::String>("example_topic", 1000);

    ros::Rate loop_rate(10);

    int count = 0;
    while (ros::ok()) {
    std_msgs::String msg;
    msg.data = "Hello, ROS! " + std::to_string(count);

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

    publisher.publish(msg);

    ros::spinOnce();
    loop_rate.sleep();
    ++count;
    }

    return 0;
    }

  2. 接下来,创建一个名为 “example_subscriber” 的订阅者节点:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <ros/ros.h>
    #include <std_msgs/String.h>

    void exampleCallback(const std_msgs::String::ConstPtr& msg) {
    ROS_INFO("Received message: %s", msg->data.c_str());
    }

    int main(int argc, char **argv) {
    ros::init(argc, argv, "example_subscriber");
    ros::NodeHandle nh;

    ros::Subscriber subscriber = nh.subscribe("example_topic", 1000, exampleCallback);

    ros::spin();

    return 0;
    }

    这两个例子分别创建了一个发布者节点和一个订阅者节点。发布者节点发布一个 std_msgs::String 类型的消息到 “example_topic” 主题上,订阅者节点订阅该主题并在接收到新消息时调用 exampleCallback 函数。

接下来,我们将详细介绍如何编译和运行上述示例中的发布者和订阅者节点。

首先,确保你已经安装了 ROS 并正确设置了环境。接下来,在你的工作空间中创建一个名为 std_msgs_example 的新 ROS 软件包:

1
2
3
cd ~/catkin_ws/src
catkin_create_pkg std_msgs_example roscpp std_msgs


现在,在 std_msgs_example 软件包的 src 文件夹中创建两个源文件:example_publisher.cpp 和 example_subscriber.cpp。将先前给出的发布者和订阅者示例代码分别复制到这两个文件中。

接下来,在 std_msgs_example/CMakeLists.txt 中添加以下内容以编译发布者和订阅者节点:

1
2
3
4
5
6
7
# ...
# 在 find_package 之后添加
add_executable(example_publisher src/example_publisher.cpp)
add_executable(example_subscriber src/example_subscriber.cpp)
target_link_libraries(example_publisher ${catkin_LIBRARIES})
target_link_libraries(example_subscriber ${catkin_LIBRARIES})

在终端中,导航到你的工作空间目录(catkin_ws),并运行 catkin_make 以编译新创建的发布者和订阅者节点:

1
2
3
cd ~/catkin_ws
catkin_make


编译完成后,确保在新的终端中运行 ROS Master:
1
2
roscore


接下来,在两个单独的终端中分别运行发布者和订阅者节点:
1
2
3
source ~/catkin_ws/devel/setup.bash
rosrun std_msgs_example example_publisher


1
2
3
source ~/catkin_ws/devel/setup.bash
rosrun std_msgs_example example_subscriber


此时,你将看到发布者节点定期发布消息 “Hello, ROS! X”(其中 X 是递增的整数),并且订阅者节点会显示接收到的消息。这个简单的例子演示了如何使用 std_msgs::String 类型在 ROS 节点之间传递消息。对于其他 std_msgs 类型,使用类似的方法创建发布者和订阅者节点即可。


介绍ROS中的std_msgs
https://qiangsun89.github.io/2023/04/25/介绍ROS中的std-msgs/
作者
Qiang Sun
发布于
2023年4月25日
许可协议