c++使用ROS2发送、接收消息示例

857 阅读1分钟

当在 ROS 2 中使用 C++ 语言发送和接收数据时,通常会使用 ROS 2 提供的 Publisher 和 Subscriber 来实现。下面是一个简单的示例,演示如何在 ROS 2 中发送和接收数据。

假设我们要发送和接收一个字符串消息,您可以按照以下步骤进行操作:

  1. 创建一个 ROS 2 工作空间并构建您的代码。
  2. 在您的 ROS 2 工作空间中创建一个包(package),例如 demo_package
  3. 在该包中创建一个源代码文件,例如 demo_publisher.cppdemo_subscriber.cpp
  4. demo_publisher.cpp 中编写发布者代码:
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("demo_publisher");
    auto publisher = node->create_publisher<std_msgs::msg::String>("demo_topic", 10);

    rclcpp::WallRate loop_rate(1);  // 1 Hz publishing rate

    while (rclcpp::ok()) {
        auto message = std_msgs::msg::String();
        message.data = "Hello, ROS 2!";
        RCLCPP_INFO(node->get_logger(), "Publishing: %s", message.data.c_str());
        publisher->publish(message);
        rclcpp::spin_some(node);
        loop_rate.sleep();
    }

    rclcpp::shutdown();
    return 0;
}
  1. demo_subscriber.cpp 中编写订阅者代码:
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"

void callback(const std_msgs::msg::String::SharedPtr msg)
{
    RCLCPP_INFO(rclcpp::get_logger("demo_subscriber"), "Received: %s", msg->data.c_str());
}

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("demo_subscriber");
    auto subscription = node->create_subscription<std_msgs::msg::String>(
        "demo_topic", 10, callback);

    rclcpp::spin(node);

    rclcpp::shutdown();
    return 0;
}
  1. CMakeLists.txt 中添加以下内容来构建发布者和订阅者:
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)

add_executable(demo_publisher src/demo_publisher.cpp)
target_include_directories(demo_publisher PRIVATE
    ${rclcpp_INCLUDE_DIRS}
    ${std_msgs_INCLUDE_DIRS})
target_link_libraries(demo_publisher ${rclcpp_LIBRARIES} ${std_msgs_LIBRARIES})

add_executable(demo_subscriber src/demo_subscriber.cpp)
target_include_directories(demo_subscriber PRIVATE
    ${rclcpp_INCLUDE_DIRS}
    ${std_msgs_INCLUDE_DIRS})
target_link_libraries(demo_subscriber ${rclcpp_LIBRARIES} ${std_msgs_LIBRARIES})
  1. 构建您的代码:
colcon build --packages-select demo_package
  1. 运行发布者和订阅者:

在两个不同的终端窗口中运行以下命令:

source install/setup.bash
ros2 run demo_package demo_publisher
source install/setup.bash
ros2 run demo_package demo_subscriber

发布者将发送 "Hello, ROS 2!" 消息,而订阅者将接收并打印消息。

这只是一个简单的示例,演示了在 ROS 2 中使用 C++ 发送和接收数据的基本步骤。您可以根据实际需求进行扩展和修改。