快速入门指南

校准指南
Apollo目前提供强大的校准服务,可满足您从LiDAR,IMU到摄像机的校准要求。百度还可以提供这项服务。
软件硬件安装


需要安装的硬件主要有:
–GPS天线
–IPC
–GPS接收器和IMU
型号有:NovAtel SPAN-IGM-A1
NovAtelSPAN®ProPak6™和NovAtel IMU-IGM-A1
NovAtelSPAN®PwrPak7™
Navtech NV-GI120
–激光雷达(LiDAR)
型号有:Velodyne VLS-128
Velodyne HDL-64E S3
Velodyne冰球系列
创新激光雷达
河赛的潘多拉
–Camera
型号有:带有USB 3.0外壳的Leopard Imaging LI-USB30-AR023ZWDR
阿格斯相机(FPD-Link)
威森相机
–雷达
型号有:大陆ARS408-21
浣熊B01HC
–控制器局域网(CAN)卡─ESD CAN-PCIe / 402-B4
需要安装在IPC上的软件有:
–Ubuntu Linux
–阿波罗内核
–Nvidia GPU驱动程序
关于dreamview的使用
dreamview是一种WEB 应用,提供可视化界面和调试工具,并可以查看硬件状态。
关于操作说明详见:https://github.com/ApolloAuto/apollo/blob/master/docs/specs/dreamview_usage_table.md
机载测试的流程
1.将外部硬盘驱动器插入主机中任何可用的USB端口
2.打开车辆,然后打开主机
3.启动Dev Docker容器
4.启动DreamView
5.选择模式,车辆和地图
6.启动模块,点击Setup按钮
转到“ 模块控制器”选项卡,检查所有模块和硬件是否已准备就绪(注意:在离线环境中,无法启动GPS,CANBus,Velodyne,Camera和Radar等硬件模块)(注意:您可能需要四处行驶以获得良好的GPS信号)
7.在下Default Routing选择您想要的路线
8.在“任务”下,单击Start Auto。(注意:开始自动驾驶时要小心,您现在应该处于自动驾驶模式)
9.自主测试完成后,在下Tasks单击Reset All,关闭所有窗口并关闭计算机
10.卸下硬盘驱动器

Apollo 5.5技术教程

Apollo Cyber​​ RT
Apollo Cyber​​ RT是一个开源的高性能运行时框架,专门为自动驾驶场景设计。它基于集中式计算模型,针对自动驾驶中的高并发,低延迟和高吞吐量进行了极大的优化。
在自动驾驶技术发展的最后几年中,我们从以前的Apollo经验中学到了很多东西。这个行业在发展,阿波罗也在发展。展望未来,Apollo已经从开发转向产品化,并且在现实世界中进行了大规模部署,我们看到了对最高水平的鲁棒性和性能的需求。因此,我们花费了数年的时间来构建和完善Apollo Cyber​​ RT,以解决自动驾驶解决方案的这一需求。
软件架构
1.感知 -感知模块可识别自动驾驶汽车周围的世界。感知内部有两个重要的子模块:障碍物检测和交通信号灯检测。
2.预测 —预测模块可以预测感知到的障碍物的未来运动轨迹。
3.路线选择 -路线选择模块告诉自动驾驶汽车如何通过一系列车道或道路到达目的地。
4.规划 -规划模块为自动驾驶汽车规划时空轨迹。
5.控制 -控制模块通过生成控制命令(例如节气门,制动和转向)来执行计划的时空轨迹。
6.CanBus — CanBus是将控制命令传递到车辆硬件的接口。它还会将机箱信息传递到软件系统。
7.HD-Map(高清地图) —此模块类似于库。它通常不作为发布和订阅消息的工具,而是充当查询引擎的支持,以提供有关道路的临时结构信息。
8.本地化 -本地化模块利用各种信息源(例如GPS,LiDAR和IMU)来估计自动驾驶汽车的位置。
9.HMI -Apollo中的人机界面或DreamView是一个用于查看车辆状态,测试其他模块并实时控制车辆功能的模块。
10.监控器 -车辆中所有模块(包括硬件)的监控系统。
11.监护人 -一种新的安全模块,可执行操作中心的功能并进行干预,以使Monitor能够检测到故障。

