话题通信
本章节主要介绍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