草庐IT

详解视觉BEV3D检测模型: Fast-BEV: A Fast and Strong Bird‘s-Eye View Perception Baseline

自动驾驶小学生 2024-05-08 原文

本文介绍一篇视觉BEV3D检测模型: Fast-BEV,论文收录于 NeurIPS2022

目前大多数现有的BEV感知方案要么需要相当多的资源来执行车端推理,要么性能不高。本文提出了一种简单而有效的框架,称为Fast-BEV,它能够在车载芯片上执行更快的BEV感知。为了实现这一目标,本文通过试验发现,BEV表征可以在不需要昂贵的基于transformer变换或基于深度表示的情况下获得强大的表征能力。 本文设计的FAST-BEV由五个部分组成:

  • (1)一种轻量级的、部署友好的视图变换,它将2D图像特征快速地转换到3D体素空间
  • (2)一种利用多尺度信息以获得更好性能的多尺度图像编码器
  • (3)一种专为加速车载推理而设计的高效的BEV编码器
  • (4)一种针对图像和BEV空间的强数据增强策略以避免过度拟合;
  • (5)一种多帧特征融合机制以利用时间信息

其中,(1)和(3)使Fast-BEV能够在车载芯片上快速推理和方便部署,(2),(4)和(5)确保Fast-BEV具有竞争力的性能。这些都使得Fast-BEV成为自动驾驶车载芯片上高性能、快速推理和易于部署的解决方案。通过实验,在2080Ti平台上,本文的ResNet-50模型在nuScenes验证集上可以运行达到52.6FPS和47.3%的NDS,超过了BEVDepth-R50模型的41.3 FPS和47.5%的NDS和BEVDet4D-R50模型的30.2 FPS和45.7%的NDS。本文最大的模型(ResNet-101@900x1600)在nuScenes验证集上获得了具有竞争力的53.5%的NDS。

论文链接: https://arxiv.org/pdf/2301.12511.pdf,作者在arxiv上传了两个版本,这一版为期刊版本。

项目链接: https://github.com/Sense-GVT/Fast-BEV


文章目录

Introduction

目前,为了从2D图像特征进行3D感知,在nuScenes数据集上最先进的BEV方法要么是使用transformer的变换,要么是使用基于隐式或显式深度的变换。然而,它们很难部署在车载芯片上,并且推理速度慢。

  • (1)基于transformer转换的方法如图1(a)所示。由于解码器需要注意力机制,这些方法通常需要专用芯片来支持。
  • (2)基于深度变换的方法如图1(b)所示。这些方法通常需要加速的、不方便部署的体素池化操作,甚至多线程CUDA内核也可能不是最佳解决方案。此外,这对于在资源受限或不受CUDA加速推理库支持的芯片上运行也不方便。

它们的推理非常耗时,这阻碍了它们的实际部署。本文提出了为车载芯片设计一种部署友好、推理速度快、性能具有竞争力的BEV感知框架。

基于以上观察,本文以 M 2 B E V M^2BEV M2BEV 模型为基础,即在图像到BEV视图转换过程中,假设图像深度沿相机光线均匀分布,本文提出了快速光线变换 (Fast-Ray),如图1 (c) 所示,它通过查找表和多视图到单体素操作将BEV变换加速到一个新的水平。 基于Fast-Ray变换,本文提出了Fast-BEV,一种更快更强的全卷积BEV感知框架,不需要昂贵的transformer转换或深度表示。

具体来说:

  • (1) 本文提出了一种轻量级、易于部署的快速推理视图变换:Fast-Ray Transform,它通过将多视角2D图像特征沿摄像机射线投影到3D体素来获得BEV表征。此外,本文还提出了两种操作,即查表操作多视图投影到到一个体素操作,以优化车载平台的处理过程。
  • (2) 已有方法的视图转换非常耗时,多尺度投影操作的时间开销大,难以在实际中使用。基于Fast-Ray变换,2D到3D投影具有极快的速度,使得具有多尺度投影操作的多尺度图像编码器成为可能。 具体地说,与现有的大多数使用单尺度特征作为图像编码输出的方法不同,本文在图像编码输出部分采用了**三层多尺度特征金字塔网络(FPN)**结构。然后进行相应的三级多尺度投影运算。
  • (3) 对于BEV编码器,本文使用了极少的原始残差网络作为基本的BEV编码器。在此基础上,采用了三种降维操作来加速编码器,它们分别是(space-to-channel)算子、多尺度级联融合(multi-scale concatenation fusion)算子和多帧级联融合(multi-frame concatenation fusion)算子。
  • (4) 本文使用了图像和BEV空间的强数据增强策略,如flipping, rotation, resize等。数据增强分别在图像空间和BEV空间进行,不仅避免了过拟合,而且获得了更好的性能。
  • (5) 本文还使用了时域融合,通过引入时间特征融合模块,使当前关键帧能够充分利用历史帧中的信息。综合(1)和(3),Fast-BEV可以在车载芯片上实现更快的推理速度。进一步结合(2)、(4)和(5),Fast-BEV可以取得具有竞争力的性能。

