当在 ROS 2 中使用 C++ 语言发送和接收数据时,通常会使用 ROS 2 提供的 Publisher 和 Subscriber 来实现。下面是一个简单的示例,演示如何在 ROS 2 中发送和接收数据。
假设我们要发送和接收一个字符串消息,您可以按照以下步骤进行操作:
- 创建一个 ROS 2 工作空间并构建您的代码。
- 在您的 ROS 2 工作空间中创建一个包(package),例如
demo_package。 - 在该包中创建一个源代码文件,例如
demo_publisher.cpp和demo_subscriber.cpp。 - 在
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;
}
- 在
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;
}
- 在
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})
- 构建您的代码:
colcon build --packages-select demo_package
- 运行发布者和订阅者:
在两个不同的终端窗口中运行以下命令:
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++ 发送和接收数据的基本步骤。您可以根据实际需求进行扩展和修改。