每个模块都作为独立的基于CarOS的ROS节点运行。
感知
Apollo Perception 3.5具有以下新功能:
1.支持VLS-128 Line LiDAR
2.通过多个摄像机进行障碍物检测
3.先进的交通信号灯检测
4.可配置的传感器融合
感知模块具有使用5个摄像头(2个前置,侧面2个和1个后置)和2个雷达(前后)以及3个16线LiDAR(2个后置和1个前置)和1个128行LiDAR的功能识别障碍物并融合它们的各个轨迹以获得最终轨迹列表。障碍物子模块检测,分类和跟踪障碍物。该子模块还预测障碍物的运动和位置信息(例如,航向和速度)。对于车道线,我们通过对车道解析像素进行后处理来构造车道实例,并计算车道相对于自我车辆的相对位置(L0,L1,R0,R1等)。
预测
预测模块估计所有感知到的障碍物的未来运动轨迹。输出的预测消息包装感知信息。

收到本地化更新后,预测模块将更新其内部状态。当感知发出感知障碍信息时,触发实际预测。
本地化
定位模块汇总各种数据以定位自动驾驶汽车。本地化模式有两种:OnTimer和Multiple SensorFusion。
第一种本地化方法是基于RTK的,具有基于计时器的回调函数OnTimer,如下所示。

另一个本地化方法是多传感器融合(MSF)方法,其中注册了一堆事件触发的回调函数,如下所示。

路径

路径模块需要知道路由起点和路由终点,以计算通过车道和道路。通常,路线起点是自动驾驶车辆的位置。RoutingResponse计算和发布如下所示。
规划
Apollo 5.5使用多个信息源来计划安全且无碰撞的轨迹,因此计划模块几乎与所有其他模块进行交互。随着阿波罗(Apollo)的成熟并采用不同的路况和驾驶用例,规划已发展成为一种更具模块性,针对特定场景和全面的方法。在这种方法中,每个驾驶用例都被视为不同的驾驶场景。这是有用的,因为与以前的版本相比,现在可以解决在特定情况下报告的问题,而不会影响其他情况的工作,与以前的版本相反,问题修复会影响其他驾驶用例,因为它们都被视为单个驾驶情况。最初,计划模块获取预测输出。由于预测输出会包裹原始的感知障碍物,因此计划模块会订阅红绿灯检测输出,而不是感知障碍物输出。
然后,计划模块获取路由输出。在某些情况下,如果无法忠实遵循当前路线,则规划模块还可以通过发送路线选择请求来触发新的路线计算。最后,计划模块需要知道位置(本地化:我在哪里)以及当前的自动驾驶汽车信息(底盘:我的状态)。

控制
控制系统将计划轨迹作为输入,并生成控制命令以传递到CanBus。它具有五个主要数据接口:OnPad,OnMonitor,OnChassis,OnPlanning和OnLocalization。

该OnPad和OnMonitor与基于PAD-人机接口和模拟日常互动。
CanBus
CanBus具有两个数据接口,如下所示。

第一个是OnControlCommand具有回调功能的基于事件的发布者,当CanBus模块接收控制命令时将触发该事件,而第二个是OnGuardianCommand。
人机界面
人机界面或Apollo中的DreamView是一个Web应用程序,它:-可视化相关自动驾驶模块的当前输出,例如规划轨迹,汽车定位,底盘状态等。-提供人机界面供用户查看硬件状态,转向打开/关闭模块,并启动自动驾驶汽车。-提供调试工具,例如PnC Monitor,可有效跟踪模块问题。
监控
车辆中所有模块的监视系统,包括硬件。Monitor从不同的模块接收数据,并将它们传递给HMI,以供驱动程序查看并确保所有模块正常工作。如果模块或硬件出现故障,监视器将向Guardian(新的Action Center模块)发送警报,然后由Guardian决定需要采取哪些措施来防止崩溃。
监护人
这个新模块基本上是一个行动中心,它根据Monitor发送的数据做出决策。监护人有2个主要功能:
所有模块工作正常-Guardian允许控制流正常工作。就像没有监护人一样,控制信号也会发送到CANBus。
Monitor可以检测到模块崩溃-如果Monitor检测到故障,Guardian将阻止控制信号到达CANBus并使汽车停下来。监护人可以通过3种方式决定如何停车,为此,监护人求助于最终的Gatekeeper,超声波传感器,
如果超声波传感器在没有发现障碍物的情况下运行良好,则监护人会将汽车缓慢停下来
如果传感器没有响应,则Guardian会施加强力制动,以使汽车立即停止。
这是一种特殊情况,如果HMI将即将发生的撞车事故告知驾驶员,并且驾驶员在10秒钟内未进行干预,则Guardian会施加硬制动,以使汽车立即停车。

