Cyber RT 服务通信

场景: 用户乘坐无人出租车过程中,可能临时需要切换目的地,用户可以通过车机系统完成修改,路径规划模块需要根据新的目的地信息重新规划路径,并反馈修正后的结果给用户,那么用户的修正请求数据与修正结果是如何被传输的呢?
上述场景下便可以使用服务通信实现数据传输。

概念
以请求响应的方式实现不同节点之间数据交互的通信模式。

作用
用于偶然的、对实时性有要求、有一定逻辑处理需求的数据传输场景。

需求
客户端发送请求提交两个整型数字,服务端处理请求提取两个数字求和,并将结果响应回客户端。

流程
1.编写消息载体(protobuf文件)并配置;
2.编写服务端配置;
3.编写客户端配置;
4.编译执行。

准备
在 demo_base_proto 目录下,新建文件 addints.proto,内容如下:

syntax = "proto2";

package apollo.cyber.demo_basee_proto;

message AddInts_Request {
    required int64 num1 = 1;
    required int64 num2 = 2;
}

message AddInts_Reponse {
    required  int64 sum = 1;
}

上述文件中,包含两种消息类型,AddInts_Request 是用于客户端向服务端发送请求的数据类型,AddInts_Response 是用于服务端向客户端发送响应的数据类型。

BUILD 文件添加如下内容:

proto_library(
    name="addints_proto",
    srcs=["addints.proto"]
)

cc_proto_library(
    name = "addints_cc",
    deps = [":addints_proto"],
)

py_proto_library(
    name = "addints_py",
    deps = [":addints_proto"]
)

验证文件编写是否正确,先编译:

bazel build cyber/demo_base_proto/...

在这里插入图片描述

C++ 实现

1.服务端实现
demo_cc 目录下新建 C++ 文件 demo03_server.cc,输入如下内容:

BUILD文件:

cc_binary(
    name="demo03_server",
    srcs=["demo03_server.cc"],
    deps=[
        "//cyber",
        "//cyber/demo_base_proto:addints_cc"
    ]
)

2.客户端实现
在 demo_cc 目录下新建 C++ 文件 demo04_client.cc,输入如下内容:

#include "cyber/cyber.h"
#include "cyber/demo_base_proto/addints.pb.h"

using apollo::cyber::demo_base_proto::AddInts_Request;
using apollo::cyber::demo_base_proto::AddInts_Reponse;

int main(int argc,char const *argv[]){
    apollo::cyber::Init(argv[0]);

    if(3 != argc){
        AINFO <<"请提交2个整型参数。。。";
        return 1;
    }
    auto client_node = apollo::cyber::CreateNode("addIntsClient_node");

    auto client = client_node->CreateClient<AddInts_Request, AddInts_Reponse>("addints");
    auto req = std::make_shared<AddInts_Request>();
    req->set_num1(atoll(argv[1]));
    req->set_num2(atoll(argv[2]));

    AINFO <<"请求数据为 num1: " << req->num1() << " and num2: "<<req->num2();

    auto reponse = client -> SendRequest(req);
    AINFO<<"reponse -->sum = "<< reponse ->sum();


    apollo::cyber::WaitForShutdown();


    return 0;
}

BUILD文件:

cc_binary(
    name="demo04_client",
    srcs=["demo04_client.cc"],
    deps=[
        "//cyber",
        "//cyber/demo_base_proto:addints_cc"
    ]
)

3.执行
在这里插入图片描述

python 实现

1.服务端实现
demo_py 目录下新建 python 文件 demo03_server_py.py,输入:

#!/usr/bin/env python3

from cyber.python.cyber_py3 import cyber
from cyber.demo_base_proto.addints_pb2 import AddInts_Request
from cyber.demo_base_proto.addints_pb2 import AddInts_Reponse

def  cb(req):
    num1 = req.num1
    num2 = req.num2
    print("num1: %d, num2: %d"%(num1,num2))
    sum = num1 + num2
    response = AddInts_Reponse()
    response.sum  = sum
    return response

if __name__ == "__main__":
    cyber.init()
    print("server------")
    server_node = cyber.Node("addIntsServer_node_py")
    server = server_node.create_service("addints", AddInts_Request,AddInts_Reponse, cb)
    server_node.spin()

    cyber.shutdown()


BUILD 文件

py_binary(
    name = "demo03_server_py",
    srcs = ["demo03_server_py.py"],
    deps = [
        "//cyber/python/cyber_py3:cyber",
        "//cyber/demo_base_proto:addints_py"
    ],
)

2.客户端实现
demo_py 目录下新建 python 文件 demo03_client_py.py,输入:

#!/usr/bin/env python3