Methods

Rethink BEV Perception 2D-to-3D Projection

下面介绍Fast-BEV细节,首先回顾已有方法如何实现2D-3D转换。在BEV感知中,最重要的是如何将2D特征转换到3D空间? 如图1所示,基于query的方法通过transformer中的注意机制获得3D BEV特征。这个过程可以表示为公式:

F b e v ( x , y , z ) = A t t n ( q , k , v ) F_{b e v}(x, y, z)={Attn}(q, k, v) Fbev(x,y,z)=Attn(q,k,v)

其中, q ⊂ P x y z , k , v ⊂ F 2 D ( u , v ) q \subset P_{x y z},k,v \subset F_{2D}(u,v) qPxyzk,vF2D(u,v) P x y z P_{x y z} Pxyz是预定义3D空间中的anchor 点,F_{2D}(u,v) 是2D图像特征,在部署过程中,注意力机制对一些计算平台不友好,这阻碍了这些方法的实际应用。

基于深度表示的方法通过计算二维特征和预测深度的外积来获得三维BEV特征。具体过程用公式表示为:
F b e v ( x , y , z ) = P o o l { F 2 D ( u , v ) ⊗ D ( u , v ) } x , y , z F_{b e v}(x, y, z)={Pool}\left\{F_{2 D}(u, v) \otimes D(u, v)\right\}_{x, y, z} Fbev(x,y,z)=Pool{F2D(u,v)D(u,v)}x,y,z

其中, D ( u , v ) D(u,v) D(u,v) 为从图像特征中预测得到的图像深度, ⊗ \otimes 为外积操作。在CUDA多线程的支持下,这些方法在GPU平台上大大提高了推理速度,但在较大的分辨率和特征维度下会遇到计算速度瓶颈,在没有推理库支持的情况下移植到非GPU平台不是很方便。


Overview of Fast-BEV

M 2 B E V M^2BEV M2BEV 是第一个使用统一的BEV表征来解决多摄像头多感知任务的工作,在车端平台有极大的应用潜力,因为它不需要很昂贵的视角转换或深度表征,Fast-BEV就是受到了它的启发,同时兼顾了性能和速度。整个框架如下图所示,输入为多个相机图片,输出为3D bbox,同时还有速度信息。整个框架包含五个模块:

  • Fast-Ray Transformation。实验发现,从图像空间到voxel空间的投影非常耗时。本文提出了Fast-Ray变换,将多视角2D图像特征沿相机射线投影到3Dvoxel,并针对车载平台提出了两种操作。(1)预先计算了固定的投影索引,并将其存储为静态查找表,这在推理过程中具有极高的效率。(2)让所有相机投影到同一个voxel,避免昂贵的voxel聚合,在GPU上的耗时可以忽略不计,CPU上的速度远远领先于其他解决方案,非常便于部署。
  • Multi-Scale Image Encoder。收到2D检测任务的启发,多尺度可以带来性能的提高。利用Fast-Ray变换带来的速度优势来设计多尺度BEV感知范式,期望从多尺度信息中获得性能优势。在Fast-BEV中,图像编码器通过三层FPN输出结构从统一的单尺度图像输入中获得多尺度图像特征输出。
  • Efficient BEV Encoder。实验发现,在快速增加耗时的情况下,3D编码器中更多的blocks和更大的分辨率并不能显著提高模型的性能。 BEV编码器只使用了一层多尺度级联融合(MSCF)和多帧级联融合(MFCF)模块,残差结构较少,大大减少了时间消耗,且不影响精度。
  • Data Augmentation。实验发现,在模型训练的后期,出现了严重的过拟合问题。这是因为模型架中没有使用数据增强。受最近的工作启发,在图像和BEV空间上都使用了强数据增强,如随机翻转、旋转。
  • Temporal Fusion。在真实的自动驾驶场景中,输入在时间上是连续的,并且在时间上具有巨大的互补信息。 例如,在当前帧被部分遮挡的行人可能在过去的几帧中完全可见。因此,本文通过引入时间特征融合模块,将模型从纯空间扩展到空间时域空间。