3D障碍物感知

3D障碍感知包括三个主要部分:
–LiDAR障碍物感知
–雷达障碍物感知
–障碍结果融合
LiDAR障碍物感知
以下各节描述了障碍物感知pipeline,其中输入的输入来自LiDAR传感器的3D点云数据,由Apollo解决:

1.HDMap感兴趣区域(ROI)过滤器

感兴趣区域(ROI)指定可驾驶区域,包括从HD(高分辨率)地图中检索到的道路表面和交叉路口。HDMap ROI过滤器处理ROI外部的LiDAR点,从而删除背景对象,例如道路周围的建筑物和树木。剩下的是ROI中的点云,用于后续处理。
给定一个HDMap,每个LiDAR点的隶属关系表明它在ROI的内部还是外部。可以使用汽车周围区域的2D量化查询表(LUT)查询每个LiDAR点。下表总结了HDMap ROI过滤器模块的输入和输出。

Apollo HDMap ROI过滤器通常包括三个连续的步骤:
坐标转换:
对于HDMap ROI过滤器,HDMap的数据接口由一组多边形定义,每个多边形实际上是世界坐标系中一组有序的点。使用HDMap ROI对点进行查询需要将点云和面表示在同一坐标系中。为此,Apollo将输入点云和HDMap多边形的点转换为源自LiDAR传感器位置的局部坐标系。
ROI LUT建设:
为了确定输入点,无论是在ROI的内部还是外部,Apollo都采用了将ROI量化为鸟瞰2D网格的网格LUT。如图1所示,该LUT覆盖了一个矩形区域,该区域由HDMap边界中从上方围绕该通用视图的预定义空间范围界定。然后,它代表每个网格单元与ROI的隶属关系(即1/0表示它在ROI的内部/外部)。为了提高计算效率,Apollo使用扫描线算法和位图编码来构造ROI LUT。
蓝线表示HDMap ROI的边界,包括路面和路口。红色实心点表示与LiDAR传感器位置相对应的局部坐标系的原点。2D网格由8×8的单元格组成,显示为绿色正方形。ROI内的单元格是蓝色填充的正方形,而ROI外的单元格是黄色填充的正方形。
使用ROI LUT进行积分查询:
基于ROI LUT,使用两步验证来查询每个输入点的隶属关系。然后,阿波罗如下所述进行数据编辑和输出。对于积分查询过程,Apollo:
标识该点是在ROI LUT矩形区域的内部还是外部。查询LUT中该点的相应单元格是否与ROI有关。收集属于ROI的所有点,并输出其相对于输入点云的索引。
在配置文件中设置用户定义的参数:modules/perception/production/data/perception/lidar/models/roi_filter/hdmap_roi_filter/hdmap_roi_filter.conf。
下表描述了HDMap ROI过滤器的参数用法。

2.卷积神经网络(CNN)分割

使用HDMap ROI过滤器识别周围环境后,Apollo获得过滤后的点云,该点云仅包含ROI内部的点(即,可行驶的道路和交叉路口区域)。大部分背景障碍(例如道路区域周围的建筑物和树木)都已被清除,并且ROI内部的点云被馈入到细分模块中。该过程检测并分割出前景障碍物,例如汽车,卡车,自行车和行人。

