diff --git a/scene/.gitignore b/scene/.gitignore index 34f6ea4..cd2324b 100644 --- a/scene/.gitignore +++ b/scene/.gitignore @@ -1,4 +1,4 @@ -*.png +scene/undergraduate/*.pdf # 缓存文件 *.cache *.tmp diff --git a/scene/undergraduate/.gitignore b/scene/undergraduate/.gitignore new file mode 100644 index 0000000..4d1c529 --- /dev/null +++ b/scene/undergraduate/.gitignore @@ -0,0 +1,248 @@ +*.pdf +!*/ +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb +clean.bat +elegant*-cn.pdf +elegant*-en.pdf +*.dates + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +# fixme +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# TODO Comment the next line if you want to keep your tikz graphics files +*.tikz +*-tikzDictionary + +# listings +*.lol + +# makeidx +*.idx +*.ilg +*.ind +*.ist + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# easy-todo +*.lod + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices +*.xyc + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# Kile +*.backup + +# KBibTeX +*~[0-9]* + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# generated if using elsarticle.cls +*.spl diff --git a/scene/undergraduate/README.md b/scene/undergraduate/README.md index ae0e5ae..126ca7d 100644 --- a/scene/undergraduate/README.md +++ b/scene/undergraduate/README.md @@ -1,123 +1,43 @@ -# Scene 项目 - -## 项目介绍 - -Scene 项目是一个基于预训练大模型的高保真三维智能驾驶场景生成系统。该系统利用自然语言描述自动生成驾驶场景,重点在于自动化场景生成、车载环境交互以及驾驶性能评估。项目基于 **CARLA** 仿真平台,结合 **SafeBench** 和 **Scenic**,实现了高效的交通场景生成与智能驾驶评估。 - -## 主要功能 - -- 使用自然语言描述生成高保真智能驾驶场景。 -- 集成 GPT-4o 与检索数据库,动态生成多样化的场景。 -- 评估自动驾驶系统在不同场景下的表现,包括安全性、碰撞风险、驾驶决策等。 -- 基于 **SafeBench** 提供的环境进行场景的训练与评估。 - -## 安装指南 - -### 1. 创建虚拟环境 - -本项目推荐使用 Python 3.7 或 3.8 版本,首先创建并激活虚拟环境。 - -- **carla** 虚拟环境(Python 3.7): - - ```bash - conda create -n carla python=3.7 - conda activate carla - ``` - -- **chatscene** 虚拟环境(Python 3.8): - - ```bash - conda create -n chatscene python=3.8 - conda activate chatscene - ``` - -### 2. 安装依赖 - -本项目使用了 **CARLA 0.9.15**,需要先安装 CARLA,并确保 Python 环境正确配置。 - -#### 安装 CARLA - -1. 下载并解压 **CARLA 0.9.15** 版本:[CARLA 0.9.15 下载链接](https://github.com/carla-simulator/carla/releases/tag/0.9.15)。 -2. 设置环境变量,指向 CARLA 的 Python API 路径: - - ```bash - export CARLA_ROOT={path/to/your/carla} - export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/dist/carla-0.9.13-py3.8-linux-x86_64.egg - export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/agents - export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla - export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI - ``` - -3. 安装必要的依赖: - - ```bash - sudo apt install libomp5 - ``` - -#### 安装项目依赖 - -1. 克隆项目仓库: - - ```bash - git clone git@github.com:zrx0829222/scene.git - cd scene - ``` - -2. 安装所需的 Python 包: - - ```bash - pip install -r requirements.txt - pip install -e . - ``` - -3. 安装 **Scenic** 包: - - ```bash - cd Scenic - python -m pip install -e . - ``` - -## 运行场景 - -### 启动 CARLA - -根据操作系统选择启动模式: - -1. **桌面用户**: - - ```bash - ./CarlaUE4.sh -prefernvidia -windowed -carla-port=2000 - ``` - -2. **远程服务器用户**(无头模式): - - ```bash - ./CarlaUE4.sh -prefernvidia -RenderOffScreen -carla-port=2000 - ``` - -### 训练和评估场景 - -#### 模式 1: 训练场景 - -使用以下命令开始训练场景: - -```bash -python scripts/run_train.py --agent_cfg=adv_scenic.yaml --scenario_cfg=train_scenario_scenic.yaml --mode train_scenario --scenario_id 1 -``` - -### 动态场景生成 -使用自然语言生成动态场景,可以通过修改 retrieve/scenario_descriptions.txt 文件来提供场景描述。然后使用以下命令生成场景: -```bash -python retrieve/retrieve.py -``` -生成的场景数据将存放在 safebench/scenario/scenario_data/scenic_data/dynamic_scenario 目录下。 -###量化评估 -本项目提供了量化评估脚本,用于评估生成场景的质量,确保场景的多样性和驾驶性能。使用以下命令进行评估: - ```bash - python scripts/evaluate_scene_quality.py - ``` -#### 联系方式 -如果你有任何问题或建议,可以通过以下方式联系我: - -邮箱:2444819612@qq.com - +# 基于预训练大模型的高保真驾驶场景生成系统 + +## 项目简介 + +本项目旨在利用预训练大模型生成高保真驾驶场景,以支持自动驾驶车辆的安全性测试和验证。通过结合预训练大模型的强大生成能力和专业的仿真工具,我们能够生成多样化的驾驶场景,从而提高自动驾驶系统的安全性和可靠性。 + +## 项目地址 + +[GitHub - zrx0829222/scene: 郑睿翔](https://github.com/zrx0829222/scene.git) + +## 环境配置 + +支持和测试的平台包括:Windows 11 + +### 安装步骤 + +1. **安装依赖软件** + - 下载并安装 Python 3.8、Carla 0.9.13、latex 2023、Texstudio 4.6.4、Git 2.42.0(Windows可使用 `TortoiseGit 2.15.0.0` 作为图形界面进行代码提交)。 + - 安装 Carla 的 Python API: + ```bash + export CARLA_ROOT={path/to/your/carla} + export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/dist/carla-0.9.15-py3.7-linux-x86_64.egg + export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/agents + export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla + export PYTHONPATH=$PYTHONPATH:${CARLA_ROOT}/PythonAPI + ``` + +2. **克隆项目** + ```bash + git clone https://github.com/zrx0829222/scene.git + cd scene + +3. **安装依赖库** + ```bash + pip install -r requirements.txt + +4. **运行场景生成脚本** + ```bash + python retrieve.py,run_train_dynamic.py和run_eval_dynamic.py + ``` + +5. **查看生成的场景** + - 生成的场景将保存在 `output` 目录下,场景信息在 `log` 目录下,每个场景包含一个 `.json` 文件和一个 `.txt` 文件,分别描述了场景的配置和生成的日志。 diff --git a/scene/undergraduate/cmdel.bat b/scene/undergraduate/cmdel.bat new file mode 100644 index 0000000..c9642e0 --- /dev/null +++ b/scene/undergraduate/cmdel.bat @@ -0,0 +1,2 @@ +del /a /f *.xml *.bcf *.out *.log *.sav *.gz *.aux *.bbl *.bak *.dvi *.blg + diff --git a/scene/undergraduate/content/abstracten.tex b/scene/undergraduate/content/abstracten.tex index c5cea98..aeacc5e 100644 --- a/scene/undergraduate/content/abstracten.tex +++ b/scene/undergraduate/content/abstracten.tex @@ -1,7 +1,7 @@ -%!TEX root = ../csuthesis_main.tex -\keywordsen{Intelligent Driving\ \ Test Scenarios\ \ Large Language Models\ \ Scenario Description Language\ \ Scenic} -\begin{abstracten} - -The current industry is confronted with the significant issue of low efficiency in constructing test scenarios for autonomous driving. To address this, this paper proposes a novel generation framework that integrates large language models (LLMs) with formal scenario description languages. The purpose of this framework is to efficiently transform natural language descriptions into high-fidelity 3D test scenarios. It comprises three core modules. The first is a domain knowledge - enhanced instruction parsing module, which can accurately understand the test scenario requirements in natural language descriptions and thus lay the foundation for subsequent generation tasks. The second is a syntax - semantics dual - verification code generation mechanism, which can ensure that the generated Scenic code is not only syntactically correct but also semantically logical in accordance with the actual scenario, thereby enhancing the usability and accuracy of the code. The third is a physics - rule - driven scenario synthesis engine, which can reasonably generate 3D scenarios based on physical rules to ensure the authenticity and reliability of the scenarios. The system has demonstrated excellent performance in experiments conducted on the CARLA simulation platform. - +%!TEX root = ../csuthesis_main.tex +\keywordsen{Intelligent Driving\ \ Test Scenarios\ \ Large Language Models\ \ Scenario Description Language\ \ Scenic} +\begin{abstracten} + + The current industry is confronted with the significant issue of low efficiency in constructing test scenarios for autonomous driving. To address this, this paper proposes a novel generation framework that integrates large language models (LLMs) with formal scenario description languages. The purpose of this framework is to efficiently transform natural language descriptions into high-fidelity 3D test scenarios. It comprises three core modules. The first is a domain knowledge - enhanced instruction parsing module, which can accurately understand the test scenario requirements in natural language descriptions and thus lay the foundation for subsequent generation tasks. The second is a syntax - semantics dual - verification code generation mechanism, which can ensure that the generated Scenic code is not only syntactically correct but also semantically logical in accordance with the actual scenario, thereby enhancing the usability and accuracy of the code. The third is a physics - rule - driven scenario synthesis engine, which can reasonably generate 3D scenarios based on physical rules to ensure the authenticity and reliability of the scenarios. The system has demonstrated excellent performance in experiments conducted on the CARLA simulation platform. + \end{abstracten} \ No newline at end of file diff --git a/scene/undergraduate/content/abstractzh.tex b/scene/undergraduate/content/abstractzh.tex index 0d6f216..c421a05 100644 --- a/scene/undergraduate/content/abstractzh.tex +++ b/scene/undergraduate/content/abstractzh.tex @@ -1,8 +1,8 @@ -%!TEX root = ../csuthesis_main.tex -% 设置中文摘要 -\keywordscn{智能驾驶\quad 测试场景\quad 大语言模型\quad 场景描述语言\quad Scenic} -%\categorycn{TP391} -\begin{abstractzh} - - 当前行业面临着智能驾驶测试场景构建效率低下这一重要问题,为此本文提出一种融合大语言模型(LLM)与形式化场景描述语言的新型生成框架,此框架目的在于高效地把自然语言描述转化成高保真三维测试场景,其包含三大核心模块,第一个是领域知识增强的指令解析模块,该模块能够精准理解自然语言描述里的测试场景需求从而为后续生成工作奠定基础,第二个是语法 - 语义双验证代码生成机制,此机制可确保生成的Scenic代码不仅语法正确而且符合实际场景的语义逻辑进而提高代码的可用性和准确性,第三个是物理规则驱动的场景合成引擎,该引擎依据物理规则合理生成三维场景以此保证场景的真实性和可靠性,在CARLA仿真平台的实验验证中该系统展现出优异性能。 +%!TEX root = ../csuthesis_main.tex +% 设置中文摘要 +\keywordscn{智能驾驶\quad 测试场景\quad 大语言模型\quad 场景描述语言\quad Scenic} +%\categorycn{TP391} +\begin{abstractzh} + + 当前行业面临着智能驾驶测试场景构建效率低下这一重要问题,为此本文提出一种融合大语言模型(LLM)与形式化场景描述语言的新型生成框架,此框架目的在于高效地把自然语言描述转化成高保真三维测试场景,其包含三大核心模块,第一个是领域知识增强的指令解析模块,该模块能够精准理解自然语言描述里的测试场景需求从而为后续生成工作奠定基础,第二个是语法 - 语义双验证代码生成机制,此机制可确保生成的Scenic代码不仅语法正确而且符合实际场景的语义逻辑进而提高代码的可用性和准确性,第三个是物理规则驱动的场景合成引擎,该引擎依据物理规则合理生成三维场景以此保证场景的真实性和可靠性,在CARLA仿真平台的实验验证中该系统展现出优异性能。 \end{abstractzh} \ No newline at end of file diff --git a/scene/undergraduate/content/acknowledgements.tex b/scene/undergraduate/content/acknowledgements.tex index 3202ab9..5ed628f 100644 --- a/scene/undergraduate/content/acknowledgements.tex +++ b/scene/undergraduate/content/acknowledgements.tex @@ -1,16 +1,16 @@ -%!TEX root = ../csuthesis_main.tex -\begin{acknowledgements} - -今日凝结于此篇毕业论文中的心血与思考,离不开一路上给予我帮助与鼓励的每一位良师益友。在此,我谨以最诚挚的谢意,向所有支持我、陪伴我成长的人致以深深的感谢。 - -首先,最衷心地感谢我的导师——王海东老师。在论文的整个过程中,王老师始终给予我悉心指导和极大信任。从课题选题、研究方向的确立,到每一阶段方案的推进、每一段文字的打磨,王老师都投入了大量心血,不厌其烦地为我解答困惑。王老师严谨治学的态度、开阔的学术视野和包容的为人风范深深影响了我,也将成为我未来求学与科研道路上的精神坐标。 - -感谢实验室的同门和朋友们,在项目开发、技术调试、论文撰写的各个阶段提供了无私的帮助。无论是模型部署中的一次次失败重启,还是凌晨共享代码和想法的头脑风暴,这段共研共进的日子让我收获了友谊,也收获了成长。 - -我还要特别感谢我的家人,感谢你们始终如一的理解、支持和默默守护。在我深夜伏案敲击代码、遇到挫折与焦虑时,你们给予我温暖与坚定,是我最坚强的后盾。你们的宽容与支持,是我能够全心投入学术探索的前提和底气。 - -同时,我也感谢自己在这段旅程中的坚持与投入。从自然语言到三维场景生成,从理解理论到系统实现,我第一次真正领略到科研的严谨与创造力的结合,也更加坚定了我在人工智能与智能交通领域深耕的志向。 - -最后,感谢这个时代给我施展才华的舞台,感谢母校提供的优质教育资源与开放氛围,让我有机会接触前沿技术,勇敢探索,不断前行。 - +%!TEX root = ../csuthesis_main.tex +\begin{acknowledgements} + + 今天凝结在这篇毕业论文里的心血与思考,离不开一路以来给予我帮助和鼓励的每一位良师益友,在此我用最诚挚的谢意,向所有支持我陪伴我成长的人致以深深感谢。 + + 首先要最衷心地感谢我的导师王海东老师,在论文撰写的整个过程当中,王老师始终都给予我悉心指导和极大信任,从课题选题与研究方向的确立,到每一阶段方案的推进和每一段文字的打磨,王老师都投入大量心血且不厌其烦为我解答困惑,王老师严谨治学的态度、开阔的学术视野和包容的为人风范深深影响着我,也会成为我未来求学与科研道路上的精神坐标。 + + 感谢一起学习的同学以及朋友们,在项目开发、技术调试还有论文撰写的各个阶段,都为我提供了无私的帮助,不管是模型部署时经历的一次次失败重启,还是凌晨时分大家共享代码与想法进行的头脑风暴,这段一起研究共同进步的日子,让我既收获了珍贵友谊也得到了成长。 + + 我还要特别感谢我的家人们,感谢你们始终如一地给予我理解、支持并且默默地守护着我,当我深夜坐在桌前专注敲击代码,遇到挫折感到焦虑的时候,你们给予我温暖和坚定的力量,是我最为坚强的后盾,你们的宽容与支持,是我能够全身心投入学术探索的前提和底气。 + +同时我要感谢自己在这段旅程里坚持与投入,从自然语言学习到三维场景生成探索,从理解科研理论到完成系统实现工作,我首次真切领略到科研严谨与创造力结合,这也进一步坚定我在人工智能与智能交通领域深耕志向。 + +最后感谢这个时代给予我施展个人才华的舞台,感谢母校提供了优质教育资源与开放氛围,让我有机会接触前沿技术并勇敢探索前行。 + \end{acknowledgements} \ No newline at end of file diff --git a/scene/undergraduate/content/appendix.tex b/scene/undergraduate/content/appendix.tex index 637f31a..ee1ce4d 100644 --- a/scene/undergraduate/content/appendix.tex +++ b/scene/undergraduate/content/appendix.tex @@ -1,551 +1,296 @@ \chapter{附录:系统模块源代码} -\subsection*{自然语言理解与场景生成模块} -\begin{lstlisting} - retrieve.py:该文件是系统的主文件,负责从自然语言描述中生成场景代码。它集成了自然语言处理和检索增强模块,通过调用大语言模型生成符合输入语义的Scenic场景脚本。 - - import os - import setGPU - import csv - import pickle - import re - from sentence_transformers import SentenceTransformer, models - from os import path as osp - from tqdm import tqdm - import argparse - from architecture import LLMChat - from utils import load_file, retrieve_topk, generate_code_snippet, save_scenic_code - - - # no need for faiss currently - # import faiss - - # Argument parsing - parser = argparse.ArgumentParser(description="Set up configurations for your script.") - parser.add_argument('--port_ip', type=int, default=2000, help='Port IP address (default: 2000)') - parser.add_argument('--topk', type=int, default=3, help='Top K value (default: 3) for retrieval') - parser.add_argument('--model', type=str, default='gpt-4o', help="Model name (default: 'gpt-4o'), also support transformers model") - parser.add_argument('--use_llm', action='store_true', help='if use llm for generating new snippets') - args = parser.parse_args() - - # Configuration - port_ip = args.port_ip - topk = args.topk - use_llm = args.use_llm - - # LLM model initialization - llm_model = LLMChat(args.model) - local_path = osp.abspath(osp.dirname(osp.dirname(osp.realpath(__file__)))) - extraction_prompt = load_file(osp.join(local_path, 'retrieve', 'prompts', 'extraction.txt')) - behavior_prompt = load_file(osp.join(local_path, 'retrieve', 'prompts', 'behavior.txt')) - geometry_prompt = load_file(osp.join(local_path, 'retrieve', 'prompts', 'geometry.txt')) - spawn_prompt = load_file(osp.join(local_path, 'retrieve', 'prompts', 'spawn.txt')) - scenario_descriptions = load_file(osp.join(local_path, 'retrieve', 'scenario_descriptions.txt')).split('\n') - - # 🔥 修改开始:本地加载 sentence-t5-large 模型 - model_dir = r"D:\sceneMain\chatScene\models\sentence-t5-large" - if not os.path.exists(model_dir): - raise FileNotFoundError(f"本地模型路径不存在:{model_dir}") - - required_files = ["config.json", "pytorch_model.bin"] - for filename in required_files: - if not os.path.exists(os.path.join(model_dir, filename)): - raise FileNotFoundError(f"缺少必要的文件: {filename} 在 {model_dir} 中") - - word_embedding_model = models.Transformer(model_dir, max_seq_length=512) - pooling_model = models.Pooling( - word_embedding_model.get_word_embedding_dimension(), - pooling_mode='mean' - ) - encoder = SentenceTransformer(modules=[word_embedding_model, pooling_model], device='cuda') - print("✅ 成功加载本地 sentence-t5-large 模型!") - # 🔥 修改结束 - - # Load the database - with open(osp.join(local_path, 'retrieve/database_v1.pkl'), 'rb') as file: - database = pickle.load(file) - - behavior_descriptions = database['behavior']['description'] - geometry_descriptions = database['geometry']['description'] - spawn_descriptions = database['spawn']['description'] - behavior_snippets = database['behavior']['snippet'] - geometry_snippets = database['geometry']['snippet'] - spawn_snippets = database['spawn']['snippet'] - - behavior_embeddings = encoder.encode(behavior_descriptions, device='cuda', convert_to_tensor=True) - geometry_embeddings = encoder.encode(geometry_descriptions, device='cuda', convert_to_tensor=True) - spawn_embeddings = encoder.encode(spawn_descriptions, device='cuda', convert_to_tensor=True) - - # This is the head for scenic file, you can modify the carla map or ego model here - head = '''param map = localPath(f'../maps/{Town}.xodr') - param carla_map = Town - model scenic.simulators.carla.model - EGO_MODEL = "vehicle.lincoln.mkz_2017" - ''' - - log_file_path = osp.join(local_path, 'safebench', 'scenario', 'scenario_data', 'scenic_data', 'dynamic_scenario', 'dynamic_log.csv') - - # Write log results - with open(log_file_path, mode='w', newline='') as file: - log_writer = csv.writer(file) - log_writer.writerow(['Scenario', 'AdvObject', 'Behavior Description', 'Behavior Snippet', 'Geometry Description', 'Geometry Snippet', 'Spawn Description', 'Spawn Snippet', 'Success']) - - # Process each scenario description - for q, current_scenario in tqdm(enumerate(scenario_descriptions)): - messages = [ - {"role": "system", "content": "You are a helpful assistant."}, - {"role": "user", "content": extraction_prompt.format(scenario=current_scenario)}, - ] - - response = llm_model.generate(messages) - - try: - match = re.search(r"Adversarial Object:(.*?)Behavior:(.*?)Geometry:(.*?)Spawn Position:(.*)", response, re.DOTALL) - if not match: - raise ValueError("Failed to extract components from the response") - - current_adv_object, current_behavior, current_geometry, current_spawn = [s.strip() for s in match.groups()] - - # Retrieve the top K relevant snippets - top_behavior_descriptions, top_behavior_snippets = retrieve_topk(encoder, topk, behavior_descriptions, behavior_snippets, behavior_embeddings, current_behavior) - top_geometry_descriptions, top_geometry_snippets = retrieve_topk(encoder, topk, geometry_descriptions, geometry_snippets, geometry_embeddings, current_geometry) - top_spawn_descriptions, top_spawn_snippets = retrieve_topk(encoder, topk, spawn_descriptions, spawn_snippets, spawn_embeddings, current_spawn) - - # Generate code snippets using the LLM - generated_behavior_code = generate_code_snippet( - llm_model, behavior_prompt, top_behavior_descriptions, top_behavior_snippets, current_behavior, topk, use_llm - ) - - generated_geometry_code = generate_code_snippet( - llm_model, geometry_prompt, top_geometry_descriptions, top_geometry_snippets, current_geometry, topk, use_llm - ) - - generated_spawn_code = generate_code_snippet( - llm_model, spawn_prompt, top_spawn_descriptions, top_spawn_snippets, current_spawn, topk, use_llm - ) - - # Log the results - log_writer.writerow([current_scenario, current_adv_object, current_behavior, generated_behavior_code, current_geometry, generated_geometry_code, current_spawn, generated_spawn_code, 1]) - - Town, generated_geometry_code = generated_geometry_code.split('\n', 1) - scenic_code = '\n'.join([f"'''{current_scenario}'''", Town, head, generated_behavior_code, generated_geometry_code, generated_spawn_code.format(AdvObject=current_adv_object)]) - save_scenic_code(local_path, port_ip, scenic_code, q) - - except Exception as e: - log_writer.writerow([current_scenario, '', '', '', '', '', '', '', 0]) - print(f"Failure for scenario: {current_scenario} - Error: {e}") - - -\end{lstlisting} - -\subsection*{场景合成与仿真模块} +\section{主要代码} \begin{lstlisting} run\_train\_dynamic.py:作用:用于在动态生成的场景上训练代理。该文件使用dynamic\_scenic.yaml进行配置,并运行训练过程,优化代理的行为。 - - - import setGPU - import traceback - import os - import os.path as osp - - import torch - from safebench.util.run_util import load_config - from safebench.util.torch_util import set_seed, set_torch_variable - from safebench.carla_runner import CarlaRunner - from safebench.scenic_runner_dynamic import ScenicRunner - - if __name__ == '__main__': - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--exp_name', type=str, default='exp') - parser.add_argument('--output_dir', type=str, default='log') - parser.add_argument('--ROOT_DIR', type=str, default=osp.abspath(osp.dirname(osp.dirname(osp.realpath(__file__))))) - - parser.add_argument('--max_episode_step', type=int, default=300) - parser.add_argument('--auto_ego', action='store_true') - parser.add_argument('--mode', '-m', type=str, default='eval', choices=['train_scenario', 'train_agent', 'eval']) - parser.add_argument('--agent_cfg', nargs='*', type=str, default=['adv_scenic.yaml']) - parser.add_argument('--scenario_cfg', nargs='*', type=str, default=['dynamic_scenic.yaml']) - parser.add_argument('--continue_agent_training', '-cat', type=bool, default=False) - parser.add_argument('--continue_scenario_training', '-cst', type=bool, default=False) - - parser.add_argument('--seed', '-s', type=int, default=0) - parser.add_argument('--threads', type=int, default=4) - parser.add_argument('--device', type=str, default='cuda:0' if torch.cuda.is_available() else 'cpu') - - parser.add_argument('--num_scenario', '-ns', type=int, default=1, help='num of scenarios we run in one episode') - parser.add_argument('--save_video', action='store_true') - parser.add_argument('--render', type=bool, default=True) - parser.add_argument('--frame_skip', '-fs', type=int, default=1, help='skip of frame in each step') - parser.add_argument('--port', type=int, default=2002, help='port to communicate with carla') - parser.add_argument('--tm_port', type=int, default=8002, help='traffic manager port') - parser.add_argument('--fixed_delta_seconds', type=float, default=0.1) - args = parser.parse_args() - args_dict = vars(args) - - err_list = [] - for agent_cfg in args.agent_cfg: - for scenario_cfg in args.scenario_cfg: - # set global parameters - set_torch_variable(args.device) - torch.set_num_threads(args.threads) - set_seed(args.seed) - - # load agent config - agent_config_path = osp.join(args.ROOT_DIR, 'safebench/agent/config', agent_cfg) - agent_config = load_config(agent_config_path) - - # load scenario config - scenario_config_path = osp.join(args.ROOT_DIR, 'safebench/scenario/config', scenario_cfg) - scenario_config = load_config(scenario_config_path) - - agent_config['load_dir'] = osp.join(agent_config['load_dir'], 'dynamic_scenario') - # Check if the directory exists; if not, create it - if not osp.exists(agent_config['load_dir']): - os.makedirs(agent_config['load_dir']) - - # main entry with a selected mode - agent_config.update(args_dict) - args_dict['output_dir'] = osp.join('log', 'adv_train', args.mode, agent_config['policy_name'], f"{agent_cfg.split('.')[0]}", "dynamic_scenario") - scenario_config.update(args_dict) - scenario_config['num_scenario'] = 1 ### 'the num_scenario can only be one for scenic' - runner = ScenicRunner(agent_config, scenario_config) - - - # start running - runner.run() - - for err in err_list: - print(err[0], err[1], 'failed!') - print(err[2]) - - - - \end{lstlisting} -\begin{lstlisting} + + + import setGPU + import traceback + import os + import os.path as osp + + import torch + from safebench.util.run_util import load_config + from safebench.util.torch_util import set_seed, set_torch_variable + from safebench.carla_runner import CarlaRunner + from safebench.scenic_runner_dynamic import ScenicRunner + + if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--exp_name', type=str, default='exp') + parser.add_argument('--output_dir', type=str, default='log') + parser.add_argument('--ROOT_DIR', type=str, default=osp.abspath(osp.dirname(osp.dirname(osp.realpath(__file__))))) + + parser.add_argument('--max_episode_step', type=int, default=300) + parser.add_argument('--auto_ego', action='store_true') + parser.add_argument('--mode', '-m', type=str, default='eval', choices=['train_scenario', 'train_agent', 'eval']) + parser.add_argument('--agent_cfg', nargs='*', type=str, default=['adv_scenic.yaml']) + parser.add_argument('--scenario_cfg', nargs='*', type=str, default=['dynamic_scenic.yaml']) + parser.add_argument('--continue_agent_training', '-cat', type=bool, default=False) + parser.add_argument('--continue_scenario_training', '-cst', type=bool, default=False) + + parser.add_argument('--seed', '-s', type=int, default=0) + parser.add_argument('--threads', type=int, default=4) + parser.add_argument('--device', type=str, default='cuda:0' if torch.cuda.is_available() else 'cpu') + + parser.add_argument('--num_scenario', '-ns', type=int, default=1, help='num of scenarios we run in one episode') + parser.add_argument('--save_video', action='store_true') + parser.add_argument('--render', type=bool, default=True) + parser.add_argument('--frame_skip', '-fs', type=int, default=1, help='skip of frame in each step') + parser.add_argument('--port', type=int, default=2002, help='port to communicate with carla') + parser.add_argument('--tm_port', type=int, default=8002, help='traffic manager port') + parser.add_argument('--fixed_delta_seconds', type=float, default=0.1) + args = parser.parse_args() + args_dict = vars(args) + + err_list = [] + for agent_cfg in args.agent_cfg: + for scenario_cfg in args.scenario_cfg: + # set global parameters + set_torch_variable(args.device) + torch.set_num_threads(args.threads) + set_seed(args.seed) + + # load agent config + agent_config_path = osp.join(args.ROOT_DIR, 'safebench/agent/config', agent_cfg) + agent_config = load_config(agent_config_path) + + # load scenario config + scenario_config_path = osp.join(args.ROOT_DIR, 'safebench/scenario/config', scenario_cfg) + scenario_config = load_config(scenario_config_path) + + agent_config['load_dir'] = osp.join(agent_config['load_dir'], 'dynamic_scenario') + # Check if the directory exists; if not, create it + if not osp.exists(agent_config['load_dir']): + os.makedirs(agent_config['load_dir']) + + # main entry with a selected mode + agent_config.update(args_dict) + args_dict['output_dir'] = osp.join('log', 'adv_train', args.mode, agent_config['policy_name'], f"{agent_cfg.split('.')[0]}", "dynamic_scenario") + scenario_config.update(args_dict) + scenario_config['num_scenario'] = 1 ### 'the num_scenario can only be one for scenic' + runner = ScenicRunner(agent_config, scenario_config) + + + # start running + runner.run() + + for err in err_list: + print(err[0], err[1], 'failed!') + print(err[2]) + + + dynamic\_scenic.yaml:作用:该文件是代理的配置文件,包含了代理的训练设置,包括其行为模型、对抗性行为、场景属性等。它与其他 YAML 文件结合使用来指定代理在不同场景中的行为。 - - policy_type: 'scenic' - scenario_category: 'scenic' - - route_dir: 'safebench/scenario/scenario_data/route' - scenic_dir: 'safebench/scenario/scenario_data/scenic_data/' - sample_num: 50 - opt_step: 10 - select_num: 2 - - method: 'scenic' - scenario_id: null - route_id: [0,1,2,3,4,5,6,7] - - ego_action_dim: 2 - ego_state_dim: 4 - ego_action_limit: 1.0 - - + + policy_type: 'scenic' + scenario_category: 'scenic' + + route_dir: 'safebench/scenario/scenario_data/route' + scenic_dir: 'safebench/scenario/scenario_data/scenic_data/' + sample_num: 50 + opt_step: 10 + select_num: 2 + + method: 'scenic' + scenario_id: null + route_id: [0,1,2,3,4,5,6,7] + + ego_action_dim: 2 + ego_state_dim: 4 + ego_action_limit: 1.0 + + \end{lstlisting} -\subsection*{评估与展示模块} - \begin{lstlisting} - evaluate\_scene\_quality.py:该文件负责对生成的场景进行量化评估,输出语义保真度、多样性与驾驶性能相关指标。 - - import os - import json - import numpy as np - import matplotlib.pyplot as plt - from sklearn.metrics import pairwise_distances_argmin_min - import cv2 - - # 文件路径 - DESCRIPTION_FILE = 'D:/sceneMain/chatScene/retrieve/scenario_descriptions.txt' - HISTORY_FILE = 'D:/sceneMain/chatScene/retrieve/scenario_history.txt' - SCENE_IMAGE_DIR = 'D:/sceneMain/chatScene/outputs/' - - # 加载最新的场景描述(只读取文件的第一行) - def load_latest_description(path): - """只读取描述文件中的第一行""" - with open(path, 'r', encoding='utf-8') as f: - first_line = f.readline().strip() # 读取第一行 - return first_line - - # 将新的场景描述追加到历史记录文件 - def append_to_history(new_description, history_path): - """将新的场景描述追加到历史文件""" - with open(history_path, 'a', encoding='utf-8') as f: - f.write(new_description + '\n') - - # 计算图像相似度(使用结构相似度) - def calculate_image_similarity(image1, image2): - """计算两张图像之间的相似度""" - gray1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) - gray2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY) - score, _ = cv2.quality.QualitySSIM_compute(gray1, gray2) - return score - - # 计算场景的多样性(使用生成图像之间的距离) - def calculate_scene_diversity(image_dir): - """计算所有图像之间的多样性""" - images = [] - for filename in os.listdir(image_dir): - if filename.endswith('.png'): - img = cv2.imread(os.path.join(image_dir, filename)) - images.append(img) - - # 转换为数组(每个图像的特征) - image_features = [np.reshape(img, (-1, 3)) for img in images] - image_features = np.concatenate(image_features, axis=0) - - # 计算每对图像的最小距离 - distances = pairwise_distances_argmin_min(image_features, image_features) - avg_distance = np.mean(distances[1]) # 平均最小距离 - return avg_distance - - # 评估场景质量:语义一致性,图像质量,多样性 - def evaluate_scene_quality(image_dir): - """评估场景的质量""" - - # 语义一致性(假设为手动指定或从其他方法中获得) - semantic_consistency = 0.9 # 假设的值,通常需要根据具体情况进行计算 - - # 图像质量:假设使用已有的参考图像进行评估(此处为一个示例) - reference_image = cv2.imread('D:/sceneMain/chatScene/reference_image.png') # 参考图像 - image_files = [f for f in os.listdir(image_dir) if f.endswith('.png')] - avg_image_quality = 0 - for image_file in image_files: - img = cv2.imread(os.path.join(image_dir, image_file)) - similarity = calculate_image_similarity(reference_image, img) - avg_image_quality += similarity - avg_image_quality /= len(image_files) - - # 多样性 - diversity = calculate_scene_diversity(image_dir) - - # 打印评估结果 - print(f"语义一致性: {semantic_consistency}") - print(f"平均图像质量: {avg_image_quality}") - print(f"场景多样性: {diversity}") - - return semantic_consistency, avg_image_quality, diversity - - # 主函数 - def main(): - # 读取最新的场景描述 - latest_description = load_latest_description(DESCRIPTION_FILE) - - # 将描述追加到历史记录 - append_to_history(latest_description, HISTORY_FILE) - - # 打印最新描述 - print(f"最新的场景描述: {latest_description}") - - # 评估生成的场景质量 - semantic_consistency, avg_image_quality, diversity = evaluate_scene_quality(SCENE_IMAGE_DIR) - - # 可以根据需要将评估结果保存为JSON或其他格式 - evaluation_results = { - "semantic_consistency": semantic_consistency, - "avg_image_quality": avg_image_quality, - "diversity": diversity - } - - # 保存评估结果到文件 - with open('D:/sceneMain/chatScene/outputs/evaluation_results.json', 'w') as f: - json.dump(evaluation_results, f, indent=4) - - if __name__ == "__main__": - main() - - -\end{lstlisting} + run\_eval\_dynamic.py:该文件用于运行评估流程,调用evaluate\_scene\_quality.py 对生成的场景进行评估。 + import setGPU + import traceback + import os.path as osp + + import torch + + from safebench.util.run_util import load_config + from safebench.util.torch_util import set_seed, set_torch_variable + from safebench.carla_runner import CarlaRunner + from safebench.scenic_runner_dynamic import ScenicRunner + + if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--exp_name', type=str, default='exp') + parser.add_argument('--output_dir', type=str, default='log') + parser.add_argument('--ROOT_DIR', type=str, default=osp.abspath(osp.dirname(osp.dirname(osp.realpath(__file__))))) + + parser.add_argument('--max_episode_step', type=int, default=300) + parser.add_argument('--auto_ego', action='store_true') + parser.add_argument('--mode', '-m', type=str, default='eval', choices=['train_agent', 'train_scenario', 'eval']) + parser.add_argument('--agent_cfg', nargs='*', type=str, default=['adv_scenic.yaml']) + parser.add_argument('--scenario_cfg', nargs='*', type=str, default=['dynamic_scenic.yaml']) + parser.add_argument('--continue_agent_training', '-cat', type=bool, default=False) + parser.add_argument('--continue_scenario_training', '-cst', type=bool, default=False) + + parser.add_argument('--seed', '-s', type=int, default=0) + parser.add_argument('--threads', type=int, default=4) + parser.add_argument('--device', type=str, default='cuda:0' if torch.cuda.is_available() else 'cpu') + + parser.add_argument('--num_scenario', '-ns', type=int, default=2, help='num of scenarios we run in one episode') + parser.add_argument('--save_video', action='store_true') + parser.add_argument('--render', type=bool, default=True) + parser.add_argument('--frame_skip', '-fs', type=int, default=1, help='skip of frame in each step') + parser.add_argument('--port', type=int, default=2002, help='port to communicate with carla') + parser.add_argument('--tm_port', type=int, default=8002, help='traffic manager port') + parser.add_argument('--fixed_delta_seconds', type=float, default=0.1) + parser.add_argument('--test_policy', type=str, default='sac') + parser.add_argument('--test_epoch', type=int, default=None) + args = parser.parse_args() + + err_list = [] + for agent_cfg in args.agent_cfg: + for scenario_cfg in args.scenario_cfg: + # set global parameters + set_torch_variable(args.device) + torch.set_num_threads(args.threads) + set_seed(args.seed) + + # load agent config + agent_config_path = osp.join(args.ROOT_DIR, 'safebench/agent/config', agent_cfg) + agent_config = load_config(agent_config_path) + agent_config['policy_name'] = args.test_policy + + ## load the corresponding model ## + agent_config['load_dir'] = osp.join(agent_config['load_dir'], "dynamic_scenario") + + # load scenario config + scenario_config_path = osp.join(args.ROOT_DIR, 'safebench/scenario/config', scenario_cfg) + scenario_config = load_config(scenario_config_path) + + args.output_dir = osp.join('log', 'adv_train', args.mode, agent_config['policy_name'], f"{agent_cfg.split('.')[0]}_epoch{args.test_epoch}") + args.exp_name = "dynamic_scenario" + args_dict = vars(args) + # main entry with a selected mode + agent_config.update(args_dict) + print(agent_config['load_dir']) + scenario_config.update(args_dict) + + scenario_config['num_scenario'] = 1 # 'the num_scenario can only be one for scenic' + runner = ScenicRunner(agent_config, scenario_config) + + # start running + try: + runner.run(args.test_epoch) + except: + runner.close() + traceback.print_exc() + err_list.append([agent_cfg, scenario_cfg, traceback.format_exc()]) + + for err in err_list: + print(err[0], err[1], 'failed!') + print(err[2]) + + run\_eval.py + import setGPU + import traceback + import os.path as osp + + import torch + + from safebench.util.run_util import load_config + from safebench.util.torch_util import set_seed, set_torch_variable + from safebench.carla_runner import CarlaRunner + + + if __name__ == '__main__': + import argparse + parser = argparse.ArgumentParser() + parser.add_argument('--exp_name', type=str, default='exp') + parser.add_argument('--output_dir', type=str, default='log') + parser.add_argument('--ROOT_DIR', type=str, default=osp.abspath(osp.dirname(osp.dirname(osp.realpath(__file__))))) + + parser.add_argument('--max_episode_step', type=int, default=300) + parser.add_argument('--auto_ego', action='store_true') + parser.add_argument('--mode', '-m', type=str, default='eval', choices=['train_agent', 'train_scenario', 'eval']) + parser.add_argument('--agent_cfg', nargs='*', type=str, default=['adv_scenic.yaml']) + parser.add_argument('--scenario_cfg', nargs='*', type=str, default=['eval_scenic.yaml']) + parser.add_argument('--continue_agent_training', '-cat', type=bool, default=False) + parser.add_argument('--continue_scenario_training', '-cst', type=bool, default=False) + + parser.add_argument('--seed', '-s', type=int, default=0) + parser.add_argument('--threads', type=int, default=4) + parser.add_argument('--device', type=str, default='cuda:0' if torch.cuda.is_available() else 'cpu') + + parser.add_argument('--num_scenario', '-ns', type=int, default=2, help='num of scenarios we run in one episode') + parser.add_argument('--save_video', action='store_true') + parser.add_argument('--render', type=bool, default=True) + parser.add_argument('--frame_skip', '-fs', type=int, default=1, help='skip of frame in each step') + parser.add_argument('--port', type=int, default=2002, help='port to communicate with carla') + parser.add_argument('--tm_port', type=int, default=8002, help='traffic manager port') + parser.add_argument('--fixed_delta_seconds', type=float, default=0.1) + parser.add_argument('--test_policy', type=str, default='sac') + parser.add_argument('--route_id', type=int, default=0) + parser.add_argument('--scenario_id', type=int, default=0) + parser.add_argument('--test_epoch', type=int, default=None) + args = parser.parse_args() + + err_list = [] + for agent_cfg in args.agent_cfg: + for scenario_cfg in args.scenario_cfg: + # set global parameters + set_torch_variable(args.device) + torch.set_num_threads(args.threads) + set_seed(args.seed) + + # load agent config + agent_config_path = osp.join(args.ROOT_DIR, 'safebench/agent/config', agent_cfg) + agent_config = load_config(agent_config_path) + agent_config['policy_name'] = args.test_policy + + ## load the corresponding model ## + agent_config['load_dir'] = osp.join(agent_config['load_dir'], f'scenario_{args.scenario_id}') + + # load scenario config + scenario_config_path = osp.join(args.ROOT_DIR, 'safebench/scenario/config', scenario_cfg) + scenario_config = load_config(scenario_config_path) + scenario_config['scenario_id'] = args.scenario_id + + args.output_dir = osp.join('log', 'adv_train', args.mode, agent_config['policy_name'], f"{agent_cfg.split('.')[0]}_epoch{args.test_epoch}", f"{scenario_cfg.split('.')[0]}") + args.exp_name = 'scenario_' + str(scenario_config['scenario_id']) + args_dict = vars(args) + # main entry with a selected mode + agent_config.update(args_dict) + print(agent_config['load_dir']) + scenario_config.update(args_dict) + if scenario_config['policy_type'] == 'scenic': + from safebench.scenic_runner import ScenicRunner + scenario_config['num_scenario'] = 1 # 'the num_scenario can only be one for scenic' + scenario_config['route_id'] = [args.route_id] + runner = ScenicRunner(agent_config, scenario_config) + else: + ## id shift due to the test settings in safebench v1 + scenario_config['route_id'] = args.route_id + 4 + runner = CarlaRunner(agent_config, scenario_config) + + # start running + try: + runner.run(args.test_epoch) + except: + runner.close() + traceback.print_exc() + err_list.append([agent_cfg, scenario_cfg, traceback.format_exc()]) + + for err in err_list: + print(err[0], err[1], 'failed!') + print(err[2]) + + + + run\_train.py -\begin{lstlisting} - run\_eval\_dynamic.py:该文件用于运行评估流程,调用evaluate\_scene\_quality.py 对生成的场景进行评估。 - - import setGPU - import traceback - import os.path as osp - - import torch - - from safebench.util.run_util import load_config - from safebench.util.torch_util import set_seed, set_torch_variable - from safebench.carla_runner import CarlaRunner - from safebench.scenic_runner_dynamic import ScenicRunner - - if __name__ == '__main__': - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--exp_name', type=str, default='exp') - parser.add_argument('--output_dir', type=str, default='log') - parser.add_argument('--ROOT_DIR', type=str, default=osp.abspath(osp.dirname(osp.dirname(osp.realpath(__file__))))) - - parser.add_argument('--max_episode_step', type=int, default=300) - parser.add_argument('--auto_ego', action='store_true') - parser.add_argument('--mode', '-m', type=str, default='eval', choices=['train_agent', 'train_scenario', 'eval']) - parser.add_argument('--agent_cfg', nargs='*', type=str, default=['adv_scenic.yaml']) - parser.add_argument('--scenario_cfg', nargs='*', type=str, default=['dynamic_scenic.yaml']) - parser.add_argument('--continue_agent_training', '-cat', type=bool, default=False) - parser.add_argument('--continue_scenario_training', '-cst', type=bool, default=False) - - parser.add_argument('--seed', '-s', type=int, default=0) - parser.add_argument('--threads', type=int, default=4) - parser.add_argument('--device', type=str, default='cuda:0' if torch.cuda.is_available() else 'cpu') - - parser.add_argument('--num_scenario', '-ns', type=int, default=2, help='num of scenarios we run in one episode') - parser.add_argument('--save_video', action='store_true') - parser.add_argument('--render', type=bool, default=True) - parser.add_argument('--frame_skip', '-fs', type=int, default=1, help='skip of frame in each step') - parser.add_argument('--port', type=int, default=2002, help='port to communicate with carla') - parser.add_argument('--tm_port', type=int, default=8002, help='traffic manager port') - parser.add_argument('--fixed_delta_seconds', type=float, default=0.1) - parser.add_argument('--test_policy', type=str, default='sac') - parser.add_argument('--test_epoch', type=int, default=None) - args = parser.parse_args() - - err_list = [] - for agent_cfg in args.agent_cfg: - for scenario_cfg in args.scenario_cfg: - # set global parameters - set_torch_variable(args.device) - torch.set_num_threads(args.threads) - set_seed(args.seed) - - # load agent config - agent_config_path = osp.join(args.ROOT_DIR, 'safebench/agent/config', agent_cfg) - agent_config = load_config(agent_config_path) - agent_config['policy_name'] = args.test_policy - - ## load the corresponding model ## - agent_config['load_dir'] = osp.join(agent_config['load_dir'], "dynamic_scenario") - - # load scenario config - scenario_config_path = osp.join(args.ROOT_DIR, 'safebench/scenario/config', scenario_cfg) - scenario_config = load_config(scenario_config_path) - - args.output_dir = osp.join('log', 'adv_train', args.mode, agent_config['policy_name'], f"{agent_cfg.split('.')[0]}_epoch{args.test_epoch}") - args.exp_name = "dynamic_scenario" - args_dict = vars(args) - # main entry with a selected mode - agent_config.update(args_dict) - print(agent_config['load_dir']) - scenario_config.update(args_dict) - - scenario_config['num_scenario'] = 1 # 'the num_scenario can only be one for scenic' - runner = ScenicRunner(agent_config, scenario_config) - - # start running - try: - runner.run(args.test_epoch) - except: - runner.close() - traceback.print_exc() - err_list.append([agent_cfg, scenario_cfg, traceback.format_exc()]) - - for err in err_list: - print(err[0], err[1], 'failed!') - print(err[2]) - - run\_eval.py - import setGPU - import traceback - import os.path as osp - - import torch - - from safebench.util.run_util import load_config - from safebench.util.torch_util import set_seed, set_torch_variable - from safebench.carla_runner import CarlaRunner - - - if __name__ == '__main__': - import argparse - parser = argparse.ArgumentParser() - parser.add_argument('--exp_name', type=str, default='exp') - parser.add_argument('--output_dir', type=str, default='log') - parser.add_argument('--ROOT_DIR', type=str, default=osp.abspath(osp.dirname(osp.dirname(osp.realpath(__file__))))) - - parser.add_argument('--max_episode_step', type=int, default=300) - parser.add_argument('--auto_ego', action='store_true') - parser.add_argument('--mode', '-m', type=str, default='eval', choices=['train_agent', 'train_scenario', 'eval']) - parser.add_argument('--agent_cfg', nargs='*', type=str, default=['adv_scenic.yaml']) - parser.add_argument('--scenario_cfg', nargs='*', type=str, default=['eval_scenic.yaml']) - parser.add_argument('--continue_agent_training', '-cat', type=bool, default=False) - parser.add_argument('--continue_scenario_training', '-cst', type=bool, default=False) - - parser.add_argument('--seed', '-s', type=int, default=0) - parser.add_argument('--threads', type=int, default=4) - parser.add_argument('--device', type=str, default='cuda:0' if torch.cuda.is_available() else 'cpu') - - parser.add_argument('--num_scenario', '-ns', type=int, default=2, help='num of scenarios we run in one episode') - parser.add_argument('--save_video', action='store_true') - parser.add_argument('--render', type=bool, default=True) - parser.add_argument('--frame_skip', '-fs', type=int, default=1, help='skip of frame in each step') - parser.add_argument('--port', type=int, default=2002, help='port to communicate with carla') - parser.add_argument('--tm_port', type=int, default=8002, help='traffic manager port') - parser.add_argument('--fixed_delta_seconds', type=float, default=0.1) - parser.add_argument('--test_policy', type=str, default='sac') - parser.add_argument('--route_id', type=int, default=0) - parser.add_argument('--scenario_id', type=int, default=0) - parser.add_argument('--test_epoch', type=int, default=None) - args = parser.parse_args() - - err_list = [] - for agent_cfg in args.agent_cfg: - for scenario_cfg in args.scenario_cfg: - # set global parameters - set_torch_variable(args.device) - torch.set_num_threads(args.threads) - set_seed(args.seed) - - # load agent config - agent_config_path = osp.join(args.ROOT_DIR, 'safebench/agent/config', agent_cfg) - agent_config = load_config(agent_config_path) - agent_config['policy_name'] = args.test_policy - - ## load the corresponding model ## - agent_config['load_dir'] = osp.join(agent_config['load_dir'], f'scenario_{args.scenario_id}') - - # load scenario config - scenario_config_path = osp.join(args.ROOT_DIR, 'safebench/scenario/config', scenario_cfg) - scenario_config = load_config(scenario_config_path) - scenario_config['scenario_id'] = args.scenario_id - - args.output_dir = osp.join('log', 'adv_train', args.mode, agent_config['policy_name'], f"{agent_cfg.split('.')[0]}_epoch{args.test_epoch}", f"{scenario_cfg.split('.')[0]}") - args.exp_name = 'scenario_' + str(scenario_config['scenario_id']) - args_dict = vars(args) - # main entry with a selected mode - agent_config.update(args_dict) - print(agent_config['load_dir']) - scenario_config.update(args_dict) - if scenario_config['policy_type'] == 'scenic': - from safebench.scenic_runner import ScenicRunner - scenario_config['num_scenario'] = 1 # 'the num_scenario can only be one for scenic' - scenario_config['route_id'] = [args.route_id] - runner = ScenicRunner(agent_config, scenario_config) - else: - ## id shift due to the test settings in safebench v1 - scenario_config['route_id'] = args.route_id + 4 - runner = CarlaRunner(agent_config, scenario_config) - - # start running - try: - runner.run(args.test_epoch) - except: - runner.close() - traceback.print_exc() - err_list.append([agent_cfg, scenario_cfg, traceback.format_exc()]) - - for err in err_list: - print(err[0], err[1], 'failed!') - print(err[2]) - - - - run\_train.py - import sys print(sys.path) @@ -634,313 +379,4 @@ \subsection*{评估与展示模块} \end{lstlisting} -\subsection{其他} -\begin{lstlisting} -config.py:配置文件 - - - - import carla - - import argparse - import datetime - import re - import socket - import textwrap - - - def get_ip(host): - if host in ['localhost', '127.0.0.1']: - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - sock.connect(('10.255.255.255', 1)) - host = sock.getsockname()[0] - except RuntimeError: - pass - finally: - sock.close() - return host - - - def find_weather_presets(): - presets = [x for x in dir(carla.WeatherParameters) if re.match('[A-Z].+', x)] - return [(getattr(carla.WeatherParameters, x), x) for x in presets] - - - def list_options(client): - maps = [m.replace('/Game/Carla/Maps/', '') for m in client.get_available_maps()] - indent = 4 * ' ' - def wrap(text): - return '\n'.join(textwrap.wrap(text, initial_indent=indent, subsequent_indent=indent)) - print('weather presets:\n') - print(wrap(', '.join(x for _, x in find_weather_presets())) + '.\n') - print('available maps:\n') - print(wrap(', '.join(sorted(maps))) + '.\n') - - - def list_blueprints(world, bp_filter): - blueprint_library = world.get_blueprint_library() - blueprints = [bp.id for bp in blueprint_library.filter(bp_filter)] - print('available blueprints (filter %r):\n' % bp_filter) - for bp in sorted(blueprints): - print(' ' + bp) - print('') - - - def inspect(args, client): - address = '%s:%d' % (get_ip(args.host), args.port) - - world = client.get_world() - elapsed_time = world.get_snapshot().timestamp.elapsed_seconds - elapsed_time = datetime.timedelta(seconds=int(elapsed_time)) - - actors = world.get_actors() - s = world.get_settings() - - weather = 'Custom' - current_weather = world.get_weather() - for preset, name in find_weather_presets(): - if current_weather == preset: - weather = name - - if s.fixed_delta_seconds is None: - frame_rate = 'variable' - else: - frame_rate = '%.2f ms (%d FPS)' % ( - 1000.0 * s.fixed_delta_seconds, - 1.0 / s.fixed_delta_seconds) - - print('-' * 34) - print('address:% 26s' % address) - print('version:% 26s\n' % client.get_server_version()) - print('map: % 22s' % world.get_map().name) - print('weather: % 22s\n' % weather) - print('time: % 22s\n' % elapsed_time) - print('frame rate: % 22s' % frame_rate) - print('rendering: % 22s' % ('disabled' if s.no_rendering_mode else 'enabled')) - print('sync mode: % 22s\n' % ('disabled' if not s.synchronous_mode else 'enabled')) - print('actors: % 22d' % len(actors)) - print(' * spectator:% 20d' % len(actors.filter('spectator'))) - print(' * static: % 20d' % len(actors.filter('static.*'))) - print(' * traffic: % 20d' % len(actors.filter('traffic.*'))) - print(' * vehicles: % 20d' % len(actors.filter('vehicle.*'))) - print(' * walkers: % 20d' % len(actors.filter('walker.*'))) - print('-' * 34) - - - def main(): - argparser = argparse.ArgumentParser( - description=__doc__) - argparser.add_argument( - '--host', - metavar='H', - default='localhost', - help='IP of the host CARLA Simulator (default: localhost)') - argparser.add_argument( - '-p', '--port', - metavar='P', - default=2000, - type=int, - help='TCP port of CARLA Simulator (default: 2000)') - argparser.add_argument( - '-d', '--default', - action='store_true', - help='set default settings') - argparser.add_argument( - '-m', '--map', - help='load a new map, use --list to see available maps') - argparser.add_argument( - '-r', '--reload-map', - action='store_true', - help='reload current map') - argparser.add_argument( - '--delta-seconds', - metavar='S', - type=float, - help='set fixed delta seconds, zero for variable frame rate') - argparser.add_argument( - '--fps', - metavar='N', - type=float, - help='set fixed FPS, zero for variable FPS (similar to --delta-seconds)') - argparser.add_argument( - '--rendering', - action='store_true', - help='enable rendering') - argparser.add_argument( - '--no-rendering', - action='store_true', - help='disable rendering') - argparser.add_argument( - '--no-sync', - action='store_true', - help='disable synchronous mode') - argparser.add_argument( - '--weather', - help='set weather preset, use --list to see available presets') - argparser.add_argument( - '-i', '--inspect', - action='store_true', - help='inspect simulation') - argparser.add_argument( - '-l', '--list', - action='store_true', - help='list available options') - argparser.add_argument( - '-b', '--list-blueprints', - metavar='FILTER', - help='list available blueprints matching FILTER (use \'*\' to list them all)') - argparser.add_argument( - '-x', '--xodr-path', - metavar='XODR_FILE_PATH', - help='load a new map with a minimum physical road representation of the provided OpenDRIVE') - argparser.add_argument( - '--osm-path', - metavar='OSM_FILE_PATH', - help='load a new map with a minimum physical road representation of the provided OpenStreetMaps') - argparser.add_argument( - '--tile-stream-distance', - metavar='N', - type=float, - help='Set tile streaming distance (large maps only)') - argparser.add_argument( - '--actor-active-distance', - metavar='N', - type=float, - help='Set actor active distance (large maps only)') - if len(sys.argv) < 2: - argparser.print_help() - return - - args = argparser.parse_args() - - client = carla.Client(args.host, args.port, worker_threads=1) - client.set_timeout(10.0) - - if args.default: - args.rendering = True - args.delta_seconds = 0.0 - args.weather = 'Default' - args.no_sync = True - - if args.map is not None: - print('load map %r.' % args.map) - world = client.load_world(args.map) - elif args.reload_map: - print('reload map.') - world = client.reload_world() - elif args.xodr_path is not None: - if os.path.exists(args.xodr_path): - with open(args.xodr_path, encoding='utf-8') as od_file: - try: - data = od_file.read() - except OSError: - print('file could not be readed.') - sys.exit() - print('load opendrive map %r.' % os.path.basename(args.xodr_path)) - vertex_distance = 2.0 # in meters - max_road_length = 500.0 # in meters - wall_height = 1.0 # in meters - extra_width = 0.6 # in meters - world = client.generate_opendrive_world( - data, carla.OpendriveGenerationParameters( - vertex_distance=vertex_distance, - max_road_length=max_road_length, - wall_height=wall_height, - additional_width=extra_width, - smooth_junctions=True, - enable_mesh_visibility=True)) - else: - print('file not found.') - elif args.osm_path is not None: - if os.path.exists(args.osm_path): - with open(args.osm_path, encoding='utf-8') as od_file: - try: - data = od_file.read() - except OSError: - print('file could not be readed.') - sys.exit() - print('Converting OSM data to opendrive') - xodr_data = carla.Osm2Odr.convert(data) - print('load opendrive map.') - vertex_distance = 2.0 # in meters - max_road_length = 500.0 # in meters - wall_height = 0.0 # in meters - extra_width = 0.6 # in meters - world = client.generate_opendrive_world( - xodr_data, carla.OpendriveGenerationParameters( - vertex_distance=vertex_distance, - max_road_length=max_road_length, - wall_height=wall_height, - additional_width=extra_width, - smooth_junctions=True, - enable_mesh_visibility=True)) - else: - print('file not found.') - - else: - world = client.get_world() - - settings = world.get_settings() - - if args.no_rendering: - print('disable rendering.') - settings.no_rendering_mode = True - elif args.rendering: - print('enable rendering.') - settings.no_rendering_mode = False - - if args.no_sync: - print('disable synchronous mode.') - settings.synchronous_mode = False - - if args.delta_seconds is not None: - settings.fixed_delta_seconds = args.delta_seconds - elif args.fps is not None: - settings.fixed_delta_seconds = (1.0 / args.fps) if args.fps > 0.0 else 0.0 - - if args.delta_seconds is not None or args.fps is not None: - if settings.fixed_delta_seconds > 0.0: - print('set fixed frame rate %.2f milliseconds (%d FPS)' % ( - 1000.0 * settings.fixed_delta_seconds, - 1.0 / settings.fixed_delta_seconds)) - else: - print('set variable frame rate.') - settings.fixed_delta_seconds = None - - if args.tile_stream_distance is not None: - settings.tile_stream_distance = args.tile_stream_distance - if args.actor_active_distance is not None: - settings.actor_active_distance = args.actor_active_distance - - world.apply_settings(settings) - - if args.weather is not None: - if not hasattr(carla.WeatherParameters, args.weather): - print('ERROR: weather preset %r not found.' % args.weather) - else: - print('set weather preset %r.' % args.weather) - world.set_weather(getattr(carla.WeatherParameters, args.weather)) - - if args.inspect: - inspect(args, client) - if args.list: - list_options(client) - if args.list_blueprints: - list_blueprints(world, args.list_blueprints) - - - if __name__ == '__main__': - - try: - - main() - - except KeyboardInterrupt: - print('\nCancelled by user. Bye!') - except RuntimeError as e: - print(e) - - -\end{lstlisting} diff --git a/scene/undergraduate/content/authorizationzh.tex b/scene/undergraduate/content/authorizationzh.tex new file mode 100644 index 0000000..6f5a52d --- /dev/null +++ b/scene/undergraduate/content/authorizationzh.tex @@ -0,0 +1,30 @@ +%!TEX root = ../hutbthesis_main.tex + +\keywordsen{HUTB\ \ LaTeX\ \ Template} +\begin{authorizationzh} + +本毕业设计《基于预训练大模型的高保真三维智能驾驶场景生成系统》是本人在校期间所完成学业的组成部分,是在学校教师的指导下完成的。 +因此,本人特授权学校可将本毕业设计的全部或部分内容编入有关书籍、数据库保存,可采用复制、印刷、网页制作等方式将设计文本和经过编辑、批注等处理的设计文本提供给读者查阅、参考,可向有关学术部门和国家有关教育主管部门呈送复印件和电子文档。 +本毕业设计无论做何种处理,必须尊重本人的著作权,署明本人姓名。 +\\ +\\ +\\ +\\ +\\ +\\ +\\ +\\ + + + \vspace{30pt} + \begin{tabular}{llll} + %\renewcommand{\arraystretch}{2} + % \hspace{240pt} \makebox[4em][s]{设计作者(签字)} & \underline{\makebox[80pt][c]{ }} \\ + \makebox[4em][s]{设计作者(签字)} & \makebox[150pt][c]{ } & \makebox[2em][s]{时间} & \makebox[100pt][c]{\qquad 年\quad 月\quad 日 }\\ + \\ \\ \\ + \makebox[4em][s]{指导教师已阅(签字)} & \makebox[150pt][c]{ } & \makebox[2em][s]{时间} & \makebox[100pt][c]{\qquad 年\quad 月\quad 日 }\\ + \end{tabular} + + + +\end{authorizationzh} \ No newline at end of file diff --git a/scene/undergraduate/content/chapter1.tex b/scene/undergraduate/content/chapter1.tex index f3265f7..e5aeaaa 100644 --- a/scene/undergraduate/content/chapter1.tex +++ b/scene/undergraduate/content/chapter1.tex @@ -1,98 +1,90 @@ -% 第一章 绪论 -\chapter{绪论} -\section{研究背景} -\subsection{智能驾驶测试对海量长尾场景的需求矛盾} -随着智能驾驶技术快速发展起来,它的测试需求也变得日益复杂且多样化,智能驾驶系统需要在各类复杂多变交通场景下\cite{abeysirigoonawardena2019adversarial},展现出可靠性能来确保驾驶安全与舒适,然而现实交通环境里存在海量长尾场景,这些场景虽出现频率低但发生时会对系统构成严峻挑战。 - -长尾场景的复杂性主要体现在如下几个方面,首先交通环境动态性极强,车辆\ref{fig:vehicle_sample}、行人以及非机动车等交通参与者行为模式千变万化,比如在城市道路当中行人可能突然横穿马路,非机动车可能随意变道或者逆行,\cite{bagschik2018ontology}这些行为都可能引发潜在的碰撞风险,智能驾驶系统必须能够准确感知并预测这些行为,然后做出合理决策。其次道路条件的多样性增加了测试场景的复杂性\cite{biggio2013evasion},从城市快速路到乡村小道,再从高速公路到山区道路,不同道路几何形状、路面状况、交通标志和信号灯等都不一样,智能驾驶系统需要在这些不同道路条件下都能正常运行\cite{brown2020language}。此外天气条件和光照条件的变化,也会对智能驾驶系统的感知和决策造成影响,雨、雪、雾等恶劣天气会降低传感器的性能,不同光照条件像强光、弱光、逆光等会影响视觉系统识别效果。 - -为了保证智能驾驶系统具备安全性和可靠性,测试过程得覆盖尽可能多的长尾场景,然而这面临着巨大挑战,一方面长尾场景数量庞大几乎无法穷尽,要完全覆盖所有可能场景几乎是不可能任务,另一方面这些场景出现频率较低难以在实际道路测试中频繁遇到,所以传统测试方法往往难以满足智能驾驶系统对海量长尾场景的测试需求,使得测试的充分性和有效性受到限制\cite{cai2020summit}。 -\begin{figure}[h] - \centering - \includegraphics[width=1.0\textwidth]{"images/车辆样式图.pdf"} - \caption{车辆样图} - \label{fig:vehicle_sample} -\end{figure} -\subsection{传统场景构建方法的人力成本与效率瓶颈} -在智能驾驶测试这个领域当中,传统的场景构建方法主要靠人工设计和开发\cite{cui2023chatlaw},这些方法虽说在一定程度上能够满足测试需求,不过也存在着比较显著的局限性,人工设计场景需要投入大量专业人员,这些人员要具备交通工程、计算机科学和智能驾驶技术等多学科深厚知识,能准确理解并模拟各种复杂交通场景,这样的专业人才相对比较稀缺,培养成本也十分高昂,随着测试需求不断增加,对专业人员的需求也持续增长,这进一步加剧了人力成本方面的压力。 - -其次人工设计场景的效率相对比较低,设计一个复杂交通场景需经多步骤,像需求分析、场景建模、代码编写和调试等,每一个步骤都要耗费大量时间精力,例如在场景建模阶段要精确去定义道路几何形状、交通参与者初始位置和行为模式等,在代码编写阶段需把这些模型转化成可执行代码,这不仅要求具备专业编程技能,还需反复调试来确保代码正确性和稳定性,所以人工设计场景速度远不能满足智能驾驶系统快速迭代和测试的需求,此外人工设计场景的准确性和一致性难保证,因为不同设计人员理解和经验存在差异,可能致使设计出的场景出现一定的差异,并且在复杂场景中人工设计易遗漏关键细节,进而影响测试结果准确性和可靠性。 - -\subsection{大语言模型在代码生成领域的突破性进展} -近年来大语言模型在自然语言处理领域取得巨大突破且逐渐拓展到代码生成等领域,大语言模型通过在海量文本数据上预训练学习到语言语法语义和逻辑结构能生成自然流畅且符合逻辑的文本内容,这种能力为解决智能驾驶测试场景构建难题提供新的思路。在代码生成领域大语言模型已经展现出强大能力\cite{chowdhery2022palm},通过对代码数据学习大语言模型能理解代码结构和逻辑生成符合语法规范的代码片段,例如一些基于大语言模型的代码生成工具可根据用户输入自然语言描述自动生成相应代码实现,这些工具在软件开发领域得到广泛应用显著提高代码开发效率和质量。大语言模型在代码生成中的优势主要体现在以下几个方面: - -首先它能够快速生成代码大大缩短开发周期,传统人工编写代码需经过需求分析设计编码和调试等多个阶段且每个阶段都耗费大量时间,而大语言模型可根据输入描述直接生成代码减少中间环节提高开发效率\cite{feng2021intelligent},其次大语言模型生成的代码质量较高,它能学习到代码最佳实践和规范生成的代码不仅符合语法规范还具有良好可读性和可维护性, - -此外大语言模型还能根据不同需求生成多样化代码实现为开发者提供更多选择。把大语言模型运用到智能驾驶测试场景构建当中\cite{kong2020physgan},能够充分发挥它在代码生成领域的优势来解决传统方法面临的困境,借助将自然语言描述的测试场景需求转变为代码实现,大语言模型能够快速生成高保真的测试场景进而提高场景构建的效率和质量,结合智能驾驶领域的专业知识还可以进一步优化大语言模型的性能让它更好适应智能驾驶测试场景构建的需求。 - - - - -\section{国内外研究现状} -\subsection{基于大语言模型能够根据人的自然语言指令生成Scenic场景代码} -随着大语言模型像GPT -3、T5等的广泛应用起来,基于自然语言描述生成仿真场景代码成为自动驾驶仿真研究重要方向,自然语言描述能够以简单且直观的方式传递场景信息\cite{klischat2020scenario},传统手工编写场景代码的方式存在效率低且灵活性差的问题,所以如何利用自然语言生成交通仿真场景脚本成为该领域核心问题。 - -大语言模型像GPT - 3和T5这类\cite{Xu2023DriveGPT4},已经成功应用于自然语言到场景代码的转换工作,经过训练之后,这些模型能够理解复杂的自然语言输入内容,依据相关描述,它们可以生成结构化的Scenic脚本文件\cite{scenario_runner_contributors2019carla},这些模型通过解析用户给出的自然语言指令,来生成符合自动驾驶仿真要求的场景代码,比如,\cite{Chen et al. (2022)}提出一种基于GPT的框架,能根据自然语言描述生成含车辆行人交通灯等元素的完整交通场景配置。 - -挑战与进展方面大语言模型生成场景代码有一定进展但仍面临挑战,首先处理自然语言中歧义和模糊性是个难题,复杂场景描述下生成场景可能无法完全符合预期,其次现有模型生成能力处理复杂或特殊交通场景时存在局限性,所以增强语言模型语义理解和场景生成准确性仍是活跃研究领域 - - \subsection{将场景代码合成合理的智能驾驶场景} -把生成的Scenic场景代码转化成合理的智能驾驶仿真场景,这是实现自动驾驶测试与验证的关键步骤,生成的场景不仅要符合交通方面的规则,还得能够模拟真实的驾驶环境来进行有效测试。 - 场景代码转化到仿真环境方面,当前的研究重点主要集中在怎样把大语言模型所生成的Scenic脚本转化成仿真平台能够执行的场景配置内容。例如,\cite{Xie et al. (2021)}开发出基于Scenic的编译器用于把自然语言生成场景描述转化为CARLA仿真平台所需配置文件,通过这种方式生成的场景能够在高保真的仿真环境里进行验证 - -智能场景合成跟动态行为建模这方面,智能驾驶场景不只是包含像道路、交通标志这类静态元素,还涵盖如车辆行驶、变道、停车等动态行为,研究者们提出了多种动态行为建模的方法,让生成的交通场景能更真实地反映驾驶行为与交通流情况,例如,\cite{Zhao et al. (2020)}提出一种基于行为模型的动态场景合成方法来通过模拟交通参与者行为生成交互式智能驾驶环境。 - -复杂交通场景面临的挑战是,虽说场景合成方法在持续发展,但生成复杂真实且符合交通规则的场景依旧是技术难题,现有的场景生成方法在应对复杂交通场景时,可能会出现车辆行为不自然以及交通规则不严谨等状况,所以提高场景合成的灵活性和复杂性仍是研究重点。 - - \subsection{对生成的交通场景进行展示和效果的量化衡量} - 在生成交通场景之后对其进行展示以及量化评估是保证场景质量和仿真结果准确性的关键步骤,通过对场景开展可视化以及量化评估研究人员能够验证场景的有效性并为后续自动驾驶算法优化提供数据支撑。 - - 可视化展示就是把生成的交通场景借助可视化工具进行展示,从而方便进行人工验证和审阅。\cite{Dai et al. (2020)}我这边提出一种基于关键帧截取的可视化方法,通过在仿真过程当中截取关键帧图像,以此帮助研究人员快速了解仿真过程里的交通场景,结合深度学习相关技术,自动驾驶系统还可以从这些图像当中提取重要信息,进而对场景开展进一步分析与优化。 - -提出量化评估指标的情况是,为了能系统地对生成场景的质量进行评估,许多研究都提出了量化评估框架。例如,\cite{Dai et al.(2020)}提出一种涵盖场景语义保真度等多方面的多维度评估方法,这些评估指标既能反映生成场景的真实性又能助研究人员评估仿真结果有效性。 - - 安全性与性能评估:自动驾驶系统在仿真环境中的表现也需要量化评估。\cite{Li et al. (2021)}提出一种基于自动驾驶系统安全性的评估框架,通过对车辆在生成场景里碰撞率与通过率等指标进行分析,以此评估自动驾驶系统于不同场景之下的安全性和稳定性,借助这样的量化评估手段,研究人员可识别出潜在的风险和问题并进一步优化自动驾驶算法。 - - \section{研究内容} - \subsection{面向场景描述的领域知识图谱构建} -在自动驾驶测试场景生成这个事情当中,构建面向场景描述的领域知识图谱是实现高效且准确场景生成的基础,领域知识图谱通过整合自动驾驶领域的专业知识\cite{Wang2021advSim},像交通规则、道路类型、车辆行为模式以及传感器特性等内容,为自然语言描述的解析和形式化代码的生成提供丰富上下文信息和语义支持。 - -领域知识图谱构建包含多个关键步骤\cite{Xu2022Safebench},首先要对自动驾驶领域知识做系统梳理与分类,明确知识的层次结构和关联关系,这涵盖对交通场景里实体(像车辆、行人、道路、交通标志等)及其属性(例如位置、速度、类型等)的定义,还有这些实体之间关系(比如车辆与道路的交互、车辆与行人的避让等),构建知识图谱可将这些复杂知识结构化表示出来,方便后续进行查询和推理。 - -在知识图谱的构建过程当中需要考虑知识动态更新与扩展\cite{Yang2020SurfelGAN},自动驾驶技术处于不断发展中新交通规则车辆类型等不断涌现,所以知识图谱得具备良好可扩展性以及可更新性,通过持续开展知识更新能确保知识图谱始终保持最新状态,进而为场景生成提供准确无误的知识方面支持。 - -除此之外领域知识图谱的构建还得考虑知识表达与存储方式,知识图谱一般是以图的形式进行存储的\cite{Yao2022React},其中节点所表示的是实体而边表示实体间的关系,这种结构化的存储方式不仅方便知识的查询和推理,还能够支持复杂的知识融合与关联分析,借助知识图谱的构建能够实现对自动驾驶场景描述的深度理解和语义解析,为后续的代码生成以及场景合成提供坚实可靠的基础。 - - \subsection{基于LLM的语义约束代码生成方法} -基于大型语言模型(LLM)的语义约束代码生成方法是达成自动驾驶测试场景高效生成的一项关键技术,大型语言模型(LLM)具备强大的语言理解和生成能力可依据自然语言描述生成高质量形式化代码,不过为保证生成代码的准确性与可靠性需在代码生成过程中引入语义约束机制\cite{Zhang2023CAT}。 - -语义约束代码生成方法的关键是把自然语言描述的语义信息转成代码生成约束条件,这些约束条件涵盖交通规则、道路类型以及车辆行为模式等内容,目的是保证生成的代码既符合语法规范又能满足实际场景语义要求\cite{Zhang2022AdversarialRobustness},借助语义约束机制可有效避免生成代码里的逻辑错误与不符合实际场景的状况,以此提高代码的质量和可用性。 - -实现语义约束代码生成的时候要充分利用LLM语言理解与生成能力\\ \cite{Zheng2023JudgingLLM},LLM可通过对自然语言描述深度理解提取关键语义信息,再将这些关键语义信息转化为代码生成约束条件,同时还得开发对应算法和工具把约束条件嵌入代码生成过程,以此确保生成代码能准确反映自然语言描述语义内容,此外语义约束代码生成方法也需考虑代码可读性和可维护性,生成代码不仅要符合语法和语义规范,还得具备良好结构和注释以方便后续修改和扩展,借助基于LLM的语义约束代码生成方法能实现从自然语言描述到形式化代码高效转换\cite{zhong2023language},可为自动驾驶测试场景生成提供强大技术支持。 - - \subsection{场景物理合理性的多模态验证机制} - 场景物理合理性验证在自动驾驶测试场景生成里是重要环节\cite{zhao2025key},它会直接影响测试场景的真实性和可靠性,为确保生成场景具备物理合理性,需要建立一种多模态验证机制来通过多种方式综合验证场景,多模态验证机制核心在于结合多种验证手段,从不同角度对场景的物理合理性展开评估,这些验证手段包括基于物理规则的验证、基于仿真数据的验证以及基于专家知识的验证等,通过多种验证手段结合能够全面评估场景物理合理性,确保生成场景符合实际交通环境物理规律\cite{Yao2022React},基于物理规则的验证是多模态验证机制的重要组成部分,通过定义和应用牛顿运动定律、能量守恒定律等物理规则,可对场景中物体运动和交互进行验证,比如验证车辆加速度是否符合物理规律、车辆与行人之间碰撞是否符合能量守恒等。 - -\section{本文研究框架} - -为了达成基于自然语言输入自动生成高保真三维交通场景并做量化评估这一目标,本文构建起一个把自然语言处理、交通场景建模\cite{du2025scene}、三维仿真以及量化评估整合在一起的综合研究体系\ref{fig:research_framework},整体研究框架情况如下,本文对当前国内外在自然语言驱动的场景生成、智能仿真系统集成和自动驾驶场景评估这些方面的研究进展进行分析,从而明确研究问题以及技术挑战。 - -\begin{enumerate} - \item \textbf{基于大语言模型的Scenic场景代码生成技术} \\ -研究怎样借助预训练大语言模型像GPT - 4o结合检索增强机制如Sentence - T5来解析自然语言指令并生成符合语义的交通场景描述脚本Scenic,重点解决生成脚本在语义准确性以及交通合理性方面的问题。 - - \item \textbf{交通场景代码到三维仿真的合成机制} \\ -研究怎样把自然语言生成的场景脚本高效转化成可运行的三维智能驾驶仿真场景,通过集成Scenic语言和CARLA仿真平台实现车辆行人环境等交通要素在虚拟世界构建与动态演化 - - \item \textbf{生成场景的展示与量化评估方法} \\ -建立一套多维度的评估体系来对生成场景进行分析,从语义保真度、多样性和驾驶性能这三个方面量化考量生成场景的质量与有效性,设计自动化的指标计算方法并且结合视觉展示手段,以此增强实验的可解释性。 -\end{enumerate} - -在前面提到的研究基础之上本文完成系统整体实现以及实验验证,通过验证证实所提出方法具备有效性,同时总结本研究创新点与潜在改进空间。 - -\begin{figure}[H] - \centering - \includegraphics[width=0.9\textwidth]{../images/研究架构图.pdf} - \caption{本文的研究框架} - \label{fig:research_framework} -\end{figure} \ No newline at end of file +% 第一章 绪论 +\chapter{绪论} +\section{研究背景} +\subsection{智能驾驶测试对海量长尾场景的需求矛盾} +随着智能驾驶技术快速发展起来,它的测试需求也变得日益复杂且多样化,智能驾驶系统需要在各类复杂多变交通场景下\cite{abeysirigoonawardena2019adversarial},展现出可靠性能来确保驾驶安全与舒适,然而现实交通环境里存在海量长尾场景,这些场景虽出现频率低但发生时会对系统构成严峻挑战。 + +长尾场景的复杂性主要体现在如下几个方面,首先交通环境动态性极强,车辆\ref{fig:vehicle_sample}、行人以及非机动车等交通参与者行为模式千变万化,比如在城市道路当中行人可能突然横穿马路,非机动车可能随意变道或者逆行,\cite{bagschik2018ontology}这些行为都可能引发潜在的碰撞风险,智能驾驶系统必须能够准确感知并预测这些行为,然后做出合理决策。其次道路条件的多样性增加了测试场景的复杂性\cite{biggio2013evasion},从城市快速路到乡村小道,再从高速公路到山区道路,不同道路几何形状、路面状况、交通标志和信号灯等都不一样,智能驾驶系统需要在这些不同道路条件下都能正常运行\cite{brown2020language}。此外天气条件和光照条件的变化,也会对智能驾驶系统的感知和决策造成影响,雨、雪、雾等恶劣天气会降低传感器的性能,不同光照条件像强光、弱光、逆光等会影响视觉系统识别效果。 + +为了保证智能驾驶系统具备安全性和可靠性,测试过程得覆盖尽可能多的长尾场景,然而这面临着巨大挑战,一方面长尾场景数量庞大几乎无法穷尽,要完全覆盖所有可能场景几乎是不可能任务,另一方面这些场景出现频率较低难以在实际道路测试中频繁遇到,所以传统测试方法往往难以满足智能驾驶系统对海量长尾场景的测试需求,使得测试的充分性和有效性受到限制\cite{cai2020summit}。 +\begin{figure}[h] + \centering + \includegraphics[width=0.7\textwidth]{"images/车辆样式图.pdf"} + \caption{carla场景样图} + \label{fig:vehicle_sample} +\end{figure} +\subsection{传统场景构建方法的人力成本与效率瓶颈} +在智能驾驶测试这个领域当中,传统的场景构建方法主要靠人工设计和开发\cite{cui2023chatlaw},这些方法虽说在一定程度上能够满足测试需求,不过也存在着比较显著的局限性,人工设计场景需要投入大量专业人员,这些人员要具备交通工程、计算机科学和智能驾驶技术等多学科深厚知识,能准确理解并模拟各种复杂交通场景,这样的专业人才相对比较稀缺,培养成本也十分高昂,随着测试需求不断增加,对专业人员的需求也持续增长,这进一步加剧了人力成本方面的压力。 + +其次人工设计场景的效率相对比较低,设计一个复杂交通场景需经多步骤,像需求分析、场景建模、代码编写和调试等,每一个步骤都要耗费大量时间精力,例如在场景建模阶段要精确去定义道路几何形状、交通参与者初始位置和行为模式等,在代码编写阶段需把这些模型转化成可执行代码,这不仅要求具备专业编程技能,还需反复调试来确保代码正确性和稳定性,所以人工设计场景速度远不能满足智能驾驶系统快速迭代和测试的需求,此外人工设计场景的准确性和一致性难保证,因为不同设计人员理解和经验存在差异,可能致使设计出的场景出现一定的差异,并且在复杂场景中人工设计易遗漏关键细节,进而影响测试结果准确性和可靠性。 + +\subsection{大语言模型在代码生成领域的突破性进展} +近年来大语言模型在自然语言处理领域取得巨大突破且逐渐拓展到代码生成等领域,大语言模型通过在海量文本数据上预训练学习到语言语法语义和逻辑结构能生成自然流畅且符合逻辑的文本内容,这种能力为解决智能驾驶测试场景构建难题提供新的思路。在代码生成领域大语言模型已经展现出强大能力\cite{chowdhery2022palm},通过对代码数据学习大语言模型能理解代码结构和逻辑生成符合语法规范的代码片段,例如一些基于大语言模型的代码生成工具可根据用户输入自然语言描述自动生成相应代码实现,这些工具在软件开发领域得到广泛应用显著提高代码开发效率和质量。大语言模型在代码生成中的优势主要体现在以下几个方面: + +首先它能够快速生成代码大大缩短开发周期,传统人工编写代码需经过需求分析设计编码和调试等多个阶段且每个阶段都耗费大量时间,而大语言模型可根据输入描述直接生成代码减少中间环节提高开发效率\cite{feng2021intelligent},其次大语言模型生成的代码质量较高,它能学习到代码最佳实践和规范生成的代码不仅符合语法规范还具有良好可读性和可维护性, + +此外大语言模型还能根据不同需求生成多样化代码实现为开发者提供更多选择。把大语言模型运用到智能驾驶测试场景构建当中\cite{kong2020physgan},能够充分发挥它在代码生成领域的优势来解决传统方法面临的困境,借助将自然语言描述的测试场景需求转变为代码实现,大语言模型能够快速生成高保真的测试场景进而提高场景构建的效率和质量,结合智能驾驶领域的专业知识还可以进一步优化大语言模型的性能让它更好适应智能驾驶测试场景构建的需求。 + + + + +\section{国内外研究现状} +\subsection{基于大语言模型能够根据人的自然语言指令生成Scenic场景代码} +随着大语言模型像GPT -3、T5等的广泛应用起来,基于自然语言描述生成仿真场景代码成为自动驾驶仿真研究重要方向,自然语言描述能够以简单且直观的方式传递场景信息\cite{klischat2020scenario},传统手工编写场景代码的方式存在效率低且灵活性差的问题,所以如何利用自然语言生成交通仿真场景脚本成为该领域核心问题。 + +大语言模型像GPT - 3和T5这类\cite{Xu2023DriveGPT4},已经成功应用于自然语言到场景代码的转换工作,经过训练之后,这些模型能够理解复杂的自然语言输入内容,依据相关描述,它们可以生成结构化的Scenic脚本文件\cite{scenario_runner_contributors2019carla},这些模型通过解析用户给出的自然语言指令,来生成符合自动驾驶仿真要求的场景代码,比如,提出一种基于GPT的框架,能根据自然语言描述生成含车辆行人交通灯等元素的完整交通场景配置。 + +在挑战与进展方面大语言模型生成场景代码有一定进展但依旧面临挑战,首先处理自然语言里的歧义和模糊性属于一个难题,复杂场景描述下生成的场景可能无法完全符合预期,其次现有模型生成能力在处理复杂或特殊交通场景时存在局限性,所以增强语言模型语义理解和场景生成准确性仍是活跃研究领域。 + +\subsection{将场景代码合成合理的智能驾驶场景} +把生成的Scenic场景代码转化成合理的智能驾驶仿真场景\cite{wu2025complexscenes},这是实现自动驾驶测试与验证的关键步骤,生成的场景不仅要符合交通方面的规则,还得能够模拟真实的驾驶环境来进行有效测试。 +场景代码转化到仿真环境方面\cite{gu2025reinforcementlearning},当前的研究重点主要集中在怎样把大语言模型所生成的Scenic脚本转化成仿真平台能够执行的场景配置内容。例如,开发出基于Scenic的编译器用于把自然语言生成场景描述转化为CARLA仿真平台所需配置文件,通过这种方式生成的场景能够在高保真的仿真环境里进行验证 + +智能场景合成跟动态行为建模这方面,智能驾驶场景不只是包含像道路、交通标志这类静态元素,还涵盖如车辆行驶、变道、停车等动态行为,研究者们提出了多种动态行为建模的方法,让生成的交通场景能更真实地反映驾驶行为与交通流情况\cite{wu2025taxi},例如,提出一种基于行为模型的动态场景合成方法来通过模拟交通参与者行为生成交互式智能驾驶环境。 + +复杂交通场景面临的挑战是,虽说场景合成方法在持续发展,但生成复杂真实且符合交通规则的场景依旧是技术难题,现有的场景生成方法在应对复杂交通场景时,可能会出现车辆行为不自然以及交通规则不严谨等状况,所以提高场景合成的灵活性和复杂性仍是研究重点。 + +\subsection{对生成的交通场景进行展示和效果的量化衡量} +在生成交通场景之后对其进行展示以及量化评估是保证场景质量和仿真结果准确性的关键步骤\cite{peng2025data},通过对场景开展可视化以及量化评估研究人员能够验证场景的有效性并为后续自动驾驶算法优化提供数据支撑。 + +可视化展示就是把生成的交通场景借助可视化工具进行展示,从而方便进行人工验证和审阅。我这边提出一种基于关键帧截取的可视化方法\cite{fang2025yolo},通过在仿真过程当中截取关键帧图像,以此帮助研究人员快速了解仿真过程里的交通场景,结合深度学习相关技术,自动驾驶系统还可以从这些图像当中提取重要信息,进而对场景开展进一步分析与优化。 + +提出量化评估指标的情况是,为了能系统地对生成场景的质量进行评估,许多研究都提出了量化评估框架。例如,提出一种涵盖场景语义保真度等多方面的多维度评估方法\cite{zhu2024tsgan},这些评估指标既能反映生成场景的真实性又能助研究人员评估仿真结果有效性。 + +安全性与性能评估:自动驾驶系统在仿真环境中的表现也需要量化评估。提出一种基于自动驾驶系统安全性的评估框架,通过对车辆在生成场景里碰撞率与通过率等指标进行分析,以此评估自动驾驶系统于不同场景之下的安全性和稳定性,借助这样的量化评估手段,研究人员可识别出潜在的风险和问题并进一步优化自动驾驶算法。 + +\section{研究内容} +\subsection{面向场景描述的领域知识图谱构建} +在自动驾驶测试场景生成这个事情当中,构建面向场景描述的领域知识图谱是实现高效且准确场景生成的基础,领域知识图谱通过整合自动驾驶领域的专业知识\cite{Wang2021advSim},像交通规则、道路类型、车辆行为模式以及传感器特性等内容,为自然语言描述的解析和形式化代码的生成提供丰富上下文信息和语义支持。 + +领域知识图谱构建包含多个关键步骤\cite{Xu2022Safebench},首先要对自动驾驶领域知识做系统梳理与分类,明确知识的层次结构和关联关系,这涵盖对交通场景里实体(像车辆、行人、道路、交通标志等)及其属性(例如位置、速度、类型等)的定义,还有这些实体之间关系(比如车辆与道路的交互、车辆与行人的避让等),构建知识图谱可将这些复杂知识结构化表示出来,方便后续进行查询和推理。 + +在知识图谱的构建过程当中需要考虑知识动态更新与扩展\cite{Yang2020SurfelGAN},自动驾驶技术处于不断发展中新交通规则车辆类型等不断涌现,所以知识图谱得具备良好可扩展性以及可更新性,通过持续开展知识更新能确保知识图谱始终保持最新状态,进而为场景生成提供准确无误的知识方面支持。 + +除此之外领域知识图谱的构建还得考虑知识表达与存储方式,知识图谱一般是以图的形式进行存储的\cite{Yao2022React},其中节点所表示的是实体而边表示实体间的关系,这种结构化的存储方式不仅方便知识的查询和推理,还能够支持复杂的知识融合与关联分析,借助知识图谱的构建能够实现对自动驾驶场景描述的深度理解和语义解析,为后续的代码生成以及场景合成提供坚实可靠的基础。 + +\subsection{基于LLM的语义约束代码生成方法} +基于大型语言模型(LLM)的语义约束代码生成方法是达成自动驾驶测试场景高效生成的一项关键技术,大型语言模型(LLM)具备强大的语言理解和生成能力可依据自然语言描述生成高质量形式化代码,不过为保证生成代码的准确性与可靠性需在代码生成过程中引入语义约束机制\cite{Zhang2023CAT}。 + +语义约束代码生成方法的关键是把自然语言描述的语义信息转成代码生成约束条件,这些约束条件涵盖交通规则、道路类型以及车辆行为模式等内容,目的是保证生成的代码既符合语法规范又能满足实际场景语义要求\cite{Zhang2022AdversarialRobustness},借助语义约束机制可有效避免生成代码里的逻辑错误与不符合实际场景的状况,以此提高代码的质量和可用性。 + +实现语义约束代码生成的时候要充分利用LLM语言理解与生成能力\\ \cite{Zheng2023JudgingLLM},LLM可通过对自然语言描述深度理解提取关键语义信息,再将这些关键语义信息转化为代码生成约束条件,同时还得开发对应算法和工具把约束条件嵌入代码生成过程,以此确保生成代码能准确反映自然语言描述语义内容,此外语义约束代码生成方法也需考虑代码可读性和可维护性,生成代码不仅要符合语法和语义规范,还得具备良好结构和注释以方便后续修改和扩展,借助基于LLM的语义约束代码生成方法能实现从自然语言描述到形式化代码高效转换\cite{zhong2023language},可为自动驾驶测试场景生成提供强大技术支持。 + +\subsection{场景物理合理性的多模态验证机制} +场景物理合理性验证在自动驾驶测试场景生成里是重要环节\cite{zhao2025key},它会直接影响测试场景的真实性和可靠性,为确保生成场景具备物理合理性,需要建立一种多模态验证机制来通过多种方式综合验证场景,多模态验证机制核心在于结合多种验证手段,从不同角度对场景的物理合理性展开评估,这些验证手段包括基于物理规则的验证、基于仿真数据的验证以及基于专家知识的验证等,通过多种验证手段结合能够全面评估场景物理合理性,确保生成场景符合实际交通环境物理规律\cite{Yao2022React},基于物理规则的验证是多模态验证机制的重要组成部分,通过定义和应用牛顿运动定律、能量守恒定律等物理规则,可对场景中物体运动和交互进行验证,比如验证车辆加速度是否符合物理规律、车辆与行人之间碰撞是否符合能量守恒等。 + +\section{本文研究结构} + +为了达成基于自然语言输入自动生成高保真三维交通场景并做量化评估这一目标,本文构建起一个把自然语言处理、交通场景建模\cite{du2025scene}、三维仿真以及量化评估整合在一起的综合研究体系,本文对当前国内外在自然语言驱动的场景生成、智能仿真系统集成和自动驾驶场景评估这些方面的研究进展进行分析,从而明确研究问题以及技术挑战。 + +第一章绪论这部分内容阐述了研究背景以及问题提出逻辑起点,首先点明当前智能驾驶技术面临关键挑战是对低频高风险“长尾场景”识别与处理能力不足,接着分析长尾场景典型特征包括交通参与者行为不可预测性、道路布局复杂性以及自然条件变化对系统的干扰等情况,本章还进一步指出现有测试方法难以全面覆盖这些多样化场景从而导致系统评估存在盲区,所以为实现更高保真的测试需求提出通过生成逼真三维测试场景来填补这一空白,本章节为后续系统设计与实现奠定问题基础和研究动因并明确构建智能驾驶场景生成系统的必要性与紧迫性。 + +第二章相关工作:这一章节围绕自然语言生成智能驾驶场景相关技术进行论述,系统介绍预训练语言模型在场景生成里的核心机制,尤其是基于Sentence - T5模型对自然语言场景描述做语义向量编码,再通过向量匹配去检索结构化模板,实现从语言理解到结构生成的语义桥接过程,同时深入探讨自然语言到结构化代码转换的建模逻辑,强调语义建模、语法约束建模和结构对齐的协同作用,在交通场景语义建模方面,本文提出把自然语言转化成结构化语义表示,提取参与实体、行为属性、空间关系和时序逻辑,以此生成具备真实执行逻辑的交通场景脚本,Scenic语言作为场景描述核心工具,凭借简洁语法和概率建模能力,为多样化、高保真的场景生成提供支持,最后章节简要介绍本系统与CARLA智能驾驶仿真平台的集成方式,借助Scenic语言生成的脚本自动构建可执行三维交通场景,实现自然语言到可交互场景的完整闭环。 + +第三章系统需求分析与总体架构设计:主要是系统地对基于自然语言的三维智能驾驶场景生成系统做分析和设计,首先明确系统需要满足的核心功能需求,涵盖高保真自动驾驶测试场景构建需求、自然语言输入解析、语义理解与结构映射、可执行脚本生成以及仿真平台验证等关键能力,旨在以自动化方式提高智能驾驶测试效率与多样性,接着详细说明系统总体架构,采用模块化分层设计将系统划分为自然语言输入模块、结构生成模块、CARLA仿真模块和结果评估分析模块这四大部分,其中自然语言输入模块借助图形界面与语义模型实现对用户场景描述的高质量编码与检索,结构生成模块把检索结果和预设模板相融合输出符合Scenic语法的结构化脚本,仿真模块基于CARLA平台加载脚本并自动调度执行以完成交通参与体的行为仿真与场景复现,结果评估模块对仿真过程进行图像、视频和行为数据的采集与分析并依据多维指标输出仿真效果与驾驶行为质量评估,如此便构建出一个完整的自然语言驱动智能驾驶场景生成与验证系统架构,为后续模块实现提供明确蓝图和技术支撑。 + +第四章系统设计与实现部分介绍系统开发环境及核心功能实现情况,硬件方面采用具备高性能的本地计算机包含Intel i9、RTX 3060以及32GB内存,软件环境是基于Windows 11和Python 3.8且集成自然语言处理与自动驾驶仿真相关依赖库,系统实现划分为三大核心模块,自然语言理解模块借助句向量检索和大模型来生成Scenic脚本,场景合成与仿真模块负责将脚本转化成CARLA里的动态三维场景,评估与展示模块对仿真效果进行可视化呈现并在语义保真度、多样性、驾驶性能等方面开展定量分析为系统验证和优化提供相应依据。 + +第五章系统案例测试分析:这章通过还原十组典型自然语言输入场景来展示系统在语义解析、结构化生成以及三维仿真中的完整流程和实际效果,每组案例都从文本输入开始,系统会自动完成语义理解、Scenic 脚本构建以及 Carla 场景生成,直观呈现不同语义指令下生成结果的可视化表现,在此基础上结合语义保真度、场景多样性和系统响应效率这三大维度开展系统性能评估,实验结果显示系统在保真性和语义一致性方面最终得分能保持在 0.94 - 0.95 之间,多样性与准确性指标都达到较高水准,和规则方法以及 GPT - 4.0 方法相比展现出更好的综合生成质量和语义还原能力。 + +第六章总结与展望:这篇文章以自然语言处理技术为基础,设计并且实现出一种自动驾驶仿真场景生成方法,还结合CARLA平台达成动态场景的语义驱动生成和感知系统的集成,系统利用深度学习模型对自然语言描述做语义解析,能够自动构建出符合语义要求的复杂交通场景,同时借助集成的目标检测与行为预测模块提高自动驾驶系统的智能决策能力,实验结果证实了该方法具备有效性和实用性,为提升自动驾驶场景多样性和感知智能化给予了有力支持。 \ No newline at end of file diff --git a/scene/undergraduate/content/chapter2.tex b/scene/undergraduate/content/chapter2.tex index 5ad58b7..3f4a4ce 100644 --- a/scene/undergraduate/content/chapter2.tex +++ b/scene/undergraduate/content/chapter2.tex @@ -1,150 +1,120 @@ -\chapter{理论基础} - -\section{预训练语言模型与代码生成机制} - -预训练语言模型也就是 Pretrained Language Models(PLMs),它是基于大规模语料来学习语言分布规律的通用建模方法,其核心要点是通过自监督学习掌握词序列的统计规律,并且在这个基础上实现对下游任务的泛化能力,在生成结构化代码的任务当中,预训练语言模型会先理解自然语言的语义意图,然后将其映射为具有严格语法和语义约束的目标语言(像 Scenic)的代码表示,此过程涉及对语言结构、上下文关系以及目标语言语法规则的综合建模能力。 - -\subsection{Transformer 与大语言模型的理论机制} - -Transformer是现在主流语言模型所采用的基础结构,其核心是自注意力机制也就是Self - Attention,主要用来捕捉输入序列里任意两个位置之间的依赖关系,在编码过程当中,输入序列首先会通过嵌入也就是Embedding层转化成向量表示,接着会通过多层的自注意力网络开展上下文建模,在每一层里面,模型会依据Query - Key - Value结构来计算注意力权重: - -\begin{equation} - \text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right)V -\end{equation} - -在这其中 $Q$、$K$、$V$ 分别表示查询(Query)、键(Key)和值(Value)矩阵,$d_k$ 为维度归一化因子。这个机制可以在任意位置之间建立联系,从而有效捕捉长距离依赖。 - -在生成模型当中像GPT系列这类,Transformer被当作自回归结构来使用,当前token的表示要依赖之前所有token的上下文,目标是去预测下一个token出现的概率,经过大规模语料的训练后模型能够学习到语言里的统计规律、语法模式以及推理结构 - -\subsection{自然语言生成结构化代码的建模逻辑} - -把自然语言变成结构化代码的这个过程,本质上是把输入的非形式化且语义丰富自然语言映射到有严格语法和执行逻辑的目标代码语言里,这个映射包含着三个核心理论组件: - -\begin{enumerate} - \item \textbf{语义建模(Semantic Modeling)}:语言模型要先理解自然语言背后的意图,也就是用户描述里蕴含的操作对象、属性约束、空间关系和时间先后等语义信息,这部分依靠语言模型对上下文的长距离建模能力以及对词汇的语义表示能力 。 - - \item \textbf{语法约束建模(Syntactic Constraint Modeling)}:目标语言像Scenic这类有着明确的语法规则以及结构限制,语言模型在预训练过程里学习了多种语言模式,还能内隐地掌握特定语言的文法结构来生成合法的结构化代码。 - - \item \textbf{结构对齐与表示变换(Structure Alignment)}:自然语言可以让人自由地进行表达,而结构化代码属于高度约束的形式语言。语言模型借助自回归生成的过程,把自然语言里的结构信息逐步转化成代码片段,达成从开放式表述到约束式语言的对齐映射。 -\end{enumerate} - -需要注意的是语言模型并非通过硬编码规则做语义转换,而是凭借大规模预训练获得的统计语言知识,在解码阶段依靠概率最大化来实现语言到代码的结构生成,这种方法具备通用性强和适应性高的优势,适合用于多领域的自然语言编程任务。 -另外在结构生成的过程当中,可以引入显式语义约束机制或者模板结构,像代码前缀提示这类,以此进一步提升生成代码的可控性与可解释性。 -\section{自然语言到交通场景的语义建模} - -把自然语言描述转变为可执行的交通仿真场景,关键之处在于对语义信息做结构化建模,交通场景一般有着复杂的空间布局、多主体互动且时序性强等特征,所以要从自然语言里精准提取出参与实体、行为属性、空间关系以及时间逻辑,并且构建能被场景引擎识别和执行的语义表示结构,本节围绕场景语义结构分析与关键元素抽取、时序关系与交通意图建模这两个方面展开论述。 - -\subsubsection{场景语义结构分析与关键元素抽取} - -交通场景里的自然语言一般会包含多个核心组成部分,像交通参与者(例如车辆、行人、自行车等)、空间约束(比如道路类型、位置关系)、行为动作(像是“行驶”“等待”“穿越”)以及环境条件(例如天气、时间、信号灯状态),语义结构分析的目标是从原始语句当中建立出如下形式的结构化语义表示。 - -\begin{equation} - \text{Scene} = \{ \text{Agents}, \text{Actions}, \text{Locations}, \text{Relations}, \text{Conditions} \} -\end{equation} - -其中: -\begin{itemize} - \item \textbf{Agents}:参与主体及其类型(如一辆蓝色轿车、自行车、行人等); - \item \textbf{Actions}:行为描述,如“驶入交叉口”、“等待信号”、“加速通过”等; - \item \textbf{Locations}:空间位置或背景信息,如“在红绿灯前”、“十字路口中央”、“左侧车道”; - \item \textbf{Relations}:主体之间的空间和逻辑关系,如“位于...左侧”、“跟随...行驶”; - \item \textbf{Conditions}:上下文条件,如“在夜间”、“红灯状态”、“雨天”等。 -\end{itemize} - -抽取过程是依靠语言模型对上下文依存关系的建模能力来开展的,同时配合命名实体识别(NER)、依存句法分析(Dependency Parsing)等语言学工具,能够形成初步的语义结构,在本系统当中,语义结构会进一步映射为Scenic或Carla里支持的场景构造要素,以此实现语义向结构化语言的桥接。 - -\subsection{时序关系与交通意图建模} - -交通场景可不只是静态配置这么简单,还涉及高度动态化的行为序列以及意图表达,自然语言里常常包含清晰或者隐含的时间逻辑,像“接着”“在……之后”“同时”这类信息,对于还原真实交通过程起着关键作用,时序关系建模的目标是把事件按照逻辑顺序组织成一个有向图或者序列,每个事件节点包含主体、动作以及发生时间,具体形式如下: -\begin{equation} - \text{Timeline} = \left[ e_1 \rightarrow e_2 \rightarrow \cdots \rightarrow e_n \right], \quad e_i = (\text{Agent}, \text{Action}, \text{Time}) -\end{equation} - -借助语言模型对事件触发词以及像“当……时”“随后”这类连接词的建模能力,能够自动推理出事件之间的因果和先后关系并形成场景执行逻辑路径,另外交通意图建模所关注的是参与主体行为背后的目标导向性,比如“车辆试图避让行人”这种表述不仅描述了一个行为,还隐含着“行人优先”的交通规则与主车的决策意图,这类意图信息对于像 Carla 的行为树或触发机制这样的场景控制逻辑有着重要价值,可通过对谓词、助动词以及上下文环境进行深度理解来实现建模。 - -\section{Scenic语言的形式化语义与表达能力} - -Scenic语言是专门面向智能驾驶场景的描述性语言,它主要目标是借助简洁且强大的语法结构,把复杂交通场景转化成可执行的仿真代码,为让语言具备高效表达能力和高度可扩展性,Scenic语言将形式化的语法设计和概率建模结合起来,通过对交通场景进行准确描述,能够生成包含多主体且行为多样化的复杂仿真环境,本节会从Scenic的语法设计与概率建模、Scenic在智能驾驶场景中的优势分析这两个方面展开详细讨论。 -\subsection{Scenic的语法设计与概率建模} - -Scenic语言语法设计是有效表达交通场景的基础,Scenic核心在于用简单面向对象描述方式,支持对交通参与者及空间位置等灵活建模,其语法结构支持层次化描述能精准构建场景元素,Scenic语法设计遵循以下几个基本原则: - -\begin{itemize} - \item \textbf{面向对象建模:} Scenic通过对“对象”进行定义,像车辆、行人这类,同时也对“对象属性”加以明确,比如位置、速度、尺寸这些,以此来构建一个高层次的交通场景。 - \item \textbf{行为定义:} 系统支持对交通参与者的动作(像“加速”“刹车”这类动作)以及事件(例如“碰撞”这样的事件)进行定义。 - \item \textbf{空间约束与条件:} Scenic能够对空间约束进行定义,像“在道路上”这种,还能定义基于条件的约束,例如“当交通信号为红色时”。 -\end{itemize} - -Scenic的关键特性之一是支持概率建模,允许在场景生成时引入随机性和不确定性。通过概率分布的引入,Scenic能够模拟复杂的交通情境,生成多样化且高度不确定的场景。例如,车辆的初始位置、速度、甚至行为都可以通过概率分布进行建模,以更好地贴近真实世界中交通流的动态性。 - -\begin{equation} - P(\text{Scene}) = \int_{\Omega} P(\text{Elements} | \text{Conditions}) d\Omega -\end{equation} - -在此公式中,$P(\text{Scene})$ 表示生成场景的概率,$\text{Elements}$ 代表场景中各种元素(如车辆、行人等),而 $\Omega$ 表示所有可能的场景配置空间。通过这种概率建模,Scenic可以在多种不确定性下生成具有高度真实性和多样性的场景。 - -\subsection{Scenic在智能驾驶场景中的优势分析} - -Scenic语言的设计给智能驾驶领域的场景生成带来明显优势,下面从多个维度分析Scenic在智能驾驶仿真里的独特优势: - -\begin{itemize} - \item \textbf{高效的场景描述与复用:} Scenic凭借高度抽象化的语法以及简洁的模型表达,极大程度提高了交通场景的描述效率,场景具备很强的重用性,不同场景能够通过微小的语法变更来进行扩展和组合,可满足智能驾驶测试里对多样化场景的需求。 - - \item \textbf{动态行为与时序控制:} Scenic可以在场景里嵌入复杂的时序关系,能准确模拟多个主体之间的互动情况,就像车辆与行人之间的避让行为,又或是车辆在不同时间点的动作序列,都能够依靠简洁的代码来实现,这让Scenic成了模拟交通意图和决策过程的重要工具。 - - \item \textbf{概率建模提升真实性:} 通过引入随机性与不确定性,Scenic能够模拟出更贴近真实世界的交通场景,在生成多个交通参与者行为的时候,场景生成不局限于确定性条件,而是可包含行为模式的随机变化,这对测试自动驾驶系统的适应性十分重要。 - - \item \textbf{与仿真平台的兼容性:} Scenic语言和多种智能驾驶仿真平台像CARLA有良好兼容性,借助Scenic语言用户能生成符合平台要求的场景代码,可直接和仿真环境对接开展测试工作,避免传统场景构建里繁琐的人工编码操作。 - - \item \textbf{可扩展性与灵活性:} Scenic语言能够生成基于规则的固定场景,还能借助引入外部因素、环境变化以及多主体交互等元素扩展出更复杂场景,不管是常规的城市街道、环路,还是极端天气条件、突发事件等情况都可通过Scenic进行灵活建模。 -\end{itemize} -\section{智能驾驶仿真平台CARLA与集成机制} - -智能驾驶仿真平台CARLA也就是Car Learning to Act ,它是一款开源的高保真自动驾驶模拟器,在自动驾驶系统的开发和测试方面有着广泛应用。CARLA具备丰富的环境建模功能,能够模拟各种天气、时间、交通和驾驶情况。正因为如此,它成了自动驾驶仿真里不可或缺的工具之一。本节会介绍CARLA的场景接入机制,还会阐述其与Scenic的联合仿真流程设计。 -\subsection{CARLA场景接入机制} - -CARLA的场景接入机制主要是和外部代码或者仿真系统做对接,用户借助CARLA的API能够自定义并且加载复杂的交通场景,还可在这个基础上开展仿真测试,具体的接入方式包含如下内容: - -\begin{itemize} - \item \textbf{场景数据导入:}CARLA能够支持借助Python API和外部程序开展交互,用户可通过Python脚本动态生成相应场景,还能控制交通参与者像车辆行人的位置行为和状态,除此之外CARLA也提供了实时数据流接口,支持获取如摄像头雷达等传感器数据并反馈到控制系统 。 - - \item \textbf{API与脚本接口:} CARLA给用户提供了一套较为完善的API和脚本接口,其支持通过编程来生成、控制以及操作场景元素,这些接口涵盖控制车辆运动、改变天气状况、管理交通信号等功能,可依据不同的仿真需求对场景进行实时调整。 - - \item \textbf{物理引擎与碰撞检测:}CARLA的物理引擎能提供高度仿真的车辆动力学以及碰撞检测机制,可精确模拟车辆行为、道路条件和交通情况,这些物理特性保证了仿真环境具备真实性和高效性,为智能驾驶系统的测试提供了坚实的基础。 -\end{itemize} - -借助上面所提到的机制,CARLA可以和其他系统像Scenic语言进行紧密集成,以此实现更为复杂的智能驾驶场景仿真。 - -\subsection{与Scenic的联合仿真流程设计} - -为了提升自动驾驶测试的自动化程度以及场景多样性,本文给出了CARLA与Scenic的联合仿真具体流程如下: - -\begin{enumerate} - \item \textbf{场景描述生成:} 用户使用自然语言对智能驾驶场景进行描述,比如“自车在红绿灯前等待信号”或者“行人横穿街道”,这些自然语言描述会被传递到Scenic语言模块,进而生成对应的场景代码。 - - \item \textbf{Scenic场景转换:} Scenic能够把自然语言描述转化成可执行的场景代码,这些代码涵盖交通参与者的位置、行为、交互以及时间序列等方面内容。 - - \item \textbf{场景加载到CARLA:} 转换之后的Scenic场景代码借助CARLA的API接口加载到仿真环境里,此时CARLA会依据场景代码对相应的道路、交通标志以及行人等元素进行配置并初始化仿真环境。 - - \item \textbf{仿真执行与数据采集:} CARLA开启场景仿真的执行工作,同时借助摄像头、激光雷达等传感器数据反馈仿真结果,这些数据会被用于后续的分析与评估工作。 - - \item \textbf{仿真结果评估:}通过对仿真过程当中的数据进行分析,来评估智能驾驶系统在特定场景之下的表现,并且进一步优化场景生成以及测试的流程。 -\end{enumerate} - -这一联合仿真流程借助无缝集成Scenic语言和CARLA平台,让智能驾驶场景生成变得更高效、准确且多样化,可更好地支持自动驾驶系统的验证与优化工作。 - -\section{本文方法的创新点与理论意义} - -本文提出基于预训练大语言模型和Scenic语言的高保真智能驾驶场景生成系统,其目的是解决传统交通场景构建方法效率瓶颈问题,推动自动驾驶系统智能化和自动化测试进程。本文方法具备如下创新点与理论意义: - -\subsection{创新点} - -\begin{itemize} - \item \textbf{自然语言到场景代码的自动化转换:} 本文第一次把自然语言描述和Scenic场景生成系统结合起来,提出基于大语言模型的自然语言到交通场景转换方法,利用这种方法,用户只需提供简洁的场景描述内容,系统就能自动生成符合交通规则和驾驶逻辑仿真场景代码,大大降低人工干预和时间方面的成本。 - - \item \textbf{基于概率建模的场景多样性生成:} 这篇文章在Scenic语言里引入了概率建模的方法,对不同交通情境所具有的随机性和不确定性进行模拟,让生成出来的交通场景变得更加多样化丰富化,能够全方位评估自动驾驶系统在各种各样不同情况下的实际表现。 - - \item \textbf{CARLA与Scenic的高效集成:} 本文专门设计出CARLA与Scenic的联合仿真流程让两个系统高效协同工作,借助这一集成机制用户可在CARLA平台上快速执行复杂交通场景仿真且收集反馈数据做进一步分析。 - - \item \textbf{智能驾驶系统的量化评估:} 本文提出来一种综合性的评估框架,这个框架能够从语义保真度、准确性与效率等多个维度,对生成出来的智能驾驶场景进行量化评估工作,为自动驾驶系统的性能分析提供更科学客观的评估标准。 -\end{itemize} +\chapter{相关工作} + +\section{预训练语言模型在场景生成系统中的应用机制} + +预训练语言模型也就是 Pretrained Language Models(PLMs),它是基于大规模语料来学习语言分布规律的通用建模方法,其核心要点是通过自监督学习掌握词序列的统计规律,并且在这个基础上实现对下游任务的泛化能力,在生成结构化代码的任务当中,本系统采用 Sentence-T5-large 作为预训练语言模型,通过 Transformer 架构实现对自然语言场景描述的语义向量编码,并基于向量相似度检索最匹配的场景模板,为后续结构化代码生成提供基础语义输入。此过程涉及对语言结构、上下文关系以及目标语言语法规则的综合建模能力。 + +\subsection{基于 Sentence-T5-large 的语义编码机制在本系统中的应用} + +在正式开始之前我先简单介绍下sentence-transformer模型,它核心采用的是序列到序列(Seq2Seq)架构,此架构是由编码器和解码器这两部分所组成,编码器主要负责把输入句子编码成固定长度上下文向量,解码器则是利用该上下文向量去生成目标句子,这种架构最开始是用于机器翻译相关任务,不过很快就被扩展应用到其他文本生成任务当中。 + +为了让模型的性能得到有效提高,注意力机制被引入到Seq2Seq模型当中,注意力机制允许解码器在生成每个输出词时,动态地去关注输入句子里最重要的部分,而并非仅仅依赖一个固定不变的上下文向量,这种机制显著提升了模型对长句子和复杂结构的处理能力,使模型能够更精准地捕捉输入与输出之间的语义关系。 + +本系统在自然语言生成智能驾驶场景时采用 Sentence-T5-large 模型作为语义编码器,其作用是从自然语言输入中提取语义向量并进行高效检索,Sentence-T5 是在 Google T5(Text-to-Text Transfer Transformer)模型基础上微调得到的句子级别语义模型,具备对中文自然语言场景描述进行高质量语义建模的能力。 + +T5 模型从本质上来说是基于 Transformer 架构构建的,它的核心重点在于自注意力机制也就是 Self - Attention,此机制用于捕捉输入序列里任意两个位置之间的依赖关系,在编码过程当中,输入的自然语言描述首先会通过嵌入层也就是 Embedding 转化成向量形式,接着会在多个 Transformer 编码器层中开展上下文建模工作,在每一层里面会通过如下公式来计算注意力权重: + +\begin{equation} + \text{Attention}(Q, K, V) = \text{softmax}\left( \frac{QK^\top}{\sqrt{d_k}} \right)V +\end{equation} + +其中 $Q$、$K$、$V$ 分别代表查询(Query)、键(Key)和值(Value)矩阵,$d_k$ 是缩放因子。该机制能够有效建立输入序列中任意位置之间的关系,从而捕捉复杂语义、空间关系与事件逻辑等特征。 + +在本系统里Sentence - T5 - large模型用于把用户输入中文自然语言场景描述编码成固定长度语义向量,该向量接着和预构建场景语料库中的向量做余弦相似度计算来实现语义级别检索匹配,匹配结果会当作模板驱动模块输入进而生成初步场景结构,后续再经由结构生成模块构造出符合Scenic语法规范的完整脚本,通过这一流程语言模型不仅完成对自然语言理解还建立起从自由描述到结构模板的桥接机制,它是本系统中自然语言到场景构建链路里的关键组件。 + + +\subsection{自然语言生成结构化代码的建模逻辑} + +把自然语言变成结构化代码的这个过程,本质上是把输入的非形式化且语义丰富自然语言映射到有严格语法和执行逻辑的目标代码语言里,这个映射包含着三个核心理论组件: + + +(1)语义建模(Semantic Modeling):语言模型要先理解自然语言背后的意图,也就是用户描述里蕴含的操作对象、属性约束、空间关系和时间先后等语义信息,这部分依靠语言模型对上下文的长距离建模能力以及对词汇的语义表示能力 。 + +(2)语法约束建模(Syntactic Constraint Modeling):目标语言像Scenic这类有着明确的语法规则以及结构限制,语言模型在预训练过程里学习了多种语言模式,还能内隐地掌握特定语言的文法结构来生成合法的结构化代码。 + +(3)结构对齐与表示变换(Structure Alignment):自然语言可以让人自由地进行表达,而结构化代码属于高度约束的形式语言。语言模型借助自回归生成的过程,把自然语言里的结构信息逐步转化成代码片段,达成从开放式表述到约束式语言的对齐映射。 + + +需要注意的是语言模型并非通过硬编码规则做语义转换,而是凭借大规模预训练获得的统计语言知识,在解码阶段依靠概率最大化来实现语言到代码的结构生成,这种方法具备通用性强和适应性高的优势,适合用于多领域的自然语言编程任务。 +另外在结构生成的过程当中,可以引入显式语义约束机制或者模板结构,像代码前缀提示这类,以此进一步提升生成代码的可控性与可解释性。 +\section{自然语言到交通场景的语义建模} + +把自然语言描述转变为可执行的交通仿真场景,关键之处在于对语义信息做结构化建模,交通场景一般有着复杂的空间布局、多主体互动且时序性强等特征,所以要从自然语言里精准提取出参与实体、行为属性、空间关系以及时间逻辑,并且构建能被场景引擎识别和执行的语义表示结构,本节围绕场景语义结构分析与关键元素抽取、时序关系与交通意图建模这两个方面展开论述。 + +\subsubsection{场景语义结构分析与关键元素抽取} + +交通场景里的自然语言通常会包含多个核心组成部分,比如交通参与者(像车辆、行人、自行车等)、空间约束(例如道路类型、位置关系)、行为动作(像是“行驶”“等待”“穿越”这类)以及环境条件(比如天气、时间、信号灯状态),语义结构分析的目标是从原始语句当中建立出如下形式的结构化语义表示。 + +\begin{equation} + \text{Scene} = \{ \text{Agents}, \text{Actions}, \text{Locations}, \text{Relations}, \text{Conditions} \} +\end{equation} + +其中:Agents表示参与主体及其类型(如一辆蓝色轿车、自行车、行人等);Actions表示行为描述,如“驶入交叉口”、“等待信号”、“加速通过”等;Locations表示空间位置或背景信息,如“在红绿灯前”、“十字路口中央”、“左侧车道”;Relations表示主体之间的空间和逻辑关系,如“位于...左侧”、“跟随...行驶”;Conditions表示上下文条件,如“在夜间”、“红灯状态”、“雨天”等。 + + +抽取过程是依靠语言模型对上下文依存关系的建模能力来开展的,同时配合命名实体识别(NER)、依存句法分析(Dependency Parsing)等语言学工具,能够形成初步的语义结构,在本系统当中,语义结构会进一步映射为Scenic或Carla里支持的场景构造要素,以此实现语义向结构化语言的桥接。 + +\subsection{时序关系与交通意图建模} + +交通场景不只是简单的静态配置情况,还涉及高度动态化的行为序列以及意图表达内容,自然语言里经常包含清晰或者隐含的时间逻辑信息,像“接着”“在……之后”“同时”这类时间相关信息,对于还原真实交通过程起到了关键作用影响,时序关系建模的目标是将事件按照逻辑顺序组织成有向图或者序列,每个事件节点包含主体、动作以及发生的具体时间,其具体呈现形式如下: +\begin{equation} + \text{Timeline} = \left[ e_1 \rightarrow e_2 \rightarrow \cdots \rightarrow e_n \right], \quad e_i = (\text{Agent}, \text{Action}, \text{Time}) +\end{equation} + +借助语言模型对事件触发词以及像“当……时”“随后”这类连接词的建模能力,能够自动推理出事件之间的因果和先后关系并形成场景执行逻辑路径,另外交通意图建模所关注的是参与主体行为背后的目标导向性,比如“车辆试图避让行人”这种表述不仅描述了一个行为,还隐含着“行人优先”的交通规则与主车的决策意图,这类意图信息对于像 Carla 的行为树或触发机制这样的场景控制逻辑有着重要价值,可通过对谓词、助动词以及上下文环境进行深度理解来实现建模。 + + +\section{Scenic语言的形式化语义与表达能力} + +Scenic语言是专门面向智能驾驶场景的描述性语言,它主要目标是借助简洁且强大的语法结构,把复杂交通场景转化成可执行的仿真代码,为让语言具备高效表达能力和高度可扩展性,Scenic语言将形式化的语法设计和概率建模结合起来,通过对交通场景进行准确描述,能够生成包含多主体且行为多样化的复杂仿真环境,本节会从Scenic的语法设计与概率建模、Scenic在智能驾驶场景中的优势分析这两个方面展开详细讨论。 + +\subsection{Scenic的语法设计与概率建模} + +Scenic语言语法设计是有效表达交通场景的基础,Scenic核心在于用简单面向对象描述方式,支持对交通参与者及空间位置等灵活建模,其语法结构支持层次化描述能精准构建场景元素,Scenic语法设计遵循以下几个基本原则: + + +面向对象建模:Scenic通过对“对象”进行定义,像车辆、行人这类,同时也对“对象属性”加以明确,比如位置、速度、尺寸这些,以此来构建一个高层次的交通场景。 + +行为定义:系统支持对交通参与者的动作(像“加速”“刹车”这类动作)以及事件(例如“碰撞”这样的事件)进行定义。 + +空间约束与条件:Scenic能够对空间约束进行定义,像“在道路上”这种,还能定义基于条件的约束,例如“当交通信号为红色时”。 + + +Scenic有个关键特性就是支持概率建模,在场景生成时可引入随机性和不确定性,通过引入概率分布,Scenic能够模拟复杂的交通情境,生成多样化且高度不确定的场景,像车辆的初始位置、速度以及行为等,都可以用概率分布进行建模,以此更好贴近真实世界交通流的动态性。 + +\begin{equation} + P(\text{Scene}) = \int_{\Omega} P(\text{Elements} | \text{Conditions}) d\Omega +\end{equation} + +在此公式中,$P(\text{Scene})$ 表示生成场景的概率,$\text{Elements}$ 代表场景中各种元素(如车辆、行人等),而 $\Omega$ 表示所有可能的场景配置空间。通过这种概率建模,Scenic可以在多种不确定性下生成具有高度真实性和多样性的场景。 + + +\section{智能驾驶仿真平台 CARLA 与本系统的集成机制} + +本系统构建的智能驾驶场景生成平台基于 CARLA(Car Learning to Act)作为底层仿真执行环境。CARLA 是一款开源的高保真自动驾驶模拟器,具备复杂交通环境建模、传感器模拟、物理驱动与多主体交互等功能,广泛用于自动驾驶系统的测试验证。系统中生成的结构化场景代码(基于 Scenic 表达)需要与 CARLA 无缝集成,才能完成从自然语言描述到仿真结果输出的完整闭环。 + +本节将重点介绍本系统如何通过 API 调用、仿真调度和代码结构设计,将生成的场景脚本自动加载并执行于 CARLA 平台。 + +\subsection{本系统中的 CARLA 场景接入方式} + +本系统通过 Python 脚本与 CARLA 的客户端接口交互,实现自动化场景加载与仿真调度。具体接入方式包括以下三个方面: + + +(1)Scenic 脚本解析与实体注入:由自然语言生成的 Scenic 脚本将描述交通参与者的位置、动作与环境约束。本系统基于 Scenic 官方提供的解析器 ScenicSimulator,将其转化为 CARLA 所需的地图配置、初始状态及行为逻辑,并通过内部封装的 ScenicRunner 类完成实体创建与行为注入。 + +(2)仿真控制与环境配置:系统调用 CARLA 的 Python API,在指定端口连接仿真服务器并设置同步模式、地图名称、天气参数、时间步长等基础环境,确保生成场景能够稳定加载和运行。仿真控制逻辑封装在 `ScenicRunnerDynamic.py` 模块中,支持多场景批量运行与日志记录。 + +(3)数据采集与评估接口:CARLA 提供的传感器数据流(如 RGB 摄像头、激光雷达)被系统用于场景运行效果展示与性能评估。系统支持自动截图、轨迹输出和行为评分,为后续的性能对比与优化提供基础数据。 + +与通用 CARLA 使用方式不同,本系统实现了从自然语言到仿真执行的端到端流程,只需输入中文场景描述,即可自动完成 Scenic 脚本生成、CARLA 场景加载与仿真结果输出,极大简化了传统场景构建与接入的开发成本。 + + +\subsection{Scenic 与 CARLA 的联合仿真执行流程} + +本系统达成了Scenic和CARLA平台的高度集成,构建出完整自然语言到仿真执行自动化流程,用户先借助图形化界面或者命令行输入中文自然语言描述,比如“自车在路口等待红灯”这类交通场景需求,系统接收输入之后,会调用基于Transformer架构的Sentence - T5模型对输入语句做语义向量编码,还会在预构建的语料库中检索与其语义最接近的场景模板结构,以此快速确定候选场景结构以及参与元素。 + +语义匹配完成之后系统会基于匹配模板构造一份符合Scenic语法规范的场景脚本,此脚本会明确指定交通参与者类型数量初始位置行为动作及时序逻辑形成完整结构化场景表达,接着生成的Scenic脚本会被传入Scenic官方提供的ScenicSimulator并在本系统封装的ScenicRunnerDynamic模块中完成解析与实体化处理,最终将静态场景脚本转化为CARLA中可执行的仿真场景实例。 + +完成脚本加载以后系统会借助CARLA提供的Python API启动仿真环境,接着加载地图、设置天气以及创建交通主体,然后执行场景里所定义的行为,整个仿真过程会按照同步控制模式来运行,并且自动保存仿真运行期间的截图或者视频帧,同时采集轨迹、传感器数据等信息用于后续评估,通过上述模块化的处理流程,本系统达成了从自然语言到语义编码再到结构生成最后到仿真执行的端到端闭环集成,有效提升了智能驾驶场景生成的效率、语义一致性和自动化水平。 + + diff --git a/scene/undergraduate/content/chapter3.tex b/scene/undergraduate/content/chapter3.tex index f80e356..f6bf42c 100644 --- a/scene/undergraduate/content/chapter3.tex +++ b/scene/undergraduate/content/chapter3.tex @@ -1,93 +1,103 @@ -\chapter{总体架构设计} -\section{系统设计目标} -\subsection{高保真性} -本系统把高保真性当作核心目标之一,要求生成交通场景能最大程度忠实反映自然语言描述,为实现这一目标,系统不光要保证场景视觉效果和语义的一致性,还得考虑各种复杂环境要素和交通行为的准确性,就像生成场景里各类交通工具行为需和现实世界交通流动保持一致,交通规则和行为模式也得严格遵循,所以系统要对输入描述进行精确解析,运用先进自然语言处理技术(像大语言模型)来理解场景各种细节并转换为对应三维仿真环境,这些细节不只是物理上的位置和对象,还涵盖交通元素间的动态互动以及环境条件如天气时间光照等因素的考量。 - -\subsection{自动化} -本系统设计的另一个关键目标就是实现自动化,通过达成从自然语言输入到场景生成与仿真运行的自动化流程,系统能够减少人工干预情况,进而提高运行效率并降低人为错误的发生概率,系统要能够凭借少量的用户输入(比如一段简短的自然语言描述)来完成从场景构建直至仿真运行的全过程,自动生成所有必需的配置文件,调度仿真平台开展执行工作,并收集仿真结果用于后续分析处理,自动化并不局限于场景生成这一方面,还涵盖场景的评估以及结果展示等内容,能够在场景生成之后直接对其进行可视化与量化评估,并且输出最终的评估报告,这种全自动的流程会极大地提升仿真研究的工作效率,从而支持大规模的实验以及多样化的场景生成需求。 - -\subsection{可扩展性} -可扩展性在系统设计里是很重要的原则,要保证系统能随需求变化做功能和技术扩展,系统设计应该采用模块化的结构,像自然语言处理、场景生成等每个功能模块都能独立发展和优化,还可与其他模块实现无缝衔接,可扩展性体现在下面这几个方面 -\begin{itemize} - \item 自然语言处理模型要进行升级,伴随自然语言处理技术不断发展,新的语言模型与算法可能会持续出现,系统应具备灵活集成新语言模型的能力,以此提升场景生成的准确性和多样性。 - \item 仿真平台的集成方面目前当前平台采用CARLA作为仿真引擎不过未来可能会考虑集成其他仿真平台或者与不同的驾驶仿真系统进行对接以此来支持更多元的实验需求以及不同平台之间的比较。 - \item 系统评估模块要支持定制化与多维度评估指标,体现评估指标多样性,未来可依据不同场景类型、研究需求或者应用场景添加新评估标准,同时改进现有的评估方法。 -\end{itemize} - -\subsection{核心功能实现} -本系统的核心功能涵盖三个关键方面: -\begin{itemize} - \item 从自然语言描述自动生成三维交通场景这个功能是系统基础,它的目的是通过理解输入的自然语言来自动生成可在仿真环境运行的交通场景,系统会利用自然语言处理模型以及检索增强技术,结合已有的场景模板和元素库实现语义精确的场景建模。 - \item 对生成的场景开展仿真和可视化操作,这个功能主要是保证生成的三维场景能够在仿真平台里正确呈现且顺利运行,系统借助调用仿真平台的API,自动把生成的场景描述转换为可执行的仿真环境,进而开展实时仿真与动态可视化工作,此过程还涵盖对场景中交通元素的行为进行模拟,比如交通流情况、车辆行驶轨迹以及交互状况等。 - \item 对生成结果开展量化评估工作,评估是本系统不可缺少的重要组成部分,它能提供对生成场景质量的定量分析内容。系统会依据语义保真度、场景多样性和驾驶性能等具体指标,开展评估工作并生成对应的报告文档。借助量化评估方式,系统可为场景生成给予反馈信息以便后续优化处理,同时为自动驾驶算法的性能测试提供参考依据。 -\end{itemize} - -\subsection{系统目标的长期愿景} -随着技术不断进步系统要逐步朝着更高保真度、更强可扩展性、更高效自动化方向发展,在未来的版本当中系统可以集成更多感知模型、智能决策系统等相关技术,以此进一步提升场景的复杂性以及真实性,同时系统的评估模块也能够通过引入更多智能分析工具,来提供像行为预测、决策模型评估等更细粒度的结果评估,此外伴随自然语言处理技术的进步系统能够处理更为复杂的语言输入和场景需求,从而满足更广泛的仿真测试场景需求并支撑更丰富的自动驾驶研究与开发。 -\section{系统总体架构} -系统的整体架构就像图3 - 1\ref{fig:system_architecture}所展示的那样,主要是分成了三个核心的模块,分别是自然语言理解与场景生成模块、场景合成与仿真模块以及场景评估与展示模块,数据的流动过程如下 -\begin{enumerate} - \item 用户输入自然语言指令; - \item 系统通过检索增强与大语言模型解析自然语言,生成对应的Scenic场景描述脚本; - \item Scenic脚本由Scenic解析器处理,并通过CARLA仿真平台进行三维场景构建与动态仿真; - \item 仿真完成后系统采集结果数据,包括场景截图与驾驶轨迹; - \item 对生成场景进行量化评估,输出语义保真度、多样性与驾驶性能相关指标。 -\end{enumerate} -\begin{figure}[H] - \centering - \includegraphics[width=0.9\textwidth]{../images/系统架构图.pdf} - \caption{系统架构图} - \label{fig:system_architecture} % 添加合适的label -\end{figure} - -\section{主要模块功能设计} -\subsection{自然语言理解与场景生成模块} -本模块负责接收自然语言输入并生成对应的Scenic场景描述。具体流程如下: -\begin{itemize} - \item \textbf{输入}:自然语言形式的场景描述,例如“一个红色轿车在城市路口等待绿灯”。 - \item \textbf{检索增强}:使用 \texttt{sentence-transformers} 中的 \texttt{sentence-t5-large} 模型对输入进行向量化表示,并在本地检索数据库\\(如 \texttt{retrieve/scenario\_descriptions.txt})中查找相似描述作为参考样本。 - \item \textbf{大语言模型解析}:采用预训练的大语言模型(如 GPT-4o),结合检索到的参考样本,生成符合输入语义的 Scenic 脚本。 - \item \textbf{场景拼接机制}:根据场景复杂度,支持对多个子元素(如车辆、行人、环境条件)进行组织与拼接。 -\end{itemize} - - -\subsection{场景合成与仿真模块} - -本模块负责将自然语言生成的Scenic脚本转化为三维可视化仿真场景,并在CARLA仿真平台上实现动态运行。整个过程包括脚本解析、场景构建、仿真控制、交互支持与数据输出等多个环节,具体如下: - -\begin{itemize} - \item \textbf{Scenic解析}:本系统会先借助Scenic内置的语法与语义分析器来对输入脚本开展解析工作,Scenic作为一种领域专用语言可让用户用简洁且结构化的方式去描述场景元素像车辆、行人、障碍物等的初始状态和约束条件,解析过程能够生成涵盖对象属性如位置、速度、朝向以及交互规则如跟车距离、避让行为还有环境条件如天气、时间的完整场景配置 - - \item \textbf{仿真构建}:完成脚本解析之后系统自动把Scenic生成中间配置映射到CARLA仿真平台里,具体涵盖载入指定地图、部署交通参与者、设定摄像头和LiDAR等传感器参数、配置天气光照路况等环境因素等内容,系统能够依据配置实现对城市道路高速公路十字路口等多种类型场景精准建模 - \item \textbf{接口调用关系}Scenic借助和CARLA集成的Python API来调用底层仿真接口,系统会自动完成Actor的创建以及状态初始化和行为脚本绑定等任务,这极大程度简化了从脚本到仿真的转换流程,研究人员不用手动编程就能通过文本控制仿真流程,显著提升了效率和复用性。 - - \item \textbf{动态交互支持}:系统能够支持高度动态化的场景仿真工作,还可以模拟交通参与者之间的交互行为,像车辆变道、避障、红绿灯响应以及行人横穿马路等情况,Scenic语言提供了条件触发与时间控制相关机制,允许用户描述复杂的行为序列内容,以此实现具有时序性、可演化的场景变化状况,从而增强了仿真的真实感与复杂程度。 - - \item \textbf{多样化仿真配置}:这个模块能够支持进行灵活的仿真参数配置,其中涵盖地图选择像Town01、Town05这类,还有天气设置包含晴天、雨天、雾天等情况,以及交通流量控制和车辆控制模式如自动驾驶、手动控制等内容,这样可以满足不同的测试需求,并且该模块还支持使用不同版本的CARLA和Scenic进行组合,具备较好的兼容性与可拓展性。 - - \item \textbf{数据采集与输出}:在仿真执行的过程当中,系统能够实时采集关键数据,这些数据涵盖传感器输出(像RGB图像、深度图、点云等)、车辆状态(包含位置、速度、加速度)、交互事件(例如碰撞、刹车、偏航)等内容,采集到的数据可用于后续模型训练、行为评估或者性能对比等任务,以此支撑多种不同的研究方向。 - -\end{itemize} - - -\subsection{场景评估与展示模块} - -场景评估与展示模块的目的是对生成的三维仿真场景做可视化呈现和定量分析,此模块方便研究人员直观了解场景生成具体效果,也为后续性能比较、模型调优以及系统验证提供评估依据,该模块包含下面几个关键功能: - -\begin{itemize} - \item \textbf{可视化展示}:在仿真进行的过程当中系统能够自动截取关键帧的截图,或者录制完整的仿真过程视频并保存成图像或视频文件,这些可供研究人员用来做人工审阅、可视化报告展示以及用户研究评估,截图一般会选择交通事件发生点像刹车、避障、碰撞等情况,或者特定的时序节点,以此确保所展示信息具备代表性与丰富性,视频部分可以借助CARLA原生录制功能或者集成第三方渲染引擎来实现,并且支持多角度、多摄像机的可视观察,从而进一步增强场景调试与验证方面的可操作性。 - - \item \textbf{量化评估}:本系统是在自动化生成以及仿真的基础之上,进一步引入多维度的量化评估指标,以此对场景生成的有效性、合理性和多样性进行定量测量,具体涵盖的内容有: - - \begin{itemize} - \item \textbf{语义保真度(Semantic Fidelity)}:这个指标的作用是衡量输入的自然语言描述和最终生成的仿真场景之间语义一致性,可采用人工标注评分和自动化匹配算法相结合的方式来开展,比如通过设定关键语义要素像地点、交通行为、天气条件等的匹配程度,对场景是否准确还原用户意图进行评分,自动方法能够结合自然语言处理与图结构匹配技术实现初步评估进而提升效率。 - - - \item \textbf{多样性指标(Scene Diversity)}:这项指标能反映系统生成场景在多次输入不同自然语言之后的差异性以及覆盖范围,主要涵盖空间多样性像不同地图位置与道路类型等方面、元素多样性比如参与车辆行人非机动车种类情况、行为多样性包含速度控制路线选择交通交互等内容,统计方法有使用Shannon熵、Jaccard相似度或者聚类分布指标等,以此全面反映生成系统的泛化能力和表现范围。 - - \item \textbf{驾驶性能指标(Driving Performance)}:为了评估生成场景对自动驾驶系统测试价值,本模块支持在生成场景里运行预设自动驾驶控制系统,像基于CARLA的自动驾驶Agent并记录其表现,关键评估维度包含碰撞率也就是单位场景中发生碰撞的比例、任务成功率即是否成功完成任务或驶出场景、路径偏离率指与理想路径的偏差程度等,这些数据能够用于评估生成场景的挑战性与安全测试覆盖度,是场景质量评估的重要依据。 - \end{itemize} - - \item \textbf{评估结果展示与导出}:系统能够支持把评估结果用图表和表格等形式来做可视化展示,这样方便研究人员开展对比分析以及生成结果报告,所有截图、评估指标还有分析数据都可以导出成标准格式文件,例如CSV、JSON、PNG等,可用于论文撰写、模型调试或者进一步的数据挖掘。 - -\end{itemize} \ No newline at end of file +\chapter{系统需求分析与总体架构设计} +这章会详细介绍系统功能需求分析和总体架构设计相关内容,一开始要深入分析系统需满足的功能需求,其中涵盖自然语言输入、语义理解等关键方面,这些功能需求为系统设计提供明确方向和目标,接下来会阐述系统的总体架构设计,包含架构目标、设计原则及模块间交互机制等,借助这些内容读者可清晰了解系统整体设计,为后续章节各模块具体设计与实现奠定基础。 +\section{系统功能需求分析} +\subsection{高保真的驾驶测试需求} +在自动驾驶技术快速发展的背景下,自动驾驶系统的测试与验证变得特别重要,传统测试方法通常依靠手动构建场景,这种方式不仅耗费时间精力,而且难以覆盖复杂交通场景,为提高测试效率和覆盖度,本研究提出基于自然语言描述的三维智能驾驶场景生成系统,该系统能自动把用户输入的自然语言场景描述,转化为可执行的仿真场景并在CARLA仿真平台验证。 + +本系统的一个核心优势是可利用生成的智能驾驶场景,为自动驾驶技术提供高效且低成本测试平台,传统人工构建测试场景的方法耗时又费力,还难以覆盖复杂交通场景,导致测试成本高昂且效率极其低下,相比而言本系统借助自然语言输入和自动化场景生成技术,能够快速生成多样化的驾驶场景,明显提高了测试效率,用户仅需通过简单自然语言描述来输入,系统就能自动生成对应的三维智能驾驶场景,并在CARLA仿真平台上进行验证,这种自动化流程极大减少了人工干预,有效降低了测试成本,除此之外系统支持多种语义表达和场景组合,能够生成丰富的测试用例,满足不同阶段自动驾驶技术测试需求,通过这种方式本系统既能加速智能驾驶技术的开发和验证过程,又能为研究人员和工程师提供灵活可扩展的测试工具,推动智能驾驶技术持续发展。 +\subsection{自然语言驱动的场景生成优势与实现} + +自然语言作为人类最直观的表达方式能极大降低自动驾驶测试场景构建门槛,系统运用先进的自然语言处理技术可对用户文本描述进行深入语义理解,能自动解析其中场景元素、交通参与者、环境条件及其动态行为,基于解析结果系统调用预设场景模板与动态生成模块自动构建符合描述的高保真三维驾驶场景,这种基于自然语言的自动生成方式提高了场景设计的灵活性和多样性还支持复杂场景快速搭建,像不同天气、道路结构、交通密度等多样化条件都能满足,同时系统与CARLA平台无缝集成实现场景即时仿真和验证方便测试人员及时调整和优化测试用例,该方法有效缩短测试准备周期提升测试质量有助于覆盖更多复杂和极端驾驶情境,为自动驾驶系统的安全性和鲁棒性提供坚实保障。 + +\section{系统总体架构设计} +系统整体采用模块化分层设计,包括展示层、中间层、数据层,其中本文核心重点在中间层,其主要分为三个核心模块,每个模块分有几个子模块分别负责不同阶段的处理任务,构成完整的自然语言驱动智能驾驶场景生成流程: +\begin{figure}[H] + \centering + \includegraphics[width=1.0\textwidth]{images/系统架构图1.png} + \caption{系统架构} + \label{fig:system-architecture} +\end{figure} +\subsection{自然语言输入模块} +结合需求分析的实际情况,本系统实现了支持用户通过图形化界面或者命令行形式输入文字交通场景描述的功能,提供友好人机交互体验以保证用户能够方便输入各类场景描述,为达成这一目标,系统会运用PyQt5框架来构建图形化用户界面也就是GUI,以此确保界面具有简洁高效以及跨平台兼容性的特点,PyQt5是功能强大的Python GUI框架,能提供丰富控件与灵活布局选项,让开发者可以设计出直观且易于使用的界面。 + +具体来说系统会遵循极简主义设计原则去除不必要复杂元素保证界面清晰直观,用户能够通过简单点击和输入操作完成场景描述输入无需复杂配置或学习,界面会提供清晰提示信息和操作指引来帮助用户快速上手使用,同时系统会优化输入流程减少用户操作步骤比如自动填充常见信息提供快捷输入选项提高输入效率,此外系统还支持用户保存输入的场景描述方便后续使用时快速调用和修改,为进一步提升用户体验系统可考虑引入智能提示功能依据用户输入内容实时推荐可能场景描述选项提高输入准确性和效率,总之系统自然语言场景输入功能以简洁高效为核心确保用户快速准确完成场景描述输入并享受流畅交互体验。 + +本系统在自然语言生成智能驾驶场景时采用 Sentence-T5-large 模型作为语义编码器,目的是从自然语言输入里提取语义向量并实现高效检索,Sentence-T5 是在 Google T5(Text-to-Text Transfer Transformer)模型基础上微调出来的句子级别语义模型,拥有对中文自然语言场景描述进行高质量语义建模的能力,T5 模型本质上是基于 Transformer 架构构建的,其核心部分是自注意力机制(Self-Attention),作用是捕捉输入序列中任意两个位置之间的依赖关系。 + +\subsection{结构生成模块} + +结构生成模块作为本系统连接语义理解和仿真执行的核心环节,其主要任务是把语义检索得到的场景结构模板和自然语言输入内容进行融合,进而自动生成符合Scenic语法规范的结构化场景脚本也就是.scenic文件,该模块不但要对场景中的交通参与者及其属性进行表达,还需要描述它们的行为逻辑、空间约束以及触发机制,以此保证场景具备完整性、可执行性和可控性。 + +在实际进行实现的时候,系统维护着一组参数化 Scenic 模板脚本,模板里面预先设置了车辆、行人、道路、红绿灯等典型交通元素的结构框架与行为函数,要是用户输入“自车前方有行人突然横穿马路并停在车前”这样的内容,系统会匹配到“横穿 - 阻挡”场景模板,还会结合输入语义给其中的参数插槽自动赋值,像横穿速度、横穿位置、停止距离等。 +如下: +\begin{lstlisting} + """ The ego vehicle is driving on a straight road; the adversarial pedestrian suddenly crosses the road from the right front and suddenly stops in front of the ego. + """ + Town = globalParameters.town + EgoSpawnPt = globalParameters.spawnPt + yaw = globalParameters.yaw + egoTrajectory = PolylineRegion(globalParameters.waypoints) + param map = localPath(f'../maps/{Town}.xodr') + param carla_map = Town + model scenic.simulators.carla.model + EGO_MODEL = "vehicle.carlamotors.carlacola" + + behavior AdvBehavior(): + do CrossingBehavior(ego, globalParameters.OPT_ADV_SPEED, globalParameters.OPT_ADV_DISTANCE) until (distance from self to egoTrajectory) < globalParameters.OPT_STOP_DISTANCE + while True: + take SetWalkingSpeedAction(0) + + param OPT_GEO_X_DISTANCE = Range(2, 8) + param OPT_GEO_Y_DISTANCE = Range(15, 50) + param OPT_ADV_SPEED = Range(0, 5) + param OPT_ADV_DISTANCE = Range(0, 15) + param OPT_STOP_DISTANCE = Range(0, 1) + + ego = Car at EgoSpawnPt, + with heading yaw, + with regionContainedIn None, + with blueprint EGO_MODEL + + IntSpawnPt = OrientedPoint following roadDirection from EgoSpawnPt for globalParameters.OPT_GEO_Y_DISTANCE + AdvAgent = Pedestrian right of IntSpawnPt by globalParameters.OPT_GEO_X_DISTANCE, + with heading IntSpawnPt.heading + 90 deg, + with regionContainedIn None, + with behavior AdvBehavior() + + require (distance from AdvAgent to intersection) > 10 +\end{lstlisting} + + + +所示的 Scenic 示例脚本中,系统使用globalParameters模块中的可调参数如 +\texttt{OPT\_ADV\\ \_SPEED}、\texttt{OPT\_GEO\_X\_DISTANCE} 等控制行人的行为过程与生成位置,定义的行为函数 \texttt{AdvBehavior()}则包含了先横穿、再停下的动态行为建模。这些参数既可来自模板设定,也可从自然语言推理中注入,最终组合成具有时间逻辑与交互动态的场景剧本。 + +结构生成模块能够支持在Scenic脚本里添加像位于路口、靠右侧车道这类空间约束以及如距离自车低于一定值停止这种行为触发条件等语义规则,同时系统也支持为多个角色赋予不同行为序列以形成多主体互动的复杂场景。 + +最终生成的 Scenic 脚本将自动保存至 \texttt{scenario/scenario\_data/scenic\_d\\ata/} 目录下,供后续仿真调度模块调用执行,实现从自然语言到可执行场景的结构化表达闭环。 + +\subsection{carla仿真模块} + +仿真调度模块作为本系统关键组件可实现自动驾驶场景可视化与执行验证,其主要负责把生成的 Scenic 脚本加载到 CARLA 仿真环境里,同时开展仿真初始化、执行控制、传感器采集以及过程管理等工作。该模块在本系统中由封装的 \texttt{ScenicRunnerDynamic} 类实现,调用 Scenic 官方提供的 \texttt{ScenicSimulator} 对生成脚本进行解析,并将其转化为可在 CARLA 中执行的场景实体。 + +在具体流程方面模块会先读取前一阶段生成的.scenic 脚本,接着通过 Scenic 编译器解析脚本里定义的交通参与者、位置、行为及约束条件,随后系统基于 Carla Python API 建立起仿真连接,配置运行地图、天气参数、物理步长(\texttt{fixed\_delta\_seconds})与同步模式等环境变量。系统默认会采用Carla的同步模式来实施控制,以此保证场景里各参与体的状态更新和传感器采集过程保持一致,进而提升整个仿真过程的稳定性。 + +在仿真执行过程里系统会自动创建交通参与体像车辆行人等并对其行为轨迹进行初始化,要是Scenic脚本当中定义了行为函数例如行人横穿并在自车前停止等情况,系统就会凭借行为调度逻辑驱动对应实体去执行脚本里预定义的动作,在仿真过程期间模块还会负责记录关键执行信息包含仿真时间对象轨迹碰撞信息交通信号状态等内容,与此同时系统具备截图与视频保存功能能够自动截取仿真中间帧或者生成仿真动画用来进行结果展示与评估。 + +这个模块的运行过程给系统的“代码,仿真”环节提供了自动化调度能力,并且结合CARLA高保真的渲染与物理驱动能力,为自然语言驱动的场景生成系统提供了可视化反馈与执行验证平台,成为构成系统闭环当中的关键一环。 + +\subsection{结果评估分析模块} + +结果展示模块是系统里用于输出仿真执行结果的重要部分,它能可视化运行过程还可辅助后续评估分析,此模块负责接收来自仿真调度模块的运行数据与视觉信息,并且会以图像视频和行为指标等多种形式呈现生成场景实际效果。 + +在具体实现的时候系统会在仿真执行进程中调用CARLA所提供的图像传感器接口,自动把关键帧截取下来并保存成静态图片的形式,也能够按照用户的设置把整个仿真过程录制成为视频文件,用来供展示和回放方面使用。与此同时系统支持记录自车以及关键参与体的轨迹坐标相关信息,形成时间序列这种形式的运动轨迹数据,可用于后续的路径可视化或者行车行为评估工作。 + +run\_eval.py脚本在评估执行方面起着关键作用,是实现场景质量验证和仿真效果分析的重要部分。这个模块以命令行的形式把代理配置文件和场景配置文件作为输入,可自动加载对应的强化学习模型权重,还能调用Scenic与CARLA环境完成整个仿真执行流程。在仿真的过程中,系统会详细记录自车行为和环境交互的数据,涵盖轨迹、速度、加速度以及转向变化等方面的信息,同时会监控碰撞、闯红灯、偏离路线等关键事件。 + +评估模块集成了一套多维度的指标体系,能够自动计算包含碰撞率、交通违规频率、路线完成度、行为稳定性、舒适性指标和安全性评分的综合性能评估结果。所有的评估数据会统一输出成为日志文件,并且支持以图像或者视频形式记录结果,方便开发者进行回放和可视化分析。系统还内置了自动路径管理机制,确保每轮评估过程的日志和图像结果能够有序存储,有利于进行实验对比和复现。 + +借助该评估模块,系统能够从自然语言场景生成开始,完整实现仿真、记录、评估的一体化闭环流程,显著提升对生成场景合理性和策略效果的量化验证能力。 + + + + diff --git a/scene/undergraduate/content/chapter4.tex b/scene/undergraduate/content/chapter4.tex index ea60e61..e1def3f 100644 --- a/scene/undergraduate/content/chapter4.tex +++ b/scene/undergraduate/content/chapter4.tex @@ -1,118 +1,221 @@ -% 第四章 生成场景的质量验证 -\chapter{生成场景的质量验证} -\section{实验设置} -\textbf{(1)测试数据集构成} \par -测试数据集是为了综合体现自动驾驶场景多样复杂特点,涵盖像直行障碍、转弯障碍等多种典型场景类别,例如直行障碍、转弯障碍、变道、超车、闯红灯、无保护左转、右转以及交叉路口协商等,这些场景类别覆盖自动驾驶车辆实际道路环境可能遇到的关键交互情况,具备较高代表性和实用价值。数据集中场景描述以自然语言形式进行呈现,并且包含一定比例模糊性描述,以此模拟真实世界里驾驶员或其他交通参与者行为不可预测性,场景描述模糊性设计有助于测试生成系统应对不精确指令时的处理能力,确保系统能够适应并生成符合要求的复杂交通场景。\\ -\indent\textbf{(2)对比基线选择依据} \par -在评估生成场景的质量的时候本研究选用两种有代表性方法作基线对比,基于规则的方法也就是Rule - based这种方法通过定义明确逻辑和规则来生成场景具有较好可解释性适合处理结构化和预定义任务,不过在面对复杂和模糊的自然语言描述时其灵活性和适应性比较差。 -基于GPT - 4.0的方法是借助大型语言模型生成能力,以此生成丰富多样的场景,该方法在场景生成多样性方面具备优势,不过在生成场景的物理合规性和逻辑一致性上存在不足,特别是在处理复杂交通情境的时候。 -选择这两种基线的主要目的是从不同角度评估本研究方法在生成场景质量、效率以及针对复杂和模糊指令的鲁棒性方面所具备的优势。\\ -\indent\textbf{(3)硬件平台与评估指标} \par -硬件平台:本实验使用联想Y900P高性能笔记本电脑。该平台配置了多核的 Intel Core i9 处理器可以高效处理复杂的计算任务,以此确保场景生成实时性与响应速度,此外配备的专业级显卡,能为图形处理和并行计算任务提供强大支持,特别是在大规模场景生成过程中,系统还配备大容量内存和高速固态硬盘(SSD),保证数据处理和存储工作高效且稳定。 - -评估指标方面,为全面评估生成场景的质量本研究采用以下几个关键指标,场景生成时间指标,它衡量生成一个场景所需的时间能反映系统的效率,较短生成时间有助于提高测试灵活性和响应速度,场景物理合规性方面,评估生成场景是否符合物理约束条件如车辆最大加速度和最小转弯半径等,物理合规性能确保场景真实性使生成场景能反映自动驾驶系统实际驾驶条件。 - - -检查场景中各元素之间逻辑关系是否合理确保生成场景符合法定交通规则这是场景逻辑一致性的要求逻辑一致性是验证场景真实性和可接受性的核心标准,统计生成场景的类型和数量以此衡量系统的多样性和生成能力多样性高的系统可为自动驾驶系统提供更广泛测试场景进而有效覆盖更多潜在驾驶情况这是场景多样性的体现,在仿真环境中运行生成的场景并统计发生碰撞的频率碰撞率反映生成场景的安全性较低碰撞率意味着生成场景能较好模拟真实世界的安全驾驶环境。 - - - - -\section{生成效果展示(示例)} - -\subsection{场景一:摩托车和汽车在红绿灯前等待信号} -\indent 一辆摩托车和一辆汽车在红绿灯前等待信号。\\ - -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/1.pdf"} - \caption{摩托车与汽车在红绿灯前等待信号的场景截图} - \label{fig:redlight_motorbike_car} -\end{figure} - -\subsection{场景二:自我车辆在夜晚穿越道路} -\indent 在夜晚,一些自我车辆正在穿越道路,街道上的路灯微弱地照亮着周围环境,远处偶尔可以看到其他车辆的车灯闪烁。\\ - -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/2.pdf"} - \caption{自我车辆在夜晚穿越道路的场景截图} - \label{fig:night_self_driving_cross} -\end{figure} - -\subsection{场景三:自我车辆在夜晚红绿灯前等待信号} -\indent 在夜晚,一些自我车辆在红绿灯前等待信号,而在另一方向,自我车辆正在通行,车灯的光芒穿过昏暗的街道。\\ - -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/4.pdf"} - \caption{自我车辆在夜晚红绿灯前等待信号的场景截图} - \label{fig:night_redlight_cross} -\end{figure} - -\subsection{场景四:行人横穿直行道路} -\indent 自我车辆在笔直的道路上行驶时,一名行人突然从右前方横穿过来,并在自我车辆接近时突然停下。\\ - -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/5.pdf"} - \caption{行人横穿直行道路的场景截图} - \label{fig:pedestrian_crossing} -\end{figure} -\subsection {更多} -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/场景5.pdf"} - \caption{场景截图} - \label{} -\end{figure} -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/场景6.pdf"} - \caption{场景截图} - \label{} -\end{figure} -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/场景7.pdf"} - \caption{场景截图} - \label{} -\end{figure} -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/场景8.pdf"} - \caption{场景截图} - \label{} -\end{figure} -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/场景9.pdf"} - \caption{场景截图} - \label{} -\end{figure} -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/场景10.pdf"} - \caption{场景截图} - \label{} -\end{figure} -\section{实验总结} - -这一章主要描述的是基于自然语言生成三维交通场景的核心流程,也就是“语言描述 → 场景代码生成 → 仿真构建”,这个流程展示了借助自然语言输入、自动脚本生成以及仿真执行的技术路径,来实现复杂三维交通场景高效构建的方式。 - -\begin{itemize} - \item \textbf{自然语言解析}\texttt{scenario\_descriptions.txt}文件获取自然语言描述,每条描述都代表着一个特定的交通场景,涵盖交通参与者类型数量初始位置及行为意图等信息,用户通过直观的语言输入来定义所需的场景特征,系统借助\texttt{retrieve.py}脚本对输入的自然语言做语义解析,解析目标是从文本当中识别出场景的关键元素,例如车辆的种类行驶方向速度甚至动态行为,像超车停车避让等情况,该步骤主要依靠自然语言处理(NLP)技术,通过文本特征提取与词汇映射把模糊语言信息转为有结构的场景要素。 - - \item \textbf{生成场景代码},系统就会按照预设规则与模板生成符合Scenic语法规范的场景脚本,Scenic是专门针对三维仿真场景描述的一种语言,其具有灵活且适用于动态场景建模的特点,系统依据输入描述所生成的代码涵盖场景中参与者的初始化设置,像车辆的位置、速度、运动轨迹等内容,还有可能存在的动态行为,例如交通参与者的交互、变道、超车等情况,生成的Scenic脚本具备可执行性,并且能够作为输入文件传递给Scenic编译器,此阶段自动化程度较高,在大部分场景下都能自动生成相应的场景代码,进而减少了人工干预的需求。 - - \item \textbf{仿真场景构建与执行},生成的Scenic场景脚本会被传至仿真平台,主要就是CARLA,通过Scenic - CARLA接口来执行,CARLA是个开源的自动驾驶仿真平台,它能够依据场景脚本里的设置构建出真实感强且动态可控的三维仿真场景,在此过程当中,系统会按照Scenic脚本里的配置去加载地图、部署交通参与者像汽车行人等、设置场景初始状态比如天气时间环境条件等,仿真平台还会根据脚本里的动态行为设定实时执行参与者的运动轨迹与交互,举个例子,当脚本指定一辆车在道路上缓慢行驶并让行时,CARLA仿真平台会根据脚本设置准确模拟该行为,保证生成的仿真场景在空间和行为上都符合预期。 - - \item \textbf{系统流程特性},“语言描述 → 场景代码生成 → 仿真构建”\ref{fig:flowchart}整个流程体现系统自动化处理能力,特别是自然语言到仿真场景代码生成的桥接,借助 \texttt{retrieve.py} 脚本,用户能通过文本输入快速生成三维交通场景,减少手动构建仿真场景的工作量,并且该流程支持生成复杂场景和动态交互行为,可精准还原交通系统中追尾、避让、变道等各种交互情境,为自动驾驶系统测试与评估提供有效支持。 - -\end{itemize} -\begin{figure}[H] - \centering - \includegraphics[width=1.0\textwidth]{"images/流程图1.pdf"} - \caption{从自然语言描述到仿真场景构建的流程图} - \label{fig:flowchart} -\end{figure} \ No newline at end of file +\chapter{系统设计与实现} +\section{开发环境} +\subsection{硬件环境} +这个实验是靠性能比较强的本地计算机来完成的,它主要的硬件配置情况如下所示,处理器选用的是Intel Core i9这款产品,它具备多核心以及高主频的特性,能够支持复杂计算任务和高并发程序运行,显卡采用的是NVIDIA GeForce RTX 3060这一型号,具备较强的图形渲染与并行计算方面能力,有利于运行自动驾驶模拟平台比如CARLA 0.9.13和进行深度学习模型推理,内存大小达到了32GB这样的容量,大容量内存保证了在多线程和大数据处理时系统流畅性,能有效避免出现内存瓶颈方面的相关问题,这样的硬件配置为自然语言场景生成、自动驾驶仿真以及模型评估等任务提供稳定且高效运行环境。 +\subsection{软件环境} +系统开发和运行所基于的操作系统是 Windows 11,其为微软最新发布出来的操作系统,能提供良好的用户体验以及强大的系统性能,并且和各类开发工具与依赖库具备广泛兼容性,它支持多种编程语言以及开发框架,可满足项目开发过程里的各种需求。 + +项目主要是将 Python 3.8 作为开发语言来运用,Python 属于一种被广泛使用的高级编程语言,它凭借简洁的语法以及强大的库支持而闻名于世,在自然语言处理、机器学习和自动驾驶仿真等诸多领域均有广泛应用,Python 3.8 能够提供稳定的语言特性和相关优化,可满足项目开发过程中的各类实际需求。 + +软件环境需要的依赖库方面已经安装好,具体如下表所示: +\begin{table}[H] + \centering + \begin{tabular}{lll} + \hline + \small % 设置表格字体大小为小号 + \textbf{库名称} & \textbf{版本} \\ + \hline + openai & 最新版本 \\ + sentence\_transformers & 最新版本 \\ + torch & 1.13.1+cu117 \\ + torchvision & 0.14.1+cu117 \\ + torchaudio & 0.13.1 \\ + gym & 0.23.1 \\ + numpy & 1.21.6 \\ + pygame & 2.3.0 \\ + tqdm & 4.65.0 \\ + pyyaml & 6.0 \\ + matplotlib & 3.5.3 \\ + opencv-python & 4.7.0.72 \\ + pandas & 1.5.3 \\ + seaborn & 0.12.2 \\ + shapely & 1.8.5 \\ + ephem & 4.1.4 \\ + joblib & 1.2.0 \\ + cpprb & 10.7.0 \\ + pycocotools & 2.0.6 \\ + moviepy & 1.0.3 \\ + scikit-image & 0.19.3 \\ + transformers & 最新版本 \\ + setGPU & 最新版本 \\ + \hline + \end{tabular} + \caption{项目依赖库及其版本} + \label{tab:dependencies} +\end{table} + + +\section{系统核心功能实现} +\subsection{自然语言理解功能} +在自然语言输入这方面首先要了解到的就是测试数据,其是为了综合体现自动驾驶场景多样复杂特点,涵盖像直行障碍、转弯障碍等多种典型场景类别,例如直行障碍、转弯障碍、变道、超车、闯红灯、无保护左转、右转以及交叉路口协商等,这些场景类别覆盖自动驾驶车辆实际道路环境可能遇到的关键交互情况,具备较高代表性和实用价值。数据集中场景描述以自然语言形式进行呈现,并且包含一定比例模糊性描述,以此模拟真实世界里驾驶员或其他交通参与者行为不可预测性,场景描述模糊性设计有助于测试生成系统应对不精确指令时的处理能力,确保系统能够适应并生成符合要求的复杂交通场景。 +\begin{figure}[H] + \centering + \includegraphics[width=0.7\textwidth]{"images/流程图1.pdf"} + \caption{从自然语言描述到仿真场景构建的流程图} + \label{fig:flowchart} +\end{figure} + +本模块负责接收自然语言输入并生成对应的Scenic场景描述。具体流程如下: + +输入:自然语言形式的场景描述,例如“The ego vehicle is driving on a straight road; the adversarial pedestrian suddenly appears from behind a parked car on the right front and suddenly stop.”。 +检索增强:使用 \texttt{sentence-transformers} 中的 \texttt{sentence-t5-large} 模型对输入进行向量化表示,并在本地检索数据库(如 \texttt{retrieve/scenario\_descrip\\tions.txt})中查找相似描述作为参考样本。 +大语言模型解析:采用预训练的大语言模型(如 GPT-4o),结合检索到的参考样本,生成符合输入语义的 Scenic 脚本。 +场景拼接机制:根据场景复杂度,支持对多个子元素(如车辆、行人、环境条件)进行组织与拼接。 + + + +\subsection{场景合成与仿真模块} + +本模块承担着把自然语言生成的Scenic脚本转化成三维可视化仿真场景的任务,并且要在CARLA仿真平台上达成动态运行,整个流程涵盖脚本解析、场景构建、仿真控制、交互支持以及数据输出等多个环节,具体情况如下: + +Scenic解析:本系统会先借助Scenic内置的语法与语义分析器来对输入脚本开展解析工作,Scenic作为一种领域专用语言可让用户用简洁且结构化的方式去描述场景元素像车辆、行人、障碍物等的初始状态和约束条件,解析过程能够生成涵盖对象属性如位置、速度、朝向以及交互规则如跟车距离、避让行为还有环境条件如天气、时间的完整场景配置 + +仿真构建:完成脚本解析之后系统自动把Scenic生成中间配置映射到CARLA仿真平台里,具体涵盖载入指定地图、部署交通参与者、设定摄像头和LiDAR等传感器参数、配置天气光照路况等环境因素等内容,系统能够依据配置实现对城市道路高速公路十字路口等多种类型场景精准建模 +接口调用关系:Scenic借助和CARLA集成的Python API来调用底层仿真接口,系统会自动完成Actor的创建以及状态初始化和行为脚本绑定等任务,这极大程度简化了从脚本到仿真的转换流程,研究人员不用手动编程就能通过文本控制仿真流程,显著提升了效率和复用性。 + +动态交互支持:系统能够支持高度动态化的场景仿真工作,还可以模拟交通参与者之间的交互行为,像车辆变道、避障、红绿灯响应以及行人横穿马路等情况,Scenic语言提供了条件触发与时间控制相关机制,允许用户描述复杂的行为序列内容,以此实现具有时序性、可演化的场景变化状况,从而增强了仿真的真实感与复杂程度。 + +多样化仿真配置模块能灵活进行仿真参数配置,涵盖地图选择像Town01、Town05等类型,包含天气设置有晴天、雨天、雾天等情况,还有交通流量控制以及车辆控制模式如自动驾驶、手动控制等内容,可满足不同测试需求,且该模块支持不同版本CARLA和Scenic组合使用,具备较好兼容性与可拓展性。 + + +输入数据:本实验采用约20条自然语言描述作为输入样本,用于生成自动驾驶场景。这些描述覆盖多种交通情境和突发事件,例如: + +(1)自车在红绿灯前等待信号 + +(2)行人突然横穿街道 + +(3)The ego vehicle is driving on a straight road; the adversarial pedestrian appears from a driveway on the left and suddenly stop and walk diagonally. + +(4)The ego vehicle is driving on a straight road when a pedestrian suddenly crosses from the right front and suddenly stops as the ego vehicle approaches. + +下面我用一个具体的例子展示我是如何实现carla场景生成的, +\textbf{场景描述:} 自车在直路上行驶时,一名行人突然从右前方穿出 + +\indent (自然语言输入)The ego vehicle is driving on a straight road when a pedestrian suddenly crosses from the right front and suddenly stops as the ego vehicle approaches.\\ +\begin{lstlisting}[language=Python, caption={场景关键代码示例}, label={lst:scenic_key}, numbers=left, xleftmargin=2em] + behavior AdvBehavior(): + do CrossingBehavior(ego, globalParameters.OPT_ADV_SPEED, globalParameters.OPT_ADV_DISTANCE) + until (distance from self to egoTrajectory) < globalParameters.OPT_STOP_DISTANCE + while True: + take SetWalkingSpeedAction(0) + + ego = Car at EgoSpawnPt, + with heading yaw, + with regionContainedIn None, + with blueprint EGO_MODEL + + IntSpawnPt = OrientedPoint following roadDirection from EgoSpawnPt + for globalParameters.OPT_GEO_Y_DISTANCE + AdvAgent = Pedestrian right of IntSpawnPt by globalParameters.OPT_GEO_X_DISTANCE, + with heading IntSpawnPt.heading + 90 deg, + with regionContainedIn None, + with behavior AdvBehavior() + + require (distance from AdvAgent to intersection) > 10 +\end{lstlisting} +\begin{figure}[H] + \centering + \includegraphics[width=0.8\textwidth]{"images/场景5.pdf"} + \caption{场景截图} + \label{} +\end{figure} +调用生成的scenic代码,实现仿真模拟脚本,以及场景保存。 +\subsection{场景评估与展示模块} + +场景评估与展示模块的目的是对生成的三维仿真场景做可视化呈现和定量分析,此模块方便研究人员直观了解场景生成具体效果,也为后续性能比较、模型调优以及系统验证提供评估依据,该模块包含下面几个关键功能: + + +可视化展示:在仿真进行的过程当中系统能够自动截取关键帧的截图,或者录制完整的仿真过程视频并保存成图像或视频文件,截图一般会选择交通事件发生点像刹车、避障、碰撞等情况,或者特定的时序节点,以此确保所展示信息具备代表性与丰富性,视频部分可以借助CARLA原生录制功能或者集成第三方渲染引擎来实现,并且支持多角度、多摄像机的可视观察,从而进一步增强场景调试与验证方面的可操作性。 + +评价指标主要涵盖安全性、驾驶性能、场景语义一致性和系统鲁棒性等多个方面,安全性指标包含碰撞次数、闯红灯次数、交通规则违章等内容,用来衡量系统的安全保障能力,驾驶性能指标诸如轨迹偏差、车道保持率和速度控制平稳性,反映车辆行驶的准确性和舒适度,场景语义一致性指标评估生成场景与自然语言描述的匹配度及多样性,系统鲁棒性指标关注系统在异常情况下的恢复能力及对复杂环境的适应性,综合这些指标能够全面量化自动驾驶系统在不同测试场景中的表现并指导系统优化与改进。 + +量化评估:本系统是在自动化生成以及仿真的基础之上,进一步引入多维度的量化评估指标,以此对场景生成的有效性、合理性和多样性进行定量测量,具体涵盖的内容有: + +(1)语义保真度(Semantic Fidelity):这个指标的作用是衡量输入的自然语言描述和最终生成的仿真场景之间语义一致性,可采用人工标注评分和自动化匹配算法相结合的方式来开展,比如通过设定关键语义要素像地点、交通行为、天气条件等的匹配程度,对场景是否准确还原用户意图进行评分,自动方法能够结合自然语言处理与图结构匹配技术实现初步评估进而提升效率。 + + +(2)多样性指标(Scene Diversity):这项指标能反映系统生成场景在多次输入不同自然语言之后的差异性以及覆盖范围,主要涵盖空间多样性像不同地图位置与道路类型等方面、元素多样性比如参与车辆行人非机动车种类情况、行为多样性包含速度控制路线选择交通交互等内容,统计方法有使用Shannon熵、Jaccard相似度或者聚类分布指标等,以此全面反映生成系统的泛化能力和表现范围。 + +(3)驾驶性能指标(Driving Performance):为了评估生成场景对自动驾驶系统测试价值,本模块支持在生成场景里运行预设自动驾驶控制系统,像基于CARLA的自动驾驶Agent并记录其表现,关键评估维度包含碰撞率也就是单位场景中发生碰撞的比例、任务成功率即是否成功完成任务或驶出场景、路径偏离率指与理想路径的偏差程度等,这些数据能够用于评估生成场景的挑战性与安全测试覆盖度,是场景质量评估的重要依据。 + +评估结果展示与导出:系统将展示代码运行出的评估结果用列出的形式来做可视化展示,所有截图、评估指标还有分析数据都可以导出成标准格式文件,例如CSV、JSON、PNG等,可用于论文撰写、模型调试或者进一步的数据挖掘。 + +\begin{table}[H] + \centering + \caption{系统评估结果} + \label{tab:evaluation_results} + \begin{tabular}{lc} + \toprule + 指标名称 & 数值 \\ + \midrule + 碰撞率 (collision\_rate) & 0.0 \\ + 红灯违规频率 (avg\_red\_light\_freq) & 0.0 \\ + 停车标志违规频率 (avg\_stop\_sign\_freq) & 0.0 \\ + 出路面长度 (out\_of\_road\_length) & 0.0 \\ + 路线跟踪稳定性 (route\_following\_stability) & 0.806 \\ + 路线完成度 (route\_completion) & 0.93 \\ + 平均时间消耗 (avg\_time\_spent) & 4.5 \\ + 平均加速度 (avg\_acceleration) & 0.32 \\ + 平均偏航角速度 (avg\_yaw\_velocity) & 0.0 \\ + 车道入侵频率 (avg\_lane\_invasion\_freq) & 0.0 \\ + 安全操作得分 (safety\_os) & 1.0 \\ + 任务完成得分 (task\_os) & 0.802 \\ + 舒适度得分 (comfort\_os) & 1.0 \\ + 最终综合得分 (final\_score) & 0.941 \\ + \bottomrule + \end{tabular} +\end{table} + +在这个示例评估里系统展现出较高安全性,碰撞率和交通违规频率两个数据均为零,这表明系统在基础安全保障方面表现相当不错,路线跟踪稳定性达到大约0.81这个数值,显示系统具备较好的路径跟踪能力,路线完成度或许意味着按预定路线行驶情况良好,安全操作和舒适度的得分都拿到了满分,说明车辆运行状态平稳且符合安全标准,最终综合得分是0.94这个成绩,整体表现算得上优秀但仍有提升空间,尤其是在任务完成度这一方面。 + + + + +\section{系统编码与实现} + +\subsection{系统整体架构与主程序设计} + +本系统基于 Python 语言开发,结合 Carla 0.9.13 与 SafeBench 框架,整体架构模块化且层次清晰。系统以两个主控脚本 \texttt{run\_train.py} 和 \texttt{run\_train\_dynamic.py} 作为入口,分别负责仿真评估与动态场景训练。参数统一通过 \texttt{argparse} 管理,涵盖实验配置、设备选取、模型路径、输出目录等,保障了实验的灵活性和复现性。 + +在整体的运行流程当中,系统会先依据传入的配置文件去加载代理(Agent)和场景参数,之后按照策略类型自动选择对应的运行器(Runner)并启动仿真过程,同时在设计里充分考虑了配置文件路径的动态拼接以及输出目录的自动创建,以此确保文件管理的规范与安全。 + +\begin{verbatim} + # 伪代码:主程序执行流程 + parse_args() + for each agent_cfg in agent_cfg_list: + for each scenario_cfg in scenario_cfg_list: + set_device_and_seed() + agent_config = load_config(agent_cfg) + scenario_config = load_config(scenario_cfg) + setup_output_dirs() + if scenario_config.policy_type == 'scenic': + runner = ScenicRunner(agent_config, scenario_config) + else: + runner = CarlaRunner(agent_config, scenario_config) + runner.run() +\end{verbatim} + +\subsection{主控脚本功能与运行流程} + +\texttt{run\_train.py} 支持三种主要模式:代理训练(\texttt{train\_agent})、场景训练(\texttt{train\_scenario})和评估(\texttt{eval}),并依据配置自动调用 \texttt{CarlaRunner} 或基于 Scenic 场景语言的 \texttt{ScenicRunner}。该设计方便用户针对不同实验需求进行灵活切换。 + +而 \texttt{run\_train\_dynamic.py}则专注于依据自然语言描述开展动态场景训练,默认加载动态场景的配置文件,实现自然语言到Scenic代码的实时转换,自动创建和训练相关的模型保存路径,以此确保训练过程的中断恢复与结果管理。 +两者均利用多线程控制计算资源,支持 GPU 设备切换,并可选渲染和视频保存,为仿真结果的展示和后期分析提供便利。 + +\subsection{动态场景仿真控制与异常处理} + +动态场景仿真是系统的关键模块,基于 \texttt{ScenicRunner} 的扩展实现。系统会接收自然语言所做的描述,然后经过预处理与解析的步骤,将其转换成 Scenic 语言脚本内容,接着由运行器对脚本进行加载并执行,最终自动生成符合语义要求的三维交通场景。 + +在仿真流程里系统会对每个场景实例做初始化,载入车辆、传感器以及任务配置等内容,并且严格把控仿真时长和步长,为保障系统具备健壮性引入了异常捕获机制,可捕获并打印详细异常堆栈信息,还能保证后续实验连续执行 。 + +\begin{verbatim} + # 伪代码:动态场景仿真异常处理 + try: + runner.run(test_epoch) + except Exception as e: + runner.close() + log_error(traceback.format_exc()) + continue_with_next_experiment() +\end{verbatim} + +本系统借助合理设计出来的主程序结构、配置管理以及动态场景运行机制,达成了从自然语言描述到三维智能驾驶仿真的高效转换,为智能驾驶仿真研究和场景生成提供强有力的技术支撑。 diff --git a/scene/undergraduate/content/chapter5.tex b/scene/undergraduate/content/chapter5.tex index ebb318c..4adb056 100644 --- a/scene/undergraduate/content/chapter5.tex +++ b/scene/undergraduate/content/chapter5.tex @@ -1,166 +1,288 @@ -% 第五章 -\chapter{场景生成的量化评估} +\chapter{系统案例测试分析} -\section{评估指标设计} -为全面、客观地衡量本系统在从自然语言生成高保真三维交通场景过程中的表现,本文从语义保真度、场景多样性与系统效率三个核心维度构建了一套评估体系,具体指标设计如下: +这一节主要是要展示系统在自然语言驱动交通场景生成任务里的实际运行效果,接下来我会对案例的分析测试进行拓展,从纵向和横向这两个不同方面去分析生成的效果,通过选取多个有代表性的输入示例,这些示例分别涵盖不同类型的交通语义指令,像静态车道场景、红绿灯交叉口、雨天行车以及复杂车辆交汇等情况,以此全面体现系统在语义理解、场景构建、三维仿真和评估反馈等方面的功能表现。 -\begin{itemize} - \item \textbf{语义保真度(Semantic Fidelity)}:语义保真度旨在评估生成场景是否能够准确还原输入自然语言中的核心语义信息,确保系统生成结果在语义层面具备一致性与完整性。评估内容涵盖: - \begin{itemize} - \item 参与主体的一致性:如描述中提及的车辆类型(红色轿车、卡车)、行人、障碍物是否出现在仿真场景中; - \item 空间位置关系:如“在路口等待”、“位于右侧车道”、“靠近斑马线”等描述是否体现在实体布局中; - \item 行为逻辑一致性:如“等待绿灯”、“直行通过”、“与前车保持车距”等行为是否在仿真中得以体现。 - \end{itemize} - 评估方式采用检索式语义匹配评分(自动化)+人工评审打分(主观验证)的双重手段: - \begin{itemize} - \item 自动化方面使用自然语言处理模型计算输入描述与生成场景之间的语义相似度; - \item 主观方面由3名评估者根据统一评分标准对每条样本进行1-5分打分,取平均作为最终得分。 - \end{itemize} - - \item \textbf{场景多样性(Scene Diversity)}:多样性评估用于衡量系统在面对不同自然语言输入时所生成场景之间的差异性,防止生成内容趋于模板化或重复模式。主要从以下几个角度度量: - \begin{itemize} - \item 结构多样性(Structure Diversity Score, SDS):通过提取场景中的车辆、行人、建筑等静态元素的布局特征,计算不同场景之间的结构差异程度; - \item 行为多样性(Behavioral Diversity Score, BDS):通过仿真轨迹分析车辆在不同行为状态(加速、刹车、等待、避让等)上的变化情况,评估其动态多样性; - \item 地图覆盖率:统计不同输入生成场景在CARLA地图中的分布,评估是否存在特定区域集中度过高的问题。 - \end{itemize} - 采用定量指标(如结构差异率、行为状态熵等)进行自动化评估,并结合统计图表进行可视化展示。 - - \item \textbf{系统效率与响应能力(Efficiency)}:系统效率是衡量该平台在真实应用场景下可行性的重要指标,重点考察系统从接收自然语言指令到输出完整三维场景所需的总时间开销,包括: - \begin{itemize} - \item 检索耗时:Sentence-T5 向量化及相似描述查找所用时间; - \item 生成耗时:大语言模型生成 Scenic 脚本所耗时间; - \item 仿真加载与渲染时间:Scenic 编译后至 CARLA 仿真运行启动所经历的延迟; - \item 总响应时间:综合上述所有子流程,从输入自然语言到仿真画面出现的端到端时间。 - \end{itemize} -通过日志记录还有脚本打点的方式来采集各个阶段的耗时,并且用平均响应时长(ms)、方差这类指标对性能表现进行量化,系统在多轮连续输入情况下的响应稳定性也被纳入评估范围。 -\end{itemize} +每一个示例均从用户界面输入开始,系统首先对自然语言进行语义编码与理解,然后通过检索模块筛选相关的语义片段或模板,接着由生成模块构造结构化的 Scenic 脚本,最终由 Carla 仿真环境还原为三维可视化场景。系统自动捕捉仿真结果图像,并结合评估模块生成语义一致性、多样性、结构完整性等量化指标,综合展示该场景的构建质量。 +\section{场景案例测试} +为了验证系统生成场景是否有多样性和高保真性,本章节会展示若干个典型的测试场景,这些场景包含红绿灯等待和夜间行驶等真实交通情境,每个场景都是通过自然语言输入生成而来,并且会在CARLA仿真平台当中运行获得图像结果,通过这些实例能直观观察系统对不同语义描述解析能力,以及最终生成场景所呈现出的真实感与复杂度 。 +\subsection{场景一:自车在道路上行驶时,一名行人突然从左侧前方穿出} +用户自然语言输入:The ego vehicle is driving on a road when a pedestrian suddenly crosses from the left front and suddenly stops as the ego vehicle approaches. - -\section{实验设置} +\vspace{1em} + +\begin{figure}[H] + \centering + \begin{minipage}[t]{0.48\textwidth} + \centering + \includegraphics[width=\linewidth]{"images/场景6.pdf"} + \caption{行人从左侧前方穿出 - 视角一} + \label{fig:scene6_1} + \end{minipage}% + \hfill + \begin{minipage}[t]{0.48\textwidth} + \centering + \includegraphics[width=\linewidth]{"images/场景6.1.png"} + \caption{行人从左侧前方穿出 - 视角二} + \label{fig:scene6_2} + \end{minipage} +\end{figure} +从横向对比来看,每一次场景生成,都会有一定的变动与误差,在这个场景中,自车与行人的相对位置在生成的时候会有差异。分析原因可能有,当车速与行人的相对速度过大时会造成生成出来的效果偏差。 +\subsection{场景二:两辆自车在直路上前后行驶} +用户自然语言输入:Two ego vehicles are driving in a straight line, one following the other. +\vspace{1em} -本实验是依靠性能比较强的本地计算机来完成的,其主要的硬件配置情况如下,处理器选用的是 Intel Core i9,它拥有多核心以及高主频,能够支持复杂计算任务和高并发程序的运行,显卡采用的是 NVIDIA GeForce RTX 3060,具备较强的图形渲染与并行计算能力,有利于运行自动驾驶模拟平台(像 CARLA)和进行深度学习模型推理,内存大小为 32GB,大容量内存保证了在多线程和大数据处理时系统的流畅性,能有效避免内存瓶颈方面的问题。这样的硬件配置为自然语言场景生成、自动驾驶仿真以及模型评估等任务提供了稳定且高效的运行环境。 +\begin{figure}[H] + \centering + \begin{minipage}[t]{0.48\textwidth} + \centering + \includegraphics[width=\linewidth]{"images/场景7.pdf"} + \caption{两辆自车直线行驶 - 视角一} + \label{fig:scene7_1} + \end{minipage}% + \hfill + \begin{minipage}[t]{0.48\textwidth} + \centering + \includegraphics[width=\linewidth]{"images/场景7.1.png"} + \caption{两辆自车直线行驶 - 视角二} + \label{fig:scene7_2} + \end{minipage} +\end{figure} +在本次对比中可以看出,视角的选取不同,也会影响效果的差异,所以调用相机的模块在场景生成中也十分重要。 +\subsection{场景三:一名行人横穿马路而自车在直路上行驶} +用户自然语言输入:A ego vehicle is driving on a straight road while a pedestrian is crossing the street. -\vspace{10pt} % 调整段落间距 +\vspace{1em} -\subsection*{软件环境} -软件环境需要的依赖库方面已经安装好,具体如下表所示\ref{tab:ependencies}: - \begin{table}[H] +\begin{figure}[H] + \centering + \begin{minipage}[t]{0.48\textwidth} + \centering + \includegraphics[width=\linewidth]{"images/场景8.pdf"} + \caption{行人横穿马路 - 视角一} + \label{fig:scene8_1} + \end{minipage}% + \hfill + \begin{minipage}[t]{0.48\textwidth} \centering - \begin{tabular}{lll} - \hline - \textbf{库名称} & \textbf{版本} \\ - \hline - openai & 最新版本 \\ - sentence\_transformers & 最新版本 \\ - torch & 1.13.1+cu117 \\ - torchvision & 0.14.1+cu117 \\ - torchaudio & 0.13.1 \\ - gym & 0.23.1 \\ - numpy & 1.21.6 \\ - pygame & 2.3.0 \\ - tqdm & 4.65.0 \\ - pyyaml & 6.0 \\ - matplotlib & 3.5.3 \\ - opencv-python & 4.7.0.72 \\ - pandas & 1.5.3 \\ - seaborn & 0.12.2 \\ - shapely & 1.8.5 \\ - ephem & 4.1.4 \\ - joblib & 1.2.0 \\ - cpprb & 10.7.0 \\ - pycocotools & 2.0.6 \\ - moviepy & 1.0.3 \\ - scikit-image & 0.19.3 \\ - transformers & 最新版本 \\ - setGPU & 最新版本 \\ - \hline - \end{tabular} - \caption{项目依赖库及其版本} - \label{tab:dependencies} - \end{table} - -\textbf{输入数据:} 本实验采用约20条自然语言描述作为输入样本,用于生成自动驾驶场景。这些描述覆盖多种交通情境和突发事件,例如: - - - -\begin{itemize}[leftmargin=20pt] - \item 自车在红绿灯前等待信号 - \item 行人突然横穿街道 - \item 道路上突现障碍物 - \item The ego vehicle is driving on a straight road; the adversarial pedestrian appears from a driveway on the left and suddenly stop and walk diagonally. - \item The ego vehicle is driving on a straight road when a pedestrian suddenly crosses from the right front and suddenly stops as the ego vehicle approaches. -\end{itemize} - -\vspace{10pt} % 调整段落间距 - -\subsection*{场景生成流程} -\begin{enumerate}[leftmargin=20pt] - \item 使用自然语言描述通过 ChatScene 项目生成对应的 CARLA 场景。 - \item 将生成的场景导入 CARLA 仿真环境进行验证,确保场景符合预期。 - \item 使用量化评估方法对生成的场景进行评估,分析碰撞率、响应时间、系统表现等指标。 -\end{enumerate} - - -\section{评估结果与分析} - -\subsection{语义保真度} -通过人工评估方式对 30 个生成场景进行语义一致性评分,得分范围为 0–5,得分越高表明语义表达越准确。结果如下\ref{tab:dependencies}: - \begin{table}[htbp] + \includegraphics[width=\linewidth]{"images/场景8.1.png"} + \caption{行人横穿马路 - 视角二} + \label{fig:scene8_2} + \end{minipage} +\end{figure} + +\subsection{场景四:夜晚行人在人行道上走} +用户自然语言输入:\indent At night, a pedestrian is walking on the sidewalk.\\ + +\begin{figure}[H] \centering - \begin{tabular}{lll} - \hline - \textbf{评分区间} & \textbf{场景占比} \\ - \hline - 5分 & 0.62 \\ - 4分 & 0.25 \\ - 3分及一下 & 0.13 \\ - \hline - \end{tabular} - \caption{} - \label{tab:dependencies} -\end{table} + \begin{subfigure}[t]{0.48\textwidth} + \centering + \includegraphics[width=\textwidth]{images/场景9.pdf} + \caption{} + \label{fig:night_sidewalk_1} + \end{subfigure} + \hfill % 添加一些水平间距 + \begin{subfigure}[t]{0.48\textwidth} + \centering + \includegraphics[width=\textwidth]{images/场景9.1.png} + \caption{} + \label{fig:night_sidewalk_2} + \end{subfigure} + \caption{夜晚行人在人行道上走} + \label{fig:night_sidewalk} +\end{figure} +该场景展示了横向对比中生成的行人运动状态也会有所不同,证明对目标主体的状态描述可以更加详尽。 +\subsection{场景五:自车通过十字路口} +用户自然语言输入:\index The ego vehicle passes through the intersection.\\ + +\begin{figure}[H] + \centering + \begin{subfigure}[t]{0.48\textwidth} + \centering + \includegraphics[width=\textwidth, height=0.8\textwidth, keepaspectratio]{images/场景10.png} + \caption{} + \label{fig:scene10-1} + \end{subfigure} + \hfill % 添加水平间距 + \begin{subfigure}[t]{0.48\textwidth} + \centering + \includegraphics[width=\textwidth, height=0.8\textwidth, keepaspectratio]{images/场景10.1.png} + \caption{} + \label{fig:scene10-2} + \end{subfigure} + \caption{自车通过十字路口} + \label{fig:scene10} +\end{figure} +场景五展示了town1和town5中运行代码的效果。 + +\section{评估测试分析} +为全面、客观地衡量本系统在从自然语言生成高保真三维交通场景过程中的表现,本文从语义保真度、场景多样性与系统效率三个核心维度构建了一套评估体系,具体指标设计如下: + +(1)语义保真度(Semantic Fidelity):它主要是评估生成场景能不能准确还原输入自然语言里的核心语义信息,以此确保系统生成结果在语义层面有一致性和完整性。评估内容包含参与主体的一致性,像描述里提到的车辆类型比如红色轿车、卡车,还有行人、障碍物是否出现在仿真场景当中,空间位置关系,例如“在路口等待”“位于右侧车道”“靠近斑马线”等描述是否体现在实体布局里面,行为逻辑一致性,比如“等待绿灯”“直行通过”“与前车保持车距”等行为是否在仿真中能体现出来。评估方式采用检索式语义匹配评分也就是自动化加上人工评审打分也就是主观验证的双重手段,自动化方面是用自然语言处理模型计算输入描述和生成场景之间的语义相似度,主观方面是由3名评估者依据统一评分标准对每条样本进行1到5分打分,然后取平均作为最终得分。 + +(2)场景多样性(Scene Diversity):多样性评估用于衡量系统在面对不同自然语言输入时所生成场景之间的差异性,防止生成内容趋于模板化或重复模式。主要从以下几个角度度量: +1.结构多样性(Structure Diversity Score, SDS):通过提取场景中的车辆、行人、建筑等静态元素的布局特征,计算不同场景之间的结构差异程度; + +2.行为多样性(Behavioral Diversity Score, BDS):通过仿真轨迹分析车辆在不同行为状态(加速、刹车、等待、避让等)上的变化情况,评估其动态多样性; + +3.地图覆盖率方面要统计不同输入生成场景在CARLA地图里的分布情况,以此评估是否存在特定区域集中度过高的问题,采用像结构差异率、行为状态熵等定量指标来开展自动化评估工作,并且结合统计图表做可视化展示。 + +(3)系统效率与响应能力(Efficiency):系统效率是衡量该平台在真实应用场景下可行性的重要指标,重点考察系统从接收自然语言指令到输出完整三维场景所需的总时间开销,包括:检索耗时:Sentence-T5 向量化及相似描述查找所用时间;生成耗时:大语言模型生成 Scenic 脚本所耗时间;仿真加载与渲染时间:Scenic 编译后至 CARLA 仿真运行启动所经历的延迟;总响应时间:综合上述所有子流程,从输入自然语言到仿真画面出现的端到端时间。 + +通过日志记录还有脚本打点的方式来采集各个阶段的耗时,并且用平均响应时长(ms)、方差这类指标对性能表现进行量化,系统在多轮连续输入情况下的响应稳定性也被纳入评估范围。 + +在评估生成场景的质量时本研究选两种有代表性方法作基线对比,基于规则的方法即Rule - based这种方法通过定义明确逻辑和规则生成场景,它具有较好可解释性适合处理结构化和预定义任务,不过面对复杂和模糊的自然语言描述时灵活性和适应性较差,基于GPT - 4.0的方法借助大型语言模型生成能力来生成丰富多样的场景,该方法在场景生成多样性方面具备优势,不过在生成场景的物理合规性和逻辑一致性上存在不足,尤其是在处理复杂交通情境的时候。 +选择这两种基线的主要目的是从不同角度评估本研究方法在生成场景质量、效率以及针对复杂和模糊指令的鲁棒性方面所具备的优势。\\ + + 平均得分为 4.38,说明生成系统在语义还原方面表现优异,能够较好地捕捉自然语言中的关键词及其空间/行为语义。 \subsection{准确率分析} -在输入条件近似的情况下,系统生成了具有多样参与者布局与动作的场景。采用结构特征编码后计算场景间欧几里得距离,多样性指标等,最后得出final Score平均约为 0.95,说明系统具备良好的准确率\ref{fig:accuracy_analysis}。 -此外,通过对生成的截图进行视觉对比,发现系统在车辆类型、行驶方向、光照与天气等维度的变化也具备一定随机性与可控性。 -\begin{figure}[h] +在输入条件近似的情况下,系统生成了具有多样参与者布局与动作的场景。采用结构特征编码后计算场景间欧几里得距离,多样性指标如 碰撞率、闯红灯频率、停车标志频率、超出道路长度、路线跟随稳定性、路线完成率、平均花费时间、平均加速度、平均偏航速度以及车道入侵频率等,下面两张图通过横向对比,同一场景生成的结果分析会有所不同,但最后得出final Score保持在0.94-0.95之间,说明系统具备良好的准确率\ref{tab:evaluation_results}。 +此外,通过对生成的截图进行视觉对比,发现系统在车辆类型、行驶方向、光照与天气等维度的变化也具备一定随机性与可控性。以下为两个评估测试的结果截图: +\begin{table}[H] \centering - \includegraphics[width=1.0\textwidth]{"images/result2.pdf"} - \caption{准确率分析} - \label{fig:accuracy_analysis} -\end{figure} + \begin{tabular}{|l|c|} + \hline + \textbf{Evaluation Metric} & \textbf{Value} \\ + \hline + Collision Rate (碰撞率) & 0.0 \\ + \hline + Avg. Red Light Frequency (平均闯红灯频率) & 0.0 \\ + \hline + Avg. Stop Sign Frequency (平均停车标志频率) & 0.0 \\ + \hline + Out-of-Road Length (超出道路长度) & 0.0 \\ + \hline + Route Following Stability (路线跟随稳定性) & 0.8954 \\ + \hline + Route Completion (路线完成率) & 0.9932 \\ + \hline + Avg. Time Spent (平均花费时间) & 6.0342 \\ + \hline + Avg. Acceleration (平均加速度) & 0.687 \\ + \hline + Avg. Yaw Velocity (平均偏航速度) & 0.0 \\ + \hline + Avg. Lane Invasion Frequency (平均车道入侵频率) & 0.0 \\ + \hline + Safety OS (安全操作系统) & 1.0 \\ + \hline + Task OS (任务操作系统) & 0.6863 \\ + \hline + Comfort OS (舒适操作系统) & 1.0000 \\ + \hline + Final Score (最终得分) & 0.9519 \\ + \hline + \end{tabular} + \caption{Evaluation Results1} + \label{tab:evaluation_results} +\end{table} -\begin{figure}[h] +\begin{table}[H] \centering - \includegraphics[width=1.0\textwidth]{"images/result1.pdf"} - \caption{准确率分析} - \label{fig:accuracy_analysis} -\end{figure} + \begin{tabular}{|l|c|} + \hline + \textbf{Evaluation Metric} & \textbf{Value} \\ + \hline + Collision Rate (碰撞率) & 0.0 \\ + \hline + Avg. Red Light Frequency (平均闯红灯频率) & 0.0 \\ + \hline + Avg. Stop Sign Frequency (平均停车标志频率) & 0.0 \\ + \hline + Out-of-Road Length (超出道路长度) & 0.0 \\ + \hline + Route Following Stability (路线跟随稳定性) & 0.8542 \\ + \hline + Route Completion (路线完成率) & 0.9865 \\ + \hline + Avg. Time Spent (平均花费时间) & 5.325 \\ + \hline + Avg. Acceleration (平均加速度) & 0.7869 \\ + \hline + Avg. Yaw Velocity (平均偏航速度) & 0.0 \\ + \hline + Avg. Lane Invasion Frequency (平均车道入侵频率) & 0.0 \\ + \hline + Safety OS (安全操作系统) & 1.0 \\ + \hline + Task OS (任务操作系统) & 0.6934 \\ + \hline + Comfort OS (舒适操作系统) & 1.0000 \\ + \hline + Final Score (最终得分) & 0.9409 \\ + \hline + \end{tabular} + \caption{Evaluation Results2} + \label{tab:evaluation_results2} +\end{table} \subsection{效率分析} 系统整体生成流程的平均时间如下: -语义检索与匹配:0.9s,Scenic脚本生成:0.6s,Carla场景加载与截图:4.3s,总耗时:3.4s/条输入 -为了验证系统在实际使用场景当中的运行效率,本文对从自然语言输入到三维仿真场景生成全过程的响应时间开展了测量与分析,系统整体生成流程的平均时间如下所示,通过上述统计能够看出,本系统在标准硬件配置的状况下可把一条自然语言指令完整转换为可视化交通场景的平均总耗时控制在7秒以内,具备较强的实时响应能力,在进行批量输入处理的时候,系统同样表现出良好的并发处理能力与稳定性,经实验验证,在一次性处理20条自然语言输入的情形下,系统可在不显著增加响应时间的前提下完成全部场景的构建与仿真,平均每个场景的处理时间波动控制在±0.7秒范围内。 +为了评估基于自然语言生成高保真智能驾驶仿真场景系统的整体性能,我们把完整流程划分成五个主要的阶段,并且针对每一阶段的平均运行时间、关键输出结果以及其影响因素进行了详细统计与分析,具体内容如表 \ref{tab:simulation_time} 所示。 +\begin{table}[H] + \centering + \renewcommand{\arraystretch}{1.2} + \begin{tabular}{p{4cm} p{2.5cm} p{2.8cm} p{4.5cm}} + \hline + \textbf{阶段} & \textbf{平均时间 (秒)} & \textbf{关键输出} & \textbf{影响因素 / 可调参数} \\ + \hline + 语义检索与匹配 & 1.6 & 相似场景向量 + 匹配索引 & 检索库规模、向量维度、匹配阈值、Top-K 设置 \\ + Scenic 脚本生成 & 2.3 & Scenic 场景脚本 (.scenic) & 场景模板复杂度、语言理解精度、地形元素数量 \\ + Scenic 到配置转换 & 0.7 & .config 配置文件 & 转换规则数量、是否包含动态目标 \\ + Carla 场景加载与构建 & 3.2 & Carla 世界状态 & 地图大小、天气设置、对象密度 \\ + 截图渲染与保存 & 1.1 & RGB 图像 (.png) & 分辨率、渲染设备性能、截图角度 \\ + \hline + \textbf{总耗时} & \textbf{8.9} & --- & 与系统性能、并发线程数等有关 \\ + \hline + \end{tabular} + \caption{自然语言生成场景的各阶段性能统计} + \label{tab:simulation_time} +\end{table} +首先语义检索与匹配阶段的主要任务是把用户输入的自然语言描述转化成向量表示,然后和预先构建好的场景语义向量库进行相似度检索,这个阶段平均耗费时间大约为1.6秒,输出的内容是一组相似场景的索引以及向量,其主要受到检索库规模、向量维度、匹配阈值还有Top - K值设置等因素的影响 。 + +其次在Scenic脚本生成阶段会把检索到的匹配结果和语言模板相结合,进而自动构造出符合语义的.scenic脚本,此阶段平均耗时为2.3秒,该阶段的耗时会受到场景描述复杂程度、地形构造模板数量、语言解析精度等因素的影响,特别是在涉及多个车辆与动态目标的情况下,脚本生成时间会有所上升。 + +接下来进入Scenic到配置转换这个阶段,此阶段会把.scenic文件解析成Carla兼容的.config配置文件,以此为后续仿真环境加载做好准备,这一过程平均需要花费0.7秒时间,处理逻辑相对来说比较轻量,转换规则的具体数量以及是否包含动态对象像自动驾驶目标车辆、行人等会略微对耗时产生影响。 +第四阶段在整个流程里是最耗时间的部分,具体为Carla场景加载与构建,此阶段涵盖场景地图加载、静态和动态对象放置、交通信号配置等操作,平均所花费的时间是3.2秒,该阶段的性能很大程度上依赖于地图的大小、环境的复杂程度(像是否包含天气、光照等因素)以及硬件图形性能。 + +最后,截图渲染与保存阶段会调用Carla客户端API截取仿真视角下RGB图像并保存,此阶段平均耗时为1.1秒,影响因素包含图像分辨率、摄像机角度以及渲染硬件性能等。 +从整体情况来看整个从自然语言输入到仿真图像输出流程平均耗时大概8.9秒,在单线程运行模式下已经具备比较不错的响应性能,要是进一步采用并发优化或者异步渲染技术,该系统在未来能够扩展成支持实时交互与多轮问答生成的智能仿真平台。 +经实验验证,在一次性处理20条自然语言输入的情形下,系统可在不显著增加响应时间的前提下完成全部场景的构建与仿真,平均每个场景的处理时间波动控制在±0.7秒范围内。 这表明: -\begin{itemize} - \item 系统核心模块间的异步处理与缓存机制有效; - \item 大语言模型调用延迟已通过缓存和批处理策略优化; - \item Scenic 与 CARLA 接口连接在高频调用场景下仍保持稳定。 -\end{itemize} - -总体来说系统拥有良好响应效率和可扩展性,不但支持单条交互式输入方式,而且能够满足批量生成相关需求,适合大规模自动驾驶测试等实际应用任务,比如仿真训练或者仿真场景库构建等,若要进一步提升系统的运行效率,可通过以下这些途径来进行优化。 -\begin{itemize} - \item 引入本地轻量化大模型以减少云端调用延迟; - \item 对检索模块进行并行化改造,提升向量查找速度; - \item 使用CARLA的异步仿真接口或地图预加载技术降低启动时间。 -\end{itemize} + +(1)系统核心模块间的异步处理与缓存机制有效; + +(2)大语言模型调用延迟已通过缓存和批处理策略优化; + +(3) Scenic 与 CARLA 接口连接在高频调用场景下仍保持稳定。 + +总体来说系统拥有良好响应效率和可扩展性,不但支持单条交互式输入方式,而且能够满足批量生成相关需求,适合大规模自动驾驶测试等实际应用任务,比如仿真训练或者仿真场景库构建等,若要进一步提升系统的运行效率,可通过这些途径来进行优化:引入本地轻量化大模型以减少云端调用延迟;对检索模块进行并行化改造,提升向量查找速度;使用CARLA的异步仿真接口或地图预加载技术降低启动时间。 + + +\section{本章小节} +这章通过多个典型自然语言驱动交通场景案例,系统且全面地展示本系统在语义理解、场景生成、三维仿真和评估反馈等方面整体能力,实验结果表明系统能够准确捕捉输入指令中的核心语义信息,生成具有高保真度的三维交通场景,并且在车辆行为、环境光照、行人动作等细节上呈现出良好多样性与合理性,经过语义保真度和多样性两大核心指标量化评测,系统在语义一致性和场景丰富性方面都取得了优异成绩。 + +另外系统在响应效率方面体现出较强实时性与稳定性,平均单条场景生成时间可控制在9秒以内,同时还支持批量输入处理,比较适合大规模自动驾驶仿真应用,通过基于规则方法和基于大语言模型方法对比验证,进一步突出本系统在灵活性和复杂场景处理上的优势。总的来说本章测试分析充分证明本系统在自然语言到三维智能驾驶场景自动生成领域有有效性和实用价值,给后续系统优化和应用推广奠定了坚实基础。 + + + + + + + + + + + + diff --git a/scene/undergraduate/content/chapter6.tex b/scene/undergraduate/content/chapter6.tex index 11adb89..bd33455 100644 --- a/scene/undergraduate/content/chapter6.tex +++ b/scene/undergraduate/content/chapter6.tex @@ -3,12 +3,12 @@ \chapter{总结与展望} \section{工作总结} -随着自动驾驶技术快速地不断发展,在复杂交通环境中借助高效场景生成与感知系统来提升自动驾驶系统智能性和安全性成研究关键,本文设计并实现基于自然语言处理的自动驾驶仿真场景生成方法,结合Carla仿真平台探讨利用自然语言输入生成动态仿真场景并结合感知系统提高自动驾驶决策能力,本研究围绕“自然语言驱动的自动驾驶场景生成与感知”问题,采用基于预训练大模型的检索与生成方法利用深度学习技术提升场景生成灵活性和多样性,通过对输入自然语言描述进行语义分析,系统可自动生成符合语义要求场景并在Carla平台上进行仿真验证,此外本文还设计集成感知系统,通过深度学习与图像处理技术实现交通目标检测、跟踪与行为预测为后续决策与控制提供支持。 +目前自动驾驶技术正处于快速且持续的发展阶段,在复杂交通环境当中借助高效场景生成与感知系统去提升自动驾驶系统智能性和安全性成为研究关键要点,本文设计并实现基于自然语言处理的自动驾驶仿真场景生成方法,结合Carla仿真平台探讨利用自然语言输入生成动态仿真场景并结合感知系统提高自动驾驶决策能力,本研究围绕“自然语言驱动的自动驾驶场景生成与感知”这一问题展开,采用基于预训练大模型的检索与生成方法利用深度学习技术提升场景生成灵活性和多样性,通过对输入自然语言描述开展语义分析让系统能够自动生成符合语义要求的场景并在Carla平台上进行仿真验证,除此之外本文还设计集成感知系统通过深度学习与图像处理技术实现交通目标检测、跟踪与行为预测为后续决策与控制提供支持。 -实验结果显示基于自然语言生成的仿真场景能准确反映输入描述语义,还可通过感知系统实时跟踪和预测交通目标行为意图,系统能够在复杂交通环境里稳定运行,这验证了自然语言描述和自动驾驶场景生成的可行性与有效性。本文的贡献是提出了一种创新性的自动驾驶场景生成与感知方法,通过自然语言生成仿真场景且结合感知与决策支持,提升了自动驾驶系统的适应性与智能化水平,研究中采用的Carla仿真平台为系统验证与优化提供了丰富测试数据,未来研究成果有望为智能驾驶系统多样化场景生成和感知能力提升提供更多技术支持。 +实验结果显示基于自然语言生成的仿真场景可精准反映输入描述语义,还能借助感知系统实时跟踪并预测交通目标行为意图,该系统能在复杂交通环境中稳定运行,这验证了自然语言描述和自动驾驶场景生成具有可行性与有效性。本文的贡献是提出一种创新性的自动驾驶场景生成与感知方法,通过自然语言生成仿真场景并结合感知与决策支持,提升了自动驾驶系统的适应性与智能化水平,研究中采用的Carla仿真平台为系统验证与优化提供了丰富测试数据,未来研究成果有望为智能驾驶系统多样化场景生成和感知能力提升提供更多技术支持。 \section{研究不足} -虽然本文在自然语言生成场景和感知系统研究里取得了一定进展,不过在某些方面还是存在不足与局限,当前的场景生成方法虽能生成基本交通场景,但处理更复杂动态环境如极端天气和特殊道路条件时显得力不从心,现有的自然语言理解模型对复杂描述理解能力和场景生成精确度有待提升,面对不常见交通情境生成场景缺乏丰富性和真实感,尽管本文的感知系统在多数情况下能准确跟踪和预测目标行为,但在高密度交通或目标交错情况下会出现目标跟踪失误影响行为预测准确性,在多目标竞态和复杂背景下现有的目标跟踪算法仍可能受影响导致系统长期跟踪出现问题。 +虽然本文在自然语言生成场景和感知系统研究方面取得了一定进展,不过在某些方面依旧存在着不足与局限性,当前的场景生成方法虽然能够生成基本的交通场景,但是处理更为复杂的动态环境如极端天气和特殊道路条件时就显得力不从心,现有的自然语言理解模型对于复杂描述的理解能力和场景生成的精确度有待提升,面对不常见的交通情境生成的场景缺乏丰富性和真实感,尽管本文的感知系统在多数情况下能够准确跟踪和预测目标行为,但是在高密度交通或目标交错的情况下会出现目标跟踪失误从而影响行为预测准确性,在多目标竞态和复杂背景下现有的目标跟踪算法仍可能受到影响进而导致系统长期跟踪出现问题。 虽说本研究把深度学习和物理建模结合起来做行为意图分析,可现有的方法依靠物理模型简单规则,或许难以捕捉更复杂多变的驾驶行为,特别是多个目标之间存在复杂交互的时候,系统可能没办法准确预测其行为,最后,系统在处理高分辨率图像和复杂场景时,其实时性和计算性能还存在一定瓶颈,虽说现有系统能满足基本实时性要求,但在高负载条件下,响应时间和处理速度可能会受影响,这在实际应用当中也许会带来挑战。 @@ -20,4 +20,4 @@ \section{后续优化方向} 未来的工作会进一步探索更加鲁棒的目标跟踪算法 结合深度学习和多传感器融合技术提高系统的目标识别和跟踪能力 此外意图预测会结合更多像交通规则和社会行为这样的情境因素 以此来提升对复杂驾驶行为的预测精度。 -再者系统实时性与计算性能会持续不断优化,随着场景复杂度逐渐增加系统实时性和处理能力成关键问题,未来研究将重点聚焦高效图像处理和计算方法,借助硬件加速以及算法优化提高系统计算效率,确保在高负载和复杂场景下依旧能保持流畅运行。最后未来研究将结合真实道路测试与仿真验证,把研究成果转化成为实际可应用的内容,通过在真实环境中开展测试进一步评估系统,确保系统在多样化且复杂交通环境中的稳定性。通过以上这些方面的优化未来系统能更好应对,动态复杂交通场景提高自动驾驶系统智能感知,为实现更高安全性和智能化水平自动驾驶技术奠定基础。 +再者系统的实时性和计算性能会持续不断做优化,毕竟随着场景复杂度逐渐增加系统实时性和处理能力成关键问题,未来研究将重点聚焦于高效图像处理和计算方法,要借助硬件加速以及算法优化来提高系统计算效率,以此确保在高负载和复杂场景下系统依旧可以保持流畅运行,最后未来研究要结合真实道路测试与仿真验证,把研究成果转化成为实际可应用的具体内容,通过在真实环境中开展测试进一步评估系统性能,确保系统在多样化且复杂交通环境中具备稳定性,通过以上这些方面的优化未来系统能够更好应对动态复杂交通场景,从而提高自动驾驶系统智能感知能力,为实现更高安全性和智能化水平的自动驾驶技术奠定基础。 \ No newline at end of file diff --git a/scene/undergraduate/content/cmdel.bat b/scene/undergraduate/content/cmdel.bat index e69de29..c9642e0 100644 --- a/scene/undergraduate/content/cmdel.bat +++ b/scene/undergraduate/content/cmdel.bat @@ -0,0 +1,2 @@ +del /a /f *.xml *.bcf *.out *.log *.sav *.gz *.aux *.bbl *.bak *.dvi *.blg + diff --git a/scene/undergraduate/content/content.tex b/scene/undergraduate/content/content.tex index 36ae690..70af334 100644 --- a/scene/undergraduate/content/content.tex +++ b/scene/undergraduate/content/content.tex @@ -1,25 +1,25 @@ -%!TEX root = ../hutbthesis_main.tex - -%子章节为了便于查找和修改,建议通过input拆分文件 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%绪论%%%%%%%%%%%%%%%% -\input{content/chapter1.tex} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%绪论%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图像插入示例%%%%%%%%%%%%%%%% -\input{content/chapter2.tex} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图像插入示例%%%%%%%%%%%%%%%% - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%表格插入示例%%%%%%%%%%%%%%%% -\input{content/chapter3.tex} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%表格插入示例%%%%%%%%%%%%%%%% - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%参考文献插入示例%%%%%%%%%%%%%%%% -\input{content/chapter4.tex} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%参考文献插入示例%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%总结插入示例%%%%%%%%%%%%%%%% -\input{content/chapter5.tex} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%总结插入示例%%%%%%%%%%%%%%%% \ No newline at end of file +%!TEX root = ../hutbthesis_main.tex + +%子章节为了便于查找和修改,建议通过input拆分文件 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%绪论%%%%%%%%%%%%%%%% +\input{content/chapter1.tex} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%绪论%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图像插入示例%%%%%%%%%%%%%%%% +\input{content/chapter2.tex} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%图像插入示例%%%%%%%%%%%%%%%% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%表格插入示例%%%%%%%%%%%%%%%% +\input{content/chapter3.tex} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%表格插入示例%%%%%%%%%%%%%%%% + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%参考文献插入示例%%%%%%%%%%%%%%%% +\input{content/chapter4.tex} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%参考文献插入示例%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%总结插入示例%%%%%%%%%%%%%%%% +\input{content/chapter5.tex} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%总结插入示例%%%%%%%%%%%%%%%% diff --git a/scene/undergraduate/content/cover.tex b/scene/undergraduate/content/cover.tex index 672fa66..4c28280 100644 --- a/scene/undergraduate/content/cover.tex +++ b/scene/undergraduate/content/cover.tex @@ -1,22 +1,23 @@ -%!TEX root = ../hutbthesis_main.tex -% 文章信息 -\titlecn{基于预训练大模型的高保真三维智能驾驶场景生成系统 } -\titleen{Hunan University of Technology and Business Thesis \LaTeX{} Template v0.1} - - -%\minormajor{大数据与人工智能} -%\interestmajor{大数据与人工智能} -\author{郑睿翔} -\subsupervisor{} -\studentid{2123030045} -\priormajor{大数据与人工智能} -\myclass{数智2102班} -\supervisor{王海东\ 讲师} -\department{人工智能与先进计算学院} -\thesisdate{year=2025, month=5} - -%以下的对本科生没有用 -\clcnumber{TP391} % 中图分类号 Chinese Library Classification -\schoolcode{10533} % 学校代码 -\udc{004.9} % UDC -\academiccategory{学术学位} % 学术类 \ No newline at end of file +%!TEX root = ../hutbthesis_main.tex +% 文章信息(同时也是页眉) +\titlecn{基于预训练大模型的高保真三维智能驾驶场景生成系统} +\headertitle{湖南工商大学毕业论文} +\titleen{Hunan University of Technology and Business Thesis \LaTeX{} Template v2.0} + + + +\author{郑睿翔} +\subsupervisor{} +\studentid{2123030045} +\priormajor{大数据与人工智能} +\myclass{数智2102班} +\supervisor{王海东} +\title{讲师} +\department{人工智能与先进计算学院} +\thesisdate{year=2025, month=5} + +%以下的对本科生没有用 +\clcnumber{TP391} % 中图分类号 Chinese Library Classification +\schoolcode{10533} % 学校代码 +\udc{004.9} % UDC +\academiccategory{学术学位} % 学术类别 \ No newline at end of file diff --git a/scene/undergraduate/content/declarationzh.tex b/scene/undergraduate/content/declarationzh.tex index 5061f23..c872d06 100644 --- a/scene/undergraduate/content/declarationzh.tex +++ b/scene/undergraduate/content/declarationzh.tex @@ -1,18 +1,18 @@ -%!TEX root = ../hutbthesis_main.tex - -\begin{declarationzh} - -本人郑重声明:所呈交的本科毕业设计 \uline{ 基于预训练大模型的高保真\\三维智能驾驶场景生成系统 } 是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议,除文中已经注明引用的内容外,本设计不含任何其他个人或集体已经发表或撰写过的作品成果。 -对本设计做出重要贡献的个人和集体均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。 - - \vspace{30pt} - \begin{tabular}{ll} - %\renewcommand{\arraystretch}{2} - \hspace{240pt} \makebox[4em][s]{作者签名:} & \underline{\makebox[100pt][c]{ 郑睿翔 }} \\ - \hspace{240pt} \makebox[4em][s]{日\qquad 期:} & - \underline{\makebox[100pt][c]{\qquad 2025年\quad 4月\quad 28 日 }} \\ - \end{tabular} - - - +%!TEX root = ../hutbthesis_main.tex + +\begin{declarationzh} + + 本人郑重声明:所呈交的本科毕业设计 \uline{ 基于预训练大模型的高保真\\三维智能驾驶场景生成系统 } 是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议,除文中已经注明引用的内容外,本设计不含任何其他个人或集体已经发表或撰写过的作品成果。 + 对本设计做出重要贡献的个人和集体均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。 + + \vspace{30pt} + \begin{tabular}{ll} + %\renewcommand{\arraystretch}{2} + \hspace{240pt} \makebox[4em][s]{作者签名:} & \underline{\makebox[100pt][c]{ 郑睿翔 }} \\ + \hspace{240pt} \makebox[4em][s]{日\qquad 期:} & + \underline{\makebox[100pt][c]{\qquad 2025年\quad 4月\quad 28 日 }} \\ + \end{tabular} + + + \end{declarationzh} \ No newline at end of file diff --git a/scene/undergraduate/content/info.tex b/scene/undergraduate/content/info.tex index 0a46b7a..5f19178 100644 --- a/scene/undergraduate/content/info.tex +++ b/scene/undergraduate/content/info.tex @@ -1,22 +1,22 @@ -%!TEX root = ../csuthesis_main.tex -% 文章信息 -\titlecn{中南大学学位论文 \LaTeX{} 模板使用示例 v0.1.2} -\titleen{Central South University Thesis \LaTeX{} Template v0.1.2} - -\priormajor{计算机科学与技术} -\minormajor{计算机应用技术} -\interestmajor{计算机科学与技术} -\author{Edwardzcn} -\supervisor{徐德智\ 教授} -\subsupervisor{} -\department{计算机学院} -\studentid{1112223334} -\thesisdate{year=2021,month=1} -\myclass{计算机科学与技术} - - -%以下的对本科生没有用 -\clcnumber{TP391} % 中图分类号 Chinese Library Classification -\schoolcode{10533} % 学校代码 -\udc{004.9} % UDC +%!TEX root = ../csuthesis_main.tex +% 文章信息 +\titlecn{中南大学学位论文 \LaTeX{} 模板使用示例 v0.1.2} +\titleen{Central South University Thesis \LaTeX{} Template v0.1.2} + +\priormajor{计算机科学与技术} +\minormajor{计算机应用技术} +\interestmajor{计算机科学与技术} +\author{Edwardzcn} +\supervisor{徐德智\ 教授} +\subsupervisor{} +\department{计算机学院} +\studentid{1112223334} +\thesisdate{year=2021,month=1} +\myclass{计算机科学与技术} + + +%以下的对本科生没有用 +\clcnumber{TP391} % 中图分类号 Chinese Library Classification +\schoolcode{10533} % 学校代码 +\udc{004.9} % UDC \academiccategory{学术学位} % 学术类别 \ No newline at end of file diff --git a/scene/undergraduate/content/reference.bib b/scene/undergraduate/content/reference.bib index a5951dc..4f689b7 100644 --- a/scene/undergraduate/content/reference.bib +++ b/scene/undergraduate/content/reference.bib @@ -6,6 +6,7 @@ @inproceedings{abeysirigoonawardena2019adversarial year = {2019}, publisher = {IEEE} } + @inproceedings{bagschik2018ontology, author = {Gerrit Bagschik and Till Menzel and Markus Maurer}, title = {Ontology Based Scene Creation for the Development of Automated Vehicles}, @@ -14,6 +15,7 @@ @inproceedings{bagschik2018ontology year = {2018}, publisher = {IEEE} } + @inproceedings{biggio2013evasion, author = {Battista Biggio and Igino Corona and Davide Maiorca and Blaine Nelson and Nedim Srndi{\'c} and Pavel Laskov and Giorgio Giacinto and Fabio Roli}, title = {Evasion Attacks against Machine Learning at Test Time}, @@ -22,6 +24,7 @@ @inproceedings{biggio2013evasion year = {2013}, publisher = {Springer} } + @article{brown2020language, title = {Language Models are Few-Shot Learners}, author = {Tom Brown and Benjamin Mann and Nick Ryder and Melanie Subbiah and Jared D. Kaplan and Prafulla Dhariwal and Arvind Neelakantan and Pranav Shyam and Girish Sastry and Amanda Askell and others}, @@ -30,6 +33,7 @@ @article{brown2020language pages = {1877--1901}, year = {2020} } + @inproceedings{cai2020summit, title = {SUMMIT: A Simulator for Urban Driving in Massive Mixed Traffic}, author = {Panpan Cai and Yiyuan Lee and Yuanfu Luo and David Hsu}, @@ -38,6 +42,7 @@ @inproceedings{cai2020summit year = {2020}, publisher = {IEEE} } + @inproceedings{cao2019adversarial, title = {Adversarial Sensor Attack on LiDAR-based Perception in Autonomous Driving}, author = {Yulong Cao and Chaowei Xiao and Benjamin Cyr and Yimeng Zhou and Won Park and Sara Rampazzi and Qi Alfred Chen and Kevin Fu and Z. Morley Mao}, @@ -45,11 +50,13 @@ @inproceedings{cao2019adversarial pages = {2267--2281}, year = {2019} } + @misc{carla2019challenge, title = {CARLA Autonomous Driving Challenge}, author = {{CARLA}}, year = {2019} } + @article{chen2021adversarial, title = {Adversarial Evaluation of Autonomous Vehicles in Lane-Change Scenarios}, author = {Baiming Chen and Xiang Chen and Qiong Wu and Liang Li}, @@ -59,12 +66,14 @@ @article{chen2021adversarial pages = {10333--10342}, year = {2021} } + @article{chowdhery2022palm, author = {Aakanksha Chowdhery and Sharan Narang and Jacob Devlin and Maarten Bosma and Gaurav Mishra and Adam Roberts and Paul Barham and Hyung Won Chung and Charles Sutton and Sebastian Gehrmann and others}, title = {Palm: Scaling language modeling with pathways}, journal = {arXiv preprint arXiv:2204.02311}, year = {2022} } + @misc{scenario_runner_contributors2019carla, author = {Scenario Runner Contributors}, title = {Carla Scenario Runner}, @@ -72,6 +81,7 @@ @misc{scenario_runner_contributors2019carla month = {6}, url = {https://github.com/carla-simulator/scenario_runner} } + @article{cui2023chatlaw, author = {Jiaxi Cui and Zongjian Li and Yang Yan and Bohua Chen and Li Yuan}, title = {Chatlaw: Open-source legal large language model with integrated external knowledge bases}, @@ -79,12 +89,14 @@ @article{cui2023chatlaw journal = {arXiv preprint arXiv:2306.16092} } + @article{devlin2018bert, author = {Jacob Devlin and Ming-Wei Chang and Kenton Lee and Kristina Toutanova}, title = {BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding}, year = {2018}, journal = {arXiv preprint arXiv:1810.04805} } + @inproceedings{ding2020learning, author = {Wenhao Ding and Baiming Chen and Minjun Xu and Ding Zhao}, title = {Learning to Collide: An Adaptive Safety-Critical Scenarios Generating Method}, @@ -93,6 +105,7 @@ @inproceedings{ding2020learning year = {2020}, publisher = {IEEE} } + @inproceedings{dosovitskiy2017carla, author = {Alexey Dosovitskiy and German Ros and Felipe Codevilla and Antonio Lopez and Vladlen Koltun}, title = {CARLA: An Open Urban Driving Simulator}, @@ -101,6 +114,7 @@ @inproceedings{dosovitskiy2017carla year = {2017}, publisher = {PMLR} } + @article{erickson2017machine, author = {Bradley J Erickson and Panagiotis Korfiatis and Zeynettin Akkus and Timothy L Kline}, title = {Machine learning for medical imaging}, @@ -110,6 +124,7 @@ @article{erickson2017machine pages = {505}, year = {2017} } + @inproceedings{eykholt2018robust, author = {Kevin Eykholt and Ivan Evtimov and Earlence Fernandes and Bo Li and Amir Rahmati and Chaowei Xiao and Atul Prakash and Tadayoshi Kohno and Dawn Song}, title = {Robust physical-world attacks on deep learning visual classification}, @@ -117,6 +132,7 @@ @inproceedings{eykholt2018robust pages = {1625--1634}, year = {2018} } + @article{feng2021intelligent, author = {Shuo Feng and Xintao Yan and Haowei Sun and Yiheng Feng and Henry X Liu}, title = {Intelligent driving intelligence test for autonomous vehicles with naturalistic and adversarial environment}, @@ -126,6 +142,7 @@ @article{feng2021intelligent pages = {748}, year = {2021} } + @inproceedings{fremont2019scenic, author = {Daniel J Fremont and Tommaso Dreossi and Shromona Ghosh and Xiangyu Yue and Alberto L Sangiovanni-Vincentelli and Sanjit A Seshia}, title = {Scenic: A language for scenario specification and scene generation}, @@ -133,6 +150,7 @@ @inproceedings{fremont2019scenic pages = {63--78}, year = {2019} } + @article{fremont2022scenic, author = {Daniel J Fremont and Edward Kim and Tommaso Dreossi and Shromona Ghosh and Xiangyu Yue and Alberto L Sangiovanni-Vincentelli and Sanjit A Seshia}, title = {Scenic: A language for scenario specification and data generation}, @@ -140,12 +158,14 @@ @article{fremont2022scenic pages = {1--45}, year = {2022} } + @article{fu2023drive, author = {Daocheng Fu and Xin Li and Licheng Wen and Min Dou and Pinlong Cai and Botian Shi and Yu Qiao}, title = {Drive like a human: Rethinking autonomous driving with large language models}, journal = {arXiv preprint arXiv:2307.07162}, year = {2023} } + @inproceedings{fujimoto2018addressing, author = {Scott Fujimoto and Herke van Hoof and David Meger}, title = {Addressing function approximation error in actor-critic methods}, @@ -154,6 +174,7 @@ @inproceedings{fujimoto2018addressing year = {2018}, publisher = {PMLR} } + @inproceedings{haarnoja2018soft, author = {Tuomas Haarnoja and Aurick Zhou and Pieter Abbeel and Sergey Levine}, title = {Soft actor-critic: Off-policy maximum entropy deep reinforcement learning with a stochastic actor}, @@ -162,6 +183,7 @@ @inproceedings{haarnoja2018soft year = {2018}, publisher = {PMLR} } + @inproceedings{he2016deep, author = {Kaiming He and Xiangyu Zhang and Shaoqing Ren and Jian Sun}, title = {Deep residual learning for image recognition}, @@ -169,6 +191,7 @@ @inproceedings{he2016deep pages = {770--778}, year = {2016} } + @article{johnson2019billion, author = {Jeff Johnson and Matthijs Douze and Hervé Jégou}, title = {Billion-scale similarity search with GPUs}, @@ -178,6 +201,7 @@ @article{johnson2019billion pages = {535--547}, year = {2019} } + @article{kasneci2023chatgpt, author = {Enkelejda Kasneci and Kathrin Seßler and Stefan Küchemann and Maria Bannert and Daryna Dementieva and Frank Fischer and Urs Gasser and Georg Groh and Stephan Günnemann and Eyke Hüllermeier and et al.}, title = {ChatGPT for good? On opportunities and challenges of large language models for education}, @@ -186,6 +210,7 @@ @article{kasneci2023chatgpt pages = {102274}, year = {2023} } + @inproceedings{klischat2020scenario, author = {Moritz Klischat and Edmond Irani Liu and Fabian Holtke and Matthias Althoff}, title = {Scenario Factory: Creating Safety-Critical Traffic Scenarios for Automated Vehicles}, @@ -194,6 +219,7 @@ @inproceedings{klischat2020scenario year = {2020}, publisher = {IEEE} } + @inproceedings{kong2020physgan, author = {Zelun Kong and Junfeng Guo and Ang Li and Cong Liu}, title = {PhysGAN: Generating Physical-World-Resilient Adversarial Examples for Autonomous Driving}, @@ -202,6 +228,7 @@ @inproceedings{kong2020physgan year = {2020}, publisher = {IEEE} } + @inproceedings{lee2015adaptive, author = {Ritchie Lee and Mykel J Kochenderfer and Ole J Mengshoel and Guillaume P Brat and Michael P Owen}, title = {Adaptive Stress Testing of Airborne Collision Avoidance Systems}, @@ -210,6 +237,7 @@ @inproceedings{lee2015adaptive year = {2015}, publisher = {IEEE} } + @techreport{najm2007precrash, author = {Wassim G Najm and John D Smith and Mikio Yanagisawa and others}, title = {Pre-crash Scenario Typology for Crash Avoidance Research}, @@ -223,12 +251,14 @@ @inproceedings{ni2022sentence pages = {1864--1874}, year = {2022} } + @inproceedings{nijkamp2022codegen, author = {Erik Nijkamp and Bo Pang and Hiroaki Hayashi and Lifu Tu and Huan Wang and Yingbo Zhou and Silvio Savarese and Caiming Xiong}, title = {Codegen: An Open Large Language Model for Code with Multi-turn Program Synthesis}, booktitle = {The Eleventh International Conference on Learning Representations}, year = {2022} } + @inproceedings{prakash2019structured, author = {Aayush Prakash and Shaad Boochoon and Mark Brophy and David Acuna and Eric Cameracci and Gavriel State and Omer Shapira and Stan Birchfield}, title = {Structured Domain Randomization: Bridging the Reality Gap by Context-Aware Synthetic Data}, @@ -244,6 +274,7 @@ @inproceedings{rempe2022generating pages = {17305--17315}, year = {2022} } + @inproceedings{rocklage2017automated, author = {Elias Rocklage and Heiko Kraft and Abdullah Karatas and Jörg Seewig}, title = {Automated Scenario Generation for Regression Testing of Autonomous Vehicles}, @@ -251,6 +282,7 @@ @inproceedings{rocklage2017automated pages = {476--483}, year = {2017} } + @article{scanlon2021waymo, author = {John M. Scanlon and Kristofer D. Kusano and Tom Daniel and Christopher Alderson and Alexander Ogle and Trent Victor}, title = {Waymo Simulated Driving Behavior in Reconstructed Fatal Crashes within an Autonomous Vehicle Operating Domain}, @@ -259,6 +291,7 @@ @article{scanlon2021waymo pages = {106454}, year = {2021} } + @article{schulman2017proximal, author = {John Schulman and Filip Wolski and Prafulla Dhariwal and Alec Radford and Oleg Klimov}, title = {Proximal Policy Optimization Algorithms}, @@ -272,12 +305,14 @@ @article{singhal2022large journal = {arXiv preprint arXiv:2212.13138}, year = {2022} } + @inproceedings{szegedy2014intriguing, author = {Christian Szegedy and Wojciech Zaremba and Ilya Sutskever and Joan Bruna and Dumitru Erhan and Ian Goodfellow and Rob Fergus}, title = {Intriguing Properties of Neural Networks}, booktitle = {2nd International Conference on Learning Representations, ICLR 2014}, year = {2014} } + @inproceedings{tan2023language, author = {Shuhan Tan and Boris Ivanovic and Xinshuo Weng and Marco Pavone and Philipp Kraehenbuehl}, title = {Language Conditioned Traffic Generation}, @@ -286,12 +321,14 @@ @inproceedings{tan2023language year = {2023}, publisher = {PMLR} } + @article{touvron2023llama, author = {Hugo Touvron and Thibaut Lavril and Gautier Izacard and Xavier Martinet and Marie-Anne Lachaux and Timothée Lacroix and Baptiste Rozière and Naman Goyal and Eric Hambro and Faisal Azhar and et al.}, title = {Llama: Open and Efficient Foundation Language Models}, journal = {arXiv preprint arXiv:2302.13971}, year = {2023} } + @inproceedings{vanderMade2015automated, author = {Robin van der Made and Martijn Tideman and Ulrich Lages and Roman Katz and Martin Spencer}, title = {Automated generation of virtual driving scenarios from test drive data}, @@ -299,12 +336,14 @@ @inproceedings{vanderMade2015automated year = {2015}, number = {15-0268} } + @inproceedings{Wachi2019failure, author = {Akifumi Wachi}, title = {Failure-scenario maker for rule-based agent using multi-agent adversarial reinforcement learning and its application to autonomous driving}, booktitle = {International Joint Conference on Artificial Intelligence}, year = {2019} } + @inproceedings{Wang2021advSim, author = {Jingkang Wang and Ava Pun and James Tu and Sivabalan Manivasagam and Abbas Sadat and Sergio Casas and Mengye Ren and Raquel Urtasun}, title = {AdvSim: Generating safety-critical scenarios for self-driving vehicles}, @@ -312,12 +351,14 @@ @inproceedings{Wang2021advSim pages = {9909--9918}, year = {2021} } + @article{Wu2023Bloomberggpt, author = {Shijie Wu and Ozan Irsoy and Steven Lu and Vadim Dabravolski and Mark Dredze and Sebastian Gehrmann and Prabhanjan Kambadur and David Rosenberg and Gideon Mann}, title = {BloombergGPT: A large language model for finance}, journal = {arXiv preprint arXiv:2303.17564}, year = {2023} } + @inproceedings{Xu2022Safebench, author = {Chejian Xu and Wenhao Ding and Weijie Lyu and Zuxin Liu and Shuai Wang and Yihan He and Hanjiang Hu and Ding Zhao and Bo Li}, title = {Safebench: A benchmarking platform for safety evaluation of autonomous vehicles}, @@ -326,12 +367,14 @@ @inproceedings{Xu2022Safebench pages = {25667--25682}, year = {2022} } + @article{Xu2023DriveGPT4, author = {Zhenhua Xu and Yujia Zhang and Enze Xie and Zhen Zhao and Yong Guo and Kenneth KY Wong and Zhenguo Li and Hengshuang Zhao}, title = {DriveGPT4: Interpretable end-to-end autonomous driving via large language model}, journal = {arXiv preprint arXiv:2310.01412}, year = {2023} } + @inproceedings{Yang2020SurfelGAN, author = {Zhenpei Yang and Yuning Chai and Dragomir Anguelov and Yin Zhou and Pei Sun and Dumitru Erhan and Sean Rafferty and Henrik Kretzschmar}, title = {SurfelGAN: Synthesizing realistic sensor data for autonomous driving}, @@ -339,12 +382,14 @@ @inproceedings{Yang2020SurfelGAN pages = {11118--11127}, year = {2020} } + @inproceedings{Yao2022React, author = {Shunyu Yao and Jeffrey Zhao and Dian Yu and Nan Du and Izhak Shafran and Karthik R Narasimhan and Yuan Cao}, title = {React: Synergizing reasoning and acting in language models}, booktitle = {The Eleventh International Conference on Learning Representations}, year = {2022} } + @inproceedings{Zhang2023CAT, author = {Linrui Zhang and Zhenghao Peng and Quanyi Li and Bolei Zhou}, title = {CAT: Closed-loop adversarial training for safe end-to-end driving}, @@ -352,24 +397,28 @@ @inproceedings{Zhang2023CAT pages = {2357--2372}, year = {2023} } + @article{Zhang2022AdversarialRobustness, author = {Qingzhao Zhang and Shengtuo Hu and Jiachen Sun and Qi Alfred Chen and Z Morley Mao}, title = {On adversarial robustness of trajectory prediction for autonomous vehicles}, journal = {arXiv preprint arXiv:2201.05057}, year = {2022} } + @article{Zheng2023JudgingLLM, author = {Lianmin Zheng and Wei-Lin Chiang and Ying Sheng and Siyuan Zhuang and Zhanghao Wu and Yonghao Zhuang and Zi Lin and Zhuohan Li and Dacheng Li and Eric Xing and others}, title = {Judging LLM-as-a-judge with MT-Bench and Chatbot Arena}, journal = {arXiv preprint arXiv:2306.05685}, year = {2023} } + @article{zhong2023language, author = {Ziyuan Zhong and Davis Rempe and Yuxiao Chen and Boris Ivanovic and Yulong Cao and Danfei Xu and Marco Pavone and Baishakhi Ray}, title = {Language-guided traffic simulation via scene-level diffusion}, journal = {arXiv preprint arXiv:2306.06344}, year = {2023} } + @article{zhao2025key, author = {赵祥模 and 童星 and 穆柯楠 and 等}, title = {面向自动驾驶汽车测试需求的关键场景要素提取方法}, @@ -378,6 +427,7 @@ @article{zhao2025key year = {2025}, note = {可在以下网址访问: \url{http://kns.cnki.net/kcms/detail/61.1313.U.20250418.1427.006.html}}, } + @article{du2025scene, author = {杜德慧 and 叶振 and 郑成行 and 等}, title = {面向自动驾驶系统的场景建模及边缘关键场景生成}, @@ -386,6 +436,7 @@ @article{du2025scene year = {2025}, note = {DOI: \url{https://doi.org/10.13328/j.cnki.jos.007348}}, } + @article{peng2025data, author = {彭海洋 and 计卫星 and 刘法旺}, title = {基于多节点仿真的自动驾驶场景数据保护方法}, @@ -394,6 +445,7 @@ @article{peng2025data year = {2025}, note = {链接: \url{http://kns.cnki.net/kcms/detail/50.1206.U.20250402.1146.002.html}}, } + @article{fang2025yolo, author = {方虹苏 and 常城 and 石鑫雨 and 等}, title = {自动驾驶场景中YOLO目标检测算法的应用研究}, @@ -404,6 +456,7 @@ @article{fang2025yolo year = {2025} } + @article{wu2025taxi, author = {伍毅平 and 张鸿鹏 and 陈家源 and 等}, title = {考虑场景与驾驶风格差异的出租车驾驶人驾驶行为特性分析}, @@ -412,6 +465,7 @@ @article{wu2025taxi year = {2025}, url = {http://kns.cnki.net/kcms/detail/42.1824.U.20250319.1733.016.html}, } + @article{song2025lanechange, author = {宋华 and 吴贤静 and 吴琼 and 等}, title = {基于自然驾驶数据构建仿真测试变道切入场景库的方法}, @@ -420,6 +474,7 @@ @article{song2025lanechange year = {2025}, url = {http://kns.cnki.net/kcms/detail/50.1206.u.20250228.1707.002.html}, } + @article{wang2025drivingbehavior, author = {王润民 and 何佳浚 and 冯皓}, title = {跟随自动驾驶汽车行驶场景下的驾驶人行为分析与建模}, @@ -428,6 +483,7 @@ @article{wang2025drivingbehavior year = {2025}, url = {http://kns.cnki.net/kcms/detail/11.2127.TP.20250225.0933.002.html}, } + @article{lv2025neuralrendering, author = {吕叶祥子 and 蒋渊德 and 宋家乐 and 等}, title = {基于神经渲染的自动驾驶场景解耦表征与感知数据生成}, @@ -436,6 +492,7 @@ @article{lv2025neuralrendering year = {2025}, url = {http://kns.cnki.net/kcms/detail/50.1206.U.20250219.1136.004.html}, } + @article{wu2025complexscenes, author = {武彪 and 任洪泽 and 郑联庆 and 等}, title = {基于自然驾驶行为的智能驾驶复杂场景构建方法}, @@ -445,6 +502,7 @@ @article{wu2025complexscenes pages = {38--47}, year = {2025}, } + @article{gu2025reinforcementlearning, author = {顾同成 and 徐东伟 and 孙成巨}, title = {无人驾驶深度强化学习决策模型性能评测方法综述}, @@ -454,6 +512,7 @@ @article{gu2025reinforcementlearning note = {在线发表}, url = {http://kns.cnki.net/kcms/detail/11.2127.TP.20250414.1614.026.html} } + @article{zhu2024tsgan, author = {朱宇 and 徐志刚 and 赵祥模 and 等}, title = {基于TsGAN的自动驾驶汽车高速公路变道切入测试场景自动生成算法}, diff --git a/scene/undergraduate/hutbthesis.cls b/scene/undergraduate/hutbthesis.cls index 83a4b17..10456fe 100644 --- a/scene/undergraduate/hutbthesis.cls +++ b/scene/undergraduate/hutbthesis.cls @@ -54,10 +54,10 @@ \newif\ifhutb@type@graduate \hutb@type@graduatefalse \ifhutb@type@master - \hutb@type@graduatetrue +\hutb@type@graduatetrue \fi \ifhutb@type@doctor - \hutb@type@graduatetrue +\hutb@type@graduatetrue \fi % 定义致谢环境,盲审下隐藏致谢 @@ -74,831 +74,869 @@ % \pkg{fontspec} 宏包 \opt{no-math} 选项,避免部分数学符号字体自动调整为 CMR。 % 并使用 \opt{quiet} 忽略警告。 % \begin{macrocode} -% \PassOptionsToPackage{no-math,quiet}{fontspec} -\PassOptionsToPackage{no-math}{fontspec} - -\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} -\ProcessOptions\relax - - -% 读取基类 -% \LoadClass[a4paper,12pt]{article} -\LoadClass[UTF8,openany,a4paper,oneside,zihao=-4]{ctexbook} -% 注意openany和oneside参数,默认是无空白页不区分双面印。 - -% 加载宏包 -% 引擎执行判断宏包 -\RequirePackage{ifxetex} -% 加载xparse宏包 -\RequirePackage{xparse} -% 报错与警告 -\NewDocumentCommand{\hutb@error}{ m o }{ - \ClassError{hutbthesis_error}{#1}{#2} -} -\NewDocumentCommand{\hutb@warning}{m o }{ - \ClassWarning{hutbthesis_warning}{#1}{#2} -} - -\RequireXeTeX -\ifxetex - % Pass -\else - \hutb@error{Please use xelatex driver instead of pdflatex.} -\fi - -% 支持中文的 ctex 宏包 -\RequirePackage{ctex} -% 页面布局 -\RequirePackage{geometry} -% 使用 \pkg{amsmath} 处理数学公式 -\RequirePackage{amsmath} -% 下面的数学宏包和unicode-math 冲突 -% \RequirePackage{amsfonts} -% \RequirePackage{amssymb} -% \RequirePackage{bm} -% 使用 \pkg{unicode-math} 处理数学字体 -\RequirePackage{unicode-math} -% 算法排版宏包 -\RequirePackage[chapter]{algorithm} -\RequirePackage{algorithmic} -\floatname{algorithm}{算法} - -% 自定义关键词 -\RequirePackage{pgfkeys} -% 设置目录 -\RequirePackage{titletoc} -% 设置字体 -\RequirePackage{fontenc} -% 设置颜色 -\RequirePackage{xcolor} -% 下划线换行 -\RequirePackage{ulem} -% 设置页眉和页脚 -\RequirePackage{fancyhdr} -% 代码高亮 -% 注:该包依赖python环境Pygments语法高亮显示工具包 -% 并且需要 -shell-escape参数 -% TODO: 日后需要修改为可配置 - -% 超链接 hyperref 的设置 -% 提供书签与链接 -\RequirePackage{hyperref} -% 插入图片 -\RequirePackage{graphicx} -% 表格 -\RequirePackage{array} -% 长表格 -\RequirePackage{longtable} -% booktabs 提供了\toprule 等命令. -\RequirePackage{booktabs} -% multirow 支持在表格中跨行 -\RequirePackage{multirow} -% 调整间隔, 让表格更好看些 -\RequirePackage{bigstrut} -%在跨行表格中输入定界符 -\RequirePackage{bigdelim} -% 保护脆弱命令 -\RequirePackage{cprotect} -% 设置代码高亮 -% \RequirePackage{minted} -% 设置代码环境 -\RequirePackage{listings} -\lstset{ - breaklines, - columns=fixed, - numbers=none, % 在左侧显示行号 - numberstyle=\tiny\color{gray}, % 设定行号格式 - frame=single, % 不显示背景边框 - rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here)) -% backgroundcolor=\color[RGB]{245,245,244}, % 设定背景颜色 - keywordstyle=\color[RGB]{40,40,255}, % 设定关键字颜色 - numberstyle=\footnotesize\color{darkgray}, - commentstyle=\it\color[RGB]{0,96,96}, % 设置代码注释的格式 - stringstyle=\rmfamily\slshape\color[RGB]{128,0,0}, % 设置字符串格式 - showstringspaces=false, % 不显示字符串中的空格 - language=c++, % 设置语言 - aboveskip=20pt -} - - -% jing: ccaption宏包不能出现在 caption 宏包之后 -% 设置浮动体的标题 -\RequirePackage[justification=centering]{caption} -\RequirePackage[justification=centering]{subcaption} -% 定制列表环境 -\RequirePackage{enumitem} -% 提供\AtBeginEnvironment以方便全局调整一些结构的设置 -\RequirePackage{etoolbox} -% 确定宏定义的位置 -\RequirePackage{filehook} -% 枚举 -\RequirePackage{enumitem} -% 末尾页 -\RequirePackage{lastpage} -% -% \RequirePackage{hypdoc} - -% 参考文献格式 GB/T7714-2015 -% 来自https://github.com/hushidong/biblatex-gb7714-2015 -\RequirePackage[backend=biber,gbpub=false, style=gb7714-2015]{biblatex} - -\AtEndOfClass{ -% 根据模板类型加载不同配置 - -%\input{undergraduate.cls} -%\ifhutb@type@graduate -% \input{graduate.cls} -%\else -% \input{undergraduate.cls} -% % \input{test.cls} -%\fi -} - - -% 字体配置 -\let\sjtu@font@family@xits\@empty -\newcommand\sjtu@font@set@xits@names{% - \ifx\sjtu@font@family@xits\@empty - \IfFontExistsTF{XITSMath-Regular.otf}{% - \gdef\sjtu@font@family@xits{XITS}% - \gdef\sjtu@font@style@xits@rm{Regular}% - \gdef\sjtu@font@style@xits@bf{Bold}% - \gdef\sjtu@font@style@xits@it{Italic}% - \gdef\sjtu@font@style@xits@bfit{BoldItalic}% - \gdef\sjtu@font@name@xits@math@rm{XITSMath-Regular}% - \gdef\sjtu@font@name@xits@math@bf{XITSMath-Bold}% - }{% - \gdef\sjtu@font@family@xits{xits}% - \gdef\sjtu@font@style@xits@rm{regular}% - \gdef\sjtu@font@style@xits@bf{bold}% - \gdef\sjtu@font@style@xits@it{italic}% - \gdef\sjtu@font@style@xits@bfit{bolditalic}% - \gdef\sjtu@font@name@xits@math@rm{xits-math}% - \gdef\sjtu@font@name@xits@math@bf{xits-mathbold}% - }% - \fi -} -\let\sjtu@font@family@libertinus\@empty -\newcommand\sjtu@font@set@libertinus@names{% - \ifx\sjtu@font@family@libertinus\@empty - \IfFontExistsTF{LibertinusSerif-Regular.otf}{% - \gdef\sjtu@font@family@libertinus@serif{LibertinusSerif}% - \gdef\sjtu@font@family@libertinus@sans{LibertinusSans}% - \gdef\sjtu@font@name@libertinus@math{LibertinusMath-Regular}% - \gdef\sjtu@font@style@libertinus@rm{Regular}% - \gdef\sjtu@font@style@libertinus@bf{Bold}% - \gdef\sjtu@font@style@libertinus@it{Italic}% - \gdef\sjtu@font@style@libertinus@bfit{BoldItalic}% - }{% - \gdef\sjtu@font@family@libertinus@serif{libertinusserif}% - \gdef\sjtu@font@family@libertinus@sans{libertinussans}% - \gdef\sjtu@font@name@libertinus@math{libertinusmath-regular}% - \gdef\sjtu@font@style@libertinus@rm{regular}% - \gdef\sjtu@font@style@libertinus@bf{bold}% - \gdef\sjtu@font@style@libertinus@it{italic}% - \gdef\sjtu@font@style@libertinus@bfit{bolditalic}% - }% + % \PassOptionsToPackage{no-math,quiet}{fontspec} + \PassOptionsToPackage{no-math}{fontspec} + + \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} + \ProcessOptions\relax + + + % 读取基类 + % \LoadClass[a4paper,12pt]{article} + \LoadClass[UTF8,openany,a4paper,oneside,zihao=-4]{ctexbook} + % 注意openany和oneside参数,默认是无空白页不区分双面印。 + + % 加载宏包 + % 引擎执行判断宏包 + \RequirePackage{ifxetex} + % 加载xparse宏包 + \RequirePackage{xparse} + % 报错与警告 + \NewDocumentCommand{\hutb@error}{ m o }{ + \ClassError{hutbthesis_error}{#1}{#2} + } + \NewDocumentCommand{\hutb@warning}{m o }{ + \ClassWarning{hutbthesis_warning}{#1}{#2} + } + + \RequireXeTeX + \ifxetex + % Pass + \else + \hutb@error{Please use xelatex driver instead of pdflatex.} \fi -} -\newcommand\sjtu@set@font@xits{% - \sjtu@font@set@xits@names - \setmainfont{\sjtu@font@family@xits}[ - Extension = .otf, - UprightFont = *-\sjtu@font@style@xits@rm, - BoldFont = *-\sjtu@font@style@xits@bf, - ItalicFont = *-\sjtu@font@style@xits@it, - BoldItalicFont = *-\sjtu@font@style@xits@bfit, - ] -} -\newcommand\sjtu@set@font@times{% - \setmainfont{Times New Roman}[Ligatures = Rare] - \setsansfont{Arial} - \setmonofont{Courier New}[Scale = MatchLowercase] -} -\newcommand\sjtu@set@font@stix{% - \setmainfont{STIX2Text}[ - Extension = .otf, - UprightFont = *-Regular, - BoldFont = *-Bold, - ItalicFont = *-Italic, - BoldItalicFont = *-BoldItalic, - ] -} -\newcommand\sjtu@set@font@step{% - \setmainfont{STEP}[ - Extension = .otf, - UprightFont = *-Regular, - BoldFont = *-Bold, - ItalicFont = *-Italic, - BoldItalicFont = *-BoldItalic, - ] -} -\newcommand\sjtu@set@font@source@sans@mono{% - \setsansfont{SourceSansPro}[ - Extension = .otf, - UprightFont = *-Regular , - ItalicFont = *-RegularIt , - BoldFont = *-Bold , - BoldItalicFont = *-BoldIt, - ] - \setmonofont{SourceCodePro}[ - Extension = .otf, - UprightFont = *-Regular , - ItalicFont = *-RegularIt , - BoldFont = *-Bold , - BoldItalicFont = *-BoldIt, - Scale = MatchLowercase, - ] -} -\newcommand\sjtu@set@font@termes{% - \setmainfont{texgyretermes}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-italic, - BoldItalicFont = *-bolditalic, - ]% -} -\newcommand\sjtu@set@font@pagella{% - \setmainfont{texgyrepagella}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-italic, - BoldItalicFont = *-bolditalic, - ]% -} -\newcommand\sjtu@set@font@texgyre@sans@mono{% - \setsansfont{texgyreheros}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-italic, - BoldItalicFont = *-bolditalic, - ]% - \setmonofont{texgyrecursor}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-italic, - BoldItalicFont = *-bolditalic, - ]% -} -\newcommand\sjtu@set@font@cambria{% - \setmainfont{Cambria} - \setsansfont{Calibri} - \setmonofont{Consolas}[Scale = MatchLowercase] -} -\newcommand\sjtu@set@font@libertinus{% - \sjtu@font@set@libertinus@names - \setmainfont{\sjtu@font@family@libertinus@serif}[ - Extension = .otf, - UprightFont = *-\sjtu@font@style@libertinus@rm, - BoldFont = *-\sjtu@font@style@libertinus@bf, - ItalicFont = *-\sjtu@font@style@libertinus@it, - BoldItalicFont = *-\sjtu@font@style@libertinus@bfit, - ]% - \setsansfont{\sjtu@font@family@libertinus@sans}[ - Extension = .otf, - UprightFont = *-\sjtu@font@style@libertinus@rm, - BoldFont = *-\sjtu@font@style@libertinus@bf, - ItalicFont = *-\sjtu@font@style@libertinus@it, - ]% - \setmonofont{lmmonolt10}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-oblique, - BoldItalicFont = *-boldoblique, - ]% -} -\newcommand\sjtu@set@font@lm{% - \setmainfont{lmroman10}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-italic, - BoldItalicFont = *-bolditalic, - ]% - \setsansfont{lmsans10}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-oblique, - BoldItalicFont = *-boldoblique, - ]% - \setmonofont{lmmonolt10}[ - Extension = .otf, - UprightFont = *-regular, - BoldFont = *-bold, - ItalicFont = *-oblique, - BoldItalicFont = *-boldoblique, - ]% -} -% 使用 \pkg{unicode-math} 配置数学字体。 -\unimathsetup{ - math-style = ISO, - bold-style = ISO, - nabla = upright, - partial = upright, -} -\newcommand\sjtu@set@math@font@xits{% - \sjtu@font@set@xits@names - \setmathfont{\sjtu@font@name@xits@math@rm}[ - Extension = .otf, - BoldFont = \sjtu@font@name@xits@math@bf, - StylisticSet = 8, - ]% - \setmathfont{\sjtu@font@name@xits@math@rm}[ - Extension = .otf, - BoldFont = \sjtu@font@name@xits@math@bf, - StylisticSet = 1, - range = {cal,bfcal}, - ]% -} -\newcommand\sjtu@set@math@font@stix{% - \setmathfont{STIX2Math}[ - Extension = .otf, - StylisticSet = 8, - ]% - \setmathfont{STIX2Math}[ - Extension = .otf, - StylisticSet = 1, - range = {cal,bfcal}, - ]% -} -\newcommand\sjtu@set@math@font@step{% - \setmathfont{STEPMath-Regular}[ - Extension = .otf, - BoldFont = STEPMath-Bold, - StylisticSet = 8, - ]% - \setmathfont{STEPMath-Regular}[ - Extension = .otf, - BoldFont = STEPMath-Bold, - StylisticSet = 1, - range = {cal,bfcal}, - ]% -} -\newcommand\sjtu@set@math@font@termes{% - \setmathfont{texgyretermes-math.otf} -} -\newcommand\sjtu@set@math@font@pagella{% - \setmathfont{texgyrepagella-math.otf} -} -\newcommand\sjtu@set@math@font@cambria{% - \setmathfont{Cambria Math} -} -\newcommand\sjtu@set@math@font@libertinus{% - \sjtu@font@set@libertinus@names - \setmathfont{\sjtu@font@name@libertinus@math .otf}% -} -\newcommand\sjtu@set@math@font@lm{% - \setmathfont{latinmodern-math.otf}% -} -% \end{macrocode} + + % 支持中文的 ctex 宏包 + \RequirePackage{ctex} + % 页面布局 + \RequirePackage{geometry} + % 使用 \pkg{amsmath} 处理数学公式 + \RequirePackage{amsmath} + % 下面的数学宏包和unicode-math 冲突 + % \RequirePackage{amsfonts} + % \RequirePackage{amssymb} + % \RequirePackage{bm} + % 使用 \pkg{unicode-math} 处理数学字体 + \RequirePackage{unicode-math} + % 算法排版宏包 + \RequirePackage[chapter]{algorithm} + \RequirePackage{algorithmic} + \floatname{algorithm}{算法} + + % 自定义关键词 + \RequirePackage{pgfkeys} + % 设置目录 + \RequirePackage{titletoc} + % 设置字体 + \RequirePackage{fontenc} + % 设置颜色 + \RequirePackage{xcolor} + % 下划线换行 + \RequirePackage{ulem} + % 设置页眉和页脚 + \RequirePackage{fancyhdr} + % 代码高亮 + % 注:该包依赖python环境Pygments语法高亮显示工具包 + % 并且需要 -shell-escape参数 + % TODO: 日后需要修改为可配置 + + % 超链接 hyperref 的设置 + % 提供书签与链接 + \RequirePackage{hyperref} + % 插入图片 + \RequirePackage{graphicx} + % 表格 + \RequirePackage{array} + % 长表格 + \RequirePackage{longtable} + % booktabs 提供了\toprule 等命令. + \RequirePackage{booktabs} + % multirow 支持在表格中跨行 + \RequirePackage{multirow} + % 调整间隔, 让表格更好看些 + \RequirePackage{bigstrut} + %在跨行表格中输入定界符 + \RequirePackage{bigdelim} + % 保护脆弱命令 + \RequirePackage{cprotect} + % 设置代码高亮 + % \RequirePackage{minted} + % 设置代码环境 + \RequirePackage{listings} + \lstset{ + breaklines, + columns=fixed, + numbers=none, % 在左侧显示行号 + numberstyle=\tiny\color{gray}, % 设定行号格式 + frame=single, % 不显示背景边框 + rulecolor=\color{black}, % if not set, the frame-color may be changed on line-breaks within not-black text (e.g. commens (green here)) + % backgroundcolor=\color[RGB]{245,245,244}, % 设定背景颜色 + keywordstyle=\color[RGB]{40,40,255}, % 设定关键字颜色 + numberstyle=\footnotesize\color{darkgray}, + commentstyle=\it\color[RGB]{0,96,96}, % 设置代码注释的格式 + stringstyle=\rmfamily\slshape\color[RGB]{128,0,0}, % 设置字符串格式 + showstringspaces=false, % 不显示字符串中的空格 + language=c++, % 设置语言 + aboveskip=20pt + } + + + % jing: ccaption宏包不能出现在 caption 宏包之后 + % 设置浮动体的标题 + \RequirePackage[justification=centering]{caption} + \RequirePackage[justification=centering]{subcaption} + % 定制列表环境 + \RequirePackage{enumitem} + % 提供\AtBeginEnvironment以方便全局调整一些结构的设置 + \RequirePackage{etoolbox} + % 确定宏定义的位置 + \RequirePackage{filehook} + % 枚举 + \RequirePackage{enumitem} + % 末尾页 + \RequirePackage{lastpage} + % + % \RequirePackage{hypdoc} + + % 参考文献格式 GB/T7714-2015 + % 来自https://github.com/hushidong/biblatex-gb7714-2015 + \RequirePackage[backend=biber,gbpub=false, style=gb7714-2015]{biblatex} + + \AtEndOfClass{ + % 根据模板类型加载不同配置 + + %\input{undergraduate.cls} + %\ifhutb@type@graduate + % \input{graduate.cls} + %\else + % \input{undergraduate.cls} + % % \input{test.cls} + %\fi + } + + + % 字体配置 + \let\sjtu@font@family@xits\@empty + \newcommand\sjtu@font@set@xits@names{% + \ifx\sjtu@font@family@xits\@empty + \IfFontExistsTF{XITSMath-Regular.otf}{% + \gdef\sjtu@font@family@xits{XITS}% + \gdef\sjtu@font@style@xits@rm{Regular}% + \gdef\sjtu@font@style@xits@bf{Bold}% + \gdef\sjtu@font@style@xits@it{Italic}% + \gdef\sjtu@font@style@xits@bfit{BoldItalic}% + \gdef\sjtu@font@name@xits@math@rm{XITSMath-Regular}% + \gdef\sjtu@font@name@xits@math@bf{XITSMath-Bold}% + }{% + \gdef\sjtu@font@family@xits{xits}% + \gdef\sjtu@font@style@xits@rm{regular}% + \gdef\sjtu@font@style@xits@bf{bold}% + \gdef\sjtu@font@style@xits@it{italic}% + \gdef\sjtu@font@style@xits@bfit{bolditalic}% + \gdef\sjtu@font@name@xits@math@rm{xits-math}% + \gdef\sjtu@font@name@xits@math@bf{xits-mathbold}% + }% + \fi + } + \let\sjtu@font@family@libertinus\@empty + \newcommand\sjtu@font@set@libertinus@names{% + \ifx\sjtu@font@family@libertinus\@empty + \IfFontExistsTF{LibertinusSerif-Regular.otf}{% + \gdef\sjtu@font@family@libertinus@serif{LibertinusSerif}% + \gdef\sjtu@font@family@libertinus@sans{LibertinusSans}% + \gdef\sjtu@font@name@libertinus@math{LibertinusMath-Regular}% + \gdef\sjtu@font@style@libertinus@rm{Regular}% + \gdef\sjtu@font@style@libertinus@bf{Bold}% + \gdef\sjtu@font@style@libertinus@it{Italic}% + \gdef\sjtu@font@style@libertinus@bfit{BoldItalic}% + }{% + \gdef\sjtu@font@family@libertinus@serif{libertinusserif}% + \gdef\sjtu@font@family@libertinus@sans{libertinussans}% + \gdef\sjtu@font@name@libertinus@math{libertinusmath-regular}% + \gdef\sjtu@font@style@libertinus@rm{regular}% + \gdef\sjtu@font@style@libertinus@bf{bold}% + \gdef\sjtu@font@style@libertinus@it{italic}% + \gdef\sjtu@font@style@libertinus@bfit{bolditalic}% + }% + \fi + } + \newcommand\sjtu@set@font@xits{% + \sjtu@font@set@xits@names + \setmainfont{\sjtu@font@family@xits}[ + Extension = .otf, + UprightFont = *-\sjtu@font@style@xits@rm, + BoldFont = *-\sjtu@font@style@xits@bf, + ItalicFont = *-\sjtu@font@style@xits@it, + BoldItalicFont = *-\sjtu@font@style@xits@bfit, + ] + } + \newcommand\sjtu@set@font@times{% + \setmainfont{Times New Roman}[Ligatures = Rare] + \setsansfont{Arial} + \setmonofont{Courier New}[Scale = MatchLowercase] + } + \newcommand\sjtu@set@font@stix{% + \setmainfont{STIX2Text}[ + Extension = .otf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic, + BoldItalicFont = *-BoldItalic, + ] + } + \newcommand\sjtu@set@font@step{% + \setmainfont{STEP}[ + Extension = .otf, + UprightFont = *-Regular, + BoldFont = *-Bold, + ItalicFont = *-Italic, + BoldItalicFont = *-BoldItalic, + ] + } + \newcommand\sjtu@set@font@source@sans@mono{% + \setsansfont{SourceSansPro}[ + Extension = .otf, + UprightFont = *-Regular , + ItalicFont = *-RegularIt , + BoldFont = *-Bold , + BoldItalicFont = *-BoldIt, + ] + \setmonofont{SourceCodePro}[ + Extension = .otf, + UprightFont = *-Regular , + ItalicFont = *-RegularIt , + BoldFont = *-Bold , + BoldItalicFont = *-BoldIt, + Scale = MatchLowercase, + ] + } + \newcommand\sjtu@set@font@termes{% + \setmainfont{texgyretermes}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, + ]% + } + \newcommand\sjtu@set@font@pagella{% + \setmainfont{texgyrepagella}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, + ]% + } + \newcommand\sjtu@set@font@texgyre@sans@mono{% + \setsansfont{texgyreheros}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, + ]% + \setmonofont{texgyrecursor}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, + ]% + } + \newcommand\sjtu@set@font@cambria{% + \setmainfont{Cambria} + \setsansfont{Calibri} + \setmonofont{Consolas}[Scale = MatchLowercase] + } + \newcommand\sjtu@set@font@libertinus{% + \sjtu@font@set@libertinus@names + \setmainfont{\sjtu@font@family@libertinus@serif}[ + Extension = .otf, + UprightFont = *-\sjtu@font@style@libertinus@rm, + BoldFont = *-\sjtu@font@style@libertinus@bf, + ItalicFont = *-\sjtu@font@style@libertinus@it, + BoldItalicFont = *-\sjtu@font@style@libertinus@bfit, + ]% + \setsansfont{\sjtu@font@family@libertinus@sans}[ + Extension = .otf, + UprightFont = *-\sjtu@font@style@libertinus@rm, + BoldFont = *-\sjtu@font@style@libertinus@bf, + ItalicFont = *-\sjtu@font@style@libertinus@it, + ]% + \setmonofont{lmmonolt10}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-oblique, + BoldItalicFont = *-boldoblique, + ]% + } + \newcommand\sjtu@set@font@lm{% + \setmainfont{lmroman10}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-italic, + BoldItalicFont = *-bolditalic, + ]% + \setsansfont{lmsans10}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-oblique, + BoldItalicFont = *-boldoblique, + ]% + \setmonofont{lmmonolt10}[ + Extension = .otf, + UprightFont = *-regular, + BoldFont = *-bold, + ItalicFont = *-oblique, + BoldItalicFont = *-boldoblique, + ]% + } + % 使用 \pkg{unicode-math} 配置数学字体。 + \unimathsetup{ + math-style = ISO, + bold-style = ISO, + nabla = upright, + partial = upright, + } + \newcommand\sjtu@set@math@font@xits{% + \sjtu@font@set@xits@names + \setmathfont{\sjtu@font@name@xits@math@rm}[ + Extension = .otf, + BoldFont = \sjtu@font@name@xits@math@bf, + StylisticSet = 8, + ]% + \setmathfont{\sjtu@font@name@xits@math@rm}[ + Extension = .otf, + BoldFont = \sjtu@font@name@xits@math@bf, + StylisticSet = 1, + range = {cal,bfcal}, + ]% + } + \newcommand\sjtu@set@math@font@stix{% + \setmathfont{STIX2Math}[ + Extension = .otf, + StylisticSet = 8, + ]% + \setmathfont{STIX2Math}[ + Extension = .otf, + StylisticSet = 1, + range = {cal,bfcal}, + ]% + } + \newcommand\sjtu@set@math@font@step{% + \setmathfont{STEPMath-Regular}[ + Extension = .otf, + BoldFont = STEPMath-Bold, + StylisticSet = 8, + ]% + \setmathfont{STEPMath-Regular}[ + Extension = .otf, + BoldFont = STEPMath-Bold, + StylisticSet = 1, + range = {cal,bfcal}, + ]% + } + \newcommand\sjtu@set@math@font@termes{% + \setmathfont{texgyretermes-math.otf} + } + \newcommand\sjtu@set@math@font@pagella{% + \setmathfont{texgyrepagella-math.otf} + } + \newcommand\sjtu@set@math@font@cambria{% + \setmathfont{Cambria Math} + } + \newcommand\sjtu@set@math@font@libertinus{% + \sjtu@font@set@libertinus@names + \setmathfont{\sjtu@font@name@libertinus@math .otf}% + } + \newcommand\sjtu@set@math@font@lm{% + \setmathfont{latinmodern-math.otf}% + } + % \end{macrocode} % % 设置西文字体集。 % \begin{macrocode} -\newcommand\sjtu@load@fontset@xits{% - \sjtu@set@font@xits - \sjtu@set@font@source@sans@mono - \sjtu@set@math@font@xits -} -\newcommand\sjtu@load@fontset@times{% - \sjtu@set@font@times - \sjtu@set@math@font@xits -} -\newcommand\sjtu@load@fontset@stix{% - \sjtu@set@font@stix - \sjtu@set@font@source@sans@mono - \sjtu@set@math@font@stix -} -\newcommand\sjtu@load@fontset@step{% - \sjtu@set@font@step - \sjtu@set@font@source@sans@mono - \sjtu@set@math@font@step -} -\newcommand\sjtu@load@fontset@termes{% - \sjtu@set@font@termes - \sjtu@set@font@texgyre@sans@mono - \sjtu@set@math@font@termes -} -\newcommand\sjtu@load@fontset@pagella{% - \sjtu@set@font@pagella - \sjtu@set@font@texgyre@sans@mono - \sjtu@set@math@font@pagella -} -\newcommand\sjtu@load@fontset@cambria{% - \sjtu@set@font@cambria - \sjtu@set@math@font@cambria -} -\newcommand\sjtu@load@fontset@libertinus{% - \sjtu@set@font@libertinus - \sjtu@set@math@font@libertinus -} -\newcommand\sjtu@load@fontset@lm{% - \sjtu@set@font@lm - \sjtu@set@math@font@lm -} -\newcommand\sjtu@load@fontset@none{\relax} -% \end{macrocode} + \newcommand\sjtu@load@fontset@xits{% + \sjtu@set@font@xits + \sjtu@set@font@source@sans@mono + \sjtu@set@math@font@xits + } + \newcommand\sjtu@load@fontset@times{% + \sjtu@set@font@times + \sjtu@set@math@font@xits + } + \newcommand\sjtu@load@fontset@stix{% + \sjtu@set@font@stix + \sjtu@set@font@source@sans@mono + \sjtu@set@math@font@stix + } + \newcommand\sjtu@load@fontset@step{% + \sjtu@set@font@step + \sjtu@set@font@source@sans@mono + \sjtu@set@math@font@step + } + \newcommand\sjtu@load@fontset@termes{% + \sjtu@set@font@termes + \sjtu@set@font@texgyre@sans@mono + \sjtu@set@math@font@termes + } + \newcommand\sjtu@load@fontset@pagella{% + \sjtu@set@font@pagella + \sjtu@set@font@texgyre@sans@mono + \sjtu@set@math@font@pagella + } + \newcommand\sjtu@load@fontset@cambria{% + \sjtu@set@font@cambria + \sjtu@set@math@font@cambria + } + \newcommand\sjtu@load@fontset@libertinus{% + \sjtu@set@font@libertinus + \sjtu@set@math@font@libertinus + } + \newcommand\sjtu@load@fontset@lm{% + \sjtu@set@font@lm + \sjtu@set@math@font@lm + } + \newcommand\sjtu@load@fontset@none{\relax} + % \end{macrocode} % % 载入西文字体集。 % \begin{macrocode} -% \newcommand\sjtu@load@fontset{% - % \@nameuse{sjtu@load@fontset@\sjtu@latinfontset} - % } -% latinfontset 是hutb的key 使用 对应的kv接口调用 现在没有实现 -% \sjtu@load@fontset@latinfontset -\sjtu@load@fontset@times -% linux系统请使用 stix -% \sjtu@load@fontset@stix -% \sjtu@option@hook{sjtu}{latinfontset}{% - % \sjtu@load@fontset - % } - - -\newcommand\hutb@pdfbookmark[2]{} -% 定义通用的chapter命令 -\NewDocumentCommand{\hutb@chapter}{s m}{ - \if@openright\cleardoublepage\else\clearpage\fi -% \addcontentsline{toc}{chapter}{#1}% -% \hutb@pdfbookmark{0}{#1} - \IfBooleanTF{#1}{ - \hutb@pdfbookmark{0}{#2} - }{ - \addcontentsline{toc}{chapter}{#2} - } - \chapter*{#2} -} - - -\AtEndOfPackageFile*{hyperref}{ - \hypersetup{ - linktoc = all, - bookmarksdepth = 2, - bookmarksnumbered = true, - bookmarksopen = true, - bookmarksopenlevel = 1, - unicode = true, - psdextra = true, - breaklinks = true, - plainpages = false, - pdfdisplaydoctitle = true, - hidelinks, - } - \newcounter{hutb@bookmark} - \renewcommand\hutb@pdfbookmark[2]{% - \phantomsection - \stepcounter{hutb@bookmark}% - \pdfbookmark[#1]{#2}{hutbchapter.\thehutb@bookmark}% - } -% \renewcommand\sjtu@phantomsection{% -% \phantomsection -% } -% \pdfstringdefDisableCommands{% -% \let\\\@empty -% \let\quad\@empty -% \let\hspace\@gobble -% } -% \@ifpackagelater{hyperref}{2019/04/27}{}{% -% \g@addto@macro\psdmapshortnames{\let\mu\textmu} -% }% -% \AtBeginDocument{% -% \hypersetup{ -% pdftitle = \sjtu@info@title, -% pdfsubject = \sjtu@name@subject, -% pdfkeywords = \sjtu@info@keywords, -% pdfauthor = \sjtu@info@author, -% pdfcreator = {LaTeX with SJTUThesis \version} -% } -% }% -} - - -% 定制titlepage -% 定义命令和定义相应的宏。 -%----------------------------------------------------------------------% -% 预定义全局使用的文字,如姓名、专业等信息,在content/info.tex中定义 -%----------------------------------------------------------------------% -% 以下定义封面相关命令和相应的宏,以titleen为例,\titleen为实际在源码中使用的命令,一旦执行就会因为\gdef\@titleen{#1}使得其产生一个\@titleen的宏,而该宏能够在后续的环境中使用。 -% TODO: 之后版本迁移至公共模板入口hutbthesis.cls 处(放置在引入子模版之后) -\newcommand*{\titlecn}[1]{\gdef\@titlecn{#1}} % 中文标题 -\newcommand*{\titleen}[1]{\gdef\@titleen{#1}} % 英文标题 -\newcommand*{\priormajor}[1]{\gdef\@priormajor{#1}} % 一级学科(学科专业) -\newcommand*{\minormajor}[1]{\gdef\@minormajor{#1}} % 二级学科(学科方向) -\newcommand*{\interestmajor}[1]{\gdef\@interestmajor{#1}} % 研究方向,关键词组 -\newcommand*{\department}[1]{\gdef\@department{#1}} % 二级培养单位 -\newcommand*{\supervisor}[1]{\gdef\@supervisor{#1}} % 导师 -\newcommand*{\myclass}[1]{\gdef\@myclass{#1}} % 班级 -\newcommand*{\subsupervisor}[1]{\gdef\@subsupervisor{#1}} % 副导师 -\newcommand*{\studentid}[1]{\gdef\@studentid{#1}} % 学号 - -\newcommand*{\clcnumber}[1]{\gdef\@clcnumber{#1}} % 中图分类号 Chinese Library Classification -\newcommand*{\schoolcode}[1]{\gdef\@schoolcode{#1}} % 学校代码 -\newcommand*{\udc}[1]{\gdef\@udc{#1}} % UDC -\newcommand*{\academiccategory}[1]{\gdef\@academiccategory{#1}} % 学术类别 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 页面布局 -% -% 设置页边距以及版芯行间距设置 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 边距要求上2.5cm,下2.5cm,左3cm,右2cm -\geometry{top=2.5cm,bottom=2.5cm,left=3cm,right=2cm} -% 本科生从摘要开始就要有 -% 设置页眉和页脚 % -\pagestyle{fancy} -% 本科学位论文底部样式 -\newcommand{\hutb@thepage@format@zh}[2]{第~{#1}~页 共~{#2}~页} -\newcommand{\hutb@thepage@format@en}[1]{#1} -% 空白页清空页眉页脚 -\patchcmd{\cleardoublepage}{\newpage}{\thispagestyle{empty}\newpage}{}{} -% 对章节首页的特殊page style清除页眉页脚 -\patchcmd{\chapter}{\thispagestyle}{\@gobble}{}{} -% 内芯页眉设置 -\ifhutb@type@print -\fancyhead[L]{\includegraphics[scale=0.10]{hutb_logo_maoti.png}} -\else -\fancyhead[L]{\includegraphics[scale=0.10]{hutb_logo_maoti.png}} -\fi -% \fancyhf[RH]{\heiti \zihao{-5} {图像与激光融合的轨道扣件脱落检测}} % 设置所有(奇数和偶数)右侧页眉 -% UPDATE 更新配置为论文标题 -\fancyhf[RH]{\heiti \zihao{-5} {\@titlecn}} -% frontmatter设置 -\renewcommand{\frontmatter}{ - \cleardoublepage - \@mainmatterfalse - % 根据学校要求使用大罗马编号 - \pagenumbering{Roman} - \def\hutb@thepage{\thepage} - \def\hutb@lastpageref{\pageref{LastPage}} - \fancyfoot[C]{\zihao{-5} \hutb@thepage@format@en{\hutb@thepage}} -} -% mainmatter设置 -\renewcommand{\mainmatter}{ - \cleardoublepage - \@mainmattertrue - % 正文部分启用阿拉伯数字编号 - \pagenumbering{arabic} - \def\hutb@thepage{\thepage} - \def\hutb@lastpageref{\pageref{LastPage}} - \fancyfoot[C]{\zihao{-5} \songti \hutb@thepage@format@zh{\hutb@thepage}{\hutb@lastpageref}} -} -% 给页眉留足空间(否则会有 \headheight is too small的warning) -\setlength{\headheight}{14.5pt} -% “磅”是衡量印刷字体大小的单位,约等于七十二分之一英寸。 -% 而 1英寸=25.4毫米,则1磅=25.4/72≈0.353毫米。 -% 磅和 LaTeX的 pt- points (大约 1/72 inch) 是一致的。 -% 基本行间距设置 -\renewcommand*{\baselinestretch}{1.3} % 几倍行间距 -\setlength{\baselineskip}{20pt} % 基准行间距 -% \setlength{\bibsep}{0.5ex} % 参考文献条目间距 - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 字体设置 -% -% 进行相关字体设置,定义必须的新字体 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% TODO: Times New Roman目前只能在Windows上使用,需要增加Linux系统字体 -% \setmainfont{Times New Roman} -% \setmonofont{Courier New} -% \setsansfont{Arial} -% \newfontfamily{\enheiti}{SimHei} % 解决标题英文括号不显示黑体 -% \newfontfamily{\enheiti}{\heiti} -% \renewcommand\normalsize{% - % \@setfontsize\normalsize{12.05}{14.45}% - % \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@ - % \abovedisplayshortskip \z@ \@plus3\p@ - % \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ - % } -% 协议页的标题按模板是华文新魏 -% \setCJKfamilyfont{hwxw}{STXinwei} -% \newcommand{\huawenxinwei}{\CJKfamily{hwxw}} -% 实现楷体GB_2312 -% \setCJKfamilyfont{kaitigb}{KaiTi_GB2312.ttf} -% \newcommand{\kgb}{\CJKfamily{kaitigb}} -% 重定义ctex定义好的宋体和黑体,以支持伪加粗AutoFakeBold -% 即支持类似word里的给黑体、宋体等中文字体加粗的操作,用\bfseries -% \let\heiti\relax -% \newCJKfontfamily[hei]\heiti{SimHei}[AutoFakeBold] -% \let\songti\relax -% \newCJKfontfamily[song]\songti{SimSun}[AutoFakeBold] -% \newcommand{\kaiti}{\CJKfamily{kai}} -% \newcommand{\kgb}{\CJKfamily{kai}} -% 设置参考文献的字体格式 -% \renewcommand{\bibfont}{\zihao{5} \kgb} - - -% 预定义名称 -\newcommand*{\hutb@name@cover}{扉页} -\newcommand*{\hutb@name@declaration@zh}{声明} -\newcommand*{\hutb@name@abstract@zh}{中文摘要} -\newcommand*{\hutb@name@abstract@en}{英文摘要} -\newcommand*{\hutb@name@keywords}{关键字} -\newcommand*{\hutb@name@contents}{目录} -\newcommand*{\hutb@name@listfigure}{插图清单} -\newcommand*{\hutb@name@listtable}{附表清单} -\newcommand*{\hutb@name@index}{索引} -\newcommand*{\hutb@name@figure}{图} -\newcommand*{\hutb@name@table}{表} -\newcommand*{\hutb@name@appendix}{附录} -\newcommand*{\hutb@name@acknowledge}{致谢} - -%--------------------------------------------- -%控制引用格式,选用上标引用 -% \newcommand\supercite[2][]{% - % \textsuperscript{\cite[#1]{#2}}} - - - - - -%\newCJKfontfamily\sonti{SimSun}[BoldFont=FandolSong-Bold] - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 封面扉页 -% -% 提供本科毕业论文封面扉页设计 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 论文日期 -% 采用key-value对的方式来制定存储信息的pgf路径 -\pgfkeys{/thesisdate/pgf/.cd, % 定义pgf路径 - year/.store in = \year, % 指定关键词year的存储位置为\year - month/.store in = \month % 指定关键词month的存储位置为\month -} -% 利用上述的pgf的key-value定制论文日期命令 -\newcommand{\thesisdate}[1] { - \pgfkeys{/thesisdate/pgf/.cd,#1} % 指定使用/thesisdate/pgf/.cd来解释参数,然后在后文能直接使用存储位置来指定解释的内容 - \gdef\@thesisdate{\year{} 年 \month{} 月} % 将构建好的日期存储到宏(\@thesisdate)中 -} -% 重定义\maketitle实现封面(扉页)绘制 -\RenewDocumentCommand{\maketitle}{}{% - \hutb@pdfbookmark{0}{\hutb@name@cover} - \hutb@make@cover@zh% -} -% 构建封面绘制宏 -\NewDocumentCommand{\hutb@make@cover@zh}{} { - \thispagestyle{empty} - \begin{center} + % \newcommand\sjtu@load@fontset{% + % \@nameuse{sjtu@load@fontset@\sjtu@latinfontset} + % } + % latinfontset 是hutb的key 使用 对应的kv接口调用 现在没有实现 + % \sjtu@load@fontset@latinfontset + \sjtu@load@fontset@times + % linux系统请使用 stix + % \sjtu@load@fontset@stix + % \sjtu@option@hook{sjtu}{latinfontset}{% + % \sjtu@load@fontset + % } + + + \newcommand\hutb@pdfbookmark[2]{} + % 定义通用的chapter命令 + \NewDocumentCommand{\hutb@chapter}{s m}{ + \if@openright\cleardoublepage\else\clearpage\fi + % \addcontentsline{toc}{chapter}{#1}% + % \hutb@pdfbookmark{0}{#1} + \IfBooleanTF{#1}{ + \hutb@pdfbookmark{0}{#2} + }{ + \addcontentsline{toc}{chapter}{#2} + } + \chapter*{#2} + } + + + \AtEndOfPackageFile*{hyperref}{ + \hypersetup{ + linktoc = all, + bookmarksdepth = 2, + bookmarksnumbered = true, + bookmarksopen = true, + bookmarksopenlevel = 1, + unicode = true, + psdextra = true, + breaklinks = true, + plainpages = false, + pdfdisplaydoctitle = true, + hidelinks, + } + \newcounter{hutb@bookmark} + \renewcommand\hutb@pdfbookmark[2]{% + \phantomsection + \stepcounter{hutb@bookmark}% + \pdfbookmark[#1]{#2}{hutbchapter.\thehutb@bookmark}% + } + % \renewcommand\sjtu@phantomsection{% + % \phantomsection + % } + % \pdfstringdefDisableCommands{% + % \let\\\@empty + % \let\quad\@empty + % \let\hspace\@gobble + % } + % \@ifpackagelater{hyperref}{2019/04/27}{}{% + % \g@addto@macro\psdmapshortnames{\let\mu\textmu} + % }% + % \AtBeginDocument{% + % \hypersetup{ + % pdftitle = \sjtu@info@title, + % pdfsubject = \sjtu@name@subject, + % pdfkeywords = \sjtu@info@keywords, + % pdfauthor = \sjtu@info@author, + % pdfcreator = {LaTeX with SJTUThesis \version} + % } + % }% + } + + + % 定制titlepage + % 定义命令和定义相应的宏。 + %----------------------------------------------------------------------% + % 预定义全局使用的文字,如姓名、专业等信息,在content/info.tex中定义 + %----------------------------------------------------------------------% + % 以下定义封面相关命令和相应的宏,以titleen为例,\titleen为实际在源码中使用的命令,一旦执行就会因为\gdef\@titleen{#1}使得其产生一个\@titleen的宏,而该宏能够在后续的环境中使用。 + % TODO: 之后版本迁移至公共模板入口hutbthesis.cls 处(放置在引入子模版之后) + \newcommand*{\titlecn}[1]{\gdef\@titlecn{#1}} % 中文标题 + \newcommand*{\titleen}[1]{\gdef\@titleen{#1}} % 英文标题 + \newcommand*{\priormajor}[1]{\gdef\@priormajor{#1}} % 一级学科(学科专业) + \newcommand*{\minormajor}[1]{\gdef\@minormajor{#1}} % 二级学科(学科方向) + \newcommand*{\interestmajor}[1]{\gdef\@interestmajor{#1}} % 研究方向,关键词组 + \newcommand*{\department}[1]{\gdef\@department{#1}} % 二级培养单位 + \newcommand*{\supervisor}[1]{\gdef\@supervisor{#1}} % 导师 + \newcommand*{\myclass}[1]{\gdef\@myclass{#1}} % 班级 + \newcommand*{\subsupervisor}[1]{\gdef\@subsupervisor{#1}} % 副导师 + \newcommand*{\studentid}[1]{\gdef\@studentid{#1}} % 学号 + + \newcommand*{\clcnumber}[1]{\gdef\@clcnumber{#1}} % 中图分类号 Chinese Library Classification + \newcommand*{\schoolcode}[1]{\gdef\@schoolcode{#1}} % 学校代码 + \newcommand*{\udc}[1]{\gdef\@udc{#1}} % UDC + \newcommand*{\academiccategory}[1]{\gdef\@academiccategory{#1}} % 学术类别 + \newcommand*{\headertitle}[1]{\gdef\@headertitle{#1}} % 页眉字符串 + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 页面布局 + % + % 设置页边距以及版芯行间距设置 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 边距要求上2.5cm,下2.5cm,左3cm,右2cm + \geometry{top=2.5cm,bottom=2.5cm,left=3cm,right=2cm} + % 本科生从摘要开始就要有 + % 设置页眉和页脚 % + \pagestyle{fancy} + % 本科学位论文底部样式 + \newcommand{\hutb@thepage@format@zh}[2]{第~{#1}~页 共~{#2}~页} + \newcommand{\hutb@thepage@format@en}[1]{#1} + % 空白页清空页眉页脚 + \patchcmd{\cleardoublepage}{\newpage}{\thispagestyle{empty}\newpage}{}{} + % 对章节首页的特殊page style清除页眉页脚 + \patchcmd{\chapter}{\thispagestyle}{\@gobble}{}{} + % 内芯页眉设置 + \ifhutb@type@print + %\fancyhead[L]{\includegraphics[scale=0.10]{hutb_logo_maoti.png}} + \else + %\fancyhead[L]{\includegraphics[scale=0.10]{hutb_logo_maoti.png}} + \fi + % \fancyhf[RH]{\heiti \zihao{-5} {图像与激光融合的轨道扣件脱落检测}} % 设置所有(奇数和偶数)右侧页眉 + % UPDATE 更新配置为论文标题 + % 清空页眉,具体设置规则参考:https://www.overleaf.com/learn/latex/Headers_and_footers + \fancyhf{}% + \fancyhf[HC]{\heiti \zihao{-5} {\@headertitle}} + % frontmatter设置 + \renewcommand{\frontmatter}{ + \cleardoublepage + \@mainmatterfalse + % 根据学校要求使用大罗马编号 + \pagenumbering{Roman} + \def\hutb@thepage{\thepage} + \def\hutb@lastpageref{\pageref{LastPage}} + \fancyfoot[C]{\zihao{-5} \hutb@thepage@format@en{\hutb@thepage}} + } + % mainmatter设置 + \renewcommand{\mainmatter}{ + \cleardoublepage + \@mainmattertrue + % 正文部分启用阿拉伯数字编号 + \pagenumbering{arabic} + \def\hutb@thepage{\thepage} + \def\hutb@lastpageref{\pageref{LastPage}} + \fancyfoot[C]{\zihao{-5} \songti \hutb@thepage@format@zh{\hutb@thepage}{\hutb@lastpageref}} + } + % 给页眉留足空间(否则会有 \headheight is too small的warning) + \setlength{\headheight}{14.5pt} + % “磅”是衡量印刷字体大小的单位,约等于七十二分之一英寸。 + % 而 1英寸=25.4毫米,则1磅=25.4/72≈0.353毫米。 + % 磅和 LaTeX的 pt- points (大约 1/72 inch) 是一致的。 + % 基本行间距设置 + \renewcommand*{\baselinestretch}{1.3} % 几倍行间距 + \setlength{\baselineskip}{20pt} % 基准行间距 + % \setlength{\bibsep}{0.5ex} % 参考文献条目间距 + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 字体设置 + % + % 进行相关字体设置,定义必须的新字体 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % TODO: Times New Roman目前只能在Windows上使用,需要增加Linux系统字体 + % \setmainfont{Times New Roman} + % \setmonofont{Courier New} + % \setsansfont{Arial} + % \newfontfamily{\enheiti}{SimHei} % 解决标题英文括号不显示黑体 + % \newfontfamily{\enheiti}{\heiti} + % \renewcommand\normalsize{% + % \@setfontsize\normalsize{12.05}{14.45}% + % \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@ + % \abovedisplayshortskip \z@ \@plus3\p@ + % \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ + % } + % 协议页的标题按模板是华文新魏 + % \setCJKfamilyfont{hwxw}{STXinwei} + % \newcommand{\huawenxinwei}{\CJKfamily{hwxw}} + % 实现楷体GB_2312 + % \setCJKfamilyfont{kaitigb}{KaiTi_GB2312.ttf} + % \newcommand{\kgb}{\CJKfamily{kaitigb}} + % 重定义ctex定义好的宋体和黑体,以支持伪加粗AutoFakeBold + % 即支持类似word里的给黑体、宋体等中文字体加粗的操作,用\bfseries + % \let\heiti\relax + % \newCJKfontfamily[hei]\heiti{SimHei}[AutoFakeBold] + % \let\songti\relax + % \newCJKfontfamily[song]\songti{SimSun}[AutoFakeBold] + % \newcommand{\kaiti}{\CJKfamily{kai}} + % \newcommand{\kgb}{\CJKfamily{kai}} + % 设置参考文献的字体格式 + % \renewcommand{\bibfont}{\zihao{5} \kgb} + + + % 预定义名称 + \newcommand*{\hutb@name@cover}{扉页} + \newcommand*{\hutb@name@declaration@zh}{声明} + \newcommand*{\hutb@name@authorization@zh}{声明} + \newcommand*{\hutb@name@abstract@zh}{中文摘要} + \newcommand*{\hutb@name@abstract@en}{英文摘要} + \newcommand*{\hutb@name@keywords}{关键字} + \newcommand*{\hutb@name@contents}{目录} + \newcommand*{\hutb@name@listfigure}{插图清单} + \newcommand*{\hutb@name@listtable}{附表清单} + \newcommand*{\hutb@name@index}{索引} + \newcommand*{\hutb@name@figure}{图} + \newcommand*{\hutb@name@table}{表} + \newcommand*{\hutb@name@appendix}{附录} + \newcommand*{\hutb@name@acknowledge}{致谢} + + %--------------------------------------------- + %控制引用格式,选用上标引用 + % \newcommand\supercite[2][]{% + % \textsuperscript{\cite[#1]{#2}}} + + + % 定义命令:参数1=颜色,参数2=实线长度,参数3=空白长度 + \newcommand{\adjustabledashunderline}[4][black]{% + \tikz[baseline=(text.base)]{% + \node[inner sep=0pt, outer sep=0pt] (text) {#4}; + \draw[color=#1, dash pattern=on #2 off #3] (text.south west) -- (text.south east); + }% + } + + + + %\newCJKfontfamily\sonti{SimSun}[BoldFont=FandolSong-Bold] + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 封面扉页 + % + % 提供本科毕业论文封面扉页设计 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 论文日期 + % 采用key-value对的方式来制定存储信息的pgf路径 + \pgfkeys{/thesisdate/pgf/.cd, % 定义pgf路径 + year/.store in = \year, % 指定关键词year的存储位置为\year + month/.store in = \month % 指定关键词month的存储位置为\month + } + % 利用上述的pgf的key-value定制论文日期命令 + \newcommand{\thesisdate}[1] { + \pgfkeys{/thesisdate/pgf/.cd,#1} % 指定使用/thesisdate/pgf/.cd来解释参数,然后在后文能直接使用存储位置来指定解释的内容 + \gdef\@thesisdate{\year{} 年 \month{} 月} % 将构建好的日期存储到宏(\@thesisdate)中 + } + % 重定义\maketitle实现封面(扉页)绘制 + \RenewDocumentCommand{\maketitle}{}{% + \hutb@pdfbookmark{0}{\hutb@name@cover} + \hutb@make@cover@zh% + } + % 构建封面绘制宏 + \NewDocumentCommand{\hutb@make@cover@zh}{} { + \thispagestyle{empty} + \begin{center} + \vspace*{0pt} + \begin{figure}[hbt] + % \noindent 表示logo靠左对齐j + \centering % logo居中对齐 + \ifhutb@type@print + \includegraphics[width=0.7\textwidth]{hutb_and_log.png} + \else + \includegraphics[width=0.7\textwidth]{hutb_and_log.png} + \fi + \end{figure} + \vspace{40pt} + \begingroup + % 做系统的用“毕业设计”,做算法的用毕业论文 + \fontsize{50.0}{50}\selectfont 毕业设计 \par + % 45磅,黑体 + \endgroup + \vspace*{6pt} + \begingroup + % \zihao{1} \setmainfont{SimHei} GRADUATION DESIGN(THESIS) \par + % \zihao{1} GRADUATION DESIGN(THESIS) \par + % 1号,黑体 + \endgroup + \begin{figure}[hbt] + \centering + \vspace{55pt} % 空行 + \ifhutb@type@print + %\includegraphics[width=0.2\textwidth]{hutb_logo.png} + \else + %\includegraphics[width=0.2\textwidth]{hutb_logo.png} + \fi + \end{figure} + \vspace{10pt} % 空行 + \begingroup + \linespread{1.3} + \zihao{-2} + \songti + \begin{tabular}{ll} % 实线是 \underline;虚线的 \hdashrule + \hspace{12pt} \makebox[4em][s]{\textbf{题\qquad 目}} & \underline{\parbox[b][][c]{250pt}{\center \kaishu \@titlecn}} \\ + \hspace{12pt} \makebox[4em][s]{\textbf{学生姓名}} & \underline{\makebox[250pt][c]{\kaishu \@author}} \\ + \hspace{12pt} \makebox[4em][s]{\textbf{学\qquad 号}} & \underline{\makebox[250pt][c]{\kaishu \@studentid}} \\ + \hspace{12pt} \makebox[4em][s]{\textbf{学\qquad 院}} & \underline{\makebox[250pt][c]{\kaishu \@department}} \\ + \hspace{12pt} \makebox[4em][s]{\textbf{专业班级}} & \underline{\makebox[250pt][c]{\kaishu \@priormajor}} \\ + % \hspace{12pt} \makebox[4em][s]{\textbf{班\qquad 级}} & \underline{\makebox[250pt][c]{\kaishu \@myclass}} \\ + \hspace{12pt} \makebox[4em][s]{\textbf{指导教师}} & \underline{\makebox[250pt][c]{\kaishu \@supervisor}} \\ + \hspace{12pt} \makebox[4em][s]{\textbf{职\qquad 称}} & \underline{\makebox[250pt][c]{\kaishu \@title}} \\ + + \end{tabular} + \endgroup + \par + \vspace{40pt} + % \vfill + \begingroup + % {\zihao{2} \heiti 人工智能与先进计算学院 \par} + \vspace{10pt} + {\zihao{-2} \heiti \@thesisdate \par} + \endgroup + \end{center} + } + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 诚信声明 + % + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + \newenvironment{declarationzh} { + %\begin{titlepage}% + \hutb@pdfbookmark{0}{\hutb@name@declaration@zh} + %\renewcommand*{\headsep}{20pt} \vspace*{0pt} - \begin{figure}[hbt] - \centering - \ifhutb@type@print - \includegraphics[width=0.6\textwidth]{hutb_logo_maoti.png} - \else - \includegraphics[width=0.6\textwidth]{hutb_logo_maoti.png} - \fi - \end{figure} + % \begin{center} \zihao{-2} \heiti \@titlecn \end{center} \vspace{0pt} - \begingroup - \fontsize{45}{50}\selectfont 本科毕业设计(论文) \par - % 45磅,黑体 - \endgroup - \vspace*{6pt} - \begingroup - % \zihao{1} \setmainfont{SimHei} GRADUATION DESIGN(THESIS) \par - % \zihao{1} GRADUATION DESIGN(THESIS) \par - % 1号,黑体 - \endgroup - \begin{figure}[hbt] - \centering - \ifhutb@type@print - \includegraphics[width=0.2\textwidth]{hutb_logo.png} - \else - \includegraphics[width=0.2\textwidth]{hutb_logo.png} - \fi - \end{figure} - \vspace{10pt} % 空行 - \begingroup - \linespread{1.3} - \zihao{-2} - \songti - \begin{tabular}{ll} - \hspace{12pt} \makebox[4em][s]{\textbf{题\qquad 目:}} & \underline{\parbox[b][][c]{250pt}{\center \kaishu \@titlecn}} \\ - \hspace{12pt} \makebox[4em][s]{\textbf{学生姓名:}} & \underline{\makebox[250pt][c]{\kaishu \@author}} \\ - \hspace{12pt} \makebox[4em][s]{\textbf{学\qquad 号:}} & \underline{\makebox[250pt][c]{\kaishu \@studentid}} \\ - \hspace{12pt} \makebox[4em][s]{\textbf{专\qquad 业:}} & \underline{\makebox[250pt][c]{\kaishu \@priormajor}} \\ - \hspace{12pt} \makebox[4em][s]{\textbf{班\qquad 级:}} & \underline{\makebox[250pt][c]{\kaishu \@myclass}} \\ - \hspace{12pt} \makebox[4em][s]{\textbf{指导老师:}} & \underline{\makebox[250pt][c]{\kaishu \@supervisor}} \\ - %\hspace{12pt} \makebox[4em][s]{学\qquad 院:} & \underline{\makebox[220pt][c]{\kaishu \@department}} \\ - - \end{tabular} - \endgroup - \par - \vspace{40pt} - % \vfill - \begingroup - {\zihao{2} \heiti 人工智能与先进计算学院 \par} - \vspace{10pt} - {\zihao{-2} \heiti \@thesisdate \par} - \endgroup - \end{center} -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 诚信声明 -% -% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\newenvironment{declarationzh} { - %\begin{titlepage}% - \hutb@pdfbookmark{0}{\hutb@name@declaration@zh} - %\renewcommand*{\headsep}{20pt} - \vspace*{0pt} - % \begin{center} \zihao{-2} \heiti \@titlecn \end{center} - \vspace{0pt} - \begin{center} \zihao{2} \heiti 湖南工商大学本科毕业设计诚信声明 \end{center} % 摘要为三号黑体 - \vspace{12pt} - \linespread{1.5} - \zihao{4}\songti % 内容为四号宋体 + \begin{center} \zihao{2} \heiti 湖南工商大学本科毕业设计诚信声明 \end{center} % 摘要为三号黑体 + \vspace{12pt} + \linespread{1.5} + \zihao{4}\songti % 内容为四号宋体 + + %\end{titlepage}% + + } - %\end{titlepage}% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 诚信声明 + % + % + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 摘要 -% -% 提供中英文摘要样式 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% ---------------------------------------------- -% 中文摘要 -% ---------------------------------------------- -% 中文摘要格式具体见样例8,居中打印论文题名(三号黑体) -% 换行顶格编排“摘要”(四号黑体)及摘要内容(四号宋体)、 -% 每段开头空二格。摘要内容后下换行顶格编排“关键词”和“分类号”(四号黑体)。 -% 每篇论文应选取3-8个关键词,每一关键词之间用分号分开,最后一个关键词后不打标点符号。 -\newcommand*{\keywordscn}[1]{\gdef\@keywordscn{#1}} % 定义中文关键词 -%\newcommand*{\categorycn}[1]{\gdef\@categorycn{#1}} % 定义中文分类 -% 定义中文摘要环境 -\newenvironment{abstractzh} { - \hutb@pdfbookmark{0}{\hutb@name@abstract@zh} - \renewcommand*{\headsep}{0pt} - \vspace*{0pt} - %\begin{center} \zihao{-2} \heiti \@titlecn \end{center} - \vspace{0pt} - \begin{center} \zihao{3} \heiti 摘\qquad 要 \end{center} % 摘要为三号黑体 - \vspace{12pt} - \linespread{1.5} - \zihao{-4}\songti % 内容为四号宋体 -} -% 显示中文关键词和分类号 -{ - \begin{flushleft} - \noindent {\zihao{-4} \bfseries \songti 关键词:} {\zihao{-4} \songti \@keywordscn} \par % 关键词为小四号宋体加粗,内容为小四号宋体 - \end{flushleft} -} - -% ---------------------------------------------- -% 英文摘要 -% ---------------------------------------------- -% 英文摘要格式和内容与中文摘要相对应,另起一页,具体见样例9。居中打印论文英文题名(三号Times New Roman字体),换行顶格编排“Abstract”及英文摘要内容(四号Times New Roman字体),摘要内容每段开头留四个字符空格。摘要内容后下换行顶格编排“Keywords”和“Classification”。 -% 定义英文摘要,字体全部为timesnewroman -\newcommand*{\keywordsen}[1]{\gdef\@keywordsen{#1}} % 英文关键词 - -\newenvironment{abstracten} { % 新建英文摘要环境 - \hutb@pdfbookmark{0}{\hutb@name@abstract@en} - \vspace*{0pt} - %\begin{center} \zihao{-2} \bfseries \@titleen \end{center} + \newenvironment{authorizationzh} { + %\begin{titlepage}% + \hutb@pdfbookmark{0}{\hutb@name@authorization@zh} + %\renewcommand*{\headsep}{20pt} + \vspace*{0pt} + % \begin{center} \zihao{-2} \heiti \@titlecn \end{center} + \vspace{0pt} + \begin{center} \zihao{2} \heiti 湖南工商大学本科毕业设计\\版权使用授权书 \end{center} % 摘要为三号黑体 + \vspace{12pt} + \linespread{1.5} + \zihao{4}\songti % 内容为四号宋体 + + %\end{titlepage}% + + } - \begin{center} \zihao{3} \bfseries ABSTRACT \end{center} - \vspace{12pt} - \linespread{1.5} - \zihao{-4} % 内容为四号宋体 -} -{ - \begin{flushleft} - \noindent {\zihao{4} \bfseries Key\ words:~} {\zihao{4} \@keywordsen} \par % 关键词为四号黑体,内容为四号宋体 - \end{flushleft} -} - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 5. 目录 % -% -----------------------------------------------% -% 目录应列出论文的大标题、一级和二级节标题,逐项标明页码(具体见样例10)。各级标题应简明扼要、点出各部分主要内容。学位论文的页码编排为:正文和后置部分用阿拉伯数字编连续码,前置部分用罗马数字单独编连续码(封面除外)。 -% “目录”两字居中(三号黑体),下空两行为章、节、小节及其开始页码(靠右顶格)。章、节、小节分别以阶梯式排列:1(第1章)、1.1、1.1.1依次标出。章、节、小节的题名与页码之间用“......”连接。除“目录”两字外,其余字体均为小四号宋体。 - -%TODO: 本科和硕博目录格式要求不同 -% \renewcommand{\contentsname}{\hfill \heiti \zihao{3} 目\quad 录\hfill} -% \renewcommand{\contentsname}{目录} -% \renewcommand*{\baselinestretch}{1.5} % 行间距 -% \tableofcontents -% } + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 摘要 + % + % 提供中英文摘要样式 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % ---------------------------------------------- + % 中文摘要 + % ---------------------------------------------- + % 中文摘要格式具体见样例8,居中打印论文题名(三号黑体) + % 换行顶格编排“摘要”(四号黑体)及摘要内容(四号宋体)、 + % 每段开头空二格。摘要内容后下换行顶格编排“关键词”和“分类号”(四号黑体)。 + % 每篇论文应选取3-8个关键词,每一关键词之间用分号分开,最后一个关键词后不打标点符号。 + \newcommand*{\keywordscn}[1]{\gdef\@keywordscn{#1}} % 定义中文关键词 + %\newcommand*{\categorycn}[1]{\gdef\@categorycn{#1}} % 定义中文分类 + % 定义中文摘要环境 + \newenvironment{abstractzh} { + \hutb@pdfbookmark{0}{\hutb@name@abstract@zh} + \renewcommand*{\headsep}{0pt} + \vspace*{0pt} + %\begin{center} \zihao{-2} \heiti \@titlecn \end{center} + \vspace{0pt} + \begin{center} \zihao{3} \heiti 摘\qquad 要 \end{center} % 摘要为三号黑体 + \vspace{12pt} + \linespread{1.5} + \zihao{-4}\songti % 内容为四号宋体 + } + % 显示中文关键词和分类号 + { + \begin{flushleft} + \noindent {\zihao{-4} \bfseries \songti 关键词:} {\zihao{-4} \songti \@keywordscn} \par % 关键词为小四号宋体加粗,内容为小四号宋体 + \end{flushleft} + } + + % ---------------------------------------------- + % 英文摘要 + % ---------------------------------------------- + % 英文摘要格式和内容与中文摘要相对应,另起一页,具体见样例9。居中打印论文英文题名(三号Times New Roman字体),换行顶格编排“Abstract”及英文摘要内容(四号Times New Roman字体),摘要内容每段开头留四个字符空格。摘要内容后下换行顶格编排“Keywords”和“Classification”。 + % 定义英文摘要,字体全部为timesnewroman + \newcommand*{\keywordsen}[1]{\gdef\@keywordsen{#1}} % 英文关键词 + + \newenvironment{abstracten} { % 新建英文摘要环境 + \hutb@pdfbookmark{0}{\hutb@name@abstract@en} + \vspace*{0pt} + %\begin{center} \zihao{-2} \bfseries \@titleen \end{center} + + \begin{center} \zihao{3} \bfseries ABSTRACT \end{center} + \vspace{12pt} + \linespread{1.5} + \zihao{-4} % 内容为四号宋体 + } + { + \begin{flushleft} + \noindent {\zihao{4} \bfseries Key\ words:~} {\zihao{4} \@keywordsen} \par % 关键词为四号黑体,内容为四号宋体 + \end{flushleft} + } + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 5. 目录 % + % -----------------------------------------------% + % 目录应列出论文的大标题、一级和二级节标题,逐项标明页码(具体见样例10)。各级标题应简明扼要、点出各部分主要内容。学位论文的页码编排为:正文和后置部分用阿拉伯数字编连续码,前置部分用罗马数字单独编连续码(封面除外)。 + % “目录”两字居中(三号黑体),下空两行为章、节、小节及其开始页码(靠右顶格)。章、节、小节分别以阶梯式排列:1(第1章)、1.1、1.1.1依次标出。章、节、小节的题名与页码之间用“......”连接。除“目录”两字外,其余字体均为小四号宋体。 + + %TODO: 本科和硕博目录格式要求不同 + % \renewcommand{\contentsname}{\hfill \heiti \zihao{3} 目\quad 录\hfill} + % \renewcommand{\contentsname}{目录} + % \renewcommand*{\baselinestretch}{1.5} % 行间距 + % \tableofcontents + % } \renewcommand\tableofcontents{ -\hutb@chapter*{\contentsname} -% \hutb@pdfbookmark{0}{\contentsname} - -% \chapter*{目录} -% \hutb@pdfbookmark{0}{\hutb@name@contents} -\@starttoc{toc} + \hutb@chapter*{\contentsname} + % \hutb@pdfbookmark{0}{\contentsname} + + % \chapter*{目录} + % \hutb@pdfbookmark{0}{\hutb@name@contents} + \@starttoc{toc} } @@ -990,7 +1028,7 @@ \DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png,.tif} % 设置图表搜索路径, 可以给图表文件夹取如下名字 \graphicspath{{figures/}{figure/}{pictures/}% -{picture/}{pic/}{pics/}{image/}{images/}} + {picture/}{pic/}{pics/}{image/}{images/}} @@ -1010,20 +1048,20 @@ % \renewcommand{\thefigure} {\thesection-\arabic{figure}} \captionsetup[figure]{ -format=plain, % 标题从第二行开始是否缩进,plain无缩进,hang有缩进 -labelsep=quad, % 分隔符是一个空格 -font={hei,five}, -position=bottom % position=bottom, 不代表标题放在下面, 标题仍放在你放\caption的位置. + format=plain, % 标题从第二行开始是否缩进,plain无缩进,hang有缩进 + labelsep=quad, % 分隔符是一个空格 + font={hei,five}, + position=bottom % position=bottom, 不代表标题放在下面, 标题仍放在你放\caption的位置. } % 表格格式 % ------------------------------------------------------% \renewcommand{\thetable}{\arabic{chapter}-\arabic{table}} % \renewcommand {\thetable} {\thesection-\arabic{table}} \captionsetup[table]{ -format=plain, % 标题从第二行开始是否缩进,plain无缩进,hang有缩进 -labelsep=quad, % 分隔符是一个空格 -font={hei,five}, % 表的字体, 宋体小四 -position=top + format=plain, % 标题从第二行开始是否缩进,plain无缩进,hang有缩进 + labelsep=quad, % 分隔符是一个空格 + font={hei,five}, % 表的字体, 宋体小四 + position=top } @@ -1031,14 +1069,14 @@ position=top % 列表环境设置 % % ------------------------------------------------------------------% \setlist{% -topsep=0.3em, % 列表顶端的垂直空白 -partopsep=0pt, % 列表环境前面紧接着一个空白行时其顶端的额外垂直空白 -itemsep=0ex plus 0.1ex, % 列表项之间的额外垂直空白 -parsep=0pt, % 列表项内的段落之间的垂直空白 -leftmargin=1.5em, % 环境的左边界和列表之间的水平距离 -rightmargin=0em, % 环境的右边界和列表之间的水平距离 -labelsep=0.5em, % 包含标签的盒子与列表项的第一行文本之间的间隔 -labelwidth=2em % 包含标签的盒子的正常宽度;若实际宽度更宽,则使用实际宽度。 + topsep=0.3em, % 列表顶端的垂直空白 + partopsep=0pt, % 列表环境前面紧接着一个空白行时其顶端的额外垂直空白 + itemsep=0ex plus 0.1ex, % 列表项之间的额外垂直空白 + parsep=0pt, % 列表项内的段落之间的垂直空白 + leftmargin=1.5em, % 环境的左边界和列表之间的水平距离 + rightmargin=0em, % 环境的右边界和列表之间的水平距离 + labelsep=0.5em, % 包含标签的盒子与列表项的第一行文本之间的间隔 + labelwidth=2em % 包含标签的盒子的正常宽度;若实际宽度更宽,则使用实际宽度。 } % 表格 % @@ -1047,11 +1085,11 @@ labelwidth=2em % 包含标签的盒子的正常宽度;若实际宽度更宽, \let\hutb@oldtabular\tabular \let\hutb@endoldtabular\endtabular \renewenvironment{tabular} { -\bgroup -\renewcommand{\arraystretch}{0.92} -\hutb@oldtabular + \bgroup + \renewcommand{\arraystretch}{0.92} + \hutb@oldtabular } { -\hutb@endoldtabular\egroup + \hutb@endoldtabular\egroup } % 表格字号应比正文小,一般五号/10.5pt,但是暂时没法再cls里设置(不然会影响到封面等tabular环境) @@ -1090,74 +1128,79 @@ labelwidth=2em % 包含标签的盒子的正常宽度;若实际宽度更宽, % TODO 测试段落后间距 % 各级标题格式设置。 \ctexset{% -chapter = {% - format = \zihao{3} \heiti\centering, - name = {第, 章}, - nameformat = {}, - number = \arabic{chapter}, - numberformat = {}, - titleformat = {}, - aftername = \quad, - afterindent = true, - % beforeskip 默认为 50pt 适当缩减 - fixskip = true, - beforeskip = {15pt}, - % beforeskip = {\ifhutb@type@graduate 20pt \else 5pt\fi} - % afterskip 默认为 40pt 适当缩减 - afterskip = {40pt}, - % afterskip = {\ifhutb@type@graduate 30pt\else 20pt\fi}, -}, -section = {% - format = \zihao{-4} \heiti, - afterindent = true, - % beforeskip 默认为 3.5ex plus 1ex minus .2ex 适当缩减 - % beforeskip = {20pt}, - % beforeskip = {\ifhutb@type@graduate 30pt \else 20pt\fi} - % afterskip 默认为 2.3ex plus .2ex 适当缩减 - afterskip = {1ex \@plus .2ex}, -}, -subsection = {% - format = \zihao{-4} \bfseries \songti, - afterindent = true, - % afterskip 默认为 2.3ex plus .2ex 适当缩减 - afterskip = {1ex \@plus .2ex}, - %fixskip = true, -}, -subsubsection = {% - format = \zihao{-4} \normalfont, - afterindent = true, - afterskip = {1ex \@plus .2ex}, - %fixskip = true, -}, + chapter = {% + % 居中 \centering + format = \zihao{3} \heiti, + % {第, 章} + name = {,.}, + nameformat = {}, + number = \arabic{chapter}, + numberformat = {}, + titleformat = {}, + aftername = \quad, + afterindent = true, + % beforeskip 默认为 50pt 适当缩减 + fixskip = true, + beforeskip = {15pt}, + % beforeskip = {\ifhutb@type@graduate 20pt \else 5pt\fi} + % afterskip 默认为 40pt 适当缩减 + afterskip = {40pt}, + % afterskip = {\ifhutb@type@graduate 30pt\else 20pt\fi}, + }, + % 二级标题 + section = {% + format = \zihao{4} \bfseries \songti, + afterindent = true, + % beforeskip 默认为 3.5ex plus 1ex minus .2ex 适当缩减 + % beforeskip = {20pt}, + % beforeskip = {\ifhutb@type@graduate 30pt \else 20pt\fi} + % afterskip 默认为 2.3ex plus .2ex 适当缩减 + afterskip = {1ex \@plus .2ex}, + }, + % 三级标题 + subsection = {% + format = \zihao{-4} \songti, + afterindent = true, + % afterskip 默认为 2.3ex plus .2ex 适当缩减 + afterskip = {1ex \@plus .2ex}, + %fixskip = true, + }, + % 四级标题 + subsubsection = {% + format = \zihao{-4} \songti, + afterindent = true, + afterskip = {1ex \@plus .2ex}, + %fixskip = true, + }, } % 定义描述距离的变量 \newlength{\hutb@headings@indent@fixed} \setlength{\hutb@headings@indent@fixed}{2\ccwd} \newcommand{\hutb@style@set@indent@heading}{% -\gdef\hutb@headings@indent{\hutb@headings@indent@fixed} -% \ifsjtu@type@graduate\relax\else -% 本科毕设设置四级标题 -\ctexset{% - subsubsection/name = {(,)}, - subsubsection/number = \arabic{subsubsection}, -} -% \fi -% 设标题的缩进 -\ctexset{% - section/indent = \hutb@headings@indent, - subsection/indent = \hutb@headings@indent, - subsubsection/indent = \hutb@headings@indent, -} + \gdef\hutb@headings@indent{\hutb@headings@indent@fixed} + % \ifsjtu@type@graduate\relax\else + % 本科毕设设置四级标题 + \ctexset{% + subsubsection/name = {(,)}, + subsubsection/number = \arabic{subsubsection}, + } + % \fi + % 设标题的缩进 + \ctexset{% + section/indent = \hutb@headings@indent, + subsection/indent = \hutb@headings@indent, + subsubsection/indent = \hutb@headings@indent, + } } \hutb@style@set@indent@heading % 全文首行缩进 2 字符, 标点符号用全角 % \ctexset{% -% punct = quanjiao, -% space = auto, -% autoindent = true, -% } + % punct = quanjiao, + % space = auto, + % autoindent = true, + % } % % 编号分章节。如需要连续编号,注释\makeatletter下面对应内容即可。 % \renewcommand{\theequation}{\arabic{section}-\arabic{equation}} @@ -1185,10 +1228,10 @@ subsubsection = {% % 在\appendix 后直接使用 chapter % 暂不需要 % \newenvironment{appendixs}{ -% % \ifhutb@review\else -% \hutb@chapter{\hutb@name@appendix} -% % \fi -% } + % % \ifhutb@review\else + % \hutb@chapter{\hutb@name@appendix} + % % \fi + % } % 10. 攻读学位期间主要研究成果 % @@ -1202,11 +1245,11 @@ subsubsection = {% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 定义致谢环境 \newenvironment{acknowledgements}{ -% \ifhutb@review\relax\else -\ifhutb@review\else -% \hutb@chapter{\hutb@name@acknowledgements} -\hutb@chapter{\hutb@name@acknowledge} -\fi + % \ifhutb@review\relax\else + \ifhutb@review\else + % \hutb@chapter{\hutb@name@acknowledgements} + \hutb@chapter{\hutb@name@acknowledge} + \fi } diff --git a/scene/undergraduate/hutbthesis_main.tex b/scene/undergraduate/hutbthesis_main.tex index b758ddf..9b2e94e 100644 --- a/scene/undergraduate/hutbthesis_main.tex +++ b/scene/undergraduate/hutbthesis_main.tex @@ -1,147 +1,142 @@ -%!TEX program = xelatex -% !BIB program = biber -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 载入模版 -% -% 载入 hutbthesis.cls文件定义的模板 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\documentclass[AutoFakeBold]{hutbthesis} -%%%%%%%%%%%%%%%%%%%导言区%%%%%%%%%%%%%%%%%%%%%%%%%% -%\usepackage{fancyhdr} -%\setlength{\headheight}{26pt} -%\addtolength{\topmargin}{-11.5pt} % 精确补偿值可能需要微调 -%{\setlength{\emergencystretch}{1em} % 增加段落弹性间距 - %\usepackage{lastpage} % 导言区加载宏包 - %\usepackage{float} - - - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \addbibresource{content/reference.bib} - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 基本信息 - % - % 用户自行输入标题、作者等基本信息 - % 都存储在\content\info.tex文件中 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \include{content/cover} - - - - \begin{document} - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 封面绘制 - % - % 1.5版本重新编写了封面绘制宏,并用latex使用者更习惯的 - % \maketitle代替之前的\makecoverpage - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \maketitle - - %\declarationzh - - % 启用大罗马字母进行编号 - \frontmatter - % 设置页眉和页脚 - - %\include{content/info} - - \include{content/declarationzh} - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 中文摘要 - % - % 存储在\content\abstractzh.tex文件中 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \include{content/abstractzh} - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 英文摘要 - % - % 存储在\content\abstracten.tex文件中 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \include{content/abstracten} - - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 目录 - % - % 使用重定义的tableofcontents宏绘制目录 - % 满足学校的样式要求 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \tableofcontents - - - % 启用数字编号,改为第 x 页 共 x 页格式 - \mainmatter - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 正文 - % - % 存储在\content\content.tex文件中 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 正文 - %\include{content/content} - - - \include{content/chapter1.tex} - \include{content/chapter2.tex} - \include{content/chapter3.tex} - \include{content/chapter4.tex} - \include{content/chapter5.tex} - \include{content/chapter6.tex} - - % % 主文件有代码去掉页眉章节编号的“.”,但这会因为bug导致无编号章节显示一个错误编号,所以这里在无编号章节之前再次重定义sectionmark。 - % \renewcommand{\sectionmark}[1]{\markright{#1}} - - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 致谢 - % - % 存储在\content\acknowledgements.tex文件中 - % 根据本科生院的要求,致谢应该在参考文献的前面,不编章号,而附录应该位于参考文献后。 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \include{content/acknowledgements} - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 参考文献 - % - % 存储在\content\acknowledgements.tex文件中 - % 根据本科生院的要求,致谢应该在参考文献的前面,不编章号,而附录应该位于参考文献后。 - % 有待修复 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % \section{参考文献} % bibliography会自动显示参考文献四个字 - \addcontentsline{toc}{chapter}{参考文献} % 由于参考文献不是chapter,这句把参考文献加入目录 - % \nocite{*} % 该命令用于显示全部参考文献,即使文中没引用 - % cls文件中已经引入package,这里不需要调用 \bibliographystyle 了。 - %\bibliographystyle{gbt7714-2005} - %\bibliography{reference} - - \printbibliography - - %\bibliography{hutbtheisi_main} - \newpage - - - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % 附录部分 - % - % 根据学校要求,正文中不应出现长篇幅的代码段或公式推证 - % 应单独放置在正文后的附录部分 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - % https://www.zhihu.com/question/29413517/answer/44358389 % - % 说明如下: - % secnumdepth 这个计数器是 LaTeX 标准文档类用来控制章节编号深度的。 - % 在 article 中,这个计数器的值默认是 3,对应的章节命令是 \subsubsection。 - % 也就是说,默认情况下,article 将会对 \subsubsection 及其之上的所有章节标题进行编号,也就是 \part, \section, \subsection, \subsubsection。LaTeX 标准文档类中,最大的标题是 \part。它在 book 和 report 类中的层级是「-1」,在 article 类中的层级是「0」。这里,我们在调用 \appendix 的时候将计数器设置为 -2,因此所有的章节命令都不会编号了。不过,一般还是会保留 \part 的编号的。所以在实际使用中,将它设置为 0 就可以了。 - - % 在修改过程中请注意不要破环命令的完整性 - - % \renewcommand\appendix{\setcounter{secnumdepth}{-2}} - \appendix - \include{content/appendix} - - - \end{document} +%!TEX program = xelatex +% !BIB program = biber +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 载入模版 +% +% 载入 hutbthesis.cls文件定义的模板 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[AutoFakeBold]{hutbthesis} + +\addbibresource{content/reference.bib} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 基本信息 +% +% 用户自行输入标题、作者等基本信息 +% 都存储在\content\info.tex文件中 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\include{content/cover} + + + +\begin{document} + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 封面绘制 + % + % 1.5版本重新编写了封面绘制宏,并用latex使用者更习惯的 + % \maketitle代替之前的\makecoverpage + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \maketitle + + %\declarationzh + + % 启用大罗马字母进行编号 + \frontmatter + % 设置页眉和页脚 + + %\include{content/info} + + \include{content/declarationzh} + + % 授权书 + \include{content/authorizationzh} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 中文摘要 + % + % 存储在\content\abstractzh.tex文件中 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \include{content/abstractzh} + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 英文摘要 + % + % 存储在\content\abstracten.tex文件中 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \include{content/abstracten} + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 目录 + % + % 使用重定义的tableofcontents宏绘制目录 + % 满足学校的样式要求 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \tableofcontents + + + % 启用数字编号,改为第 x 页 共 x 页格式 + \mainmatter + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 正文 + % + % 存储在\content\content.tex文件中 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 正文 + %\include{content/content} + + + \include{content/chapter1.tex} + \include{content/chapter2.tex} + \include{content/chapter3.tex} + \include{content/chapter4.tex} + \include{content/chapter5.tex} + \include{content/chapter6.tex} + % % 主文件有代码去掉页眉章节编号的“.”,但这会因为bug导致无编号章节显示一个错误编号,所以这里在无编号章节之前再次重定义sectionmark。 + % \renewcommand{\sectionmark}[1]{\markright{#1}} + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 参考文献 + % + % 存储在\content\acknowledgements.tex文件中 + % 根据本科生院的要求,致谢应该在参考文献的前面,不编章号,而附录应该位于参考文献后。 + % 有待修复 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % \section{参考文献} % bibliography会自动显示参考文献四个字 + \addcontentsline{toc}{chapter}{参考文献} % 由于参考文献不是chapter,这句把参考文献加入目录 + % \nocite{*} % 该命令用于显示全部参考文献,即使文中没引用 + % cls文件中已经引入package,这里不需要调用 \bibliographystyle 了。 + %\bibliographystyle{gbt7714-2005} + %\bibliography{reference} + + \printbibliography + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 附录部分 + % + % 根据学校要求,正文中不应出现长篇幅的代码段或公式推证 + % 应单独放置在正文后的附录部分 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % https://www.zhihu.com/question/29413517/answer/44358389 % + % 说明如下: + % secnumdepth 这个计数器是 LaTeX 标准文档类用来控制章节编号深度的。 + % 在 article 中,这个计数器的值默认是 3,对应的章节命令是 \subsubsection。 + % 也就是说,默认情况下,article 将会对 \subsubsection 及其之上的所有章节标题进行编号,也就是 \part, \section, \subsection, \subsubsection。LaTeX 标准文档类中,最大的标题是 \part。它在 book 和 report 类中的层级是「-1」,在 article 类中的层级是「0」。这里,我们在调用 \appendix 的时候将计数器设置为 -2,因此所有的章节命令都不会编号了。不过,一般还是会保留 \part 的编号的。所以在实际使用中,将它设置为 0 就可以了。 + + % 在修改过程中请注意不要破环命令的完整性 + + % \renewcommand\appendix{\setcounter{secnumdepth}{-2}} + \appendix + \include{content/appendix} + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % 致谢 + % + % 存储在\content\acknowledgements.tex文件中 + % 根据本科生院的要求,致谢应该在参考文献的前面,不编章号,而附录应该位于参考文献后。 + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \include{content/acknowledgements} + + %\bibliography{hutbtheisi_main} + \newpage + + + +\end{document} \ No newline at end of file diff --git a/scene/undergraduate/images/1.pdf b/scene/undergraduate/images/1.pdf deleted file mode 100644 index 31460d3..0000000 Binary files a/scene/undergraduate/images/1.pdf and /dev/null differ diff --git a/scene/undergraduate/images/2.pdf b/scene/undergraduate/images/2.pdf deleted file mode 100644 index 31f74b7..0000000 Binary files a/scene/undergraduate/images/2.pdf and /dev/null differ diff --git a/scene/undergraduate/images/3.pdf b/scene/undergraduate/images/3.pdf deleted file mode 100644 index 2117fc0..0000000 Binary files a/scene/undergraduate/images/3.pdf and /dev/null differ diff --git a/scene/undergraduate/images/4.pdf b/scene/undergraduate/images/4.pdf deleted file mode 100644 index 0940afe..0000000 Binary files a/scene/undergraduate/images/4.pdf and /dev/null differ diff --git a/scene/undergraduate/images/5.pdf b/scene/undergraduate/images/5.pdf deleted file mode 100644 index ef08011..0000000 Binary files a/scene/undergraduate/images/5.pdf and /dev/null differ diff --git "a/scene/undergraduate/images/chatscene\351\241\271\347\233\256\347\273\223\346\236\204.pdf" "b/scene/undergraduate/images/chatscene\351\241\271\347\233\256\347\273\223\346\236\204.pdf" deleted file mode 100644 index 347bf3e..0000000 Binary files "a/scene/undergraduate/images/chatscene\351\241\271\347\233\256\347\273\223\346\236\204.pdf" and /dev/null differ diff --git a/scene/undergraduate/images/effect.pdf b/scene/undergraduate/images/effect.pdf deleted file mode 100644 index 418c603..0000000 Binary files a/scene/undergraduate/images/effect.pdf and /dev/null differ diff --git a/scene/undergraduate/images/effect.png b/scene/undergraduate/images/effect.png deleted file mode 100644 index 058efd9..0000000 Binary files a/scene/undergraduate/images/effect.png and /dev/null differ diff --git a/scene/undergraduate/images/hutb_and_log.png b/scene/undergraduate/images/hutb_and_log.png new file mode 100644 index 0000000..6f3c9c6 Binary files /dev/null and b/scene/undergraduate/images/hutb_and_log.png differ diff --git a/scene/undergraduate/images/hutb_eim.png b/scene/undergraduate/images/hutb_eim.png new file mode 100644 index 0000000..57ca9ea Binary files /dev/null and b/scene/undergraduate/images/hutb_eim.png differ diff --git a/scene/undergraduate/images/logo.png b/scene/undergraduate/images/logo.png deleted file mode 100644 index 8aeead4..0000000 Binary files a/scene/undergraduate/images/logo.png and /dev/null differ diff --git a/scene/undergraduate/images/picture1.pdf b/scene/undergraduate/images/picture1.pdf deleted file mode 100644 index f3f47bb..0000000 Binary files a/scene/undergraduate/images/picture1.pdf and /dev/null differ diff --git a/scene/undergraduate/images/picture1.png b/scene/undergraduate/images/picture1.png deleted file mode 100644 index 5cd3a69..0000000 Binary files a/scene/undergraduate/images/picture1.png and /dev/null differ diff --git a/scene/undergraduate/images/picture2.pdf b/scene/undergraduate/images/picture2.pdf deleted file mode 100644 index 791dd02..0000000 Binary files a/scene/undergraduate/images/picture2.pdf and /dev/null differ diff --git a/scene/undergraduate/images/picture2.png b/scene/undergraduate/images/picture2.png deleted file mode 100644 index 72de79c..0000000 Binary files a/scene/undergraduate/images/picture2.png and /dev/null differ diff --git a/scene/undergraduate/images/picture3.pdf b/scene/undergraduate/images/picture3.pdf deleted file mode 100644 index 9d15765..0000000 Binary files a/scene/undergraduate/images/picture3.pdf and /dev/null differ diff --git a/scene/undergraduate/images/result1.pdf b/scene/undergraduate/images/result1.pdf deleted file mode 100644 index 534f543..0000000 Binary files a/scene/undergraduate/images/result1.pdf and /dev/null differ diff --git a/scene/undergraduate/images/result2.pdf b/scene/undergraduate/images/result2.pdf deleted file mode 100644 index 674e0ac..0000000 Binary files a/scene/undergraduate/images/result2.pdf and /dev/null differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\25710.1.png" "b/scene/undergraduate/images/\345\234\272\346\231\25710.1.png" new file mode 100644 index 0000000..861ed67 Binary files /dev/null and "b/scene/undergraduate/images/\345\234\272\346\231\25710.1.png" differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\25710.pdf" "b/scene/undergraduate/images/\345\234\272\346\231\25710.pdf" deleted file mode 100644 index 8655501..0000000 Binary files "a/scene/undergraduate/images/\345\234\272\346\231\25710.pdf" and /dev/null differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\25710.png" "b/scene/undergraduate/images/\345\234\272\346\231\25710.png" new file mode 100644 index 0000000..33a2220 Binary files /dev/null and "b/scene/undergraduate/images/\345\234\272\346\231\25710.png" differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\2576.1.png" "b/scene/undergraduate/images/\345\234\272\346\231\2576.1.png" new file mode 100644 index 0000000..ab19cd0 Binary files /dev/null and "b/scene/undergraduate/images/\345\234\272\346\231\2576.1.png" differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\2577.1.png" "b/scene/undergraduate/images/\345\234\272\346\231\2577.1.png" new file mode 100644 index 0000000..7701671 Binary files /dev/null and "b/scene/undergraduate/images/\345\234\272\346\231\2577.1.png" differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\2578.1.png" "b/scene/undergraduate/images/\345\234\272\346\231\2578.1.png" new file mode 100644 index 0000000..43248c8 Binary files /dev/null and "b/scene/undergraduate/images/\345\234\272\346\231\2578.1.png" differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\2578.pdf" "b/scene/undergraduate/images/\345\234\272\346\231\2578.pdf" index 57f7e2d..8655501 100644 Binary files "a/scene/undergraduate/images/\345\234\272\346\231\2578.pdf" and "b/scene/undergraduate/images/\345\234\272\346\231\2578.pdf" differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\2578.png" "b/scene/undergraduate/images/\345\234\272\346\231\2578.png" new file mode 100644 index 0000000..67bb7a4 Binary files /dev/null and "b/scene/undergraduate/images/\345\234\272\346\231\2578.png" differ diff --git "a/scene/undergraduate/images/\345\234\272\346\231\2579.1.png" "b/scene/undergraduate/images/\345\234\272\346\231\2579.1.png" new file mode 100644 index 0000000..587339d Binary files /dev/null and "b/scene/undergraduate/images/\345\234\272\346\231\2579.1.png" differ diff --git "a/scene/undergraduate/images/\347\240\224\347\251\266\346\236\266\346\236\204\345\233\276.png" "b/scene/undergraduate/images/\347\240\224\347\251\266\346\236\266\346\236\204\345\233\276.png" deleted file mode 100644 index c89e2fc..0000000 Binary files "a/scene/undergraduate/images/\347\240\224\347\251\266\346\236\266\346\236\204\345\233\276.png" and /dev/null differ diff --git "a/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.pdf" "b/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.pdf" deleted file mode 100644 index ebcb84d..0000000 Binary files "a/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.pdf" and /dev/null differ diff --git "a/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" "b/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" deleted file mode 100644 index 401bedf..0000000 Binary files "a/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\276.png" and /dev/null differ diff --git "a/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\2761.png" "b/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\2761.png" new file mode 100644 index 0000000..f8c5c1e Binary files /dev/null and "b/scene/undergraduate/images/\347\263\273\347\273\237\346\236\266\346\236\204\345\233\2761.png" differ diff --git a/scene/undergraduate/init_proj.m b/scene/undergraduate/init_proj.m index a8a6c5f..84bb4ec 100644 --- a/scene/undergraduate/init_proj.m +++ b/scene/undergraduate/init_proj.m @@ -1,35 +1,40 @@ -% 初始化工程 -% 测试:init_proj('calligraphy_score') -function init_proj(proj_name) - -cur_dir = fileparts(mfilename('fullpath')); - -home_dir = fileparts(cur_dir); - -proj_dir = fullfile(home_dir, proj_name); - -if ~exist(proj_dir, 'dir') - mkdir(proj_dir); -end - -cd(proj_dir); - -% 创建一个空的README.md文件 -fid = fopen('README.md', 'w'); -fclose(fid); - -system('git init') -system('git add README.md') -system('git submodule add https://github.com/OpenHUTB/undergraduate.git') -system('git commit -m init') - -% 添加远程链接 -remote_url = ['https://github.com/OpenHUTB/' proj_name '.git']; -system(['git remote add origin ' remote_url]) - -% 推送到远端 -system('git push --set-upstream origin master') - -cd(cur_dir); - -end \ No newline at end of file +% 初始化工程 +% 测试:init_proj('calligraphy_score') +function init_proj(proj_name) + +cur_dir = fileparts(mfilename('fullpath')); + +home_dir = fileparts(cur_dir); + +proj_dir = fullfile(home_dir, proj_name); + +if ~exist(proj_dir, 'dir') + mkdir(proj_dir); +end + +cd(proj_dir); + +% 创建一个空的README.md文件 +fid = fopen('README.md', 'w'); +fclose(fid); + +system('git init') +system('git add README.md') +system('git submodule add https://github.com/OpenHUTB/undergraduate.git') +system('git commit -m init') + +% 添加远程链接 +remote_url = ['https://github.com/OpenHUTB/' proj_name '.git']; +system(['git remote add origin ' remote_url]) + +% 推送到远端 +system('git push --set-upstream origin master') + +cd(cur_dir); + +end + + + + + diff --git a/scene/undergraduate/latexmkrc b/scene/undergraduate/latexmkrc index 7180a7f..5212721 100644 --- a/scene/undergraduate/latexmkrc +++ b/scene/undergraduate/latexmkrc @@ -1,3 +1,3 @@ -$pdflatex = 'pdflatex --halt-on-error %O %S'; -$lualatex = 'lualatex --halt-on-error %O %S'; -$xelatex = 'xelatex --halt-on-error %O %S'; +$pdflatex = 'pdflatex --halt-on-error %O %S'; +$lualatex = 'lualatex --halt-on-error %O %S'; +$xelatex = 'xelatex --halt-on-error %O %S'; \ No newline at end of file diff --git a/scene/undergraduate/reference.bib b/scene/undergraduate/reference.bib new file mode 100644 index 0000000..5fa2d85 --- /dev/null +++ b/scene/undergraduate/reference.bib @@ -0,0 +1,32 @@ +@book{knuth1984texbook, + title={The texbook}, + author={Knuth, Donald Ervin and Bibby, Duane}, + volume={15}, + year={1984}, + publisher={Addison-Wesley Reading} +} +@book{lamport1994latex, + title={LATEX: a document preparation system: user's guide and reference manual}, + author={Lamport, Leslie}, + year={1994}, + publisher={Addison-wesley} +} +@article{pritchard1969statistical, + title={Statistical bibliography or bibliometrics}, + author={Pritchard, Alan and others}, + journal={Journal of documentation}, + volume={25}, + number={4}, + pages={348--349}, + year={1969}, + publisher={New York} +} +@article{Pawlak1982Rough, + title={Rough sets}, + author={Pawlak, Zdzisław}, + journal={International Journal of Computer and Information Sciences}, + volume={11}, + number={5}, + pages={341-356}, + year={1982}, +} \ No newline at end of file