CyberRT两大功能
任务调度
数据通信
基本组件
component node channel
reader/writer sevice/client
Task routine
通信
1.通信的方式:
01. intras-process
02. shared Memory
03. socket--fastRTPS DDS也是采用发布/订阅机制进行网络通讯
通过抽象出DDS接口,让ROS 2可以使用不同公司开发的DDS库
Fast RTPS是eProsima公司对RTPS标准的一个实现,也就是库
RTPS是DDS标准中的一个子集。
英文名字是Real Time Publish Subscribe,是DDS标准中的通讯协议部分
Hybird 自适应以上三种
2.CM - communicate
transport
intraTransmitter --》 writer
shmTransmitter
RTPSTransmitter
ReceiverManager--Receiver--> Reader--> dispatcher
DataFusion
dataDispather ---> 消息分发 -- channelBuffer notifier
CacheBuffer
DataVistor--->消息处理--notifier_
3.Service Discovery
Transport::particopant
eprosima:fastrtps:participant
TopologyManager--manager--nodeManager channelManager serviceManager
startDiscovery stopDiscovery join leave Addchangelister removechangelister
全局队列 本地队列
4.Protobuf record
任务调度
1.基本组成
1.ResourceManagerment
2.Scheduler 调度器
3.Executor 执行器
4. Task 执行单元
5.Dag 配置任务的逻辑关系
2.用户态 协程 Routine
内核态 Thread
3.根据模块优先级、资源需求、调度算法
调度c策略
classic: group process CRoutine
choreography: task process pool
RoutineFactory
Component:
Initialize --> Init()
Process --> Proc()
ROS1_ROS2_CyberRT__autosar
机制
启动流程
CyberRT的启动流程
mainBoard
classloader
源码分析以及开发应用
开发应用
开发流程
###通信
Node节点,CyberRT的一个基础构件;
每个模块都包含节点,它能够基于信道,服务等功能,与其他节点进行通信。
Node最常用的功能是创建Reader和Writer
node_创建一个reader,并且会绑定一个回调函数 e,用来处理接收到的消息。
/*
需求: 发布摄像头仿真数据。
实现:
1.头文件;
2.初始化 cyber 框架;
3.创建节点;
4.创建发布者;
5.组织数据并发布;
6.等待关闭。
*/
#include "cyber/cyber.h"
#include "modules/common_msgs/sensor_msgs/sensor_image.pb.h"
using apollo::drivers::Image;
int main(int argc, char *argv[])
{
apollo::cyber::Init(argv[0]);
// 3.创建节点;
auto talker_node = apollo::cyber::CreateNode("camear_sim_node");
// 4.创建发布者;
auto talker = talker_node->CreateWriter<Image>("/image_sim");
// 5.组织数据并发布
####main()函数中写通信逻辑并编译为单独的可执行文件的方法
Comopnent
相比Ros,CyberRT增加了Component组件,组件之间通过 Cyber channel 通信。Cyber RT 中用Message实现模块间通信
#include "cyber/cyber.h"
#include "cyber/class_loader/class_loader.h"
#include "cyber/component/component.h"
#include "cyber/proto/unit_test.pb.h"
using apollo::cyber::Reader;
using apollo::cyber::ReaderConfig;
using apollo::cyber::CyberConfig;
using apollo::cyber::proto::Chatter;
class ConsumerComponent : public apollo::cyber::Component<> {
public:
bool Init() override {
// 创建Reader配置
CyberConfig cfg;
cfg.channel_name = "channel_name"; // 替换为你的通道名称
cfg.qos_profile.depth = 10;
reader_ = node_->CreateReader<Chatter>(cfg);
return true;
}
void Proc(const std::shared_ptr<Chatter>& msg) {
// 处理接收到的消息
// 例如,打印接收到的消息内容
AINFO << "Received message: " << msg->content();
}
std::shared_ptr<Reader<Chatter>> reader_;
};
CYBER_REGISTER_COMPONENT(ConsumerComponent)
初始化组件的文件结构
实现组件类
设置配置文件
启动组件
使用CYBER_REGISTER_COMPONENT宏定义把组件类注册成全局可用。
对于源文件 ConsumerComponent.cc, Init 和 Proc 这两个函数需要实现
Cyber RT中,所有的 Comopnent 都会被编译成独立的.so文件,Cyber RT 会根据开发者提供的配置文件,按需加载对应的 Component。
所以,开发者需要为.so文件编写好配置文.dag文件和.launch文件,以供 Cyber RT正确的加载执行Component。
Cyber RT提供两种加载启动Component的方式,
分别是使用cyber_launch工具启动component对应的launch文件,
和使用mainboard 启动 component对应的dag文件
cyber_launch工具可以启动dag文件和二进制文件,而mainboard执行启动dag文件。
与启动文件一起启动(推荐)
cyber_launch start /apollo/cyber/examples/common_component_example/common.launch
使用DAG文件启动
mainboard -d /apollo/cyber/examples/common_component_example/common.dag
apollo::cyber::Init(argv[0]);
读取的channel 写在dag文件中 reader
说明
一个dag文件对应一个进程,而dag文件中的一个components对应一个协程
CyberRT中的Component在实例化的时候会创建一个Node,通过这个Node来订阅和发布对应的消息。
此外,Component对用户提供了两个接口Init()和Proc(),用户在Init()中进行初始化,在Proc()中执行具体的算法
参考
第五章:使用Cyber RT进行相机仿真 https://apollo.baidu.com/community/article/1105