阿波罗(Apollo)使用深层CNN进行准确的障碍物检测和分割。Apollo CNN分割包括四个连续的步骤:
–通道特征提取。
–基于CNN的障碍物预测。
–障碍物聚类。
–后期处理
通道特征提取
给定一个点云框架,Apollo将建立一个鸟瞰图(即投影到XY平面),该视图是局部坐标系中的2D网格。相对于原点(即LiDAR传感器)在预定义范围内的每个点都将基于其X和Y坐标量化为2D网格的一个单元。量化后,Apollo为网格的每个像元计算8个点的统计测量值,这将是在后续步骤中馈入CNN的输入通道特征。计算出的统计量为:
–单元中点的最大高度。
–单元中最高点的强度。
–单元中点的平均高度。
–单元中点的平均强度。
–单元中的点数。
–像元中心相对于原点的角度。
–像元中心与原点之间的距离。
指示单元格是空还是已占用的二进制值。
以下各节详细介绍了深层CNN。
基于CNN的障碍物预测
基于上述通道特征,Apollo使用深层全卷积神经网络(FCNN)预测单元方向的障碍物属性,包括相对于潜在物体中心的偏移位移-称为中心偏移,(请参见下面的图2) ,客观性,积极性和物体高度。如图2所示,网络的输入是W × H × C通道图像,其中:
W代表网格的列号。
H代表网格的行号。
C代表通道特征的数量。
FCNN由三层组成:
下游编码层(功能编码器)。
上游解码层(功能解码器)。
障碍物属性预测层(预测器)。
特征编码器将通道特征图像作为输入,并通过增加特征抽象来对其空间分辨率进行连续下采样。然后,特征解码器逐渐将编码后的特征图像上采样到输入2D网格的空间分辨率,这可以恢复特征图像的空间细节,从而有助于按单元进行障碍物属性预测。下采样和上采样操作是根据具有非线性激活(即ReLu)层的堆叠卷积/卷积层实现的。

障碍物聚类
在基于CNN的预测步骤之后,Apollo获得单个小区的预测信息。Apollo利用五个包含以下内容的单元对象属性图像:
–中心偏移
–客观性
–积极性
–物体高度
–类概率
为了生成障碍物,Apollo会基于像元中心偏移量预测来构造有向图,并搜索连接的组件作为候选对象簇。
如图3所示,每个像元都是图形的一个节点,并且有向边基于该像元的中心偏移预测而构建,该中心偏移预测指向其父节点与另一个像元相对应。
给定该图,Apollo采用压缩的Union Find算法来有效地找到连接的组件,每个组件都是候选的障碍物对象簇。客观性是成为一个单个单元格的有效对象的概率。因此,Apollo将非对象单元格定义为对象度小于0.5的单元格。因此,Apollo会为每个候选对象群集过滤出空单元格和非对象单元格。
红色箭头表示每个像元的对象中心偏移预测。
蓝色遮罩对应于对象概率不小于0.5的对象单元。
红色实心多边形内的单元构成候选对象簇。
红色填充的五角星表示对应于所连接组件的子图的根节点(单元)。
一个候选对象簇可以由其根节点彼此相邻的多个相邻连接的组件组成。
针对每种候选障碍物类型(包括车辆,行人,自行车手和未知对象),在对象群集内的节点(单元)上汇总类别概率。对应于最大平均概率的障碍物类型是对象簇的最终分类结果。
后期处理
聚类后​​,Apollo获得一组候选对象聚类,每个候选对象聚类包括几个单元。在后处理步骤中,Apollo首先通过平均所涉及单元格的正值和对象高度值来平均计算每个候选群集的检测置信度得分和对象高度。然后,阿波罗删除相对于预测对象高度过高的点,并为每个候选聚类收集有效单元的点。最后,阿波罗(Apollo)移除置信度得分非常低或点数少的候选聚类,以输出最终的障碍聚类/细分。
在配置文件中设置用户定义的参数modules/perception/production/data/perception/lidar/models/cnnseg/velodyne128/cnnseg_param.conf。
下表说明了CNN细分的参数用法和默认值。

