08_apollo_scripts_scripts子模块软件架构分析
1. 概述
Apollo scripts子模块是Apollo自动驾驶平台的核心脚本集合,提供完整的开发、构建、测试和运行支持。采用模块化架构设计,将脚本按照功能划分为多个类别,包括基础环境配置、构建工具、模块管理、测试验证、数据处理等,实现开发流程自动化与标准化,简化平台使用复杂度,为开发者提供高效便捷的开发体验。
2. 软件架构图
Apollo scripts子模块采用功能导向的架构设计,将脚本按照功能和使用场景划分为多个模块,各模块之间通过清晰的接口和依赖关系进行交互。整个架构遵循高内聚、低耦合的设计原则,确保了脚本系统的稳定性和可维护性。
graph TB
subgraph "scripts子模块"
subgraph "基础环境模块"
B1[apollo_base.sh]:::key
B2[apollo.bashrc]:::key
B3[env.sh]:::key
B4[common.bashrc]:::key
end
subgraph "构建工具模块"
C1[apollo_buildify.sh]:::key
C2[apollo_clean.sh]:::key
C3[apollo_format.sh]:::key
C4[apollo_lint.sh]:::key
C5[apollo_release.sh]:::key
end
subgraph "模块管理模块"
M1[apollo_action.sh]:::key
M2[cyber_launch.sh]:::key
M3[dreamview.sh]:::key
M4[perception.sh]:::key
M5[planning.sh]:::key
end
subgraph "测试验证模块"
T1[apollo_ci.sh]:::key
T2[apollo_coverage.sh]:::key
T3[apollo_rule_check.sh]:::key
T4[msf_local_evaluation.sh]:::key
end
subgraph "数据处理模块"
D1[data_record.py]:::key
D2[dump_record.sh]:::key
D3[filter_planning.sh]:::key
D4[record_message.py]:::key
D5[record_bag.py]:::key
end
subgraph "工具脚本模块"
U1[apollo_docs.sh]:::key
U2[generate_proto_build_file.sh]:::key
U3[install_gcc.sh]:::key
U4[yapf.sh]:::key
U5[buildifier.sh]:::key
end
subgraph "传感器模块"
S1[camera.sh]:::key
S2[canbus.sh]:::key
S3[velodyne.sh]:::key
S4[gps.sh]:::key
S5[radar.sh]:::key
end
subgraph "扩展脚本模块"
E1[bootstrap.sh]:::key
E2[docker_start_user.sh]:::key
E3[ota.sh]:::key
E4[switch_vehicle.sh]:::key
end
end
subgraph "外部依赖"
X1[Shell解释器]:::key
X2[Python解释器]:::key
X3[Bazel构建系统]:::key
X4[CyberRT框架]:::key
X5[Docker引擎]:::key
end
subgraph "用户接口"
Y1[命令行接口]:::key
Y2[自动化脚本]:::key
Y3[IDE集成]:::key
end
B1 --> X1
B2 --> X1
B3 --> X1
B4 --> X1
C1 --> X1
C1 --> X3
C2 --> X1
C2 --> X3
C3 --> X1
C3 --> X3
C4 --> X1
C4 --> X3
C5 --> X1
C5 --> X3
M1 --> X1
M1 --> X4
M2 --> X1
M2 --> X4
M3 --> X1
M3 --> X4
M4 --> X1
M4 --> X4
M5 --> X1
M5 --> X4
T1 --> X1
T1 --> X3
T2 --> X1
T2 --> X3
T3 --> X1
T3 --> X3
T4 --> X1
T4 --> X4
D1 --> X2
D2 --> X1
D3 --> X1
D4 --> X2
D5 --> X2
U1 --> X1
U1 --> X3
U2 --> X1
U3 --> X1
U4 --> X1
U4 --> X2
U5 --> X1
U5 --> X3
S1 --> X1
S1 --> X4
S2 --> X1
S2 --> X4
S3 --> X1
S3 --> X4
S4 --> X1
S4 --> X4
S5 --> X1
S5 --> X4
E1 --> X1
E1 --> X3
E2 --> X1
E2 --> X5
E3 --> X1
E3 --> X4
E4 --> X1
E4 --> X4
Y1 --> B1
Y1 --> C1
Y1 --> M1
Y1 --> T1
Y1 --> D1
Y1 --> U1
Y1 --> S1
Y1 --> E1
Y2 --> B1
Y2 --> C1
Y2 --> M1
Y2 --> T1
Y2 --> D1
Y2 --> U1
Y2 --> S1
Y2 --> E1
Y3 --> B1
Y3 --> C1
Y3 --> M1
Y3 --> T1
Y3 --> D1
Y3 --> U1
Y3 --> S1
Y3 --> E1
classDef key fill:#e1f5fe
3. 调用流程图
Apollo scripts子模块的调用流程涵盖了从环境准备到系统运行的完整开发周期,包括环境配置、项目构建、模块启动和数据处理等多个阶段。整个流程设计清晰,步骤明确,便于开发者理解和使用。
3.1. 开发环境配置流程
sequenceDiagram
participant User as 开发者
participant Scripts as scripts子模块
participant Shell as Shell解释器
participant Env as 开发环境
User->>Scripts: 执行apollo.bashrc
Scripts->>Shell: 加载基础配置
Shell->>Env: 设置环境变量
Env-->>Shell: 环境变量设置完成
Shell->>Shell: 配置命令自动补全
Shell->>Shell: 设置别名
Shell-->>User: 环境配置完成
3.2. 项目构建流程
sequenceDiagram
participant User as 开发者
participant Scripts as scripts子模块
participant Bazel as Bazel构建系统
participant Project as Apollo项目
User->>Scripts: 执行apollo_buildify.sh
Scripts->>Bazel: 生成构建文件
Bazel-->>Scripts: 构建文件生成完成
User->>Scripts: 执行apollo_format.sh
Scripts->>Project: 格式化代码
Project-->>Scripts: 代码格式化完成
User->>Scripts: 执行apollo_lint.sh
Scripts->>Project: 检查代码质量
Project-->>Scripts: 代码检查完成
User->>Scripts: 执行apollo_build
Scripts->>Bazel: 启动构建
Bazel->>Project: 编译源代码
Project-->>Bazel: 编译完成
Bazel-->>Scripts: 构建完成
Scripts-->>User: 构建结果返回
3.3. 模块启动流程
sequenceDiagram
participant User as 开发者
participant Scripts as scripts子模块
participant Cyber as CyberRT框架
participant Module as Apollo模块
participant Dreamview as Dreamview
User->>Scripts: 执行dreamview.sh
Scripts->>Dreamview: 启动Dreamview
Dreamview-->>Scripts: Dreamview启动完成
User->>Scripts: 执行apollo_action.sh start
Scripts->>Cyber: 启动CyberRT框架
Cyber-->>Scripts: CyberRT启动完成
Scripts->>Module: 启动感知模块
Module-->>Scripts: 感知模块启动完成
Scripts->>Module: 启动定位模块
Module-->>Scripts: 定位模块启动完成
Scripts->>Module: 启动规划模块
Module-->>Scripts: 规划模块启动完成
Scripts->>Module: 启动控制模块
Module-->>Scripts: 控制模块启动完成
Scripts-->>User: 所有模块启动完成
3.4. 数据处理流程
sequenceDiagram
participant User as 开发者
participant Scripts as scripts子模块
participant Record as 数据记录
participant Process as 数据处理
participant Analyze as 数据分析
User->>Scripts: 执行data_record.py
Scripts->>Record: 开始录制数据
Record-->>Scripts: 数据录制开始
User->>Scripts: 执行record_message.py
Scripts->>Record: 开始录制消息
Record-->>Scripts: 消息录制开始
User->>Scripts: 停止录制
Scripts->>Record: 停止录制
Record-->>Scripts: 数据保存完成
User->>Scripts: 执行dump_record.sh
Scripts->>Process: 回放录制数据
Process-->>Scripts: 数据回放完成
User->>Scripts: 执行filter_planning.sh
Scripts->>Process: 过滤规划数据
Process-->>Scripts: 数据过滤完成
User->>Scripts: 执行performance_parse.py
Scripts->>Analyze: 分析性能数据
Analyze-->>Scripts: 分析完成
Scripts-->>User: 分析结果返回
3.5. 测试验证流程
sequenceDiagram
participant User as 开发者
participant Scripts as scripts子模块
participant Test as 测试系统
participant Coverage as 覆盖率分析
participant CI as CI系统
User->>Scripts: 执行apollo_rule_check.sh
Scripts->>Test: 执行规则检查
Test-->>Scripts: 规则检查完成
User->>Scripts: 执行apollo_ci.sh
Scripts->>CI: 执行CI测试
CI->>Test: 执行单元测试
Test-->>CI: 单元测试完成
CI->>Test: 执行集成测试
Test-->>CI: 集成测试完成
CI-->>Scripts: CI测试完成
User->>Scripts: 执行apollo_coverage.sh
Scripts->>Coverage: 执行覆盖率分析
Coverage-->>Scripts: 覆盖率分析完成
Scripts-->>User: 测试结果返回
4. 详细UML类图
Apollo scripts子模块的UML类图展示了脚本系统的核心组件、它们之间的关系以及各自的职责。类图设计遵循面向对象的设计原则,将脚本的功能抽象为类和方法,便于理解和维护。
4.1. 核心脚本类图
classDiagram
class Script {
<>
+execute()
+get_name(): string
+get_description(): string
+get_usage(): string
-name: string
-description: string
-usage: string
}
class BaseScript {
+set_environment()
+load_config()
+validate_environment(): bool
-environment: Environment
-config: Config
}
class BuildScript {
+build()
+clean()
+format()
+lint()
-bazel: Bazel
-project: Project
}
class ModuleScript {
+start()
+stop()
+restart()
+status(): ModuleStatus
-module: Module
-cyber: CyberRT
}
class DataScript {
+record()
+playback()
+filter()
+analyze()
-data_manager: DataManager
-data_processor: DataProcessor
}
class TestScript {
+run_tests()
+coverage()
+check_rules()
-test_manager: TestManager
-coverage_analyzer: CoverageAnalyzer
}
class Environment {
+set_variable(string, string)
+get_variable(string): string
+load_profile(string)
-variables: map
}
class Config {
+load_config(string): Config
+get_value(string): string
+set_value(string, string)
-config_file: string
-values: map
}
class Bazel {
+build(string)
+clean()
+test(string)
+coverage(string)
-workspace: string
}
Script <|-- BaseScript
BaseScript <|-- BuildScript
BaseScript <|-- ModuleScript
BaseScript <|-- DataScript
BaseScript <|-- TestScript
BaseScript --> Environment
BaseScript --> Config
BuildScript --> Bazel
ModuleScript --> Module
ModuleScript --> CyberRT
DataScript --> DataManager
DataScript --> DataProcessor
TestScript --> TestManager
TestScript --> CoverageAnalyzer
4.2. 脚本执行类图
classDiagram
class ScriptExecutor {
+execute_script(Script): ExecutionResult
+parse_args(list): Args
+validate_args(Args, Script): bool
-script_factory: ScriptFactory
-arg_parser: ArgParser
}
class ScriptFactory {
+create_script(string): Script
+get_all_scripts(): list