跳转至

话题通信

本章节主要介绍ROS2中的话题通信机制,包括话题的发布和订阅,以及消息的定义和使用。

【0】CPP模板

// 模板:ROS2节点类
#include <rclcpp/rclcpp.hpp>
// 导入需要的消息/服务头文件
class 节点名 : public rclcpp::Node
{
private:
    // 1. 通信对象指针
    发布者指针;
    订阅者指针;
    服务端指针;

    // 2. 回调函数
    void 订阅回调函数(消息类型::SharedPtr msg) { /* 处理消息 */ }
    void 服务回调函数(请求指针, 响应指针) { /* 处理服务 */ }

public:
    // 3. 构造函数
    节点名(std::string node_name) : Node(node_name)
    {
        发布者 = this->create_publisher<消息类型>("话题名", 队列大小);
        订阅者 = this->create_subscription<消息类型>("话题名", 队列大小, std::bind(&类名::回调函数, this, std::placeholders::_1));
        服务端 = this->create_service<服务类型>("服务名", 队列大小, std::bind(&类名::回调函数, this, std::placeholders::_1, std::placeholders::_2));
    }
};

// 4. 主函数
int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
    auto node = std::make_shared<节点名>("节点名称");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

【1】Python模板

# 模板:ROS2节点类
import rclpy
from rclpy.node import Node
# 导入需要的消息/服务头文件
from 消息包名 import 消息类型
from 服务包名 import 服务类型

class 节点名(Node):
    def __init__(self):
        super().__init__("节点名称")
        # 1. 通信对象指针
        self.发布者 = self.create_publisher(消息类型, "话题名", 10)
        self.订阅者 = self.create_subscription(消息类型, "话题名", self.订阅回调函数, 10)
        self.服务端 = self.create_service(服务类型, "服务名", self.服务回调函数)

    # 2. 回调函数
    def 订阅回调函数(self, msg):
        # 处理消息
        pass
    def 服务回调函数(self, request, response):
        # 处理服务
        response.字段 = request.字段
        response.字段 = request.字段
        return response


# 3. 主函数
def main(args=None):
    rclpy.init(args=args)
    node = 节点名()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == '__main__':
    main()

【2】消息定义

在ROS2中,消息是用于节点之间通信的数据结构。消息的定义通常在.msg文件中进行。例如,创建一个名为Hello.msg的消息文件,内容如下:

string name