注意:提供的模型仅是用于实验目的的样本。
MinBox Builder
对象构建器组件为检测到的障碍建立边界框。由于遮挡或与LiDAR传感器的距离,形成障碍的点云可能会稀疏并仅覆盖部分表面。因此,框生成器会在给定多边形点的情况下恢复整个边界框。边界框的主要目的是即使点云稀疏也可以估计障碍物(例如,车辆)的前进方向。同样,边界框用于可视化障碍物。
该算法背后的思想是找到在多边形点边缘已给定的所有区域。在以下示例中,如果AB为边,则Apollo会将其他多边形点投影到AB上,并建立具有最大距离的交点对。那是属于边界框的边缘之一。这样就很容易获得边界框的另一条边。通过迭代多边形中的所有边,如图4所示,Apollo确定了6边边界框。然后,Apollo选择面积最小的解决方案作为最终边界框。
HM对象跟踪器
HM对象跟踪器设计用于跟踪由分割步骤检测到的障碍物。通常,它通过将当前的检测与现有的跟踪列表相关联来形成和更新跟踪列表,如果旧的跟踪列表不再存在,则将其删除,如果识别出新的检测,则生成新的跟踪列表。在关联之后估计更新的轨道列表的运动状态。在HM对象跟踪器中,匈牙利算法用于检测到跟踪的关联,而鲁棒卡尔曼滤波器用于运动估计。
检测到跟踪关联
将检测与现有轨道列表关联时,Apollo构造一个二部图,然后使用匈牙利算法以最小的成本(距离)找到最佳的检测到轨道匹配。
计算关联距离矩阵
第一步,建立关联距离矩阵。根据一系列关联特征(包括运动一致性和外观一致性),计算给定检测与一条轨道之间的距离。HM跟踪器的距离计算中使用的一些功能如下所示:

另外,还有一些距离权重的重要参数,这些参数用于将上述关联特征组合到最终距离测量中。
通过匈牙利算法进行二部图匹配
给定关联距离矩阵,如图5所示,Apollo构造了一个二部图,并使用匈牙利算法通过最小化距离成本来找到最佳的跟踪检测匹配。它解决了O(n ^ 3)时间复杂度内的分配问题。为了提高计算性能,在将原始二部图切成子图之后,通过删除距离大于合理最大距离阈值的顶点来实施匈牙利算法。

跟踪运动估计
在检测到跟踪关联之后,HM对象跟踪器使用稳健卡尔曼滤波器来估计具有恒定速度运动模型的当前轨道列表的运动状态。运动状态包括置信锚点和置信速度,分别对应于3D位置和3D速度。为了克服由不完善的检测引起的干扰,跟踪器的过滤算法中采用了稳健统计技术。
观察冗余
在一系列冗余的观测值中选择作为过滤算法输入的速度测量值,这些观测值包括锚点偏移,边界框中心偏移和边界框角点偏移。冗余观测为过滤测量带来了额外的鲁棒性,因为所有观测失败的概率远小于单个观测失败的概率。
分解
高斯滤波器算法假定其噪声是由高斯分布产生的。但是,该假设可能无法解决运动估计问题,因为其测量的噪声可能来自粗尾分布。阿波罗在滤波过程中使用击穿阈值来抵消更新增益的过高估计。
根据协会质量更新
原始的卡尔曼滤波器在不区分测量质量的情况下更新其状态。但是,测量质量是过滤噪声的有益指标,可以估算出来。例如,在关联步骤中计算出的距离可以是对测量质量的合理估计。根据关联质量更新过滤算法的状态可以增强运动估计问题的鲁棒性和平滑度。
HM对象跟踪器的高级工作流程如图6所示。
M对象跟踪器工作流程中的要点是:
构造跟踪对象并将其转换为世界坐标。
预测现有轨道列表的状态并将检测结果与它们匹配。
更新更新的跟踪列表的运动状态并收集跟踪结果。
顺序类型融合
为了平滑障碍物类型并减少整个轨迹上的类型切换,Apollo利用基于线性链条件随机场(CRF)的顺序类型融合算法,可以将其表达为:

一元项作用在每个单个节点上,而二元项作用在每个边缘上。