from cyber.python.cyber_py3 import cyber
from cyber.demo_base_proto.addints_pb2 import AddInts_Request
from cyber.demo_base_proto.addints_pb2 import AddInts_Reponse
import sys


if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("input two numbers:")
        sys.exit(1)

    cyber.init()
    print("client------")
    client_node = cyber.Node("client_node_py")
    client = client_node.create_client("addints", AddInts_Request,AddInts_Reponse)
    
    req = AddInts_Request()
    req.num1 = int(sys.argv[1])
    req.num2 = int(sys.argv[2])
    response = client.send_request(req)
    print("reponse sum = %d"%response.sum)

    cyber.shutdown()

BUILD 文件

py_binary(
    name = "demo04_client_py",
    srcs = ["demo04_client_py.py"],
    deps = [
        "//cyber/python/cyber_py3:cyber",
        "//cyber/demo_base_proto:addints_py"
    ],
)

<think>嗯,用户想了解CyberRT的介绍、教程和使用方法。首先,我需要整理一下关于CyberRT的基本信息。根据提供的引用资料,CyberRT是百度Apollo自动驾驶平台中的实时计算框架,用于处理高并发和低延迟的任务。它的核心功能包括高性能通信、组件化设计和灵活的调度机制。 用户可能希望了解CyberRT的架构,比如它的模块组成,比如通信层、数据中间件和调度器等。引用中提到CyberRT使用基于协程的调度策略,这点需要详细说明。另外,用户可能对如何开始使用CyberRT感兴趣,比如安装配置、创建组件、通信机制和调度策略的设置。 教程部分需要分步骤,比如环境搭建、编写第一个组件、通信配置和调度策略选择。使用注意事项如性能优化、调试工具和扩展性也需要涵盖。同时,相关问题部分要引导用户深入了解性能优化、与ROS的对比以及调试方法。需要确保回答结构清晰,引用正确,并且符合用户的中文需求。</think>### CyberRT 介绍、教程及使用方法 #### 一、CyberRT 简介 **CyberRT** 是百度 Apollo 自动驾驶平台中的**实时计算框架**,专注于高并发、低延迟的自动驾驶任务处理。其核心设计目标包括: 1. **高性能通信**:基于共享内存和零拷贝技术优化数据传输,支持 $QoS$(服务质量)配置,满足不同场景需求[^2]。 2. **组件化设计**:通过 $Component$ 封装算法模块,利用有向无环图($DAG$)描述模块间的数据流[^5]。 3. **灵活调度**:采用用户级协程($Croutine$)和优先级调度策略(如 $ClassicScheduler$ 和 $Choreography$),提升资源利用率[^4]。 #### 二、核心概念 1. **Component** - 继承自 $ComponentBase$ 或 $TimerComponent$,用于实现独立功能模块。 - 示例代码结构: ```cpp class MyComponent : public apollo::cyber::Component<InputType, OutputType> { bool Init() override { /* 初始化逻辑 */ } bool Proc(const InputType& input, OutputType& output) override { /* 处理逻辑 */ } }; ``` [^4] 2. **通信机制** - 支持 $Channel$(发布-订阅模式)和 $Service$(请求-响应模式)。 - 数据传输通过 $Transport$ 层实现,支持 $RTPS$ 协议(需配置 $qos_profile.proto$)。 3. **调度策略** - **ClassicScheduler**:基于优先级抢占式调度。 - **Choreography**:基于时间片的协作式调度,适用于多核资源分配[^4]。 #### 三、教程与使用方法 ##### 1. 环境配置 - **安装依赖**:需安装 FastRTPS、Protobuf 等库。 - **编译配置**:通过 Bazel 构建系统管理组件依赖。 ##### 2. 编写第一个 Component - **步骤**: 1. 定义组件类并实现 $Init()$ 和 $Proc()$ 方法。 2. 在 $dag$ 文件中注册组件及输入/输出通道。 3. 通过启动脚本加载 $dag$ 文件。 ##### 3. 通信配置 - **QoS 设置**:在 $qos_profile.proto$ 中定义历史深度($depth$)、可靠性策略($RELIABILITY_RELIABLE$)等参数。 - 示例配置: ```proto qos_profile { history: HISTORY_KEEP_LAST depth: 10 reliability: RELIABILITY_RELIABLE } ``` ##### 4. 调试与日志 - 使用内置日志宏输出信息: ```cpp AINFO << "Sensor data received: " << sensor_data.DebugString(); ``` 日志级别包括 $ADEBUG$、$AERROR$ 等[^3]。 #### 四、使用注意事项 1. **性能优化**:减少数据拷贝,优先使用共享内存。 2. **调试工具**:利用 $cyber_monitor$ 实时监控通道数据。 3. **扩展性**:通过自定义 $Processor$ 和 $Task$ 实现新调度策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞大圣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值