Apollo Advanced Lesson | Cyber RT

本文探讨了传统ROS在自动驾驶领域的不足,如内核调度的不适应性和同步开销问题,以及动态内存分配的影响。然后介绍了Cyber架构,它基于DAG无环图和LockFree技术,将调度逻辑移至用户空间,减少了通信延迟。Cyber的任务编排策略包括Classic策略(协程池,全局优先级队列调度)和Choreography策略,以提高效率和实时性。协程在此扮演关键角色,允许任务在需要时暂停和恢复,优化内存分配并确保调度的确定性。


–This article is excerpted from Baidu’s official about Apollo, please indicate the source for reprinting–

传统ROS短板

  • 内核调度对自动驾驶算法业务逻辑不适应.
  • 各算法模块以独立模块,同步开销很显著,需要平衡效率与稳定性.
  • 动态内存申请.

Cyber 架构 与模块

framework

  • key concept
    • DAG无环图
    • Lock Free
      • lock free 对象池 ???
      • lock free 队列
由Sensor data 驱动
调度逻辑从内核搬到用户空间

调度流程图

任务编排策略
  • 任务基于协程实现,任务阻塞时,迅速让出CPU
    协程流程图
  • 调度的确定性
  • 支持跨进程,跨机通信.
  • 内存分配也是实时性的一大杀手
协程
  • 本质:可以被用户随时暂停和恢复的函数
  • 实现:协程运行时栈保持在堆上,而不是
调度
  • 两种调度策略:
    • Classic 策略;
    • Choreography策略
Classic 策略

SchedulerClassic 采用协程池 ,协程不会绑定到具体的处理核心上,而是放在全局的优先队列中被调度。

Choreography策略
Apollo Cyber RT 是百度 Apollo 自动驾驶平台中的一个高性能、低延迟的实时通信框架,专为自动驾驶系统设计。它类似于 ROS(Robot Operating System),但在性能、实时性和可扩展性方面进行了优化,以满足自动驾驶场景中对数据传输和处理的高要求。 ### 框架介绍 Apollo Cyber RT 提供了一个模块化、组件化的通信架构,支持节点(Node)、通道(Channel)、服务(Service)等基本通信单元。每个节点可以发布或订阅多个通道,实现进程间或跨节点的数据交换。Cyber RT 使用 Protobuf(Protocol Buffers)作为数据序列化格式,以确保高效的数据传输与解析 [^1]。 Cyber RT 的核心组件包括: - **节点(Node)**:作为通信的基本单元,节点可以发布或订阅数据。 - **通道(Channel)**:用于数据传输的逻辑路径,节点通过通道交换消息。 - **服务(Service)**:支持请求-响应模式的通信方式,适用于需要同步交互的场景。 - **定时器(Timer)**:用于周期性触发事件或回调函数。 ### 主要功能 Apollo Cyber RT 提供了丰富的功能和工具集,支持开发者构建、调试和部署自动驾驶模块。 #### 1. 实时通信机制 Cyber RT 支持高效的实时通信机制,确保传感器数据、控制指令等关键信息能够在系统中快速传递。其底层使用共享内存和零拷贝技术优化数据传输效率 [^1]。 #### 2. 组件开发支持 Cyber RT 提供了完整的组件开发流程,包括组件的创建、编译、运行和调试。开发者可以通过继承 `Component` 类并实现其生命周期方法(如 `Init()` 和 `Proc()`)来构建自定义模块 [^2]。 #### 3. 数据记录与回放 Cyber RT 提供了 `cyber_recorder` 工具,支持数据的记录与回放功能。开发者可以使用该工具进行数据采集、测试和调试,提高开发效率 [^3]。 #### 4. 参数管理 Cyber RT 支持多种类型的参数管理,包括整型、浮点型、布尔型、字符串型以及 Protobuf 类型。这些参数可以通过 `apollo::cyber::Parameter` 接口进行操作,便于配置和动态调整系统行为 [^4]。 #### 5. 服务调用机制 Cyber RT 支持服务调用机制,允许节点之间进行同步通信。开发者可以定义服务接口并通过 `cyber::Service` 实现服务端和客户端的交互 。 ### 使用指南 #### 1. 环境准备 在使用 Apollo Cyber RT 之前,需确保系统已安装 Apollo 6.0 或更高版本,并正确配置开发环境。建议使用 Ubuntu 系统,并安装 NVIDIA 显卡驱动及 CUDA 以支持可视化工具 [^3]。 #### 2. 创建组件 开发者可以通过继承 `Component` 类创建自定义组件。以下是一个简单的组件示例: ```cpp #include "cyber/component/component.h" class MyComponent : public apollo::cyber::Component<> { public: bool Init() override { // 初始化逻辑 return true; } bool Proc() override { // 数据处理逻辑 return true; } }; CYBER_REGISTER_COMPONENT(MyComponent) ``` #### 3. 使用命令行工具 Cyber RT 提供了一系列命令行工具,用于调试和管理运行时系统: - `cyber_node`:查看节点信息。 - `cyber_channel`:查看通道信息。 - `cyber_service`:查看服务信息。 - `cyber_monitor`:实时监控通道数据流。 - `cyber_recorder`:记录和回放数据。 例如,启动一个模块: ```bash cyber_launch start your_module.launch ``` 停止模块: ```bash cyber_launch stop your_module.launch ``` #### 4. 参数配置 使用 `apollo::cyber::Parameter` 可以在运行时动态设置和获取参数。例如: ```cpp apollo::cyber::Parameter param("int_param", 10); int64_t value = param.as_int64(); ``` #### 5. 服务调用 定义服务接口并在组件中实现服务端逻辑,客户端通过 `cyber::Client` 调用服务。例如: ```cpp // 定义服务接口 class MyService : public apollo::cyber::Service<MyRequest, MyResponse> { public: void HandleRequest(const std::shared_ptr<MyRequest>& request, std::shared_ptr<MyResponse>& response) override { // 处理请求 } }; ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值