Fast-Ray Transformation

Basic View Transformation视图变换是将二维图像空间的特征转换到三维BEV空间的关键部分,整个过程通常需要很长的时间。 本文假设沿着射线方向深度是均匀分布的,一旦获得相机内外参,可以很方便地知道2D-3D投影。由于这里没有使用可学习的参数,所以可以很容易地计算出图像特征图和BEV特征图中的点之间的对应矩阵。基于这一假设,从预计算**投影索引(查找表)密集体素特征生成(多视图到单体素)**两个角度进一步加速了这一过程。
Look-Up-Table。一旦感知系统建立好后,相机内外参是固定的。因此不需要为每次迭代计算相同的索引,只需预先计算固定的投影索引并存储起来。在推理阶段,我们可以通过查找表来获得投影索引,这是一种在边缘设备上非常廉价的操作。如果从单帧扩展到多帧,也可以很容易地预计算出内外参数,并将它们对齐到当前帧。算法如下图所示,通过摄像机参数矩阵投影来构造与输出3Dvoxel空间相同维度的查找表LUT。迭代每个体素单元,并通过投影计算与3D坐标对应的2D像素坐标。如果获得的二维像素坐标是有效的,将它们填充到LUT中以建立数据相关的索引映射。


Multi-View to One-Voxel。基本视图变换使用体素聚合操作,该操作存储每个摄影机视图的离散体素特征,然后聚合它们以生成最终体素特征。如图3(a)所示,由于每个摄像头只有有限的视角,每个体素特征都非常稀疏,只有大约17%的位置是非零点。实验发现,由于这些体素特征的大尺寸,聚集这些体素特征是非常昂贵的。建议生成密集的体素特征,以避免昂贵的体素聚集。具体地说,让来自所有相机视图的图像特征投影到相同的体素特征,从而在结束时产生一个密集的体素,如图3(b)所示。对于多个视图重叠区域的情况,直接采用第一个遇到的视图来提高建表速度。结合查表和多视图到一体素加速设计,视图变换操作具有极快的投影速度。


Multi-Scale Image Encoder

多尺度图像编码器,使用ResNet-50网络获得4阶段特征,然后在输出部分使用3层多尺度FPN结构。FPN每一层进行特征融合,最终得到3层特征 F = R N × W i × H i × C , i ∈ [ 4 , 8 , 16 ] F={R^{N\times\frac{W}{i}\times\frac{H}{i}\times C}},i\in[4,8,16] F=RN×iW×iH×C,i[4,8,16]。通过Fast-Ray变换获得多尺度BEV特征 V = R X i × Y i × Z × C , X i , Y i ∈ [ 200 , 150 , 100 ] V={R^{X_i \times Y_i \times Z \times C}},X_i,Y_i \in [200,150,100] V=RXi×Yi×Z×C,Xi,Yi[200,150,100]


Efficient BEV Encoder

BEV特征是4D张量。时间融合会将这些特征叠加在一起,这会使BEV编码器有很大的计算量。为了提高编码速度,采用了三种降维操作,分别是“空间到通道”(S2C)操作、多尺度级联融合(MSCF)算子和多帧级联融合(MFCF)算子。

  • S2C算子将4D体素张量 V ∈ R X × Y × Z × C V∈R^{X×Y×Z×C} VRX×Y×Z×C 转换为3DBEV张量 V ∈ R X × Y × ( Z C ) V∈R^{X×Y×(ZC)} VRX×Y×(ZC),从而避免了使用昂贵的3D卷积。
  • 在MFCF操作之前,值得注意的是通过多尺度投影获得的BEV特征是不同尺度的。首先将 X X X Y Y Y维度上的多尺度BEV特征上采样到相同大小。MSCF和MFCF操作将通道维度中的多尺度多帧特征连接在一起,并从较高的参数量到较低的参数量进行融合,从而加快了BEV编码器的计算时间。此外,通过实验发现,BEV编码器的块数目和3D体素分辨率的大小对性能的影响相对较小,但占用的速度消耗较大,因此块数越少,体素分辨率越小也就越关键。

