百度 Apollo Cyber RT简介、基本概念以及与 ROS 对照
一,背景
ROS 应用于自动驾驶领域的不足:
- 调度的不确定性:各节点以独立进程运行,节点运行顺序无法确定,因而业务逻辑的调度顺序无法保证;
- 运行效率:ROS 为分布式系统,存在通信开销
二,Cyber RT 框架
从下到上依次为:
- 基础库:高性能,无锁队列;
- 通信层:Publish/Subscribe机制,Service/Client机制,服务自发现,自适应的通信机制(共享内存、Socket、进程内);
- 数据层:数据缓存与融合。多路传感器之间数据需要融合,而且算法可能需要缓存一定的数据。比如典型的仿真应用,不同算法模块之间需要有一个数据桥梁,数据层起到了这个模块间通信的桥梁的作用;
- 计算层:计算模型,任务以及任务调度;
三,运行流程
- 算法模块通过有向无环图(DAG),配置任务间的逻辑关系。对于每个算法可以进行优先级、运行时间、使用资源等方面的配置。
- 系统启动时,结合DAG、调度配置等,创建相应的任务,从框架内部来讲,就是协程(coroutine)
- 调度器把任务放到各个 Processor 的队列中。
- 然后,由 Sensor 输入的数据,驱动整个系统运转。
四,基本概念以及与 ROS 对照
Cyber | ROS | 注释 |
---|---|---|
Component | 无 | 组件之间通过 Cyber channel 通信。 |
Channel | Topic | channel 用于管理数据通信,用户可以通过 publish/subscribe 相同的 channel 来通信。 |
Node | Node | 每一个模块包含 Node 并通过 Node 来通信。一个模块通过定义 read/write 和/或 service/client 使用不同的通信模式。 |
Reader/Writer | Publish/Subscribe | 订阅者模式。往 channel 读写消息的类。 通常作为 Node 主要的消息传输接口。 |
Service/Client | Service/Client | 请求/响应模式,支持节点间双向通信。 |
Message | Message | Cyber RT 中用于模块间通信的数据单元。其实现基于 protobuf |
Parameter | Parameter | Parameter 服务提供全局参数访问接口。该服务基于 service/client 模式。 |
Record file | Bag file | 用于记录从 channel 发送或接收的消息。 回放 record file 可以重现之前的操作行为。 |
Launch file | Launch file | 提供一种启动模块的便利途径。通过在 launch file 中定义一个或多个 dag 文件,可以同时启动多个 modules。 |
Task | 无 | 异步计算任务 |
CRoutine | 无 | 协程,优化线程使用与系统资源分配 |
Scheduler | 无 | 任务调度器,用户空间。 |
Dag file | 无 | 定义模块拓扑结构的配置文件。 |
五,特色
- 高性能:无锁对象,协程(coroutine),自适应通信机制;
- 确定性:可配置的任务以及任务调度,通过协程将调度从内核空间转移到用户空间;
- 模块化:在框架内实现组件以及节点,即可完成系统任务;
- 便利性:创建和使用任务
六,示例
Writer/Reader
Message:
syntax = "proto2";
package apollo.cyber.examples.proto;
message Chatter {optional uint64 timestamp = 1;optional uint64 lidar_timestamp = 2;optional uint64 seq = 3;optional bytes content = 4;
};
Writer:
#include "cyber/cyber.h"
#include "cyber/examples/proto/examples.pb.h"
#include "cyber/time/rate.h"
#include "cyber/time/time.h"using apollo::cyber::Rate;
using apollo::cyber::Time;
using apollo::cyber::examples::proto::Chatter;int main(int argc, char *argv[]) {// init cyber frameworkapollo::cyber::Init(argv[0]);// create talker nodeauto talker_node = apollo::cyber::CreateNode("talker");// create talkerauto talker = talker_node->CreateWriter<Chatter>("channel/chatter");Rate rate(1.0);while (apollo::cyber::OK()) {static uint64_t seq = 0;auto msg = std::make_shared<Chatter>();msg->set_timestamp(Time::Now().ToNanosecond());msg->set_lidar_timestamp(Time::Now().ToNanosecond());msg->set_seq(seq++);msg->set_content("Hello, apollo!");talker->Write(msg);AINFO << "talker sent a message!";rate.Sleep();}return 0;
}
Reader:
#include "cyber/cyber.h"
#include "cyber/examples/proto/examples.pb.h"void MessageCallback(const std::shared_ptr<apollo::cyber::examples::proto::Chatter>& msg) {AINFO << "Received message seq-> " << msg->seq();AINFO << "msgcontent->" << msg->content();
}int main(int argc, char* argv[]) {// init cyber frameworkapollo::cyber::Init(argv[0]);// create listener nodeauto listener_node = apollo::cyber::CreateNode("listener");// create listenerauto listener =listener_node->CreateReader<apollo::cyber::examples::proto::Chatter>("channel/chatter", MessageCallback);apollo::cyber::WaitForShutdown();return 0;
}
Service/Client
Message:
syntax = "proto2";package apollo.cyber.examples.proto;message Driver {optional string content = 1;optional uint64 msg_id = 2;optional uint64 timestamp = 3;
};
Service/client:
#include "cyber/cyber.h"
#include "cyber/examples/proto/examples.pb.h"using apollo::cyber::examples::proto::Driver;int main(int argc, char* argv[]) {apollo::cyber::Init(argv[0]);std::shared_ptr<apollo::cyber::Node> node(apollo::cyber::CreateNode("start_node"));auto server = node->CreateService<Driver, Driver>("test_server", [](const std::shared_ptr<Driver>& request,std::shared_ptr<Driver>& response) {AINFO << "server: i am driver server";static uint64_t id = 0;++id;response->set_msg_id(id);response->set_timestamp(0);});auto client = node->CreateClient<Driver, Driver>("test_server");auto driver_msg = std::make_shared<Driver>();driver_msg->set_msg_id(0);driver_msg->set_timestamp(0);while (apollo::cyber::OK()) {auto res = client->SendRequest(driver_msg);if (res != nullptr) {AINFO << "client: responese: " << res->ShortDebugString();} else {AINFO << "client: service may not ready.";}sleep(1);}apollo::cyber::WaitForShutdown();return 0;
}
七,Apollo 整体框架
百度 Apollo Cyber RT简介、基本概念以及与 ROS 对照相关推荐
- Apollo Cyber RT学习手册(基于Ubuntu18.04、Apollo 6.0_edu)
本文全部内容源自赵虚左老师的<百度Apollo智能驾驶课程>,如有侵权请联系,本文内容为作者手敲,禁止任何形式转载,谢谢. 第一章 Cyber RT概述与环境搭建 1.1Cyber RT简 ...
- 【Cyber RT】Apollo Cyber RT安装
一.下载源码 克隆Apollo 源码仓库 git clone https://gitee.com/ApolloAuto/apollo.git (耗时30min) 二.启动Apollo Docker ...
- 百度Apollo 3.5是如何设计Cyber RT计算框架的?
自百度Apollo自动驾驶平台开源以来,已快速迭代至 3.5 版本,代码行数超过 39 万行,合作伙伴超过 130 家,吸引了来自 97 个国家的超 15000 名开发者.无疑,Apollo 是目前世 ...
- 自动驾驶平台Apollo 5.5阅读手记:Cyber RT中的任务调度
前言 自动驾驶系统Apollo在3.5中引入了Cyber RT,替换了之前基于ROS的变体.Cyber RT的一大特点在于其调度系统.因为自动驾驶与人身安全强相关,因此很强调实时性.传统的机器人系统并 ...
- 百度Apollo发布智能驾驶商业化解决方案
雷帝网 乐天 1月9日报道 美国当地时间2019年1月8日,百度Apollo Enterprise(Apollo企业版)正式发布. 百度称,Apollo Enterprise提供给汽车企业.供应商和出 ...
- Cyber RT开发人员工具
从自动驾驶技术出发,Apollo开发者社区带你一起探索自动驾驶开发的奥秘,给每一位对自动驾驶充满热爱的你带来最实质的帮助,助力你的每一次研发.本文将介绍 Apollo Cyber RT 开发人员工具, ...
- 「Apollo」Cyber RT 学习笔记
介绍 Cyber RT是一款开源的适用于自动驾驶场景的框架 在x86/ARM64架构的Docker环境中运行CyberRT 利用CyberRT创建一个新组件 CyberRT开发者工具 CyberRT开 ...
- 百度Apollo简介
百度Apollo简介 我们选择在这个十年里去月球做其他的事情, 不是因为他们很容易,而是因为他们很努力. – John F. Kennedy, 1962 欢迎来到阿波罗GitHub. 阿波罗是一个开放 ...
- Apollo 笔记(03)— Cyber RT Python 接口(channel 读和写、server/client 通信、record 文件读写信息查询、timer 时间定时器操作)
https://cyber-rt.readthedocs.io/en/latest/CyberRT_Python_API.html https://cyber-rt.readthedocs.io/en ...
最新文章
- base64 转文件_PHP伪协议与文件包含
- 新入职了一个卷王,一来就把性能提升4倍,这谁受的了~
- disk磁盘管理与Linux驱动编写
- 语音识别的技术原理是什么?
- spring boot-html和templates
- 2019校招开发岗面试题总结(Java后台开发)
- 华为手机微信小程序上传不了照片
- PMP学习笔记 第11章 项目风险管理
- 如何测试短信接口调用代码
- 反向Telnet突破防火墙封锁
- 我作为数字产品设计师的十大宠儿
- 关于显存位宽、显存带宽和显存容量的理解
- C++ 逻辑与或非 逻辑与逻辑或 逻辑非
- jones 的 C语言复习
- 亲测-独立后台版本+学法减分小程序2022最新可用可运营源码+附带详细安装教程
- c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...
- android 关闭蓝牙功能,android – 打开和关闭蓝牙?
- 数字化转型的趋势、挑战与战略
- An unusual vacation
- c/c++测试函数的运行时间(八种方法)(转)