ROS2话题通信
时间: 2025-06-01 08:19:24 浏览: 18
### ROS 2 中话题通信的使用方法
在 ROS 2 中,话题(Topic)通信是节点之间进行数据交换的主要方式之一。通过话题,一个节点可以发布消息,而另一个节点可以订阅这些消息[^1]。以下是一个完整的示例,展示如何实现两个节点之间的通信。
#### 创建工作空间和功能包
首先,需要创建一个 ROS 2 工作空间,并在其中生成一个新的功能包。以下是具体步骤:
1. **创建工作空间**
在终端中运行以下命令以创建一个新的 ROS 2 工作空间:
```bash
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
```
2. **创建功能包**
使用 `ros2 pkg create` 命令创建一个新的功能包:
```bash
ros2 pkg create --build-type ament_cmake topic_example
```
#### 编写发布者和订阅者代码
接下来,编写发布者和订阅者的代码。以下是一个简单的 C++ 和 Python 示例。
##### 发布者代码 (C++)
将以下代码保存为 `topic_helloworld_pub.cpp` 文件:
```cpp
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
using namespace std::chrono_literals;
class PublisherNode : public rclcpp::Node {
public:
PublisherNode() : Node("helloworld_pub") {
publisher_ = this->create_publisher<std_msgs::msg::String>("hello", 10);
timer_ = this->create_wall_timer(500ms, std::bind(&PublisherNode::publish_message, this));
}
private:
void publish_message() {
auto message = std_msgs::msg::String();
message.data = "Hello, World!";
RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
publisher_->publish(message);
}
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
rclcpp::TimerBase::SharedPtr timer_;
};
int main(int argc, char *argv[]) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<PublisherNode>());
rclcpp::shutdown();
return 0;
}
```
##### 订阅者代码 (Python)
将以下代码保存为 `topic_helloworld_sub.py` 文件:
```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class SubscriberNode(Node):
def __init__(self):
super().__init__('helloworld_sub')
self.sub = self.create_subscription(String, "hello", self.listener_callback, 10)
def listener_callback(self, msg):
self.get_logger().info('I heard: "%s"' % msg.data)
def main(args=None):
rclpy.init(args=args)
node = SubscriberNode()
rclcpp.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
#### 配置 `CMakeLists.txt`
确保在 `CMakeLists.txt` 文件中添加以下内容以编译发布者代码:
```cmake
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
add_executable(topic_helloworld_pub src/topic_helloworld_pub.cpp)
ament_target_dependencies(topic_helloworld_pub rclcpp std_msgs)
install(TARGETS
topic_helloworld_pub
DESTINATION lib/${PROJECT_NAME})
```
#### 编译和运行
完成上述步骤后,编译并运行代码:
```bash
colcon build --packages-select topic_example
source ~/ros2_ws/install/setup.bash
ros2 run topic_example topic_helloworld_pub
ros2 run topic_example topic_helloworld_sub
```
此时,发布者会每 500 毫秒发送一次消息,而订阅者会接收到这些消息并打印到终端[^4]。
### 常用命令
在 ROS 2 中,可以使用以下命令查看和调试话题通信:
- 查看所有话题:`ros2 topic list`[^2]
- 查看特定话题的信息:`ros2 topic info <topic_name>`
- 查看话题发布频率:`ros2 topic hz <topic_name>`
- 查看话题数据:`ros2 topic echo <topic_name>`[^2]
###
阅读全文
相关推荐


