Data Augmentation

数据增强方法参参考了BEVDet方案。

  • 图像增强。由于3D场景中的图像与3D摄像机的坐标有直接关系,3D目标检测中的数据增强比2D检测更具挑战性。因此,如果在图像上应用数据增强,还需要改变相机的内参矩阵。对于增强操作,使用常见的操作,如翻转、裁剪和旋转。
  • 与图像增强类似,可以对BEV空间应用类似的操作,如翻转、缩放和旋转。请注意,增强变换应同时应用于BEV特征图和3D真值框以保持一致性。可以通过相应地修改相机外参矩阵来控制BEV增强变换。


Temporal Fusion

受BEVDet4D和BEVFormer的启发,进行时间特征融合。通过空间对齐操作和连接操作,将历史帧的特征与当前帧的对应特征进行融合。时间融合可以被认为是帧级别的特征增强,在一定范围内,较长的时间序列可以带来更多的性能提升。具体地说,本文使用三个历史关键帧对当前帧进行采样;每个关键帧具有0.5s的间隔。我们采用了BEVDet4D中的多帧特征对齐方法。FAST-BEV使用三个历史帧,显著提高了性能。


3D检测头,本文参考了PointPillars方法,用到了Focal损失,Smooth-1损失和二分类损失。


Experiments

Speed Comparison with Popular Methods

下面是论文实验部分,首先是与其它方法的视图转换速度比较

视图转换影响BEV感知解决方案的设计,影响模型在不同平台上的可部署性和速度。在CPU和GPU平台上,本文将提出的Fast-Ray变换与其他流行的基于LSS的视图变换方法,如LSS-DEVDet、LSS-BEVDepthMatrixVT进行了比较。为了进行公平的比较,本文按照MatrixVT实验设置进行速度比较,其中考虑了影响视图转换延迟的三个主要因素:通道数、图像分辨率和体素大小。注意的是,LSS-BEVDet是BEVDet中使用的加速视图变换;LSS-BEVDepth是BEVDepth中的CUDA多线程视图变换,在CPU平台上不可使用;LSS-MatrixVT是MatrixVT中提出的视图变换。为了全面比较几种不同的解决方案,本文在CPU和GPU两个平台上比较了从S1到S6的6种不同设置,其中 S i S_i Si表示将不同的图像特征大小投影到不同的BEV特征大小。所有的延迟测量都在2080Ti设备上进行。

如下图图7所示,本文给出了Fast-Ray和其他方法的视图变换延迟结果。左图显示了CPU延迟,可以知道,无论是较小维度的S1设置还是较大维度的S6设置,Fast-Ray变换都比LSS-BEVDet和MatrixVT有很大的速度优势。具体地说,S1设置Fast-Ray比LSS-BEVDet快22倍,比MatrixVT快4倍;S6设置Fast-Ray比LSS-BEVDet快23倍,比MatrixVT快3倍;其余设置具有类似的比例速度优势。 右图显示了CUDA延迟,可以看到从S1到S6设置,与LSS-BEVDet、LSS-BEVDepth和MatrixVT相比,Fast-Ray的延迟可以忽略不计。FAST-Ray将视图转换的延迟压缩到了极致,特别是当特征大小相对较大时,速度优势比其他方法更显著。


下面是端到端部署速度比较。在实现视图转换的基础上,本文比较了Fast-Bev、BEVDet4D和BEVDepth方案在2080Ti平台上部署后的延迟。如表1所示,表的上半部分是三种方案的详细设置,包括每个组件的具体配置,包括图像分辨率、图像编码器、2D到3D转换方法、BEV分辨率、BEV编码器和检测头。表的下半部分是在性能相当的情况下各部分的延迟和三种方案的总体延迟的比较。 具体地说,2D到3D部分包括CPU和CUDA两个平台。从表格中可以看出,虽然三种解决方案中使用的这些组件的类型可能不同,但它们的性能基本相当,值得注意的是,Fast-Bev使用4帧融合,另外两种使用2帧融合。

