一,背景

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 对照相关推荐

  1. Apollo Cyber RT学习手册(基于Ubuntu18.04、Apollo 6.0_edu)

    本文全部内容源自赵虚左老师的<百度Apollo智能驾驶课程>,如有侵权请联系,本文内容为作者手敲,禁止任何形式转载,谢谢. 第一章 Cyber RT概述与环境搭建 1.1Cyber RT简 ...

  2. 【Cyber RT】Apollo Cyber RT安装

    一.下载源码 克隆Apollo 源码仓库 git clone https://gitee.com/ApolloAuto/apollo.git  (耗时30min) 二.启动Apollo Docker ...

  3. 百度Apollo 3.5是如何设计Cyber RT计算框架的?

    自百度Apollo自动驾驶平台开源以来,已快速迭代至 3.5 版本,代码行数超过 39 万行,合作伙伴超过 130 家,吸引了来自 97 个国家的超 15000 名开发者.无疑,Apollo 是目前世 ...

  4. 自动驾驶平台Apollo 5.5阅读手记:Cyber RT中的任务调度

    前言 自动驾驶系统Apollo在3.5中引入了Cyber RT,替换了之前基于ROS的变体.Cyber RT的一大特点在于其调度系统.因为自动驾驶与人身安全强相关,因此很强调实时性.传统的机器人系统并 ...

  5. 百度Apollo发布智能驾驶商业化解决方案

    雷帝网 乐天 1月9日报道 美国当地时间2019年1月8日,百度Apollo Enterprise(Apollo企业版)正式发布. 百度称,Apollo Enterprise提供给汽车企业.供应商和出 ...

  6. Cyber​​ RT开发人员工具

    从自动驾驶技术出发,Apollo开发者社区带你一起探索自动驾驶开发的奥秘,给每一位对自动驾驶充满热爱的你带来最实质的帮助,助力你的每一次研发.本文将介绍 Apollo Cyber RT 开发人员工具, ...

  7. 「Apollo」Cyber RT 学习笔记

    介绍 Cyber RT是一款开源的适用于自动驾驶场景的框架 在x86/ARM64架构的Docker环境中运行CyberRT 利用CyberRT创建一个新组件 CyberRT开发者工具 CyberRT开 ...

  8. 百度Apollo简介

    百度Apollo简介 我们选择在这个十年里去月球做其他的事情, 不是因为他们很容易,而是因为他们很努力. – John F. Kennedy, 1962 欢迎来到阿波罗GitHub. 阿波罗是一个开放 ...

  9. 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 ...

最新文章

  1. base64 转文件_PHP伪协议与文件包含
  2. 新入职了一个卷王,一来就把性能提升4倍,这谁受的了~
  3. disk磁盘管理与Linux驱动编写
  4. 语音识别的技术原理是什么?
  5. spring boot-html和templates
  6. 2019校招开发岗面试题总结(Java后台开发)
  7. 华为手机微信小程序上传不了照片
  8. PMP学习笔记 第11章 项目风险管理
  9. 如何测试短信接口调用代码
  10. 反向Telnet突破防火墙封锁
  11. 我作为数字产品设计师的十大宠儿
  12. 关于显存位宽、显存带宽和显存容量的理解
  13. C++ 逻辑与或非 逻辑与逻辑或 逻辑非
  14. jones 的 C语言复习
  15. 亲测-独立后台版本+学法减分小程序2022最新可用可运营源码+附带详细安装教程
  16. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...
  17. android 关闭蓝牙功能,android – 打开和关闭蓝牙?
  18. 数字化转型的趋势、挑战与战略
  19. An unusual vacation
  20. c/c++测试函数的运行时间(八种方法)(转)

热门文章

  1. LABC and CABC-MTK Platform
  2. 《下辈子,无论爱与不爱,都不会再见》--梁继璋
  3. asp.net web开发——文件的上传和下载
  4. 动态调整echarts图表大小
  5. SMT车间锡膏管理规范
  6. 四大查找ASL的总结
  7. 滴滴大数据安全权限实践
  8. 封装win7系统、制作win7GHO镜像、制作一个自定义的镜像文件具体步骤、制作Win10镜像gho...
  9. 玉炜的iOS开发规范(12.14更新)
  10. 手机数据恢复软件该如何使用