Apollo 3.5 Cyber 多進程通訊模塊 - Transport (Shared Memory篇)

Apollo 3.5 Cyber 多進程通訊模塊 - Transport (Shared Memory篇)

ROS為不個的node之間的通訊提供了shared memory和network兩種方法 (是也有一個叫intra, 不過那不能cross-process的。而cyber的Node::Reader和Node::Writer是預設三種都用的,即message會視乎情況選對應的方法去發,也可能用三種方法都發一次,也就是hybrid mode了)
Cyber也提供了差不多的東西,今天就看一看

transport_shm_overall

先上一個全局的圖。建議放大看。
當中主要有ShmDispatcher, ShmReceiver, ShmTransmitter,Segment,NotifierBase這幾個。其他的就是實現的細節。當你了解這幾個主要class的互動時,就會基本了解其機制了。

每個Class的功用

  • Segment: 負責管理一段Shared Memory, 提供Accquire-Release的接口讓其他class可以在thread-safe的前題下拿到shared memory中的對象. 而因為Segment的Block(s)是放在shared memory的,就算在同一線程中生成同一channel的多個segment,其內容空間也是一樣的
  • Block: 一段Segment中有多個Block,channel中的數據會存在其中,而Block也是其他class用來讀寫數據的對象
  • State: 管理Segment的內部狀態。因為Segment應該是在多個process中都是有相同狀態的,所以要特別抽出來放到shared memory中去肯定同步。
  • Receiver : ShmReceiver的Base class, 它下邊除了 ShmReceiver,還有RtpsReceiver,IntraReceiver等等。主要就是負責`當指定channel有數據時,調用指定的回調,並提供一個開關(是否繼續監聽channel)的功能“
  • ShmReceiver: Receiver的shared memory版實現,在channel中的數據會利用shared memory去共享
  • Transmitter: ShmTransmitter的Base class, 它下邊也是有shared memory版本,rtps版本,等等。主要就是負責`提供一個接口,容許你發數據到指定channel,並告知對應Notifier有更新。並提供一個開關(是否讓其內部指針指到Notifier的singleton,這沒有甚麼用,反正不發數據就和關了差不多)的功能“
  • ShmTransmitter的shared memory版實現
  • Dispatcher: 用來管理所有的channel的讀數據的部份。當有新數據時就調用Receiver註冊的回調。其subclass都是Singleton。
  • ShmDispatcher: 做polling,不停去看Notifier有沒有新的info過來,如果有新info來了,就解讀info,在對應Segment中拿數據及把其deserialize為一個對象.最後回調Receiver的回調
  • Notifier: 發新數據發有新數據的提示是兩個不同的概念,Dispatcher做了前者,而Notifier做了後者,而Notifier也提供了多種實現方式. Notifier的所有subclass也是單例
  • MulticastNotifier: 用了multicast頻道,用socket通訊實現的Notifier
  • ConditionNotifier: 用conditional variable在shared memory實現的Notifier
  • NotifierFactory: 按全局config,生成MulticastNotifierConditionNotifier
  • ReadableInfo: Notifier在有新數據時所發出的結構體,包含了以下幾個資料
    • 是那個channel
    • 是誰發的
    • 第幾個block
  • ListenHandler: 基本就是callback, 不過加上了一些額外的資訊,容訊做到一些額外功能。比如只有在某一個特定node發數據時才調用。
  • Signal, Conenct, Slot就一個通用的回調機制

Transmitter發新數據到Receiver處理數據的流程

其實看完上邊應該都了解得差不多了,不過都寫一寫

  1. 調用TransmitterTransmit接口去發數據
// cyber/transport/transmitter/transmitter.h
 virtual bool Transmit(const MessagePtr& msg);
 virtual bool Transmit(const MessagePtr& msg, const MessageInfo& msg_info) = 0;
  1. ShmTransmitter版的Transmit實現是先從Segment中拿到可以寫的Block,然後寫進去。最後告訴Notifier,有新message了

template <typename M>
bool ShmTransmitter<M>::Transmit(const MessagePtr& msg,
                                 const MessageInfo& msg_info) {
   
  return Transmit(*msg, msg_info);
}

template <typename M>
bool ShmTransmitter<M>::Transmit(const M& msg, const MessageInfo& msg_info) {
   
  if (!this->enabled_) {
   
    ADEBUG << "not enable.";
    return false;
  }

  WritableBlock wb;
  std::size_t msg_size = message::ByteSize(msg);
  if (!segment_->AcquireBlockToWrite(msg_size, &wb)) {
   
    AERROR << "acquire block failed.";
    return false;
  }

  ADEBUG << "block index: " << wb.index;
  if (!message::SerializeToArray(msg, wb.buf, static_cast<int>(msg_size))) {
   
    AERROR << "serialize to array failed.";
    segment_->ReleaseWrittenBlock(wb);
    return false;
  }
  wb.block->set_msg_size(msg_size);

  char* msg_info_addr = reinterpret_cast<char
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Apollo Docker Quick Start Files是用于在Docker容器中快速启动Apollo配置中心的文件集合。Apollo配置中心是携程框架部门开发的分布式配置管理平台,用于实现配置集中管理和动态配置更新的需求。 使用Docker容器来快速启动Apollo配置中心可以提高开发和部署的效率,方便跨平台和环境的使用。Apollo Docker Quick Start Files包含了配置中心的相关配置文件、Dockerfile和启动脚本等,使用这些文件可以快速构建和启动配置中心的Docker容器。 在启动Docker容器之前,我们需要先配置好Apollo配置中心的相关信息,在配置文件中指定数据库、端口等参数。然后,使用Docker命令构建Docker镜像并生成Docker容器,通过运行启动脚本,让Docker容器启动并运行Apollo配置中心。 通过使用Apollo Docker Quick Start Files,可以方便地在各种环境中部署和启动Apollo配置中心,提高系统的可维护性和可扩展性。同时,通过Docker的特性,我们可以更好地管理和监控配置中心的运行状态,更灵活地进行配置的更新和维护。 总之,Apollo Docker Quick Start Files提供了一种便捷的方式来快速部署和启动Apollo配置中心,使得我们能够更加高效地管理和使用分布式配置,提高系统的稳定性和可靠性。 ### 回答2: Apollo是一个分布式配置中心,用于管理和配置分布式系统中的应用程序的配置信息。Docker是一种容器化平台,可以将应用程序打包成容器,并在不同的环境中快速部署和运行。 Apollo-Docker-Quick-Start-Files是一个用于快速开始使用Apollo和Docker的文件集合。它包含了一系列的配置文件和脚本,可以帮助用户快速搭建Apollo配置中心和使用Docker部署应用程序。 在这个文件集合中,用户可以找到一些配置文件示例,如application.properties和meta-server.properties,这些文件定义了Apollo的配置中心和元数据服务器的相关配置信息。用户可以根据自己的需要进行修改和定制。 此外,还有一些脚本文件,如docker-compose.yaml和Dockerfile。这些文件用于定义Docker容器的构建和部署规则。用户可以使用docker-compose命令,根据docker-compose.yaml文件一键启动Apollo配置中心和应用程序的Docker容器。 使用Apollo-Docker-Quick-Start-Files,用户可以轻松地搭建Apollo配置中心和部署应用程序。它提供了一种快捷的方式,帮助用户快速入门并使用Apollo和Docker进行分布式系统的配置和部署管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值