cyber RT概括

在这里插入图片描述

用户通过调用CreateNode函数创造一个节点,该函数是在节点类Node的友元函数。

Nodel类的成员变量·node_channel_impl(NodeChannellmpl)负责创建Reader和Writer。

Writer类中包含transmitter_ , change_conn_, channel_manager_,及JoinTheTopology函数。

Writer类在初始化过程中会调用函数transport::Transport::Instance()->CreateTransmitter<MessageT>(role_attr_)为transmitter_,默认情况下是OptionalMode::HYBRID混合通信,但本次分析主要以OptionalMode::SHM进程间通信为主。

在生成一个SHM形式的Transmitter后,会调用transmitter->Enable(),初始化这个Transmitter。Transmitter类主要含有成员变量segment_和 notifier_ ,Transmitter使能的过程就是为segment_和 notifier_赋值的过程,Segment类负责管理共享内存。notifier_最终会指向一个ConditionNotifier或MulticastNotifier。

对于ConditionNotifier,它包含一个Indicator结构体,Indicator包含ReadableInfo数组和一个条件变量,Indicator会在另一块共享内存中。写进程通过Indicator中的条件变量通知读进程有数据到达。读进程得到通知后会读取Indicator中的某个ReadableInfo,然后根据此ReadableInfo信息从Segment管理的内存中获取数据。

channel_manager_会被赋值channel_manager_ = service_discovery::TopologyManager::Instance()->channel_manager()负责管理channel,每创建一个Writer或Reader都会生成一个channel。

在函数JoinTheTopology中负责拓扑网络的管理

Shmdispatcher类中有一个单独进程ThreadFunc()负责监听消息,OnMessage会触发DatatDispatcher从公共内存中读取消息并放置于DataVisitor,每个DataVisitor都对应一个CRoutine,而明每个CRoutine都会封装一个用户回调函数。

Processor中的Run()函数会循环执行,每次选择一个CRoutine进行执行。

协程之间的切换主要之上下文切换,ctx_swap函数实现上下文的切换,主要做两点工作:保存当前寄存器信息、替换函数返回地址。实际上当返回地址改变时,当函数返回时,接下来执行的指令也就转移了。

### CyberRT 开源实时操作系统 使用指南与介绍 CyberRT 是 Apollo 自动驾驶平台中使用的开源实时操作系统,专为自动驾驶场景设计。它提供了高效的模块化架构和低延迟的通信机制,能够满足高并发、低延迟的需求[^2]。 #### 1. 基础概念:Component Cyber RT 提供了 `Component` 类作为构建功能模块的基础类。`Component` 可以理解为对算法功能模块的封装,通过配合对应的 DAG(Directed Acyclic Graph)文件,Cyber RT 能够实现对该功能模块的动态加载。在 Apollo 中,所有模块都是基于 `Component` 构建的[^1]。 #### 2. 编写第一个 CyberRT 程序 为了使用 CyberRT,开发者需要继承 `Component` 类,并定义自己的 `Init` 和 `Proc` 函数。以下是一个简单的代码示例: ```cpp #include <memory> #include "cyber/class_loader/class_loader.h" #include "cyber/component/component.h" #include "cyber/examples/proto/examples.pb.h" using apollo::cyber::examples::proto::Driver; using apollo::cyber::Component; using apollo::cyber::ComponentBase; class CommonComponentSample : public Component<Driver, Driver> { public: bool Init() override { // 初始化逻辑 return true; } bool Proc(const std::shared_ptr<Driver>& msg0, const std::shared_ptr<Driver>& msg1) override { // 处理消息逻辑 return true; } }; CYBER_REGISTER_COMPONENT(CommonComponentSample) ``` 上述代码展示了如何继承 `Component` 类并实现 `Init` 和 `Proc` 函数。`CYBER_REGISTER_COMPONENT` 宏用于将组件类注册为全局可用[^4]。 #### 3. 模块化设计示例 以下是一个完整的模块化设计示例,展示了如何创建一个节点并订阅主题: ```cpp #include "cyber/cyber.h" #include "your_msg_type.pb.h" int main(int argc, char** argv) { cyber::Init(argv[0]); auto node = cyber::CreateNode("example_node"); auto reader = node->CreateReader<your_namespace::YourMsgType>( "your_topic", [](const std::shared_ptr<your_namespace::YourMsgType>& msg) { // 处理消息 }); cyber::WaitForShutdown(); return 0; } ``` 此代码片段展示了如何初始化 CyberRT 环境、创建节点以及订阅指定主题的消息[^5]。 #### 4. 与其他系统的比较 尽管 ROS(Robot Operating System)在机器人领域有广泛应用,但在自动驾驶领域,其性能表现一般。ROS 在处理高并发、低延迟场景时存在先天缺陷。相比之下,Apollo Cyber RT 从多个维度进行了优化,提供了更为适合自动驾驶需求的解决方案[^2]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

海洋2416

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

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

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

打赏作者

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

抵扣说明:

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

余额充值