在这种性能相当的设置下,本文对比了它们部署后的时延,从表1下半部分的最后一栏可以看出,Fast-BEV在CUDA上的延迟更小,在CPU上从2D到3D的延迟优势更加明显。具体来说,Fast-Bev在CUDA上可以达到52.6FPS,优于BEVDet4D的30.2FPS和BEVDepth的41.3FPS。当在CPU上进行2D到3D转换时,Fast-BEV可以达到21.3FPS,比其他两种方法快3倍。此外,从2D到3D视图转换和3D编码器两栏可以看出,Fast-BEV的延迟优势主要来自这两个部分,这也符合本文设计Fast-Ray变换和高效BEV编码器的动机。


Performance Compare with Other Methods

表2所示,与现有的方法性能相比,Fast-BEV在mAP和NDS方面表现出了更好的性能。FAST-BEV主要强调效率和部署友好性。虽然它不使用任何深度信息,也不使用任何显式和隐式的深度信息监督,但与现有方法相比,它具有很好的性能。


Detailed Ablation Analysis

下面是消融实验,在这里FAST-BEV使用ResNet-50作为主干网,默认图像分辨率为250×704,体素分辨率为200×200×6。

作者比较了不同数据增强方法、不同历史帧数融合、多尺度特征、图像分辨率、voxel分辨率、训练轮数、以及2D/3D编码器对性能的影响。


Benchmark

下面是一些基准测试实验,为了满足不同边缘计算能力平台的部署需求,本文设计了从M0到M5的一系列高效模型,如表10所示。本文设置了不同的图像编码器(从ResNet-18到ResNet-50)、图像分辨率(从256×704到900×1600)、体素分辨率(从200×200×4到250×250×6)和BEV编码器(从2b-192c到6b-256c)来设计模型尺寸。从表10可以看出,从M0到M5,随着图像编码器、图像分辨率、体素分辨率、BEV编码器逐渐变大,模型性能也在逐渐提升。

本文在CUDA-TensorRT-INT8的加速下,在不同的车载平台(Xavier、Orin、T4)上部署了M系列模型。具体来说,在CUDA11.4-TRT8.4.0-INT8加速情况下,AGX Xavier的计算能力为22TOPS;在CUDA11.4-TRT8.4.0-INT8加速的情况下,AGX Orin 64G的计算能力为170TOPS;在CUDA11.1-TRT7.2.1-INT8加速情况下,T4的计算能力为130TOPS。

如表11所示,本文评估了M系列模型在这些车载设备上的延迟,并将延迟细分为2D/2D-to-3D/3D三个部分。从表11可以看到:

  • 随着M系列模型逐渐变大,性能逐渐提高,同一计算平台上的延迟也基本逐渐增大。2D和3D编码器的延迟也分别增加。
  • 从左到右,随着这三种设备的实际计算能力的逐渐增加(实际上T4算力由于Orin),M系列各模型的延迟逐渐减小。
  • 结合表11中M系列的性能可以发现,在仅考虑延迟的情况下,M0模型在Xavier这样的低计算平台上可以达到19.7FPS,能够达到实时推理速度。考虑到性能,M2模型在性能和延迟具有最合理的权衡,在Orin平台上可以达到43.3 FPS,能够达到实际的实时推理要求。

有关详解视觉BEV3D检测模型: Fast-BEV: A Fast and Strong Bird‘s-Eye View Perception Baseline的更多相关文章

  1. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  2. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  3. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  6. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  7. 【自动驾驶环境感知项目】——基于Paddle3D的点云障碍物检测 - 2

    文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3

  8. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  9. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  10. ruby - 尝试在 Windows 8 (x64) : Error installing fast-stemmer-1. 0.2.gem 上安装 Jekyll - 2

    我正在尝试使用本手册让Jekyll在Windows8x64上运行:RunningJekyllonWindows我正在使用来自rubyinstaller.org的以下两个下载:ruby2.0.0-p0(x64)DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe所以我根据手册设置了Ruby和DevKit(希望它是更新的版本)。我尝试运行一点HelloWorld.rb脚本,它工作正常,路径变量已设置。然后我尝试运行geminstalljekyll并得到以下输出:geminstalljekyll-outputonpastebin.com问题似乎出在名为f

随机推荐