一元项中的概率是基于CNN的预测输出的类别概率,而二元项中的状态转换概率是通过从时间t-1到时间t的障碍物类型转换来建模的,这是从大量统计数据中获悉的的轨迹。具体来说,阿波罗(Apollo)还使用学习的混淆矩阵来指示从预测类型变为地面真实类型的概率,以优化原始的基于CNN的类别概率。
使用维特比算法,通过解决以下问题来优化顺序障碍物类型:


雷达探测器
给定来自传感器的雷达数据,请遵循如下所述的基本过程。
首先,应该扩展轨道ID,因为Apollo需要用于ID关联的全局轨道ID。原始雷达传感器仅提供8位ID,因此很难确定两个相邻帧中具有相同ID的两个对象在跟踪历史中是否表示单个对象,尤其是在存在丢帧问题时。阿波罗使用雷达传感器提供的测量状态来解决此问题。同时,Apollo将新的轨道ID分配给远离与前一帧具有相同轨道ID的对象的对象。
其次,使用假正滤波器消除噪声。阿波罗通过雷达数据设置一些阈值,以过滤可能是噪声的结果。然后,根据雷达数据以统一的对象格式构建对象。阿波罗通过校准结果将物体转换为世界坐标。原始的雷达传感器提供了物体的相对速度,因此阿波罗使用了本地化的本车速度。阿波罗将这两个速度相加,以表示被检测物体的绝对速度。
最后,HDMap ROI过滤器用于获取感兴趣的对象。传感器融合算法仅使用ROI内部的对象。
障碍结果融合
传感器融合模块设计用于融合LiDAR跟踪结果和雷达检测结果。Apollo首先通过跟踪融合项目的ID将传感器结果与融合项目进行匹配。然后,它为不匹配的传感器结果和不匹配的融合项计算关联矩阵,以获得最佳匹配结果。
对于匹配的传感器结果,使用自适应卡尔曼滤波器更新相应的融合项。对于不匹配的传感器结果,创建一个新的融合项。删除所有过时的,不匹配的融合项目。
融合项目管理
阿波罗(Apollo)具有发布传感器的概念。给定的雷达结果将被缓存。给定的LiDAR结果触发融合动作。传感器融合输出的频率与发布传感器的频率相同。阿波罗(Apollo)的发布传感器是LiDAR。传感器结果将输入按传感器时间戳分类的融合管道。阿波罗保留所有传感器结果。在Apollo中为不同的传感器对象设置了对象生存时间。如果至少一个传感器结果得以幸存,则使对象保持活动状态。Apollo感知模块提供了LiDAR和雷达在汽车周围短距离区域的融合结果,以及仅雷达结果的长距离融合结果。
传感器结果与融合名单协会
将传感器结果与融合列表相关联时,Apollo首先匹配同一传感器的相同轨道ID,然后构造一个二分图,并使用匈牙利算法查找未匹配的传感器结果和融合列表的最佳融合结果匹配,通过最小化距离成本。匈牙利算法与HM对象跟踪器使用的算法相同。距离成本由传感器结果和融合项的锚点的欧式距离计算得出。
运动融合
阿波罗(Apollo)使用自适应卡尔曼滤波器,以恒定的加速度运动模型估算当前物品的运动。运动状态包括其置信锚点,置信速度和置信加速度,分别对应于3D位置,其3D速度和加速度。阿波罗仅使用传感器结果中的位置和速度。在运动融合中,Apollo会缓存所有传感器结果的状态,并通过卡尔曼滤波器来计算加速度。阿波罗提供了LiDAR跟踪器和雷达探测器数据中位置和速度的不确定性。阿波罗将所有状态和不确定性馈入自适应卡尔曼滤波器,并获得融合结果。阿波罗在滤波过程中使用击穿阈值来抵消更新增益的过高估计。
3.MinBox Builder
4.HM ObjectTracker
5.顺序类型融合

apollo5.5.0技术文档相关推荐

  1. Guns 技术文档 v1.0

    Guns 技术文档 v1.0 Guns 技术文档 v1.0 1. 序言 1.1 文档简介 1.2 Guns教程 1.3 获取帮助 2. 使用手册 2.1 下载项目 2.2 导入项目 2.2.1 ecl ...

  2. [技术文档] 一劳永逸,用USB设备制作多系统引导

    2019独角兽企业重金招聘Python工程师标准>>> [技术文档] 一劳永逸,用USB设备制作多系统引导  [复制链接] binghe27 艺有所成 当前离线 主题 8  UID ...

  3. 代码统计工具1.1版本技术文档

    代码统计工具1.1版本技术文档 说明:主要记录自己在做这个项目的过程中用到的方法和相关技术 1.首先面临的问题就是怎样选择一个目录,网上搜索了一下,下面是解决方案(用到目录对话框) (1)从默认的磁盘 ...

  4. VuePress 手摸手教你搭建一个类Vue文档风格的技术文档/博客

    前言: VuePress是尤大为了支持 Vue 及其子项目的文档需求而写的一个项目,VuePress界面十分简洁,并且非常容易上手,一个小时就可以将项目架构搭好.现在已经有很多这种类型的文档,如果你有 ...

  5. 好程序员技术文档HTML5开发中的javascript闭包

    好程序员技术文档HTML5开发中的javascript闭包,事实上,通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格;更优雅,更简洁的表达出代码;在某些方面提升代码的执行效率,同时避免对命 ...

  6. (马世龙)Linux下CACTI完全搭建技术文档二

    续(马世龙)Linux下CACTI完全搭建技术文档一 6.完成cacti的安装 1. 首先检查一下rra/下面,有没有数据 2. snmpwalk -v 2c -c public ServerIP i ...

  7. d3js mysql_D3js技术文档 可视化展现

    转载请注明http://www.cnblogs.com/juandx/articles/3885220.html D3js技术文档 概述 D3 allows you to bind arbitrary ...

  8. python技术文档_Python技术文档最佳实践

    所有好的产品都应该有一份简洁易读的使用说明书,除了苹果的产品.苹果认为他们的产品应该设计成为无须说明,用户天生就应该知道如何使用的那种. 但是很显然,对于软件来说,其复杂性之高,往往要求有与之配套的详 ...

  9. IBM 技术文档:Spark, 快速数据分析的又一选择

    IBM 技术文档:Spark, 快速数据分析的又一选择 原文出处:http://www.ibm.com/developerworks/library/os-spark/ 摘要:尽管Hadoop在分布式 ...

最新文章

  1. 策略模式——Strategy
  2. python执行bat文件_python自动运行cmd,bat文件
  3. 《系统集成项目管理工程师》必背100个知识点-76配置审计
  4. 常用算法 之一 详解 MD5 实现(基于算法的官方原文档)及源码详细注释
  5. vue 时间插件_Vue3 插件开发详解尝鲜版「值得收藏」
  6. Emit动态代理.NetCore迁移之旅
  7. matlab将矩阵分解成lu,10行代码实现矩阵的LU分解(matlab)
  8. 计算机等级考试二级Python讲座(一)
  9. 关于二级域名Cookie的问题及解决方法
  10. SQLServer之删除用户自定义数据库用户
  11. iNet Network Scanner Mac(网络扫描工具)
  12. SQL中的n+1次select语句查询问题
  13. 使用高德地图API获取天气
  14. SQL存储过程前面后面的几句代码是什么意思?
  15. 我的世界JAVA挂机杀怪有经验_5分钟教你打造mc最简单的刷经验机!挂机就能无限经验?...
  16. CPU平均负载过高检查(iowait负载高)
  17. PostgreSQL分区
  18. 六年级下计算机课ppt课件ppt课件,人教版六年级数学下册
  19. FPGA项目开发之时钟规划
  20. Android设备唯一码的获取

热门文章

  1. mybatis 分页插件PageHelper的简单使用
  2. 第一个神经网络——定义卷积神经网络
  3. 二维CAD工程师(机械设计)考试A卷
  4. 2014版SEO工具集最新最全收集
  5. Newman+Jenkins实现接口自动化测试
  6. UE编辑器遇到的问题
  7. url模糊匹配优化_URL的相关注意事项
  8. 淘宝镜像的下载和使用
  9. 飞凌TE6410屏幕校准步骤
  10. 16w行的nginx源码,如何分拆模块阅读,手把手教你造轮子丨Nginx模块开发丨C/C++丨Linux服务器开发丨后端开发