diff --git a/co/undergraduate/README.md b/co/undergraduate/README.md index 6deb1f67..f26e0e1b 100644 --- a/co/undergraduate/README.md +++ b/co/undergraduate/README.md @@ -1,6 +1,7 @@ -编译说明: -1. 本工程面向 TeXstudio + TeX Live/LaTeX 2023 使用。 -2. 打开 hutbthesis_main.tex,使用 XeLaTeX 编译。建议连续编译 2 次,以生成/刷新目录和交叉引用。 -3. 本版本参考文献已整理为 content/references.tex 中的 thebibliography 手工参考文献环境,不需要运行 biber。 -4. 封面、承诺书、中英文摘要文件保持原样放在 content/ 目录;正文从 chapter1.tex 到 chapter5.tex。 -5. 图片统一放在 figures/ 目录。 +编译说明 + +1. 使用 TeXstudio 打开 hutbthesis_main.tex。 +2. 编译器选择 XeLaTeX。 +3. 正常情况下连续编译 2~3 次即可生成目录、图表交叉引用和参考文献引用。 +4. 本工程参考文献采用 content/references.tex 中的 thebibliography 环境,正文使用 \cite{} 引用,不需要运行 BibTeX 或 biber。 +5. 若提交源文件,请在最终编译成功并确认 PDF 无误后运行 cmdel.bat,删除 .aux、.log、.toc、.out 等临时文件,再进行打包。 diff --git a/co/undergraduate/cmdel.bat b/co/undergraduate/cmdel.bat index c9642e0a..7f792227 100644 --- a/co/undergraduate/cmdel.bat +++ b/co/undergraduate/cmdel.bat @@ -1,2 +1,15 @@ -del /a /f *.xml *.bcf *.out *.log *.sav *.gz *.aux *.bbl *.bak *.dvi *.blg - +del /s /q *.aux +del /s /q *.log +del /s /q *.out +del /s /q *.toc +del /s /q *.bcf +del /s /q *.run.xml +del /s /q *.synctex.gz +del /s /q *.fls +del /s /q *.fdb_latexmk +del /s /q *.xdv +del /s /q *.bbl +del /s /q *.blg +del /s /q *.lof +del /s /q *.lot +pause diff --git a/co/undergraduate/content/abstracten.tex b/co/undergraduate/content/abstracten.tex index 704a7800..8ad92129 100644 --- a/co/undergraduate/content/abstracten.tex +++ b/co/undergraduate/content/abstracten.tex @@ -1,5 +1,5 @@ -%!TEX root = ../csuthesis_main.tex -\keywordsen{automatic towing vehicle \ \ aircraft docking \ \ ROS \ \ Gazebo \ \ path planning \ \ multi-sensor fusion \ \ co-simulation} +%!TEX root = ../hutbthesis_main.tex +\keywordsen{automatic towing vehicle; aircraft docking; ROS; Gazebo; path planning; multi-sensor fusion; co-simulation} \begin{abstracten} With the development of intelligent airport ground operations, aircraft towing and docking tasks require higher levels of automation, accuracy, and safety. Traditional manual towing operations rely heavily on operator experience, and may be limited by efficiency and potential safety risks. Therefore, this thesis focuses on the automatic docking process between an airport towing vehicle and an aircraft, and establishes a ROS-Gazebo co-simulation system. diff --git a/co/undergraduate/content/abstractzh.tex b/co/undergraduate/content/abstractzh.tex index bd607e1b..8181dd01 100644 --- a/co/undergraduate/content/abstractzh.tex +++ b/co/undergraduate/content/abstractzh.tex @@ -1,13 +1,13 @@ -%!TEX root = ../csuthesis_main.tex +%!TEX root = ../hutbthesis_main.tex % 设置中文摘要 -\keywordscn{自动牵引车\quad 飞机对接\quad ROS\quad Gazebo\quad 路径规划\quad 联合仿真} +\keywordscn{自动牵引车;飞机对接;ROS;Gazebo;路径规划;联合仿真} %\categorycn{TP391} \begin{abstractzh} 随着机场地面运行智能化水平的提升,飞机牵引与对接作业对自动化、精确性和安全性提出了更高要求。针对传统人工牵引方式依赖经验、作业效率受限及安全风险较高等问题,本文以自动牵引车与飞机对接过程为研究对象,基于ROS与Gazebo平台构建联合仿真系统。 本文首先对机场牵引作业场景进行抽象,建立双桥转向牵引车运动学模型,并分析转向角、速度与轨迹曲率之间的约束关系。在此基础上,设计飞机辅助感知与相对位姿误差控制方法,通过目标身份确认、相对距离与姿态误差获取,实现牵引车的自动接近、姿态调整和停车判定。随后,基于Gazebo搭建牵引车、飞机目标和机场作业环境,并通过ROS节点完成车辆控制、传感器数据获取、任务模式切换和系统通信。 - 仿真结果表明,所构建的ROS-Gazebo联合仿真系统能够实现牵引车模型加载、转向控制、轮速控制、目标接近、对接、推出和撤离等基本流程,验证了所提方法在机场自动牵引对接场景中的可行性。本文研究可为后续真实样机开发、控制算法优化和多传感器融合研究提供一定参考 + 仿真结果表明,所构建的ROS-Gazebo联合仿真系统能够实现牵引车模型加载、转向控制、轮速控制、目标接近、对接、推出和撤离等基本流程,验证了所提方法在机场自动牵引对接场景中的可行性。本文研究可为后续真实样机开发、控制算法优化和多传感器融合研究提供一定参考。 diff --git a/co/undergraduate/content/appendix.tex b/co/undergraduate/content/appendix.tex index 6568330e..756d7bfd 100644 --- a/co/undergraduate/content/appendix.tex +++ b/co/undergraduate/content/appendix.tex @@ -1,9 +1,18 @@ %!TEX root = ../hutbthesis_main.tex -\chapter{主要符号、缩写说明、方法对比表格} +\chapter{主要符号、缩写说明与方法对比表格} \begin{longtable}[]{@{} >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.1551}} >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.8449}}@{}} +\caption{主要符号与缩写说明}\label{tab:appendix_symbols}\\ +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +\textbf{缩写/符号} +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +\textbf{含义} +\end{minipage} \\ +\midrule\noalign{} +\endfirsthead \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright \textbf{缩写/符号} @@ -28,14 +37,27 @@ \chapter{主要符号、缩写说明、方法对比表格} \(e_{\theta}\) & 姿态误差 \\ \end{longtable} -方法对比表格 - \begin{longtable}[]{@{} >{\raggedright\arraybackslash}p{(\columnwidth - 8\tabcolsep) * \real{0.1297}} >{\raggedright\arraybackslash}p{(\columnwidth - 8\tabcolsep) * \real{0.2442}} >{\raggedright\arraybackslash}p{(\columnwidth - 8\tabcolsep) * \real{0.2060}} >{\raggedright\arraybackslash}p{(\columnwidth - 8\tabcolsep) * \real{0.1866}} >{\raggedright\arraybackslash}p{(\columnwidth - 8\tabcolsep) * \real{0.2336}}@{}} +\caption{自动牵引对接方法对比}\label{tab:appendix_method_compare}\\ +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +\textbf{对比对象} +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +\textbf{主要特点} +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +\textbf{优点} +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +\textbf{局限性} +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +\textbf{与本文方法的关系} +\end{minipage} \\ +\midrule\noalign{} +\endfirsthead \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright \textbf{对比对象} @@ -52,416 +74,134 @@ \chapter{主要符号、缩写说明、方法对比表格} \endhead \bottomrule\noalign{} \endlastfoot -人工牵引 & 驾驶员和地面人员协同完成牵引作业 & -经验判断灵活,适应真实复杂环境能力强 & -依赖人员经验,标准化和重复精度受人为因素影响 & -本文方法不能直接替代人工,但可为自动化流程提供仿真验证基础 \\ -固定路径/开环脚本 & 通过预设速度、转向角和时间完成动作 & -实现简单,适合早期动画和模型验证 & -缺少误差反馈,环境或初始状态变化后适应性差 & -本文在此基础上增加相对位姿误差控制思想 \\ -PID控制 & 对速度、角度等单变量进行反馈调节 & 结构简单,工程应用广 & -难以单独处理多变量耦合的精确对接问题 & -可作为底层控制基础,但不足以完整描述对接策略 \\ -Pure Pursuit & 基于前视点进行路径跟踪 & 路径跟踪平滑,实现难度适中 & -末端精确姿态对准能力有限 & 适合普通循迹,本文更强调近距离位姿误差修正 \\ -Stanley算法 & 基于横向误差和航向误差进行控制 & -适合车辆路径跟踪,横向误差修正能力较好 & -更偏向中高速路径跟踪,低速精细对接针对性不足 & -可作为参考,但本文场景更偏低速对接 \\ -MPC控制 & 在约束条件下进行预测优化控制 & 理论效果好,可处理多约束问题 & -建模和调参复杂,实现难度较高 & 后续可作为优化方向,本文阶段暂不采用 \\ -SLAM/深度学习方法 & 依赖建图、视觉识别或数据驱动决策 & -自主性和智能化程度高 & 数据、算力和系统复杂度要求高 & -本文保留扩展接口,但现阶段以规则化仿真验证为主 \\ -本文方法 & ROS-Gazebo仿真、飞机辅助感知、相对位姿误差控制、4WS执行 & -流程完整、结构清晰、实现难度适中,适合毕业设计验证 & -仿真简化较多,真实环境鲁棒性仍需进一步验证 & -作为自动牵引对接系统的前期仿真与算法验证方案 \\ +人工牵引 & 驾驶员和地面人员协同完成牵引作业 & 经验判断灵活,适应真实复杂环境能力强 & 依赖人员经验,标准化和重复精度受人为因素影响 & 本文方法不能直接替代人工,但可为自动化流程提供仿真验证基础 \\ +固定路径/开环脚本 & 通过预设速度、转向角和时间完成动作 & 实现简单,适合早期动画和模型验证 & 缺少误差反馈,环境或初始状态变化后适应性差 & 本文在此基础上增加相对位姿误差控制思想 \\ +PID控制 & 对速度、角度等单变量进行反馈调节 & 结构简单,工程应用广 & 难以单独处理多变量耦合的精确对接问题 & 可作为底层控制基础,但不足以完整描述对接策略 \\ +Pure Pursuit & 基于前视点进行路径跟踪 & 路径跟踪平滑,实现难度适中 & 末端精确姿态对准能力有限 & 适合普通循迹,本文更强调近距离位姿误差修正 \\ +Stanley算法 & 基于横向误差和航向误差进行控制 & 适合车辆路径跟踪,横向误差修正能力较好 & 更偏向中高速路径跟踪,低速精细对接针对性不足 & 可作为参考,但本文场景更偏低速对接 \\ +MPC控制 & 在约束条件下进行预测优化控制 & 理论效果好,可处理多约束问题 & 建模和调参复杂,实现难度较高 & 后续可作为优化方向,本文阶段暂不采用 \\ +本文方法 & ROS-Gazebo仿真、飞机辅助感知、相对位姿误差控制、4WS执行 & 流程完整、结构清晰、实现难度适中,适合毕业设计验证 & 仿真简化较多,真实环境鲁棒性仍需进一步验证 & 作为自动牵引对接系统的前期仿真与算法验证方案 \\ \end{longtable} -\chapter{ROS-Gazebo仿真系统主要命令与自动牵引作业核心节选} - -1.启动命令: - -cd~\textasciitilde/tug\_ws - -catkin\_make - -source~devel/setup.bash - -roslaunch~zongzhuang~gazebo.launch - -2.控制器加载命令: - -rosrun~controller\_manager~spawner~\textbackslash{} - -/zongzhuang/front\_left\_wheel\_velocity\_controller~\textbackslash{} - -/zongzhuang/front\_right\_wheel\_velocity\_controller~\textbackslash{} - -/zongzhuang/back\_left\_wheel\_velocity\_controller~\textbackslash{} - -/zongzhuang/back\_right\_wheel\_velocity\_controller - -测试脚本运行命令: - -chmod~+x~test\_control.py - -rosrun~tug\_control~test\_control.py - -3.目标点生成 - -~~~~def~transform\_local\_to\_world(self,~base\_pose,~local\_x,~local\_y,~local\_yaw=0.0): - -~~~~~~~~""" - -~~~~~~~~将飞机局部坐标系下的点转换到~Gazebo~世界坐标系。 - -~~~~~~~~""" - -~~~~~~~~c~=~math.cos(base\_pose.yaw) - -~~~~~~~~s~=~math.sin(base\_pose.yaw) - -~~~~~~~~world\_x~=~base\_pose.x~+~c~*~local\_x~-~s~*~local\_y - -~~~~~~~~world\_y~=~base\_pose.y~+~s~*~local\_x~+~c~*~local\_y - -~~~~~~~~world\_yaw~=~wrap\_to\_pi(base\_pose.yaw~+~local\_yaw) - -~~~~~~~~return~Pose2D(world\_x,~world\_y,~world\_yaw) - -~~~~def~generate\_task\_points(self,~aircraft\_pose): - -~~~~~~~~""" - -~~~~~~~~根据飞机位姿生成自动牵引作业所需的关键点: - -~~~~~~~~1.~前起落架点; - -~~~~~~~~2.~牵引车对接点; - -~~~~~~~~3.~预对接点; - -~~~~~~~~4.~飞机推出目标点; - -~~~~~~~~5.~牵引车撤离点。 - -~~~~~~~~""" - -~~~~~~~~\emph{\#~飞机前起落架点} - -~~~~~~~~nose\_gear\_pose~=~self.transform\_local\_to\_world( - -~~~~~~~~~~~~aircraft\_pose, - -~~~~~~~~~~~~self.nose\_gear\_offset\_x, - -~~~~~~~~~~~~self.nose\_gear\_offset\_y, - -~~~~~~~~~~~~0.0 - -~~~~~~~~) - -~~~~~~~~\emph{\#~对接点:牵引车前牵引钩与飞机前起落架重合} - -~~~~~~~~dock\_pose~=~self.transform\_local\_to\_world( - -~~~~~~~~~~~~nose\_gear\_pose, - -~~~~~~~~~~~~-self.hitch\_offset\_x, - -~~~~~~~~~~~~-self.hitch\_offset\_y, - -~~~~~~~~~~~~0.0 - -~~~~~~~~) - -~~~~~~~~\emph{\#~预对接点:沿飞机航向反方向后退一定距离} - -~~~~~~~~pre\_dock\_pose~=~self.transform\_local\_to\_world( - -~~~~~~~~~~~~dock\_pose, - -~~~~~~~~~~~~-self.pre\_dock\_distance, - -~~~~~~~~~~~~0.0, - -~~~~~~~~~~~~0.0 - -~~~~~~~~) - -~~~~~~~~\emph{\#~推出目标点:飞机沿机身反方向推出} - -~~~~~~~~pushback\_pose~=~self.transform\_local\_to\_world( - -~~~~~~~~~~~~dock\_pose, - -~~~~~~~~~~~~-self.pushback\_distance, - -~~~~~~~~~~~~0.0, - -~~~~~~~~~~~~0.0 - -~~~~~~~~) - -~~~~~~~~\emph{\#~撤离点:牵引车完成解挂后向侧后方撤离} - -~~~~~~~~retreat\_pose~=~self.transform\_local\_to\_world( - -~~~~~~~~~~~~pushback\_pose, - -~~~~~~~~~~~~self.retreat\_offset\_x, - -~~~~~~~~~~~~self.retreat\_offset\_y, - -~~~~~~~~~~~~0.0 - -~~~~~~~~) - -~~~~~~~~return~pre\_dock\_pose,~dock\_pose,~pushback\_pose,~retreat\_pose - -4.相对位姿误差控制 - -~~def~compute\_pose\_control(self,~current\_pose,~target\_pose,~max\_speed): - -~~~~~~~~""" - -~~~~~~~~基于相对位姿误差的车辆控制律。 - -~~~~~~~~current\_pose:牵引车当前位姿 - -~~~~~~~~target\_pose:目标位姿 - -~~~~~~~~max\_speed:当前阶段最大速度 - -~~~~~~~~输出: - -~~~~~~~~speed:车辆线速度 - -~~~~~~~~curvature:参考路径曲率 - -~~~~~~~~distance:当前位置到目标点的距离 - -~~~~~~~~yaw\_error:航向角误差 - -~~~~~~~~""" - -~~~~~~~~dx~=~target\_pose.x~-~current\_pose.x - -~~~~~~~~dy~=~target\_pose.y~-~current\_pose.y - -~~~~~~~~\emph{\#~将世界坐标误差转换到车辆自身坐标系} - -~~~~~~~~c~=~math.cos(current\_pose.yaw) - -~~~~~~~~s~=~math.sin(current\_pose.yaw) - -~~~~~~~~ex~=~c~*~dx~+~s~*~dy - -~~~~~~~~ey~=~-s~*~dx~+~c~*~dy - -~~~~~~~~distance~=~math.sqrt(dx~*~dx~+~dy~*~dy) - -~~~~~~~~target\_angle\_body~=~math.atan2(ey,~ex) - -~~~~~~~~\emph{\#~判断目标点位于车辆前方还是后方} - -~~~~~~~~direction~=~1.0 - -~~~~~~~~alpha~=~target\_angle\_body - -~~~~~~~~if~abs(target\_angle\_body)~\textgreater~math.pi~/~2.0: - -~~~~~~~~~~~~direction~=~-1.0 - -~~~~~~~~~~~~alpha~=~wrap\_to\_pi(target\_angle\_body~-~math.pi) - -~~~~~~~~yaw\_error~=~wrap\_to\_pi(target\_pose.yaw~-~current\_pose.yaw) - -~~~~~~~~\emph{\#~距离误差生成线速度} - -~~~~~~~~speed~=~self.k\_rho~*~distance - -~~~~~~~~speed~=~clamp(speed,~self.min\_motion\_speed,~max\_speed) - -~~~~~~~~speed~*=~direction - -~~~~~~~~\emph{\#~横向误差与航向误差共同生成角速度} - -~~~~~~~~if~distance~\textgreater~0.8: - -~~~~~~~~~~~~omega~=~self.k\_alpha~*~alpha - -~~~~~~~~else: - -~~~~~~~~~~~~omega~=~self.k\_alpha~*~alpha~+~self.k\_yaw~*~yaw\_error - -~~~~~~~~\emph{\#~倒车时角速度方向修正} - -~~~~~~~~if~direction~\textless~0.0: - -~~~~~~~~~~~~omega~=~-omega - -~~~~~~~~\emph{\#~角速度转换为参考路径曲率} - -~~~~~~~~if~abs(speed)~\textless~1e-5: - -~~~~~~~~~~~~curvature~=~0.0 - -~~~~~~~~else: - -~~~~~~~~~~~~curvature~=~omega~/~speed - -~~~~~~~~return~speed,~curvature,~distance,~abs(yaw\_error) - -5.自动牵引作业状态机主流程 - -~~~~def~run\_task\_state\_machine(self,~aircraft\_pose,~current\_tug\_pose): - -~~~~~~~~""" - -~~~~~~~~自动牵引作业状态机主逻辑。 - -~~~~~~~~该函数体现从目标识别、自动对接、推出到撤离的完整流程。 - -~~~~~~~~""" - -~~~~~~~~pre\_dock\_pose,~dock\_pose,~pushback\_pose,~retreat\_pose~=~\textbackslash{} - -~~~~~~~~~~~~self.generate\_task\_points(aircraft\_pose) - -~~~~~~~~\emph{\#~搜索并确认飞机目标} - -~~~~~~~~if~self.state~==~TaskState.SEARCH\_TARGET: - -~~~~~~~~~~~~target\_valid~=~aircraft\_pose~is~not~None - -~~~~~~~~~~~~if~target\_valid: - -~~~~~~~~~~~~~~~~self.state~=~TaskState.APPROACH\_PRE\_DOCK - -~~~~~~~~~~~~return~0.0,~0.0,~0.0 - -~~~~~~~~\emph{\#~前往预对接点} - -~~~~~~~~elif~self.state~==~TaskState.APPROACH\_PRE\_DOCK: - -~~~~~~~~~~~~speed,~front\_delta,~back\_delta,~reached~=~self.go\_to\_pose\_step( - -~~~~~~~~~~~~~~~~current\_tug\_pose, - -~~~~~~~~~~~~~~~~pre\_dock\_pose, - -~~~~~~~~~~~~~~~~self.max\_approach\_speed, - -~~~~~~~~~~~~~~~~"front\_only" - -~~~~~~~~~~~~) - -~~~~~~~~~~~~if~reached: - -~~~~~~~~~~~~~~~~self.state~=~TaskState.PRECISE\_DOCK - -~~~~~~~~~~~~return~speed,~front\_delta,~back\_delta - -~~~~~~~~\emph{\#~低速精确对接} - -~~~~~~~~elif~self.state~==~TaskState.PRECISE\_DOCK: - -~~~~~~~~~~~~speed,~front\_delta,~back\_delta,~reached~=~self.go\_to\_pose\_step( - -~~~~~~~~~~~~~~~~current\_tug\_pose, - -~~~~~~~~~~~~~~~~dock\_pose, - -~~~~~~~~~~~~~~~~self.max\_dock\_speed, - -~~~~~~~~~~~~~~~~"counter\_phase" - -~~~~~~~~~~~~) - -~~~~~~~~~~~~if~reached: - -~~~~~~~~~~~~~~~~self.state~=~TaskState.ATTACH - -~~~~~~~~~~~~return~speed,~front\_delta,~back\_delta - -~~~~~~~~\emph{\#~建立牵引连接} - -~~~~~~~~elif~self.state~==~TaskState.ATTACH: - -~~~~~~~~~~~~\emph{\#~工程实现中,此处可建立虚拟牵引约束或调用连接装置模型} - -~~~~~~~~~~~~self.state~=~TaskState.PUSHBACK - -~~~~~~~~~~~~return~0.0,~0.0,~0.0 - -~~~~~~~~\emph{\#~飞机推出} - -~~~~~~~~elif~self.state~==~TaskState.PUSHBACK: - -~~~~~~~~~~~~speed,~front\_delta,~back\_delta,~reached~=~self.go\_to\_pose\_step( - -~~~~~~~~~~~~~~~~current\_tug\_pose, - -~~~~~~~~~~~~~~~~pushback\_pose, - -~~~~~~~~~~~~~~~~self.max\_pushback\_speed, - -~~~~~~~~~~~~~~~~"counter\_phase" - -~~~~~~~~~~~~) - -~~~~~~~~~~~~if~reached: - -~~~~~~~~~~~~~~~~self.state~=~TaskState.RELEASE - -~~~~~~~~~~~~return~speed,~front\_delta,~back\_delta - -~~~~~~~~\emph{\#~解除牵引连接} - -~~~~~~~~elif~self.state~==~TaskState.RELEASE: - -~~~~~~~~~~~~\emph{\#~工程实现中,此处解除虚拟牵引约束或机械连接} - -~~~~~~~~~~~~self.state~=~TaskState.RETREAT - -~~~~~~~~~~~~return~0.0,~0.0,~0.0 - -~~~~~~~~\emph{\#~车辆撤离} - -~~~~~~~~elif~self.state~==~TaskState.RETREAT: - -~~~~~~~~~~~~speed,~front\_delta,~back\_delta,~reached~=~self.go\_to\_pose\_step( - -~~~~~~~~~~~~~~~~current\_tug\_pose, - -~~~~~~~~~~~~~~~~retreat\_pose, - -~~~~~~~~~~~~~~~~self.max\_retreat\_speed, - -~~~~~~~~~~~~~~~~"front\_only" - -~~~~~~~~~~~~) - -~~~~~~~~~~~~if~reached: - -~~~~~~~~~~~~~~~~self.state~=~TaskState.DONE - -~~~~~~~~~~~~return~speed,~front\_delta,~back\_delta - -~~~~~~~~\emph{\#~任务完成} - -~~~~~~~~elif~self.state~==~TaskState.DONE: - -~~~~~~~~~~~~return~0.0,~0.0,~0.0 - -~~~~~~~~\emph{\#~异常中止} - -~~~~~~~~else: - -~~~~~~~~~~~~self.state~=~TaskState.ABORT - -~~~~~~~~~~~~return~0.0,~0.0,~0.0 +\chapter{ROS-Gazebo仿真系统主要命令与自动牵引作业核心代码节选} + +\section{主要启动与测试命令} + +ROS-Gazebo联合仿真系统的主要启动流程如下所示。 + +\begin{lstlisting} +cd ~/tug_ws +catkin_make +source devel/setup.bash +roslaunch zongzhuang gazebo.launch +\end{lstlisting} + +控制器加载命令如下所示。 + +\begin{lstlisting} +rosrun controller_manager spawner \ + /zongzhuang/front_left_wheel_velocity_controller \ + /zongzhuang/front_right_wheel_velocity_controller \ + /zongzhuang/back_left_wheel_velocity_controller \ + /zongzhuang/back_right_wheel_velocity_controller +\end{lstlisting} + +测试脚本运行命令如下所示。 + +\begin{lstlisting} +chmod +x test_control.py +rosrun tug_control test_control.py +\end{lstlisting} + +\section{目标点生成核心代码} + +\begin{lstlisting}[language=Python] +def transform_local_to_world(self, base_pose, local_x, local_y, local_yaw=0.0): + c = math.cos(base_pose.yaw) + s = math.sin(base_pose.yaw) + world_x = base_pose.x + c * local_x - s * local_y + world_y = base_pose.y + s * local_x + c * local_y + world_yaw = wrap_to_pi(base_pose.yaw + local_yaw) + return Pose2D(world_x, world_y, world_yaw) + + +def generate_task_points(self, aircraft_pose): + nose_gear_pose = self.transform_local_to_world( + aircraft_pose, + self.nose_gear_offset_x, + self.nose_gear_offset_y, + 0.0 + ) + + dock_pose = self.transform_local_to_world( + nose_gear_pose, + -self.hitch_offset_x, + -self.hitch_offset_y, + 0.0 + ) + + pre_dock_pose = self.transform_local_to_world( + dock_pose, + -self.pre_dock_distance, + 0.0, + 0.0 + ) + + pushback_pose = self.transform_local_to_world( + dock_pose, + -self.pushback_distance, + 0.0, + 0.0 + ) + + retreat_pose = self.transform_local_to_world( + pushback_pose, + self.retreat_offset_x, + self.retreat_offset_y, + 0.0 + ) + + return pre_dock_pose, dock_pose, pushback_pose, retreat_pose +\end{lstlisting} + +\section{相对位姿误差控制核心代码} + +\begin{lstlisting}[language=Python] +def compute_pose_control(self, current_pose, target_pose, max_speed): + dx = target_pose.x - current_pose.x + dy = target_pose.y - current_pose.y + + c = math.cos(current_pose.yaw) + s = math.sin(current_pose.yaw) + ex = c * dx + s * dy + ey = -s * dx + c * dy + + distance = math.sqrt(dx * dx + dy * dy) + target_angle_body = math.atan2(ey, ex) + + direction = 1.0 + alpha = target_angle_body + if abs(target_angle_body) > math.pi / 2.0: + direction = -1.0 + alpha = wrap_to_pi(target_angle_body - math.pi) + + yaw_error = wrap_to_pi(target_pose.yaw - current_pose.yaw) + speed = self.k_rho * distance + speed = clamp(speed, self.min_motion_speed, max_speed) + speed *= direction + + if distance > 0.8: + omega = self.k_alpha * alpha + else: + omega = self.k_alpha * alpha + self.k_yaw * yaw_error + + if direction < 0.0: + omega = -omega + + if abs(speed) < 1e-5: + curvature = 0.0 + else: + curvature = omega / speed + + return speed, curvature, distance, abs(yaw_error) +\end{lstlisting} diff --git a/co/undergraduate/content/chapter1.tex b/co/undergraduate/content/chapter1.tex index 40857328..2ae5f249 100644 --- a/co/undergraduate/content/chapter1.tex +++ b/co/undergraduate/content/chapter1.tex @@ -3,67 +3,55 @@ \chapter{绪论} \section{研究背景与意义} -在一次航班离港流程中,飞机从停机位推出到进入滑行路线,看起来只是周转链条中的一个短环节,但它实际上同时牵涉机坪交通、廊桥区域安全、地勤人员协同和后续放行节奏。牵引车需要在飞机前起落架附近低速靠近,车身周围又存在机翼、发动机、廊桥、保障车辆和地面标线等多种约束。任何一次偏航过大、停车不及时或目标识别错误,都可能使简单的推出作业演变为安全事件。因此,飞机牵引与推出并不是单纯的``车辆驾驶''问题,而是一个典型的低速、高精度、多约束协同作业问题\textsuperscript{[1-2]}。 +在一次航班离港流程中,飞机从停机位推出到进入滑行路线,看起来只是周转链条中的一个短环节,但它实际上同时牵涉机坪交通、廊桥区域安全、地勤人员协同和后续放行节奏。牵引车需要在飞机前起落架附近低速靠近,车身周围又存在机翼、发动机、廊桥、保障车辆和地面标线等多种约束。任何一次偏航过大、停车不及时或目标识别错误,都可能使简单的推出作业演变为安全事件。因此,飞机牵引与推出并不是单纯的``车辆驾驶''问题,而是一个典型的低速、高精度、多约束协同作业问题\cite{ref1,ref2}。 目前多数机场的推出与牵引仍以人工驾驶牵引车、机务或指挥员目视协同为主。该方式在经验丰富、交通密度较低的情况下较为可靠,但其稳定性很大程度取决于人员状态和现场沟通质量。航班高峰、夜航、雨雾天气以及机坪车辆交叉运行时,人工判断容易受到视距、噪声和遮挡影响,牵引路径规划、翼尖安全距离判断、前起落架对准等环节都可能出现误差。对智慧机场而言,这类高度依赖人工经验的作业环节,会限制地面运行系统继续向闭环调度和自动执行方向发展。 -相关资料表明,机场地面运行阶段的安全风险并不低,推出、牵引和低速滑行是典型的风险集中环节之一,常见问题包括牵引车与机体接触、翼尖剐蹭、人员误入作业区域等。同时,地面运行延误还会沿航班计划向后传递,使单个机位或单个航班的问题进一步影响后续起飞排序和机坪资源利用。因此,提高牵引作业的自动化水平,不仅有助于降低局部操作风险,也有助于提升机场地面运行的整体稳定性\textsuperscript{[3-6]}。 +相关资料表明,机场地面运行阶段的安全风险并不低,推出、牵引和低速滑行是典型的风险集中环节之一,常见问题包括牵引车与机体接触、翼尖剐蹭、人员误入作业区域等。同时,地面运行延误还会沿航班计划向后传递,使单个机位或单个航班的问题进一步影响后续起飞排序和机坪资源利用。因此,提高牵引作业的自动化水平,不仅有助于降低局部操作风险,也有助于提升机场地面运行的整体稳定性\cite{ref3,ref4,ref5,ref6}。 从技术发展看,机场场面运行系统正由传统SMGCS向A-SMGCS(Advanced Surface Movement Guidance and Control -System)升级。A-SMGCS强调对地面目标的监视、引导、冲突预警和运行协同,为机场车辆与航空器的统一管理提供了系统框架\textsuperscript{[2-4]}。不过,现有研究和工程应用更多集中在飞机滑行监视、场面交通管理和冲突告警层面,对``牵引车---飞机''这一强耦合、近距离、低速精对准对象的自动控制研究仍不充分。尤其是在牵引车接近前起落架、姿态对齐、低速停车和后续推出这一连续过程中,仍缺少面向仿真验证的完整方法。 +System)升级。A-SMGCS强调对地面目标的监视、引导、冲突预警和运行协同,为机场车辆与航空器的统一管理提供了系统框架\cite{ref2,ref3,ref4}。不过,现有研究和工程应用更多集中在飞机滑行监视、场面交通管理和冲突告警层面,对``牵引车---飞机''这一强耦合、近距离、低速精对准对象的自动控制研究仍不充分。尤其是在牵引车接近前起落架、姿态对齐、低速停车和后续推出这一连续过程中,仍缺少面向仿真验证的完整方法。 -基于上述背景,本文选择以高保真仿真环境为研究支撑,围绕机场牵引车与飞行器的协同控制展开建模、感知、路径规划和控制验证。通过在ROS与Gazebo环境中构建牵引车、飞机目标和机坪作业场景,可以在较低成本下复现实车试验中难以频繁开展的对接过程,观察车辆转向、速度、目标识别和安全约束之间的相互影响\textsuperscript{[11-13]}。这对于后续自动牵引系统的样机设计、控制算法调试以及机场地面作业智能化研究都具有现实意义。 +基于上述背景,本文选择以高保真仿真环境为研究支撑,围绕机场牵引车与飞行器的协同控制展开建模、感知、路径规划和控制验证。通过在ROS与Gazebo环境中构建牵引车、飞机目标和机坪作业场景,可以在较低成本下复现实车试验中难以频繁开展的对接过程,观察车辆转向、速度、目标识别和安全约束之间的相互影响\cite{ref11,ref12,ref13}。这对于后续自动牵引系统的样机设计、控制算法调试以及机场地面作业智能化研究都具有现实意义。 \section{国内外研究现状} \subsection{机场牵引与地面自动化研究现状} -机场地面自动化研究的出发点,是在不降低安全裕度的前提下减少人工重复操作,并提高机坪资源的利用效率\textsuperscript{[1-4]}。飞机推出与牵引处在航班周转和场面交通之间:一方面,它需要服从停机位、滑行通道、速度限制和指挥流程等机场运行规则;另一方面,它又要求牵引车在飞机前起落架附近完成低速对准、连接和稳定牵引。因此,该环节既有车辆控制问题,也有机场运行组织问题。 +机场地面自动化研究的出发点,是在不降低安全裕度的前提下减少人工重复操作,并提高机坪资源的利用效率\cite{ref1,ref2,ref3,ref4}。飞机推出与牵引处在航班周转和场面交通之间:一方面,它需要服从停机位、滑行通道、速度限制和指挥流程等机场运行规则;另一方面,它又要求牵引车在飞机前起落架附近完成低速对准、连接和稳定牵引。因此,该环节既有车辆控制问题,也有机场运行组织问题。 -国外较早围绕``无发动机滑行''和自动牵引开展研究。以TaxiBot、e-Taxi等方案为代表,相关工作尝试通过牵引车或机轮电驱系统减少飞机发动机地面运行时间,从而降低燃油消耗、噪声和排放\textsuperscript{[6,8-9]}。Zaninotto等面向自动牵引作业提出调度与路径规划方法,通过冲突检测和时序优化减少牵引车之间、牵引车与飞机之间的运行冲突,说明自动牵引在提高滑行效率和减少人为差错方面具有可行性\textsuperscript{[7]}。此外,也有研究从牵引车---飞机组合体的制动、转向和纵向耦合特性入手,为低速牵引控制提供动力学基础\textsuperscript{[6,10,19]}。 +国外较早围绕``无发动机滑行''和自动牵引开展研究。以TaxiBot、e-Taxi等方案为代表,相关工作尝试通过牵引车或机轮电驱系统减少飞机发动机地面运行时间,从而降低燃油消耗、噪声和排放\cite{ref6,ref8,ref9}。Zaninotto等面向自动牵引作业提出调度与路径规划方法,通过冲突检测和时序优化减少牵引车之间、牵引车与飞机之间的运行冲突,说明自动牵引在提高滑行效率和减少人为差错方面具有可行性\cite{ref7}。此外,也有研究从牵引车---飞机组合体的制动、转向和纵向耦合特性入手,为低速牵引控制提供动力学基础\cite{ref6,ref10,ref19}。 -在机场系统层面,SESAR等项目持续推动场面运行从单点自动化向系统协同自动化发展。A-SMGCS的相关研究强调将监视、路径引导、冲突预警与运行管理结合起来,使机场能够对航空器和车辆目标进行更精细的状态管理\textsuperscript{[2-4]}。这类研究为自动牵引提供了上层运行框架,但其重点通常不在牵引车末端对接控制本身,而在于更大范围的场面交通监视与运行调度。 +在机场系统层面,SESAR等项目持续推动场面运行从单点自动化向系统协同自动化发展。A-SMGCS的相关研究强调将监视、路径引导、冲突预警与运行管理结合起来,使机场能够对航空器和车辆目标进行更精细的状态管理\cite{ref2,ref3,ref4}。这类研究为自动牵引提供了上层运行框架,但其重点通常不在牵引车末端对接控制本身,而在于更大范围的场面交通监视与运行调度。 -国内关于飞机牵引滑行和地面运行智能化的研究起步相对较晚,但近年来进展明显。孙艳坤等对飞机牵引滑行技术进行了系统综述,内容涉及牵引装备类型、动力学特性、运行模式和发展趋势,并指出自动牵引与智能调度是后续重要方向\textsuperscript{[6]}。在规范层面,中国民航局发布的A-SMGCS相关技术指南和行业标准,也为机场场面运行的信息化和智能化建设提供了依据\textsuperscript{[1-2]}。不过,从现有公开研究看,国内工作仍较多停留在系统规划、装备综述或单一算法分析层面,对牵引车自动接近飞机、对准前起落架并完成安全停车这一末端过程的仿真验证仍然不足。 +国内关于飞机牵引滑行和地面运行智能化的研究起步相对较晚,但近年来进展明显。孙艳坤等对飞机牵引滑行技术进行了系统综述,内容涉及牵引装备类型、动力学特性、运行模式和发展趋势,并指出自动牵引与智能调度是后续重要方向\cite{ref6}。在规范层面,中国民航局发布的A-SMGCS相关技术指南和行业标准,也为机场场面运行的信息化和智能化建设提供了依据\cite{ref1,ref2}。不过,从现有公开研究看,国内工作仍较多停留在系统规划、装备综述或单一算法分析层面,对牵引车自动接近飞机、对准前起落架并完成安全停车这一末端过程的仿真验证仍然不足。 因此,本文的研究切入点并不是重新讨论机场自动化的宏观框架,而是将问题压缩到一个更具体的作业单元:在给定机场作业规则和车辆结构约束下,牵引车如何识别飞机目标、生成可执行路径,并以稳定方式完成对接。这个问题更贴近实际工程调试,也更适合通过ROS-Gazebo联合仿真进行反复验证。 \subsection{协同控制与路径规划方法研究现状} -从方法上看,机场牵引自动化可归入移动机器人导航和智能车辆控制范畴,但它又不能完全照搬普通道路自动驾驶或仓储AGV的方案\textsuperscript{[17-20,28]}。原因在于,牵引车面对的是航空器这一高价值目标,运行区域空间狭窄、规则刚性强,而且最终对接阶段对横向误差和姿态误差都十分敏感。也就是说,路径规划不仅要``走得到'',还要``转得过、停得住、对得准''。 +从方法上看,机场牵引自动化可归入移动机器人导航和智能车辆控制范畴,但它又不能完全照搬普通道路自动驾驶或仓储AGV的方案\cite{ref17,ref18,ref19,ref20,ref28}。原因在于,牵引车面对的是航空器这一高价值目标,运行区域空间狭窄、规则刚性强,而且最终对接阶段对横向误差和姿态误差都十分敏感。也就是说,路径规划不仅要``走得到'',还要``转得过、停得住、对得准''。 -图搜索与采样类算法是路径规划研究中的基础方法。A*、Dijkstra等图搜索算法结构清晰、结果可解释性强,适合在机场滑行道、机坪通道等规则环境中生成全局参考路径\textsuperscript{[22-23]};RRT及其改进算法则更适合在连续空间中快速搜索可行路径,常用于机器人和自动车辆的运动规划\textsuperscript{[20-21,24]}。这类方法的优势在于稳定和易于检查,但在动态障碍较多、局部空间受限或车辆曲率约束较强时,单独使用往往需要额外的平滑、重规划和可行性筛选。 +图搜索与采样类算法是路径规划研究中的基础方法。A*、Dijkstra等图搜索算法结构清晰、结果可解释性强,适合在机场滑行道、机坪通道等规则环境中生成全局参考路径\cite{ref22,ref23};RRT及其改进算法则更适合在连续空间中快速搜索可行路径,常用于机器人和自动车辆的运动规划\cite{ref20,ref21,ref24}。这类方法的优势在于稳定和易于检查,但在动态障碍较多、局部空间受限或车辆曲率约束较强时,单独使用往往需要额外的平滑、重规划和可行性筛选。 智能优化算法也被广泛用于路径规划问题。例如蚁群算法、粒子群算法等可以把路径长度、安全距离、能耗或时间代价写入统一目标函数,对多约束规划具有一定灵活性。但这类算法通常对参数设置较敏感,收敛速度和解的稳定性会随场景复杂度变化而波动。机场牵引属于安全敏感任务,若规划结果难以解释或每次计算结果差异较大,工程应用就会受到限制。 近年来,强化学习和深度强化学习在复杂动态环境决策中受到关注。它们能够通过与环境交互学习策略,对未知障碍或非结构化场景具有一定适应能力。但机场场景对安全性、可验证性和监管合规性要求较高,单纯依赖黑箱策略并不合适;同时,强化学习对训练数据规模和仿真真实性依赖较强,若仿真与真实机坪差异较大,策略迁移效果也难以保证。 -综合来看,适合本课题的路线应是分层式、融合式的。上层规划尽量保留机场规则、车辆曲率和安全距离等显式约束,保证路径可解释、可检查;下层控制根据实时感知误差进行局部修正,解决对接过程中的小偏差和动态干扰。这样的框架既不过分依赖单一智能算法,也能避免纯规则方法在复杂局部场景中反应不足的问题,为后续牵引车---飞机协同控制提供了更稳妥的技术基础\textsuperscript{[25,28]}。 +综合来看,适合本课题的路线应是分层式、融合式的。上层规划尽量保留机场规则、车辆曲率和安全距离等显式约束,保证路径可解释、可检查;下层控制根据实时感知误差进行局部修正,解决对接过程中的小偏差和动态干扰。这样的框架既不过分依赖单一智能算法,也能避免纯规则方法在复杂局部场景中反应不足的问题,为后续牵引车---飞机协同控制提供了更稳妥的技术基础\cite{ref25,ref28}。 \section{研究内容与技术路线} -本文以机场飞机推出与牵引作业为应用背景,重点研究牵引车与飞行器在低速近距场景下的协同控制问题。课题并不追求单一算法指标,而是围绕``建模---感知---规划---控制---仿真验证''这条链路展开:先把机场牵引作业抽象成可计算的问题,再利用仿真平台检验车辆能否按预期完成目标识别、接近、对准和停车。结合本文已经开展的ROS/Gazebo建模、SolidWorks车辆模型导入、双桥转向控制调试等工作,主要研究内容如下。 +本文以机场飞机推出与牵引作业为应用背景,重点研究牵引车与飞行器在低速近距场景下的协同控制问题。课题并不追求单一算法指标,而是围绕``建模---感知---规划---控制---仿真验证''这条链路展开:先把机场牵引作业抽象成可计算的问题,再利用仿真平台检验车辆能否按预期完成目标识别、接近、对准和停车。结合本文已经开展的ROS/Gazebo建模、SolidWorks车辆模型导入、双桥转向控制调试等工作,主要研究内容和技术路线如图~\ref{fig:1-1} 所示,具体内容如下。 -(1)机场牵引作业流程建模与问题抽象 - -从停机位推出和前起落架对接过程出发,分析牵引车、飞机、机坪通道、禁行区域和障碍物之间的关系。根据作业顺序,将自动牵引过程划分为目标确认、初始接近、姿态对准、微动对接和停车保持等阶段,并把实际约束转化为状态变量、控制输入和安全边界。该部分的目的,是为后续控制算法提供一个统一的问题描述,而不是只停留在场景文字说明上。 - -(2)面向自动对接的飞机辅助感知方法 - -在仿真环境中,飞机前起落架区域被设计为主要识别对象,通过设置可识别标识,使牵引车能够获取目标身份、相对距离、横向偏差和姿态偏差等信息。视觉传感器用于目标确认与相对位姿估计,激光雷达、超声波或等效近距传感器用于安全距离判断。该部分重点解决``牵引车如何知道自己应该接近哪一架飞机、朝哪个方向对准、何时需要停车''的问题。 - -(3)多约束条件下的路径规划与协同控制方法 - -在车辆运动学模型和感知误差接口的基础上,设计自动接近与对接控制方法。全局层面,根据机场运行规则和车辆曲率约束生成可执行参考路径;局部层面,根据实时感知误差对速度和转向进行在线修正。控制策略需要同时考虑低速稳定性、转向角限制、安全距离、终端停车阈值和对接姿态要求。本文采用分层控制思路,将模式管理、局部规划、误差反馈和执行器映射分开处理,使算法结构更便于在ROS节点中实现。 - -(4)基于高保真模拟器的系统集成与验证 - -依托ROS与Gazebo搭建牵引车---飞机对接仿真系统。车辆模型由SolidWorks建立并经URDF/STL等形式导入Gazebo,前后桥转向关节和四个驱动车轮通过控制器实现位置和速度控制,传感器模型挂载于车体前部。通过设置典型机场作业场景,对牵引车模型加载、转向回中、轮速控制、目标接近和停车判定等功能进行验证,并从安全性、路径平滑性和控制稳定性等角度分析系统表现。 - -(5)牵引车辆结构与动力系统的工程化思考 - -在完成仿真和控制算法研究的同时,结合机场牵引车实际需求,对车辆结构、动力布置和维护便利性进行初步分析。该部分不作为完整机械设计展开,而是从工程实现角度讨论车辆硬件结构与控制策略之间的关系,例如双桥转向结构对小半径机动和精细对位的影响、动力响应对低速控制稳定性的影响等,为后续实物样机或半实物平台研究提供参考。 +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item \textbf{机场牵引作业流程建模与问题抽象}。从停机位推出和前起落架对接过程出发,分析牵引车、飞机、机坪通道、禁行区域和障碍物之间的关系。根据作业顺序,将自动牵引过程划分为目标确认、初始接近、姿态对准、微动对接和停车保持等阶段,并把实际约束转化为状态变量、控制输入和安全边界。该部分的目的,是为后续控制算法提供一个统一的问题描述,而不是只停留在场景文字说明上。 +\item \textbf{面向自动对接的飞机辅助感知方法}。在仿真环境中,飞机前起落架区域被设计为主要识别对象,通过设置可识别标识,使牵引车能够获取目标身份、相对距离、横向偏差和姿态偏差等信息。视觉传感器用于目标确认与相对位姿估计,激光雷达、超声波或等效近距传感器用于安全距离判断。该部分重点解决``牵引车如何知道自己应该接近哪一架飞机、朝哪个方向对准、何时需要停车''的问题。 +\item \textbf{多约束条件下的路径规划与协同控制方法}。在车辆运动学模型和感知误差接口的基础上,设计自动接近与对接控制方法。全局层面,根据机场运行规则和车辆曲率约束生成可执行参考路径;局部层面,根据实时感知误差对速度和转向进行在线修正。控制策略需要同时考虑低速稳定性、转向角限制、安全距离、终端停车阈值和对接姿态要求。本文采用分层控制思路,将模式管理、局部规划、误差反馈和执行器映射分开处理,使算法结构更便于在ROS节点中实现。 +\item \textbf{基于高保真模拟器的系统集成与验证}。依托ROS与Gazebo搭建牵引车---飞机对接仿真系统。车辆模型由SolidWorks建立并经URDF/STL等形式导入Gazebo,前后桥转向关节和四个驱动车轮通过控制器实现位置和速度控制,传感器模型挂载于车体前部。通过设置典型机场作业场景,对牵引车模型加载、转向回中、轮速控制、目标接近和停车判定等功能进行验证,并从安全性、路径平滑性和控制稳定性等角度分析系统表现。 +\item \textbf{牵引车辆结构与动力系统的工程化思考}。在完成仿真和控制算法研究的同时,结合机场牵引车实际需求,对车辆结构、动力布置和维护便利性进行初步分析。该部分不作为完整机械设计展开,而是从工程实现角度讨论车辆硬件结构与控制策略之间的关系,例如双桥转向结构对小半径机动和精细对位的影响、动力响应对低速控制稳定性的影响等,为后续实物样机或半实物平台研究提供参考。 +\end{enumerate} \begin{figure}[htbp] \centering diff --git a/co/undergraduate/content/chapter2.tex b/co/undergraduate/content/chapter2.tex index 37bf1356..7eeacd26 100644 --- a/co/undergraduate/content/chapter2.tex +++ b/co/undergraduate/content/chapter2.tex @@ -7,7 +7,7 @@ \section{机场牵引作业场景抽象} 结合本文研究目标,可将自动牵引对接过程抽象为五个连续阶段。第一阶段为任务初始化与目标确认,牵引车接收目标飞机信息并通过辅助识别标识完成身份判断;第二阶段为初始接近,车辆从给定初始位姿向飞机前起落架附近的预对接区域运动;第三阶段为姿态对准,车辆重点减小横向偏差和航向误差,使车体中心线逐步贴近目标对接方向;第四阶段为微动对接,牵引车在低速状态下完成小范围位置修正;第五阶段为停车保持,系统在满足距离、姿态和安全阈值后发布停车与转向回中命令。 -由此可见,飞机推出不是一条轨迹从起点跟到终点这么简单,而是目标识别、车辆运动学约束、安全边界和模式切换共同作用的状态演化过程\textsuperscript{[17-21]}。本章只先处理牵引车本体在机坪平面内如何运动的问题,即建立位姿状态、曲率关系和输入约束;飞机辅助识别、局部安全判断和最终对接控制将在第三章统一展开。 +由此可见,飞机推出不是一条轨迹从起点跟到终点这么简单,而是目标识别、车辆运动学约束、安全边界和模式切换共同作用的状态演化过程\cite{ref17,ref18,ref19,ref20,ref21}。本章只先处理牵引车本体在机坪平面内如何运动的问题,即建立位姿状态、曲率关系和输入约束;飞机辅助识别、局部安全判断和最终对接控制将在第三章统一展开。 \section{坐标系与状态变量定义} @@ -42,18 +42,26 @@ \section{车辆运动学模型建立} \subsection{非完整约束条件} 牵引车在机坪低速运行过程中,车轮主要满足纯滚动约束,即轮胎可沿轮平面方向滚动,但不能在垂直于轮平面的方向上发生理想横向滑移。因此,车辆系统属于典型非完整约束系统。对于车体参考点 -\(C\),其速度在车体横向方向上的投影应为零,可写为\(\dot{y}\cos\theta - \dot{x}\sin\theta = 0\)。该式的物理意义在于:车辆不能瞬时``侧向平移'',其平面运动只能由纵向速度与航向变化共同形成。这一约束是移动机器人与地面车辆运动学建模中的基本条件,也是后续推导轨迹方程的前提\textsuperscript{[17,19]}。 +\(C\),其速度在车体横向方向上的投影应为零,可写为式~\ref{eq:nonholonomic_constraint}。 +\begin{equation} +\dot{y}\cos\theta - \dot{x}\sin\theta = 0 +\label{eq:nonholonomic_constraint} +\end{equation} +该式的物理意义在于:车辆不能瞬时``侧向平移'',其平面运动只能由纵向速度与航向变化共同形成。这一约束是移动机器人与地面车辆运动学建模中的基本条件,也是后续推导轨迹方程的前提\cite{ref17,ref19}。 \subsection{单轨等效模型} -由于前桥左右轮、后桥左右轮在同一转向控制下可近似视为对称运动,因此可采用单轨等效方法,将实际四轮结构抽象为前后两虚拟轮\textsuperscript{[19]}。设前、后桥中心点分别位于车体参考点前后,车辆轴距为 -\(L\)。在低速、小侧偏工况下,车辆瞬时旋转中心满足几何关系,车辆平面运动可表示为(1) +由于前桥左右轮、后桥左右轮在同一转向控制下可近似视为对称运动,因此可采用单轨等效方法,将实际四轮结构抽象为前后两虚拟轮\cite{ref19}。设前、后桥中心点分别位于车体参考点前后,车辆轴距为 +\(L\)。在低速、小侧偏工况下,车辆瞬时旋转中心满足几何关系,车辆平面运动可表示为式~\ref{eq:planar_motion}。 -\(\left\{ \begin{array}{r} -\dot{x} = vcos\theta \\ -\dot{y} = vsin\theta \\ -\dot{\theta} = \omega\ -\end{array} \right.\ \) (1) +\begin{equation} +\begin{cases} +\dot{x}=v\cos\theta,\\ +\dot{y}=v\sin\theta,\\ +\dot{\theta}=\omega. +\end{cases} +\label{eq:planar_motion} +\end{equation} 式中,\(\omega\) 为车辆偏航角速度。前两式给出了车辆质点速度在全局坐标系中的分解形式,第三式给出了车辆姿态随时间的演化规律。车辆轨迹由两个因素共同决定:一是沿当前朝向的平移速度 @@ -63,21 +71,29 @@ \subsection{双桥转向角速度表达式} 对于普通前轮转向车辆,角速度通常由单一前轮转角决定;而对于双桥转向车辆,前桥和后桥转向均会对瞬时旋转中心位置产生影响。根据单轨几何关系,前桥与后桥分别对应的曲率贡献为 \(\tan\delta_{f}/L\)与 -\(\tan\delta_{r}/L\)。在统一参考方向下,车辆偏航角速度可表示为:\(\dot{\theta} = \omega = \frac{v}{L}\left( \tan\delta_{f} - \tan\delta_{r} \right)\)。\(\delta_{f}\) +\(\tan\delta_{r}/L\)。在统一参考方向下,车辆偏航角速度可表示为式~\ref{eq:yaw_rate_fourws}。 +\begin{equation} +\dot{\theta} = \omega = \frac{v}{L}\left( \tan\delta_{f} - \tan\delta_{r} \right) +\label{eq:yaw_rate_fourws} +\end{equation} +\(\delta_{f}\) 为前桥转角,\(\delta_{r}\) 为后桥转角,\(L\) 为前后桥中心距。该式表明,前桥转向与后桥转向对车辆角速度的作用方向相反。当后桥不转向,即 \(\delta_{r} = 0\)时,模型退化为普通前轮转向模型;当前后桥反向转向时,\(\tan\delta_{f} - \tan\delta_{r}\) 的绝对值增大,车辆角速度提高,转弯半径减小;当前后桥同向转向时,两者效应相互抵消,车辆偏航角速度下降,车辆运动趋于``蟹行''模式。 -将上述关系代入状态方程,可得双桥转向牵引车的运动学模型(2) +将上述关系代入状态方程,可得双桥转向牵引车的运动学模型式~\ref{eq:fourws_model}。 -\(\left\{ \begin{array}{r} -\dot{x} = vcos\theta \\ -\dot{y} = vsin\theta \\ -\dot{\theta} = \frac{v}{L}\left( tan\delta_{f} - tan\delta_{r} \right) -\end{array} \right.\ \) (2) +\begin{equation} +\begin{cases} +\dot{x}=v\cos\theta,\\ +\dot{y}=v\sin\theta,\\ +\dot{\theta}=\dfrac{v}{L}\left(\tan\delta_{f}-\tan\delta_{r}\right). +\end{cases} +\label{eq:fourws_model} +\end{equation} -该模型是本课题后续路径规划、轨迹跟踪与对接控制设计的基础模型\textsuperscript{[17,19,28]}。 +该模型是本课题后续路径规划、轨迹跟踪与对接控制设计的基础模型\cite{ref17,ref19,ref28}。 \section{转弯半径与曲率模型} @@ -86,7 +102,6 @@ \section{转弯半径与曲率模型} \begin{equation} \omega = \frac{v}{R} -\tag{3} \label{eq:3} \end{equation} @@ -94,7 +109,6 @@ \section{转弯半径与曲率模型} \begin{equation} R = \frac{L}{\tan\delta_{f} - \tan\delta_{r}} -\tag{4} \label{eq:4} \end{equation} @@ -102,18 +116,17 @@ \section{转弯半径与曲率模型} \begin{equation} \kappa = \frac{1}{R} = \frac{\tan\delta_{f} - \tan\delta_{r}}{L} -\tag{5} \label{eq:5} \end{equation} 上述两式给出了车辆转向输入与轨迹几何属性之间的直接联系。式中,\(R\) 用于衡量车辆完成转弯所需空间尺度,\(R\) 越小,表明车辆机动性越强;\(\kappa\) 用于衡量轨迹弯曲程度,\(\kappa\) -越大,表明车辆航向变化越快。对机场牵引作业而言,车辆能否在狭窄区域内完成姿态调整,本质上取决于其可实现的最小转弯半径或最大曲率\textsuperscript{[19,28]}。 +越大,表明车辆航向变化越快。对机场牵引作业而言,车辆能否在狭窄区域内完成姿态调整,本质上取决于其可实现的最小转弯半径或最大曲率\cite{ref19,ref28}。 需要指出的是,理论上当 \(\tan\delta_{f} - \tan\delta_{r} = 0\)时,\(R \rightarrow \infty\),车辆轨迹退化为直线或近似平移;而当 -\(\mid tan\delta_{f} - \tan\delta_{r} \mid\)增大时,车辆可实现更强的转向能力。但在工程应用中,前后桥转角均受机械结构、执行器能力和稳定性要求限制,因此曲率不可能无限增大,而必须满足可实现性约束。 +\(|\tan\delta_{f} - \tan\delta_{r}|\)增大时,车辆可实现更强的转向能力。但在工程应用中,前后桥转角均受机械结构、执行器能力和稳定性要求限制,因此曲率不可能无限增大,而必须满足可实现性约束。 \section{典型转向模式分析} @@ -125,11 +138,10 @@ \subsection{前桥单独转向模式} \begin{equation} \dot{\theta} = \frac{v}{L}\tan\delta_{f} -\tag{6} \label{eq:6} \end{equation} -此时车辆行为与传统前轮转向车辆基本一致(图2-1)。该模式实现简单、控制逻辑清晰,但在对接空间受限的场景下,其最小转弯半径较大,不利于快速完成姿态调整。 +此时车辆行为与传统前轮转向车辆基本一致,如图~\ref{fig:2-1} 所示。该模式实现简单、控制逻辑清晰,但在对接空间受限的场景下,其最小转弯半径较大,不利于快速完成姿态调整。 \begin{figure}[htbp] \centering @@ -140,12 +152,14 @@ \subsection{前桥单独转向模式} \subsection{前后桥反向转向模式} -当后桥转角与前桥转角方向相反,且幅值近似相等,即\(\delta_{r} = - \delta_{f}\)代入角速表达式可得 +当后桥转角与前桥转角方向相反,且幅值近似相等,即\(\delta_{r} = - \delta_{f}\)。代入角速度表达式可得 -\(\dot{\theta} = \frac{v}{L}\left( tan\delta_{f} - tan( - \delta_{f}) \right) = \frac{2v}{L}tan\delta_{f}\) -(7) +\begin{equation} +\dot{\theta}=\frac{v}{L}\left[\tan\delta_{f}-\tan(-\delta_{f})\right]=\frac{2v}{L}\tan\delta_{f}. +\label{eq:opposite_steering} +\end{equation} -此时车辆偏航角速度约为单桥转向工况的两倍,转弯半径显著减小(图2-2),适用于牵引车在狭小机坪空间内快速调整姿态、靠近飞机前轮或完成局部避障。该模式是本课题中实现高机动性接近控制的重要运动模式。 +此时车辆偏航角速度约为单桥转向工况的两倍,转弯半径显著减小,如图~\ref{fig:2-2} 所示,适用于牵引车在狭小机坪空间内快速调整姿态、靠近飞机前轮或完成局部避障。该模式是本课题中实现高机动性接近控制的重要运动模式。 \begin{figure}[htbp] \centering @@ -159,7 +173,7 @@ \subsection{前后桥同向转向模式} 当\(\delta_{r} = \delta_{f}\)时,有\(\dot{\theta} = \frac{v}{L}\left( \tan\delta_{f} - \tan\delta_{f} \right) = 0\) 当车辆偏航角速度为零,此时车辆整体保持原有航向并沿车轮切线方向斜向平移,表现为 -``蟹行''运动(图2-3)。该模式并不适合大幅姿态修正,但对于微小横向误差修正、精细对位和低速贴近控制具有较高实用价值。 +``蟹行''运动,如图~\ref{fig:2-3} 所示。该模式并不适合大幅姿态修正,但对于微小横向误差修正、精细对位和低速贴近控制具有较高实用价值。 通过上述分析可知,双桥转向结构使牵引车不再局限于单一的``直行---转弯''运动,而具备在姿态快速修正与横向精细调节之间切换的能力,这也是其适用于飞机自动对接场景的重要原因。 @@ -176,8 +190,11 @@ \section{速度、转角与曲率约束建模} \subsection{速度约束} -牵引车在机场作业环境中通常处于低速运行状态,故其线速度应满足\(0 \leq v \leq v_{\max}\) -。 +牵引车在机场作业环境中通常处于低速运行状态,故其线速度应满足式~\ref{eq:velocity_limit}。 +\begin{equation} +0 \leq v \leq v_{\max} +\label{eq:velocity_limit} +\end{equation} 其中,\(v_{\max}\) 为车辆允许的最大作业速度。该约束保证车辆在接近、对接和牵引过程中具有足够的可控性,同时减小碰撞风险。 @@ -186,33 +203,37 @@ \subsection{转向角约束} 由于前后桥转向机构存在机械极限,故应满足 -\(\left\{ \begin{array}{r} - \mid \delta_{f} \mid \leq \delta_{f,max} \\ - \mid \delta_{r} \mid \leq \delta_{r,max} -\end{array} \right.\ \) (8) +\begin{equation} +\begin{cases} +|\delta_f|\leq \delta_{f,\max},\\ +|\delta_r|\leq \delta_{r,\max}. +\end{cases} +\label{eq:steering_limits} +\end{equation} 其中,\(\delta_{f,\max}\) 与 \(\delta_{r,\max}\)分别为前桥与后桥最大允许转角。该约束直接限制车辆最大可实现曲率,也是最小转弯半径存在下界的原因。 \subsection{曲率约束} -由转向角约束可进一步得到曲率约束\(\mid \kappa \mid \leq \kappa_{\max}\)。其中, +由转向角约束可进一步得到曲率约束\(|\kappa| \leq \kappa_{\max}\)。其中, -\(\kappa_{\max} = \frac{tan\delta_{f,max} - tan( - \delta_{r,max})}{L}\) -(9) +\begin{equation} +\kappa_{\max}=\frac{\tan\delta_{f,\max}-\tan(-\delta_{r,\max})}{L}. +\label{eq:kappa_max} +\end{equation} -当车辆采用对称反向转向策略时,上式取到较大值。曲率约束在路径规划中具有重要作用,因为若规划轨迹的局部曲率超过车辆可实现上限,则该轨迹在物理上不可执行\textsuperscript{[20-21,28]}。 +当车辆采用对称反向转向策略时,上式取到较大值。曲率约束在路径规划中具有重要作用,因为若规划轨迹的局部曲率超过车辆可实现上限,则该轨迹在物理上不可执行\cite{ref20,ref21,ref28}。 \section{车辆动力学简化与驱动关系} -本课题以低速自主牵引控制为研究重点,后续控制层主要关注位姿演化与轨迹误差收敛,因此在第二章中不引入完整轮胎力学模型,而仅保留纵向驱动的简化动力学关系\textsuperscript{[19]}。设车辆等效质量为 +本课题以低速自主牵引控制为研究重点,后续控制层主要关注位姿演化与轨迹误差收敛,因此在第二章中不引入完整轮胎力学模型,而仅保留纵向驱动的简化动力学关系\cite{ref19}。设车辆等效质量为 \(m\),驱动力为 \(F\),纵向加速度为 \(a\),则有\(F = ma\) ;若用速度导数表示,则有\(a = \dot{v}\)。\( \) 从而可得 \begin{equation} -F = m\dot{v}\ \ -\tag{10} +F = m\dot{v} \label{eq:10} \end{equation} @@ -229,26 +250,32 @@ \section{状态方程统一表达} a & \delta_{f} & \delta_{r} \end{bmatrix}^{T}\)。若采用速度直接控制形式,则状态方程可写为 -\(\left\{ \begin{array}{r} -\dot{x} = vcos\theta \\ -\dot{y} = vsin\theta \\ -\dot{\theta} = \frac{v}{L}\left( tan\delta_{f} - tan\delta_{r} \right) -\end{array} \right.\ \) (11) +\begin{equation} +\begin{cases} +\dot{x}=v\cos\theta,\\ +\dot{y}=v\sin\theta,\\ +\dot{\theta}=\dfrac{v}{L}\left(\tan\delta_f-\tan\delta_r\right). +\end{cases} +\label{eq:state_velocity} +\end{equation} 若进一步考虑纵向加速度,则可扩展为 -\(\left\{ \begin{array}{r} -\dot{x} = vcos\theta \\ -\dot{y} = vsin\theta \\ -\dot{\theta} = \frac{v}{L}\left( tan\delta_{f} - tan\delta_{r} \right) \\ -\dot{v} = a -\end{array} \right.\ \) (12) +\begin{equation} +\begin{cases} +\dot{x}=v\cos\theta,\\ +\dot{y}=v\sin\theta,\\ +\dot{\theta}=\dfrac{v}{L}\left(\tan\delta_f-\tan\delta_r\right),\\ +\dot{v}=a. +\end{cases} +\label{eq:state_acceleration} +\end{equation} 后一形式更适合用于模型预测控制、轨迹平滑优化及速度规划问题,而前三维形式更适合用于基本路径跟踪与状态传播计算。考虑到本课题当前阶段主要完成仿真验证与控制策略设计,后续章节可根据算法需求在两种表达之间进行选取。 \section{仿真实现中的参数映射关系} -在ROS-Gazebo联合仿真中,理论模型并非直接以连续方程形式运行,而是通过URDF关节、控制器与话题通信进行离散实现\textsuperscript{[11-16]}。为保证理论模型与仿真实体一致,需要建立控制量到仿真执行量之间的映射关系。 +在ROS-Gazebo联合仿真中,理论模型并非直接以连续方程形式运行,而是通过URDF关节、控制器与话题通信进行离散实现\cite{ref11,ref12,ref13,ref14,ref15,ref16}。为保证理论模型与仿真实体一致,需要建立控制量到仿真执行量之间的映射关系。 首先,前桥转角 \(\delta_{f}\)与后桥转角 \(\delta_{r}\)分别对应转向关节的位置控制输入,其本质为关节目标角度;其次,车辆线速度 @@ -257,19 +284,20 @@ \section{仿真实现中的参数映射关系} \begin{equation} \omega_{w} = \frac{v}{r_{w}} -\tag{13} \label{eq:13} \end{equation} 若四个驱动轮采用相同滚动半径并同步驱动,则其控制目标可统一写为 -\(\omega_{fl} = \omega_{fr} = \omega_{rl} = \omega_{rr} = \frac{v}{r_{w}}\) -(14) +\begin{equation} +\omega_{fl}=\omega_{fr}=\omega_{rl}=\omega_{rr}=\frac{v}{r_w}. +\label{eq:wheel_speed_all} +\end{equation} 其中,\(\omega_{fl},\omega_{fr},\omega_{rl},\omega_{rr}\) 分别表示四个车轮的角速度。该关系建立了车辆运动学速度与Gazebo关节控制量之间的直接映射,是仿真中实现``给定线速度---车辆前进''行为的基础。 -此外,为减小仿真过程中车辆初始松垮、溜车和转向漂移等现象,通常需要在关节层引入阻尼与摩擦参数\textsuperscript{[13-14,16]}。若转向关节阻尼系数记为 +此外,为减小仿真过程中车辆初始松垮、溜车和转向漂移等现象,通常需要在关节层引入阻尼与摩擦参数\cite{ref13,ref14,ref16}。若转向关节阻尼系数记为 \(c_{d}\),摩擦系数记为 \(c_{f}\),则其作用在于抑制关节自由振荡和无控制输入下的残余摆动。虽然这些参数不显式写入上述运动学方程,但它们决定了仿真模型是否能够稳定呈现理论轨迹。因此,第二章中的理论建模与仿真实现并不是相互割裂的,而是通过参数映射与控制接口紧密关联。 diff --git a/co/undergraduate/content/chapter3.tex b/co/undergraduate/content/chapter3.tex index 70482edc..a48e670c 100644 --- a/co/undergraduate/content/chapter3.tex +++ b/co/undergraduate/content/chapter3.tex @@ -3,20 +3,20 @@ \chapter{基于飞机辅助感知的自动接近与对接控制方法} \section{感知任务分析与总体方案设计} -在机场飞机自动牵引作业过程中,牵引车能否安全、准确地完成对接,不仅取决于车辆本体的运动控制能力,还取决于其对目标飞机及作业环境的感知能力。特别是在接近飞机前起落架并执行最终对接时,系统需要同时解决目标身份确认、目标位置识别、姿态估计及近距离安全态势判断等问题。因此,感知系统是实现自动牵引作业闭环控制的关键组成部分\textsuperscript{[18,29-30]}。 +在机场飞机自动牵引作业过程中,牵引车能否安全、准确地完成对接,不仅取决于车辆本体的运动控制能力,还取决于其对目标飞机及作业环境的感知能力。特别是在接近飞机前起落架并执行最终对接时,系统需要同时解决目标身份确认、目标位置识别、姿态估计及近距离安全态势判断等问题。因此,感知系统是实现自动牵引作业闭环控制的关键组成部分\cite{ref18,ref29,ref30}。 -结合本课题的研究目标与仿真实现条件,本文引入飞机辅助感知方案,即在飞机前起落架区域设置可识别的特征标识,通过牵引车搭载的视觉与近距离传感器完成目标识别与态势获取。该方案的核心思想是:将原本难以直接观测、难以稳定识别的前起落架对接区域,转化为具有明确标志特征和身份属性的感知目标,使牵引车能够在接近过程中实现``先确认、后接近、再对准''的分阶段感知决策\textsuperscript{[29-30]}。 +结合本课题的研究目标与仿真实现条件,本文引入飞机辅助感知方案,即在飞机前起落架区域设置可识别的特征标识,通过牵引车搭载的视觉与近距离传感器完成目标识别与态势获取。该方案的核心思想是:将原本难以直接观测、难以稳定识别的前起落架对接区域,转化为具有明确标志特征和身份属性的感知目标,使牵引车能够在接近过程中实现``先确认、后接近、再对准''的分阶段感知决策\cite{ref29,ref30}。 与传统依赖人工目视判断的作业方式相比,该方案具有以下特点:其一,能够为牵引车提供明确的目标身份信息,避免牵引对象识别错误;其二,能够在接近过程中持续提供目标相对位置与姿态信息,为控制器提供实时反馈;其三,能够将飞机对接区域的局部环境显式化,使碰撞风险、偏航误差和横向偏差能够被量化描述。 因此,飞机辅助感知并不是单纯的``加一个二维码''或``加一个标签'',而是将目标飞机前起落架区域设计为牵引系统可识别、可验证、可跟踪的感知节点,从而为后续自动控制提供稳定的先验信息和观测依据。 -基于上述分析,本文构建的感知总体方案由三部分组成:\\ -第一部分为目标身份确认模块,用于确认当前牵引任务对应的飞机对象是否与预设目标一致; - -第二部分为相对位姿感知模块,用于估计牵引车与飞机前起落架之间的相对距离、横向偏差和姿态偏差; - -第三部分为近距态势判断模块,用于在对接过程中识别安全边界、碰撞风险与姿态偏离程度,并向控制层输出约束信息。 +基于上述分析,本文构建的感知总体方案由三部分组成: +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item 目标身份确认模块,用于确认当前牵引任务对应的飞机对象是否与预设目标一致; +\item 相对位姿感知模块,用于估计牵引车与飞机前起落架之间的相对距离、横向偏差和姿态偏差; +\item 近距态势判断模块,用于在对接过程中识别安全边界、碰撞风险与姿态偏离程度,并向控制层输出约束信息。 +\end{enumerate} 从系统结构上看,该方案形成了由``飞机端目标标识---牵引车端感知模块---控制决策节点''构成的信息链路。飞机前起落架不再只是被动的对接对象,而是成为局部识别信息载体;牵引车通过传感器采集这些信息,再将其转换为控制层能够使用的状态量。这样一来,第二章中的车辆运动学模型与本章中的感知输出自然衔接:前者解决牵引车如何运动,后者解决车辆如何获得目标、误差和停车依据。 @@ -24,13 +24,15 @@ \section{飞机辅助感知目标与识别信息设计} 为使牵引车能够稳定获取飞机前起落架区域的目标信息,本文将飞机辅助感知对象限定为前起落架附近的局部功能区域,并对该区域引入结构化识别信息。该识别信息并不改变飞机本体的运动学特性,而是作为一种面向自动牵引任务的感知标识,用于提升牵引车对目标区域的可识别性与可确认性。 -具体而言,本文在飞机前起落架区域设置特殊识别码,用以表征以下信息:\\ -(1)目标飞机身份编号;\\ -(2)对接区域中心参考位置;\\ -(3)局部方向参考特征;\\ -(4)用于视觉识别的几何轮廓特征。 +具体而言,本文在飞机前起落架区域设置特殊识别码,用以表征以下信息: +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item 目标飞机身份编号; +\item 对接区域中心参考位置; +\item 局部方向参考特征; +\item 用于视觉识别的几何轮廓特征。 +\end{enumerate} -上述信息在仿真环境中可通过纹理标识、平面标记、特征板或特定图案实现,其本质是为牵引车提供一个稳定的局部观测基准\textsuperscript{[29-30]}。与仅依赖起落架自然外形特征相比,这种方式具有识别特征清晰、误识别率低、对光照与视角变化更鲁棒等优点\textsuperscript{[30]}。 +上述信息在仿真环境中可通过纹理标识、平面标记、特征板或特定图案实现,其本质是为牵引车提供一个稳定的局部观测基准\cite{ref29,ref30}。与仅依赖起落架自然外形特征相比,这种方式具有识别特征清晰、误识别率低、对光照与视角变化更鲁棒等优点\cite{ref30}。 在功能上,该识别码作用是身份确认作用。牵引车在进入接近区域后,首先应判断当前视野中的目标是否为任务指定飞机,防止在多机位、多目标环境中出现识别混淆。使牵引车能够从图像观测中计算出目标中心偏移量与方向偏差,从而将视觉结果映射为控制器可直接使用的误差信号。进而实现课题上对``车机互动''的指标要求。 @@ -45,16 +47,24 @@ \section{感知系统组成与传感器配置} \subsection{视觉识别模块} 视觉识别模块安装于牵引车前部,主要面向飞机前起落架区域进行图像采集。其核心任务包括: +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item 检测比对目标识别码; +\item 提取目标区域方向特征; +\item 输出目标身份确认结果。 +\end{enumerate} -(1)检测比对目标识别码;\\ (2)提取目标区域方向特征;\\ (3)输出目标身份确认结果。 - -在实际实现中,该模块可基于深度相机或RGB相机完成\textsuperscript{[29]}。如果采用深度视觉相机,则除可获取二维图像信息外,还可同步获得目标区域的深度信息,有助于提升相对距离估计精度。鉴于本课题当前重点为仿真验证与控制逻辑建立,本文将视觉模块的功能重点放在``目标检测+中心定位+方向识别''三个方面,而不展开复杂的深度神经网络识别框架\textsuperscript{[29-30]}。 +在实际实现中,该模块可基于深度相机或RGB相机完成\cite{ref29}。如果采用深度视觉相机,则除可获取二维图像信息外,还可同步获得目标区域的深度信息,有助于提升相对距离估计精度。鉴于本课题当前重点为仿真验证与控制逻辑建立,本文将视觉模块的功能重点放在``目标检测+中心定位+方向识别''三个方面,而不展开复杂的深度神经网络识别框架\cite{ref29,ref30}。 \subsection{近距测量模块} -近距测量模块用于补充视觉感知在近距离工况下的局部测量能力。由于牵引车在最终对接阶段距离飞机前起落架较近,此时即使视觉系统能够识别目标,也可能受到视角遮挡、自动对焦的影响。因此,有必要引入激光雷达、超声或等效测距模块,对前方局部区域的距离边界进行测量,以作为视觉估计的校核或补充\textsuperscript{[18]}。 +近距测量模块用于补充视觉感知在近距离工况下的局部测量能力。由于牵引车在最终对接阶段距离飞机前起落架较近,此时即使视觉系统能够识别目标,也可能受到视角遮挡、自动对焦的影响。因此,有必要引入激光雷达、超声或等效测距模块,对前方局部区域的距离边界进行测量,以作为视觉估计的校核或补充\cite{ref18}。 -该模块的主要作用包括:\\ (1)判断牵引车前端与飞机局部结构之间的最近距离;\\ (2)检测非目标障碍物是否进入安全边界;\\ (3)在最终接近阶段为停车判定提供阈值依据。 +该模块的主要作用包括: +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item 判断牵引车前端与飞机局部结构之间的最近距离; +\item 检测非目标障碍物是否进入安全边界; +\item 在最终接近阶段为停车判定提供阈值依据。 +\end{enumerate} 通过视觉与近距测量的组合,牵引车能够在不同距离区间内采用不同感知主导方式:中远距离阶段以视觉为主,近距离阶段以视觉与测距联合判断为主,从而提升系统整体鲁棒性。 @@ -68,7 +78,6 @@ \section{目标身份确认模型} \begin{equation} I_{o} = I_{t} -\tag{15} \label{eq:15} \end{equation} @@ -78,22 +87,24 @@ \section{目标身份确认模型} 进一步地,考虑到识别系统存在误检、漏检或图像丢失的情况,可引入确认置信度 \(C_{I}\),并设置确认阈值 -\(C_{\min}\)。则身份确认判据可扩展为\(C_{I} \geq C_{\min}\) -\textsuperscript{[18,30]}。\( -\) +\(C_{\min}\)。则身份确认判据可扩展为式~\ref{eq:identity_confidence}\cite{ref18,ref30}。 +\begin{equation} +C_{I} \geq C_{\min} +\label{eq:identity_confidence} +\end{equation} 该式表示:只有当识别结果的置信度高于设定阈值时,系统才认为目标身份识别有效。尽管在当前论文阶段可以不深入展开具体置信度计算方法,但在表述上引入这一概念,有助于增强论文在工程实现层面的严谨性。 \section{相对位姿感知模型} -在完成目标身份确认后,牵引车还需进一步获取自身与飞机前起落架区域之间的相对几何关系。自动接近与对接控制的本质,并不是让牵引车``接近某个图像目标'',而是让其在物理空间中逐渐消除相对位置误差与方向误差。因此,感知系统必须将图像信息转化为可用于控制的相对位姿量\textsuperscript{[18,29-30]}。 +在完成目标身份确认后,牵引车还需进一步获取自身与飞机前起落架区域之间的相对几何关系。自动接近与对接控制的本质,并不是让牵引车``接近某个图像目标'',而是让其在物理空间中逐渐消除相对位置误差与方向误差。因此,感知系统必须将图像信息转化为可用于控制的相对位姿量\cite{ref18,ref29,ref30}。 为此,定义牵引车参考点为 \(P_{v}\),飞机辅助感知目标中心为 \(P_{a}\),则两者之间的相对位置误差向量可表示为 -\(\mathbf{e}_{p} = \left\lbrack \begin{array}{r} -e_{x} \\ -e_{y} -\end{array} \right\rbrack\ \ \ \) (16) +\begin{equation} +\mathbf{e}_{p}=\begin{bmatrix}e_x\\e_y\end{bmatrix}. +\label{eq:position_error} +\end{equation} 其中,\(e_{x}\) 表示沿牵引车纵向方向的距离误差,\(e_{y}\) 表示沿牵引车横向方向的偏移误差。若从控制意义出发,\(e_{x}\) @@ -105,7 +116,6 @@ \section{相对位姿感知模型} \begin{equation} e_{\theta} = \theta_{a} - \theta_{v} -\tag{17} \label{eq:17} \end{equation} @@ -114,9 +124,10 @@ \section{相对位姿感知模型} 综合来看,牵引车在自动接近过程中需要实时感知的核心状态量可归纳为 -\(\mathbf{z} = \begin{bmatrix} -e_{x} & e_{y} & e_{\theta} -\end{bmatrix}^{T}\) (18) +\begin{equation} +\mathbf{z}=\begin{bmatrix}e_x & e_y & e_\theta\end{bmatrix}^{T}. +\label{eq:perception_output} +\end{equation} 该状态向量构成本章感知环节向控制环节输出的核心接口。换言之,感知层的任务不是直接控制车辆,而是持续向控制层提供``还差多远、偏了多少、方向还差多少''的量化描述。 @@ -124,36 +135,44 @@ \section{近距离态势感知与安全判定} 当牵引车进入飞机前起落架附近的近距离区域后,系统感知重点将从``识别并接近目标''转向``评估局部态势并安全完成对接''。在这一阶段,局部环境中的安全边界、机械接触风险与障碍物侵入风险将显著上升,因此有必要建立近距离态势判断机制。设牵引车前部关键点到飞机局部结构的最小距离为 \(d_{\min}\),系统设定的安全阈值为 -\(d_{s}\)。则基本安全约束可写为\(d_{\min} \geq d_{s}\) 。\( -\) -该式的含义是:在非接触阶段,牵引车与飞机局部结构之间必须始终保持不小于安全阈值的距离,以防止由于感知误差或控制滞后导致提前碰撞\textsuperscript{[5,18]}。 +\(d_{s}\)。则基本安全约束可写为式~\ref{eq:safety_distance}。 +\begin{equation} +d_{\min} \geq d_{s} +\label{eq:safety_distance} +\end{equation} +该式的含义是:在非接触阶段,牵引车与飞机局部结构之间必须始终保持不小于安全阈值的距离,以防止由于感知误差或控制滞后导致提前碰撞\cite{ref5,ref18}。 对于最终对接阶段,还可设置停车触发阈值 -\(d_{t}\)。当系统判定牵引车与目标对接位置之间的剩余距离满足\(e_{x} \leq d_{t}\) -。\( -\) -且同时满足横向误差与姿态误差均处于允许范围内时,系统可进入停止或低速微调状态。设横向误差允许阈值为 +\(d_{t}\)。当系统判定牵引车与目标对接位置之间的剩余距离满足式~\ref{eq:terminal_distance},且同时满足横向误差与姿态误差均处于允许范围内时,系统可进入停止或低速微调状态。 +\begin{equation} +e_{x} \leq d_{t} +\label{eq:terminal_distance} +\end{equation} +设横向误差允许阈值为 \(e_{y,\max}\),姿态误差允许阈值为 \(e_{\theta,\max}\),则对接有效条件可表示为 -\(\left\{ \begin{array}{r} - \mid e_{y} \mid \leq e_{y,max} \\ - \mid e_{\theta} \mid \leq e_{\theta,max} -\end{array} \right.\ \) (19) +\begin{equation} +\begin{cases} +|e_y|\leq e_{y,\max},\\ +|e_\theta|\leq e_{\theta,\max}. +\end{cases} +\label{eq:docking_condition} +\end{equation} 这组三重约束共同定义了自动对接的局部成功条件。只有当纵向距离足够接近、横向偏差足够小且方向偏差足够小时,系统才可判定当前已具备机械对接条件。由此可见,近距态势感知并非孤立地``测个距离'',而是要将距离信息、位置误差和姿态误差统一纳入同一判定框架中。 \section{感知流程设计} 结合上述模型,本文将飞机辅助感知系统的工作流程划分为以下步骤: - -(1)牵引车进入任务区域后,启动视觉识别模块,对前方目标进行搜索;\\ -(2)检测到飞机辅助感知识别码后,解析目标身份信息,并与任务目标编号进行匹配;\\ -(3)若身份匹配成功,则提取目标中心点和方向参考特征,计算相对位置误差与姿态误差;\\ -(4)结合近距测量模块输出,对当前局部安全状态进行判断;\\ -(5)将 \(e_{x}\)、\(e_{y}\)、\(e_{\theta}\) -及安全边界状态发送给控制模块,驱动牵引车完成接近与对准;\\ -(6)当对接有效条件满足后,系统进入低速停止或机械连接准备状态。 +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item 牵引车进入任务区域后,启动视觉识别模块,对前方目标进行搜索; +\item 检测到飞机辅助感知识别码后,解析目标身份信息,并与任务目标编号进行匹配; +\item 若身份匹配成功,则提取目标中心点和方向参考特征,计算相对位置误差与姿态误差; +\item 结合近距测量模块输出,对当前局部安全状态进行判断; +\item 将 \(e_{x}\)、\(e_{y}\)、\(e_{\theta}\) 及安全边界状态发送给控制模块,驱动牵引车完成接近与对准; +\item 当对接有效条件满足后,系统进入低速停止或机械连接准备状态。 +\end{enumerate} 上述流程体现了``目标确认---误差提取---安全判定---控制反馈''的感知闭环逻辑。与传统单纯依赖图像中心偏差的视觉伺服方法相比,该流程更适合机场牵引这种高安全要求、低速精对位作业任务,因为其将身份确认与近距安全判断一并纳入感知体系,使系统具有更完整的任务语义理解能力。 @@ -161,9 +180,9 @@ \section{控制任务描述与总体思路} 在完成第二章牵引车运动学建模以及前文飞机辅助感知方案设计后,系统已经具备了两类基础:其一,双桥转向牵引车的平面运动规律可以用数学模型表示;其二,飞机前起落架区域能够向牵引车提供身份确认结果以及相对位置、相对姿态等感知信息。在此基础上,本节进一步研究牵引车如何利用这些信息完成自动接近与最终对接控制。 -从实际作业过程看,牵引车对接飞机前起落架并不是一次性完成的单步动作,而是一个具有明显阶段特征的连续过程。牵引车首先需要确认当前目标是否为任务指定飞机;在确认目标有效后,车辆应由较远位置向飞机前起落架方向稳定接近;当进入近距离区域后,系统控制重点应从``尽快接近目标''转变为``尽快减小横向偏差和姿态偏差'';在最后的微动阶段,车辆需要以极低速度缓慢推进,并在满足安全距离和几何对准条件时稳定停车。因此,自动对接控制的本质不是简单的路径跟踪,而是一个包含任务逻辑、局部轨迹生成、误差反馈控制和终端停车判定的分层闭环控制问题\textsuperscript{[25,27-28]}。 +从实际作业过程看,牵引车对接飞机前起落架并不是一次性完成的单步动作,而是一个具有明显阶段特征的连续过程。牵引车首先需要确认当前目标是否为任务指定飞机;在确认目标有效后,车辆应由较远位置向飞机前起落架方向稳定接近;当进入近距离区域后,系统控制重点应从``尽快接近目标''转变为``尽快减小横向偏差和姿态偏差'';在最后的微动阶段,车辆需要以极低速度缓慢推进,并在满足安全距离和几何对准条件时稳定停车。因此,自动对接控制的本质不是简单的路径跟踪,而是一个包含任务逻辑、局部轨迹生成、误差反馈控制和终端停车判定的分层闭环控制问题\cite{ref25,ref27,ref28}。 -为此,本文采用``模式管理---局部规划---误差反馈---执行器映射''的分层控制方法。其基本思想是:由感知系统实时提供牵引车与飞机辅助感知目标之间的相对误差;由上层逻辑根据当前距离、障碍物情况和识别有效性确定控制模式;由局部规划器生成短时域可行参考轨迹;再由下层控制器根据相对位姿误差计算期望速度和期望转向需求,并进一步映射为前后桥转角与车轮速度命令。该方法既能够保证控制结构清晰,也便于在ROS与Gazebo环境中分模块实现\textsuperscript{[11-16]}。 +为此,本文采用``模式管理---局部规划---误差反馈---执行器映射''的分层控制方法。其基本思想是:由感知系统实时提供牵引车与飞机辅助感知目标之间的相对误差;由上层逻辑根据当前距离、障碍物情况和识别有效性确定控制模式;由局部规划器生成短时域可行参考轨迹;再由下层控制器根据相对位姿误差计算期望速度和期望转向需求,并进一步映射为前后桥转角与车轮速度命令。该方法既能够保证控制结构清晰,也便于在ROS与Gazebo环境中分模块实现\cite{ref11,ref12,ref13,ref14,ref15,ref16}。 \section{状态变量、控制输入与误差定义} @@ -171,24 +190,27 @@ \subsection{车辆状态与控制输入} 依据第二章建立的车辆模型,定义牵引车状态向量为 -\(\mathbf{x} = \begin{bmatrix} -x & y & \theta & v -\end{bmatrix}^{T}\) (20) +\begin{equation} +\mathbf{x}=\begin{bmatrix}x & y & \theta & v\end{bmatrix}^{T}. +\label{eq:control_state} +\end{equation} 其中,\(x\) 与 \(y\)表示牵引车参考点在全局坐标系中的位置坐标,\(\theta\) 表示车辆航向角,\(v\) 表示车辆纵向线速度。 双桥转向牵引车的控制输入定义为 -\(\mathbf{u} = \begin{bmatrix} -v & \delta_{f} & \delta_{r} -\end{bmatrix}^{T}\) (21) +\begin{equation} +\mathbf{u}=\begin{bmatrix}v & \delta_f & \delta_r\end{bmatrix}^{T}. +\label{eq:control_input_velocity} +\end{equation} 或扩展为 -\(\mathbf{u} = \begin{bmatrix} -a & \delta_{f} & \delta_{r} -\end{bmatrix}^{T}\) (22) +\begin{equation} +\mathbf{u}=\begin{bmatrix}a & \delta_f & \delta_r\end{bmatrix}^{T}. +\label{eq:control_input_acceleration} +\end{equation} 其中,\(\delta_{f}\) 与 \(\delta_{r}\)分别为前桥和后桥转角,\(a\) 为车辆纵向加速度。前一种形式适用于直接速度控制实现,后一种形式更适合做速度平滑约束或模型预测控制扩展。 @@ -211,32 +233,17 @@ \section{对接过程分析与分层控制架构} \subsection{对接过程分阶段描述} 为了使控制方法与真实作业过程保持一致,本文将牵引车自动对接过程划分为以下五个阶段。 - -(1)搜索与等待阶段 - -牵引车进入任务区域后,首先由视觉模块搜索飞机前起落架区域的特殊识别码,并与任务编号进行匹配。若当前识别结果与任务目标不一致,或者识别置信度低于阈值,则系统保持等待状态,不进入自动接近控制。此时输出为零速度、零转角保持命令,以防止误接近。 - -(2)自动接近阶段 - -当目标身份确认有效后,系统开始进入自动接近阶段。该阶段的主要目标是让牵引车从较远初始位置稳定接近飞机前起落架前方的预对接区域。此时控制重点不在于最终精确对位,而在于快速减小纵向距离,同时保持可接受的横向误差和姿态误差。 - -(3)姿态对准阶段 - -当牵引车与目标之间的纵向距离降低到一定阈值后,系统切换到姿态对准阶段。该阶段中,车辆不再追求较高接近速度,而是优先减小横向误差 -\(e_{y}\)和姿态误差 -\(e_{\theta}\),使牵引车中心线逐步与飞机前起落架对接方向重合。 - -(4)微动对接阶段 - -当姿态误差和横向误差已经较小,且车辆进入最终接近区域后,系统进入微动对接阶段。此时车辆以低速蠕动方式向前推进,控制重点从``大范围修正''转为``小范围精调'',避免出现冲撞、擦碰或越位现象。 - -(5)停车保持阶段 - -当牵引车与目标区域之间的纵向、横向和姿态误差同时满足终端条件,且安全距离约束有效时,系统进入停车保持阶段。此时发布零速度命令,并将前后桥转角回中,保持车辆稳定等待后续机械连接或任务切换。 +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item \textbf{搜索与等待阶段}。牵引车进入任务区域后,首先由视觉模块搜索飞机前起落架区域的特殊识别码,并与任务编号进行匹配。若当前识别结果与任务目标不一致,或者识别置信度低于阈值,则系统保持等待状态,不进入自动接近控制。此时输出为零速度、零转角保持命令,以防止误接近。 +\item \textbf{自动接近阶段}。当目标身份确认有效后,系统开始进入自动接近阶段。该阶段的主要目标是让牵引车从较远初始位置稳定接近飞机前起落架前方的预对接区域。此时控制重点不在于最终精确对位,而在于快速减小纵向距离,同时保持可接受的横向误差和姿态误差。 +\item \textbf{姿态对准阶段}。当牵引车与目标之间的纵向距离降低到一定阈值后,系统切换到姿态对准阶段。该阶段中,车辆不再追求较高接近速度,而是优先减小横向误差\(e_y\)和姿态误差\(e_\theta\),使牵引车中心线逐步与飞机前起落架对接方向重合。 +\item \textbf{微动对接阶段}。当姿态误差和横向误差已经较小,且车辆进入最终接近区域后,系统进入微动对接阶段。此时车辆以低速蠕动方式向前推进,控制重点从``大范围修正''转为``小范围精调'',避免出现冲撞、擦碰或越位现象。 +\item \textbf{停车保持阶段}。当牵引车与目标区域之间的纵向、横向和姿态误差同时满足终端条件,且安全距离约束有效时,系统进入停车保持阶段。此时发布零速度命令,并将前后桥转角回中,保持车辆稳定等待后续机械连接或任务切换。 +\end{enumerate} \subsection{分层控制架构} -根据上述阶段分析,本文建立的分层控制架构如图3-1所示。 +根据上述阶段分析,本文建立的分层控制架构如图~\ref{fig:3-1} 所示。 这种架构的优点在于:可以把任务逻辑与连续控制分离,从而降低算法复杂度,并且更加符合ROS节点化实现习惯。 @@ -261,30 +268,29 @@ \section{误差动力学模型建立} 将全局位置误差变换到车体坐标系,可以得到 -\(\left\{ \begin{array}{r} -\left\lbrack \begin{array}{r} -e_{x} \\ -e_{y} -\end{array} \right\rbrack = \begin{bmatrix} -\cos\theta & \sin\theta \\ - - sin\theta & \cos\theta -\end{bmatrix}\left\lbrack \begin{array}{r} -x_{r} - x \\ -y_{r} - y -\end{array} \right\rbrack \\ -e_{\theta} = \theta_{r} - \theta -\end{array} \right.\ \) (23) +\begin{equation} +\begin{cases} +\begin{bmatrix}e_x\\e_y\end{bmatrix} +=\begin{bmatrix}\cos\theta & \sin\theta\\-\sin\theta & \cos\theta\end{bmatrix} +\begin{bmatrix}x_r-x\\y_r-y\end{bmatrix},\\ +e_\theta=\theta_r-\theta. +\end{cases} +\label{eq:body_error_transform} +\end{equation} 该式的作用是把全局误差转化为车体系误差,使纵向和横向误差具有明确物理意义。其中,\(e_{x}\) 表示车辆前方还剩多少距离,\(e_{y}\) 表示车辆当前偏离对接轴线的程度。 对上述误差求导,并代入车辆运动学方程,可得误差动力学: -\(\left\{ \begin{array}{r} -{\dot{e}}_{x} = v_{r}cose_{\theta} - v + \omega e_{y} \\ -{\dot{e}}_{y} = v_{r}sine_{\theta} - \omega e_{x} \\ -{\dot{e}}_{\theta} = \omega_{r} - \omega -\end{array} \right.\ \) (24) +\begin{equation} +\begin{cases} +\dot{e}_x=v_r\cos e_\theta-v+\omega e_y,\\ +\dot{e}_y=v_r\sin e_\theta-\omega e_x,\\ +\dot{e}_\theta=\omega_r-\omega. +\end{cases} +\label{eq:error_dynamics} +\end{equation} 上述误差方程表明: @@ -299,9 +305,9 @@ \section{误差动力学模型建立} 姿态误差 \(e_{\theta}\)的变化取决于参考角速度与实际角速度的差异。 \end{enumerate} -这说明自动对接控制本质上是一个非线性耦合误差调节问题,不能简单把纵向和横向完全独立看待\textsuperscript{[19,27-28]}。 +这说明自动对接控制本质上是一个非线性耦合误差调节问题,不能简单把纵向和横向完全独立看待\cite{ref19,ref27,ref28}。 -\textbf{3.12 局部参考轨迹生成方法} +\section{局部参考轨迹生成方法} \subsection{预对接点与对接点构造} @@ -309,28 +315,30 @@ \subsection{预对接点与对接点构造} 设飞机辅助感知系统给出的目标中心点为 -\(\mathbf{p}_{a} = \left\lbrack \begin{array}{r} -x_{a} \\ -y_{a} -\end{array} \right\rbrack\) (25) +\begin{equation} +\mathbf{p}_a=\begin{bmatrix}x_a\\y_a\end{bmatrix}. +\label{eq:target_point} +\end{equation} 目标方向为 \(\theta_{a}\)。则预对接点定义为 -\(\mathbf{p}_{p} = \mathbf{p}_{a} - d_{pre}\left\lbrack \begin{array}{r} -\cos\theta_{a} \\ -\sin\theta_{a} -\end{array} \right\rbrack\) (26) +\begin{equation} +\mathbf{p}_{p}=\mathbf{p}_{a}-d_{pre} +\begin{bmatrix}\cos\theta_a\\\sin\theta_a\end{bmatrix}. +\label{eq:pre_docking_point} +\end{equation} \(d_{pre}\) 为预留接近距离。该点位于最终目标点前方一定距离处,主要用于完成姿态调整。最终对接点定义为 -\(\mathbf{p}_{d} = \mathbf{p}_{a} - d_{hook}\left\lbrack \begin{array}{r} -\cos\theta_{a} \\ -\sin\theta_{a} -\end{array} \right\rbrack\) (27) +\begin{equation} +\mathbf{p}_{d}=\mathbf{p}_{a}-d_{hook} +\begin{bmatrix}\cos\theta_a\\\sin\theta_a\end{bmatrix}. +\label{eq:docking_point} +\end{equation} \(d_{hook}\) -为机械连接前的停车距离。该点用于微动对接阶段的最终停靠。如果牵引车从较远位置直接朝最终对接点收敛,往往会导致中后段横向修正不足或姿态调节过猛;引入预对接点后,车辆可以先对准姿态,再进行最后的缓慢接近\textsuperscript{[20-21,26-28]}。 +为机械连接前的停车距离。该点用于微动对接阶段的最终停靠。如果牵引车从较远位置直接朝最终对接点收敛,往往会导致中后段横向修正不足或姿态调节过猛;引入预对接点后,车辆可以先对准姿态,再进行最后的缓慢接近\cite{ref20,ref21,ref26,ref27,ref28}。 \section{参考速度调度策略} @@ -339,13 +347,15 @@ \section{参考速度调度策略} 当进入微动阶段时,也需要明显降低速度以提高最终对位精度。 因此,参照相关文献资料,认为可以采用如下速度调度公式: -\(v_{r} = min\left( v_{stage},\sqrt{\frac{a_{y,max}}{\mid \kappa_{r} \mid + \varepsilon_{\kappa}}},k_{d}\lbrack d_{\min} - d_{s}\rbrack_{+} \right)\) -(28) +\begin{equation} +v_{r}=\min\left(v_{stage},\sqrt{\frac{a_{y,\max}}{|\kappa_r|+\varepsilon_\kappa}},k_d[d_{\min}-d_s]_+\right). +\label{eq:speed_schedule} +\end{equation} 其中:\(v_{stage}\)为当前控制模式允许的最大速度; \(a_{y,\max}\)为允许的最大横向加速度; \(\kappa_{r}\)为参考轨迹曲率; \(d_{\min}\)为前方最近障碍距离; \(d_{s}\)为安全距离阈值; -\(k_{d}\)为距离---速度缩放系数\textsuperscript{[25,27-28]}。 +\(k_{d}\)为距离---速度缩放系数\cite{ref25,ref27,ref28}。 \section{误差反馈控制律设计} @@ -353,25 +363,31 @@ \subsection{纵向速度控制律} 纵向控制律设计为 -\(v_{d} = {sat}_{\left\lbrack 0,v_{\max} \right\rbrack}\left( v_{r}cose_{\theta} + k_{x}e_{x} \right)\) -(29) +\begin{equation} +v_d=\operatorname{sat}_{[0,v_{\max}]} +\left(v_r\cos e_\theta+k_xe_x\right). +\label{eq:longitudinal_control} +\end{equation} 其中,\(k_{x}\) 为纵向误差增益,\(sat\) 表示饱和函数。 该控制律由两部分组成:\(v_{r}\cos e_{\theta}\):表示当车辆姿态误差较大时,自动减小前进速度,防止车辆在未对准状态下强行推进; \(k_{x}e_{x}\):表示根据纵向误差大小补偿推进速度,使车辆逐步靠近目标。 -这种设计符合车辆对接实际过程:距离远时可较快前进;姿态偏差大时必须主动减速\textsuperscript{[19]}。 +这种设计符合车辆对接实际过程:距离远时可较快前进;姿态偏差大时必须主动减速\cite{ref19}。 \subsection{角速度控制律} 角速度控制律设计为 -\(\omega_{d} = {sat}_{\left\lbrack - \omega_{\max},\omega_{\max} \right\rbrack}\left( \omega_{r} + v_{r}(k_{y}e_{y} + k_{\theta}sine_{\theta}) \right)\) -(30) +\begin{equation} +\omega_d=\operatorname{sat}_{[-\omega_{\max},\omega_{\max}]} +\left[\omega_r+v_r\left(k_ye_y+k_\theta\sin e_\theta\right)\right]. +\label{eq:angular_control} +\end{equation} 其中,\(k_{y}\) 和 -\(k_{\theta}\)分别为横向误差增益和姿态误差增益。该控制律的物理意义如下\textsuperscript{[17,26-28]}: +\(k_{\theta}\)分别为横向误差增益和姿态误差增益。该控制律的物理意义如下\cite{ref17,ref26,ref27,ref28}: \(\omega_{r}\):参考轨迹自身的前馈角速度,用于保证车辆沿局部参考曲线运行; @@ -386,20 +402,11 @@ \subsection{角速度控制律} \subsection{对接过程中的控制行为分析} 结合车辆对接全过程,上述控制律在不同阶段表现如下: - -\begin{quote} -(1)自动接近阶段:\\ -此时 \(e_{x}\)较大,速度项 -\(k_{x}e_{x}\)占主导,车辆以较快速度向预对接点推进。 -\end{quote} - -(2)姿态对准阶段\\ -随着 \(e_{x}\)逐步减小,横向误差 \(e_{y}\)和姿态误差 -\(e_{\theta}\)开始主导控制器输出,角速度命令增大,车辆重点完成方向修正。 - -(3)微动对接阶段\\ -此时 -\(v_{r}\)已被速度调度压低,车辆角速度输出较平缓,控制器主要进行细小偏差修正,避免出现末端振荡。 +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item \textbf{自动接近阶段}:此时 \(e_{x}\)较大,速度项 \(k_{x}e_{x}\)占主导,车辆以较快速度向预对接点推进。 +\item \textbf{姿态对准阶段}:随着 \(e_{x}\)逐步减小,横向误差 \(e_{y}\)和姿态误差 \(e_{\theta}\)开始主导控制器输出,角速度命令增大,车辆重点完成方向修正。 +\item \textbf{微动对接阶段}:此时 \(v_{r}\)已被速度调度压低,车辆角速度输出较平缓,控制器主要进行细小偏差修正,避免出现末端振荡。 +\end{enumerate} 因此,这组控制律不仅在数学上闭合,而且在物理意义上能够与整个对接过程自然对应。 @@ -410,8 +417,7 @@ \subsection{曲率计算} 由期望线速度和角速度得到期望曲率 \begin{equation} -\kappa_{d} = \frac{\omega_{d}}{max(v_{d},\varepsilon_{v})} -\tag{31} +\kappa_{d} = \frac{\omega_{d}}{\max(v_{d},\varepsilon_{v})} \label{eq:31} \end{equation} @@ -419,12 +425,15 @@ \subsection{曲率计算} \subsection{双桥反向转向模式} -在自动接近阶段,如果需要较大机动能力,则采用双桥反向转向模式\textsuperscript{[19,28]}: +在自动接近阶段,如果需要较大机动能力,则采用双桥反向转向模式\cite{ref19,ref28}: -\(\left\{ \begin{array}{r} -\delta_{f}^{\star} = sat\left( arctan\frac{L\kappa_{d}}{2}, - \delta_{f,max},\delta_{f,max} \right) \\ -\delta_{r}^{\star} = - \delta_{f}^{\star} -\end{array} \right.\ \) (32) +\begin{equation} +\begin{cases} +\delta_f^{\star}=\operatorname{sat}\left(\arctan\dfrac{L\kappa_d}{2},-\delta_{f,\max},\delta_{f,\max}\right),\\ +\delta_r^{\star}=-\delta_f^{\star}. +\end{cases} +\label{eq:opposite_mapping} +\end{equation} 该模式可以显著减小等效转弯半径,适合从较远位置快速接近飞机前起落架区域。 @@ -432,10 +441,13 @@ \subsection{前桥单转向模式} 在姿态对准和微动阶段,为了提高控制平稳性,采用前桥单转向模式: -\(\left\{ \begin{array}{r} -\delta_{f}^{\star} = sat\left( arctan(L\kappa_{d}), - \delta_{f,max},\delta_{f,max} \right) \\ -\delta_{r}^{\star} = 0 -\end{array} \right.\ \) (33) +\begin{equation} +\begin{cases} +\delta_f^{\star}=\operatorname{sat}\left(\arctan(L\kappa_d),-\delta_{f,\max},\delta_{f,\max}\right),\\ +\delta_r^{\star}=0. +\end{cases} +\label{eq:front_mapping} +\end{equation} 该模式虽然机动性不如双桥反向转向,但执行器协调更简单,转向响应更平顺,适合最终精调。 @@ -443,18 +455,24 @@ \subsection{速度与转角限幅} 为了保证控制命令可执行,还需对速度与转角进行约束处理: -\(\left\{ \begin{array}{r} -0 \leq v_{d} \leq v_{\max} \\ - \mid \delta_{f}^{\star} \mid \leq \delta_{f,max} \\ - \mid \delta_{r}^{\star} \mid \leq \delta_{r,max} -\end{array} \right.\ \) (34) +\begin{equation} +\begin{cases} +0\leq v_d\leq v_{\max},\\ +|\delta_f^{\star}|\leq\delta_{f,\max},\\ +|\delta_r^{\star}|\leq\delta_{r,\max}. +\end{cases} +\label{eq:command_limits} +\end{equation} 同时对速度变化率和转角变化率限制为 -\(\left\{ \begin{array}{r} - \mid v_{d}(k) - v_{d}(k - 1) \mid \leq a_{\max}T_{s} \\ - \mid \delta_{i}(k) - \delta_{i}(k - 1) \mid \leq {\dot{\delta}}_{\max}T_{s},i \in \{ f,r\} -\end{array} \right.\ \) (35) +\begin{equation} +\begin{cases} +|v_d(k)-v_d(k-1)|\leq a_{\max}T_s,\\ +|\delta_i(k)-\delta_i(k-1)|\leq\dot{\delta}_{\max}T_s,\quad i\in\{f,r\}. +\end{cases} +\label{eq:rate_limits} +\end{equation} 这样可以避免由于离散控制导致的命令突变,从而减小Gazebo中常见的抖振与过冲现象。 @@ -464,19 +482,22 @@ \subsection{终端停车集合} 在最终微动阶段,当牵引车同时满足以下条件时,可判定已具备停车条件: -\(\left\{ \begin{array}{r} -\begin{array}{r} - \mid e_{x} \mid \leq d_{t} \\ - \mid e_{y} \mid \leq e_{y,max} -\end{array} \\ - \mid e_{\theta} \mid \leq e_{\theta,max} \\ -d_{\min} \geq d_{s} -\end{array} \right.\ \) (36) +\begin{equation} +\begin{cases} +|e_x|\leq d_t,\\ +|e_y|\leq e_{y,\max},\\ +|e_\theta|\leq e_{\theta,\max},\\ +d_{\min}\geq d_s. +\end{cases} +\label{eq:terminal_conditions} +\end{equation} 将其定义为终端停车集合 -\(\Omega_{t} = \left\{ \mid e_{x} \mid \leq d_{t},\text{ } \mid e_{y} \mid \leq e_{y,max},\text{ } \mid e_{\theta} \mid \leq e_{\theta,max},\text{ }d_{\min} \geq d_{s} \right\}\) -(37) +\begin{equation} +\Omega_t=\left\{ |e_x|\leq d_t,\ |e_y|\leq e_{y,\max},\ |e_\theta|\leq e_{\theta,\max},\ d_{\min}\geq d_s \right\}. +\label{eq:terminal_set} +\end{equation} 与单纯依靠纵向距离判定停车不同,这种集合式判定可以避免``距离够近但方向没对准''的错误停车问题。 @@ -499,11 +520,11 @@ \subsection{模式切换规则} \section{控制算法主流程} -图3-2给出自动接近与对接控制算法主流程。 +图~\ref{fig:3-2} 给出自动接近与对接控制算法主流程。 \begin{figure}[htbp] \centering - \includegraphics[width=2.72233in,height=4.05695in]{figures/image7.png} + \includegraphics[height=0.72\textheight]{figures/image7.png} \caption{全过程算法流程图} \label{fig:3-2} \end{figure} diff --git a/co/undergraduate/content/chapter4.tex b/co/undergraduate/content/chapter4.tex index b74c9cb3..7de5fa90 100644 --- a/co/undergraduate/content/chapter4.tex +++ b/co/undergraduate/content/chapter4.tex @@ -7,11 +7,11 @@ \section{系统总体架构与软硬件环境} 提供节点通信、参数服务器、TF 与消息系统;Gazebo 11 提供刚体动力学、碰撞、接触与传感器仿真;gazebo\_ros\_pkgs~和~gazebo\_ros\_control~将 Gazebo 的模型、传感器与控制接口映射到 -ROS;项目自定义节点完成飞机辅助感知、局部规划、牵引对接控制与任务调度\textsuperscript{[11-13,16]}。Gazebo +ROS;项目自定义节点完成飞机辅助感知、局部规划、牵引对接控制与任务调度\cite{ref11,ref12,ref13,ref16}。Gazebo 官方 ROS 教程明确指出,gazebo\_ros\_pkgs~负责 ROS 与 Gazebo 的接口层,而~gazebo\_ros\_control~通过解析 URDF 中的~\textless transmission\textgreater~与插件配置,实现对仿真关节的 -controllers 接入\textsuperscript{[13,16]}。 +controllers 接入\cite{ref13,ref16}。 在实际工程目录上,采用四包式组织方式:tug\_description~保存 xacro/URDF、网格模型与材料;tug\_gazebo~保存 world、spawn @@ -19,16 +19,15 @@ \section{系统总体架构与软硬件环境} launch 文件。 Gazebo -的~roslaunch~教程还给出了较为稳定的包层级约定,即~MYROBOT\_description/urdf、MYROBOT\_gazebo/worlds~与~MYROBOT\_gazebo/launch~的分离组织,这一约定适合本课题的工程化管理\textsuperscript{[11-16]}。 +的~roslaunch~教程还给出了较为稳定的包层级约定,即~MYROBOT\_description/urdf、MYROBOT\_gazebo/worlds~与~MYROBOT\_gazebo/launch~的分离组织,这一约定适合本课题的工程化管理\cite{ref11,ref12,ref13,ref14,ref15,ref16}。 -下表给出本文采用的基准软件栈。(表4-1) - -\textbf{表4-1 基准软件栈} +表~\ref{tab:software_stack} 给出本文采用的基准软件栈。 \begin{longtable}[]{@{} >{\raggedright\arraybackslash}p{(\columnwidth - 4\tabcolsep) * \real{0.2678}} >{\raggedright\arraybackslash}p{(\columnwidth - 4\tabcolsep) * \real{0.3713}} >{\raggedright\arraybackslash}p{(\columnwidth - 4\tabcolsep) * \real{0.3608}}@{}} +\caption{基准软件栈}\label{tab:software_stack}\\ \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 组件 @@ -64,21 +63,21 @@ \section{牵引车模型与传感器建模} URDF 从结构上将机器人表示为 link--joint 树;Gazebo 官方教程进一步指出,若要把 URDF 真正用于动力学仿真,除~visual~外还必须补充~collision、inertial、Gazebo -专用~\textless gazebo\textgreater~标签以及~ros\_control~所需的~\textless transmission\textgreater{}\textsuperscript{[13-16]}。同时,URDF -本身无法描述世界中的模型摆放、闭环关节与部分接触参数,因此世界摆放与环境物体建议放在~.world~中,机器人本体保持单一树形结构\textsuperscript{[12-14]}。 +专用~\textless gazebo\textgreater~标签以及~ros\_control~所需的~\textless transmission\textgreater{}\cite{ref13,ref14,ref15,ref16}。同时,URDF +本身无法描述世界中的模型摆放、闭环关节与部分接触参数,因此世界摆放与环境物体建议放在~.world~中,机器人本体保持单一树形结构\cite{ref12,ref13,ref14}。 对于双桥转向牵引车,面向第三章算法实现,推荐将车体模型拆分为以下 link:、base\_link、front\_ateer、back\_steer、四个车轮 link、相机 link、深度相机 link、激光雷达 link,以及飞机辅助感知所需的可视化或调试 link。关节层面至少需要:前桥转向关节、后桥转向关节、四个轮子的转动关节,以及各传感器与车体的固定关节。该拆分方式既符合 URDF -树结构,也便于单独对前后桥转向与轮速控制器建模\textsuperscript{[14,16]}。 +树结构,也便于单独对前后桥转向与轮速控制器建模\cite{ref14,ref16}。 -车辆基础仿真与机械模型都基于SOLIDWORKS实现。考虑到ROS与Gazebo在虚拟机环境下性能受限的影响,将模型分为两种建立------仿真模型与机械模型。其中仿真面向基本运行逻辑的测试与较为极端的算法测试,保证项目推进速度的同时最大程度降低硬件成本。其结构较为简单,隐藏了不必要的机械结构部分,只保留最基础的车辆外形与少量运动模块;机械模型是最终提交到现实生产的版本,其结构更为复杂,相比仿真模型要考虑更多的机械及电气布局。首篇幅限制,下面只给出仿真模型(图4-1) +车辆基础仿真与机械模型都基于SOLIDWORKS实现。考虑到ROS与Gazebo在虚拟机环境下性能受限的影响,将模型分为两种建立------仿真模型与机械模型。其中仿真面向基本运行逻辑的测试与较为极端的算法测试,保证项目推进速度的同时最大程度降低硬件成本。其结构较为简单,隐藏了不必要的机械结构部分,只保留最基础的车辆外形与少量运动模块;机械模型是最终提交到现实生产的版本,其结构更为复杂,相比仿真模型要考虑更多的机械及电气布局。受篇幅限制,下面只给出仿真模型,如图~\ref{fig:4-1} 所示。 \begin{figure}[htbp] \centering - \includegraphics[width=4.97629in,height=3.08022in]{figures/image8.png} + \includegraphics[width=0.95\textwidth]{figures/image8.png} \caption{模型图总览} \label{fig:4-1} \end{figure} @@ -86,15 +85,14 @@ \section{牵引车模型与传感器建模} 模型设计完成后,需要对各个活动关节进行定义与功能区分。根据实际功能------continuous(关节持续转动)、fixed(关节固定)、revolute(关节有限制有角度旋转),对车轮、转向桥以及功能部件定义。下表给出面向论文复现的一组牵引车 URDF 结构定义。表中``用途''与``建议参数''基于本项目双桥转向、小尺度机场地面车辆仿真的工程需求给出;若项目后续补充了 -CAD/BOM 或实测参数,应以实测量替换。(表4-2) - -\textbf{表4-2 车辆主要URDF结构定义} +CAD/BOM 或实测参数,应以实测量替换,具体见表~\ref{tab:urdf_structure}。 \begin{longtable}[]{@{} >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.2552}} >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.2294}} >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.1982}} >{\raggedright\arraybackslash}p{(\columnwidth - 6\tabcolsep) * \real{0.3172}}@{}} +\caption{车辆主要URDF结构定义}\label{tab:urdf_structure}\\ \toprule\noalign{} \begin{minipage}[b]{\linewidth}\raggedright 组件 @@ -120,110 +118,53 @@ \section{牵引车模型与传感器建模} 激光雷达 & fixed & lidar\_joint & 前向近距安全监测 \\ \end{longtable} -在此示例部分关节定义: - -~~\textless link - -~~~~name="base\_link"\textgreater{} - -~~~~\textless inertial\textgreater{} - -~~~~~~\textless origin - -~~~~~~~~xyz="0.052294~1.5562E-06~0.061913" - -~~~~~~~~rpy="0~0~0"~/\textgreater{} - -~~~~~~\textless mass - -~~~~~~~~value="34.871"~/\textgreater{} - -~~~~~~\textless inertia - -~~~~~~~~ixx="0.51812" - -~~~~~~~~ixy="-2.2269E-05" - -~~~~~~~~ixz="0.18429" - -~~~~~~~~iyy="2.6761" - -~~~~~~~~iyz="-2.8808E-06" - -~~~~~~~~izz="3.0257"~/\textgreater{} - -~~~~\textless/inertial\textgreater{} - -~~~~\textless visual\textgreater{} - -~~~~~~\textless origin - -~~~~~~~~xyz="0~0~0" - -~~~~~~~~rpy="0~0~0"~/\textgreater{} - -~~~~~~\textless geometry\textgreater{} - -~~~~~~~~\textless mesh - -~~~~~~~~~~filename="package://zongzhuang/meshes/base\_link.STL"~/\textgreater{} - -~~~~~~\textless/geometry\textgreater{} - -~~~~~~\textless material - -~~~~~~~~name=""\textgreater{} - -~~~~~~~~\textless color - -~~~~~~~~~~rgba="0.79216~0.81961~0.93333~1"~/\textgreater{} - -~~~~~~\textless/material\textgreater{} - -~~~~\textless/visual\textgreater{} - -~~~~\textless collision\textgreater{} - -~~~~~~\textless origin - -~~~~~~~~xyz="0~0~0" - -~~~~~~~~rpy="0~0~0"~/\textgreater{} - -~~~~~~\textless geometry\textgreater{} - -~~~~~~~~\textless mesh - -~~~~~~~~~~filename="package://zongzhuang/meshes/base\_link.STL"~/\textgreater{} - -~~~~~~\textless/geometry\textgreater{} - -~~~~\textless/collision\textgreater{} - -~~\textless/link\textgreater{} +在此示例部分关节定义如下: + +\begin{lstlisting}[language=XML] + + + + + + + + + + + + + + + + + + + + + + +\end{lstlisting} \section{任务与模式管理} -任务与模式管理器在整个控制系统中起着核心作用\textsuperscript{[25,28]}。该模块的主要任务是根据感知系统提供的信息(如目标身份确认、位姿识别结果、障碍物检测等),决定当前的控制模式。具体模式包括\textsuperscript{[5,7,28]}: - -搜索模式:当目标身份未确认时,系统处于搜索模式,牵引车保持静止或缓慢扫描。 - -自动接近模式:当目标身份确认并且距离较远时,系统启动自动接近模式,牵引车沿预设路径接近目标飞机。 - -姿态对准模式:当牵引车距离目标飞机较近时,系统切换到姿态对准模式,通过调整转向角度和速度逐步减少横向误差和姿态误差。 - -微动对接模式:在接近阶段,系统切换到微动对接模式,牵引车以非常低的速度精确接近并最终完成对接。 - -停车模式:当目标对接完成或无法继续推进时,系统进入停车模式,发布停车命令。 +任务与模式管理器在整个控制系统中起着核心作用\cite{ref25,ref28}。该模块的主要任务是根据感知系统提供的信息(如目标身份确认、位姿识别结果、障碍物检测等),决定当前的控制模式。具体模式包括\cite{ref5,ref7,ref28}: +\begin{description}[leftmargin=2em,style=nextline] +\item[搜索模式] 当目标身份未确认时,系统处于搜索模式,牵引车保持静止或缓慢扫描。 +\item[自动接近模式] 当目标身份确认并且距离较远时,系统启动自动接近模式,牵引车沿预设路径接近目标飞机。 +\item[姿态对准模式] 当牵引车距离目标飞机较近时,系统切换到姿态对准模式,通过调整转向角度和速度逐步减少横向误差和姿态误差。 +\item[微动对接模式] 在接近阶段,系统切换到微动对接模式,牵引车以非常低的速度精确接近并最终完成对接。 +\item[停车模式] 当目标对接完成或无法继续推进时,系统进入停车模式,发布停车命令。 +\end{description} \section{系统全流程测试} -为验证自动牵引对接系统在完整作业流程中的可行性与连续性,本文在ROS与Gazebo联合仿真环境中设计了自动牵引车全流程测试。测试过程按照机场地面牵引作业的基本逻辑展开,主要包括车辆前往飞行器区域、车辆对接飞行器、车辆推出飞行器、解除牵引以及车辆撤离五个阶段\textsuperscript{[5-7]}。通过该测试,可以较为直观地观察牵引车在不同作业阶段下的运动状态、姿态变化以及控制指令执行效果。 +为验证自动牵引对接系统在完整作业流程中的可行性与连续性,本文在ROS与Gazebo联合仿真环境中设计了自动牵引车全流程测试。测试过程按照机场地面牵引作业的基本逻辑展开,主要包括车辆前往飞行器区域、车辆对接飞行器、车辆推出飞行器、解除牵引以及车辆撤离五个阶段\cite{ref5,ref6,ref7}。通过该测试,可以较为直观地观察牵引车在不同作业阶段下的运动状态、姿态变化以及控制指令执行效果。 \paragraph{车辆前往飞行器区域} 测试开始,牵引车从模拟航站楼附近出发,根据地勤车辆道路向飞行器所在区域移动。在该阶段,系统主要完成车辆启动、路径跟踪和环境感知等任务。牵引车通过传感器获取周围环境信息,并结合控制算法调整自身速度与转向角,使车辆能够沿规划路径稳定行驶至飞行器附近。 -在仿真过程中,车辆需要保持较低且平稳的行驶速度,避免因速度过高造成轨迹偏差或姿态调整不及时。当前往飞行器区域时,系统重点关注车辆行驶方向是否稳定、路径跟踪是否连续,以及车辆是否能够准确进入后续对接准备区域。(图4-2) +在仿真过程中,车辆需要保持较低且平稳的行驶速度,避免因速度过高造成轨迹偏差或姿态调整不及时。当前往飞行器区域时,系统重点关注车辆行驶方向是否稳定、路径跟踪是否连续,以及车辆是否能够准确进入后续对接准备区域,如图~\ref{fig:4-2} 所示。 \begin{figure}[htbp] \centering @@ -233,9 +174,9 @@ \section{系统全流程测试} \end{figure} \paragraph{车辆对接飞行器} -当牵引车进入飞行器附近区域后,系统切换至对接控制阶段。该阶段的核心任务是使牵引车与飞行器牵引点逐步对准,并在满足位置和姿态要求的情况下完成接近动作。系统根据感知模块提供的飞行器相对位姿信息,计算牵引车与目标对接点之间的位置误差和航向误差,并通过控制算法修正车辆运动状态。(图4-3) +当牵引车进入飞行器附近区域后,系统切换至对接控制阶段。该阶段的核心任务是使牵引车与飞行器牵引点逐步对准,并在满足位置和姿态要求的情况下完成接近动作。系统根据感知模块提供的飞行器相对位姿信息,计算牵引车与目标对接点之间的位置误差和航向误差,并通过控制算法修正车辆运动状态,如图~\ref{fig:4-3} 所示。 -在对接过程中,牵引车首先进入预对接位置,然后以低速向最终对接点靠近。相比普通路径跟踪阶段,对接阶段对控制精度和车辆稳定性要求更高,因此需要限制车辆速度,并使转向角变化更加平缓,避免出现车身摆动过大或对接偏差过大的情况。(图4-4) +在对接过程中,牵引车首先进入预对接位置,然后以低速向最终对接点靠近。相比普通路径跟踪阶段,对接阶段对控制精度和车辆稳定性要求更高,因此需要限制车辆速度,并使转向角变化更加平缓,避免出现车身摆动过大或对接偏差过大的情况,如图~\ref{fig:4-4} 所示。 \begin{figure}[htbp] \centering @@ -256,7 +197,7 @@ \section{系统全流程测试} \paragraph{车辆推出飞行器} 完成对接后,系统进入飞行器推出阶段。此时牵引车与飞行器被视为一个整体运动系统,牵引车根据预设推出路径向指定方向行驶,将飞行器从停放区域推出至目标位置。在该阶段,牵引车需要保持稳定牵引状态,并避免转向过大导致飞行器姿态变化不平顺。 -推出过程中,控制系统重点保证车辆速度平稳、转向连续,并使飞行器整体运动轨迹满足预设作业要求。由于推出阶段涉及车辆与飞行器之间的相对约束关系,因此相比单车行驶更需要关注运动过程的稳定性和路径偏差。(图4-5------图4-7) +推出过程中,控制系统重点保证车辆速度平稳、转向连续,并使飞行器整体运动轨迹满足预设作业要求。由于推出阶段涉及车辆与飞行器之间的相对约束关系,因此相比单车行驶更需要关注运动过程的稳定性和路径偏差,如图~\ref{fig:4-5}--图~\ref{fig:4-7} 所示。 \begin{figure}[htbp] \centering @@ -282,7 +223,7 @@ \section{系统全流程测试} \paragraph{解除牵引} 当飞行器被推出至指定位置后,牵引车停止运动,并执行解除牵引动作。该阶段主要用于模拟实际机场作业中牵引车与飞行器之间的脱离过程。系统首先控制车辆减速至停止状态,随后解除与飞行器之间的连接关系,使飞行器保持在目标位置,牵引车进入独立运动状态。 -解除牵引阶段的关键在于保证车辆停止平稳,避免因惯性造成飞行器位置偏移。同时,解除牵引后应确认飞行器姿态稳定,牵引车与飞行器之间保持安全距离,为后续车辆撤离提供空间。(图4-6) +解除牵引阶段的关键在于保证车辆停止平稳,避免因惯性造成飞行器位置偏移。同时,解除牵引后应确认飞行器姿态稳定,牵引车与飞行器之间保持安全距离,为后续车辆撤离提供空间,如图~\ref{fig:4-8} 所示。 \begin{figure}[htbp] \centering @@ -294,7 +235,7 @@ \section{系统全流程测试} \paragraph{车辆撤离} 完成解除牵引后,牵引车按照预设撤离路径离开飞行器区域。撤离阶段主要验证牵引车在完成作业任务后能否安全驶离,并避免与飞行器或周围环境发生干涉。系统根据撤离方向控制车辆转向与速度,使其逐步远离飞行器,并回到指定待命区域或安全区域。 -在该阶段,车辆应保持稳定行驶状态,转向过程应尽量平缓,避免因急转或急停影响仿真效果。车辆撤离后,整个自动牵引对接与推出流程结束。(图4-7) +在该阶段,车辆应保持稳定行驶状态,转向过程应尽量平缓,避免因急转或急停影响仿真效果。车辆撤离后,整个自动牵引对接与推出流程结束,如图~\ref{fig:4-9} 所示。 \begin{figure}[htbp] \centering @@ -303,7 +244,7 @@ \section{系统全流程测试} \label{fig:4-9} \end{figure} -\section{本文方法与人工操作以及其它方法对比分析} +\section{本文方法与人工操作以及其他方法对比分析} 为进一步说明本文所设计系统的特点,有必要将其与传统人工牵引方式、固定路径控制方式以及常见自动驾驶控制算法进行对比分析。 @@ -313,20 +254,20 @@ \subsection{与传统人工牵引方式的比较} 本文所提出的方法主要面向仿真环境下的自动化流程验证。相比人工牵引方式,本文方法的优势并不在于真实复杂环境中的经验判断能力,而在于能够将牵引作业过程转化为可建模、可重复、可分析的控制流程。通过ROS节点通信、Gazebo物理仿真、车辆运动控制和目标位姿误差反馈,可以较为清晰地表达车辆接近、对准、推出和撤离等动作过程。 -从本项目实际测试过程来看,车辆模型在Gazebo中能够完成基本行驶、转向、刹停和回中等控制动作,并可通过脚本或控制节点实现分阶段作业流程。这说明本文方法在标准化仿真验证方面具有一定价值。下图给出了本文方法与其它方法的比较柱状图(图4-8)。 +从本项目实际测试过程来看,车辆模型在Gazebo中能够完成基本行驶、转向、刹停和回中等控制动作,并可通过脚本或控制节点实现分阶段作业流程。这说明本文方法在标准化仿真验证方面具有一定价值。图~\ref{fig:4-10} 给出了本文方法与其他方法的比较柱状图。 \begin{figure}[htbp] \centering - \includegraphics[width=4.48812in,height=2.8485in]{figures/image17.png} + \includegraphics[width=0.95\textwidth]{figures/image17.png} \caption{本文方法与主流方法以及理论方法比较} \label{fig:4-10} \end{figure} \subsection{与固定路径或开环脚本控制方式的比较} -相比与其它方式而言,最简单实现机场自动牵引驳接的方式是采用固定路径或开环脚本控制,即预先设定车辆的速度、转向角和运动时间,使车辆按照固定流程完成前进、转弯、倒车或停止等动作。但固定路径或开环控制的局限性也比较明显。由于其控制过程主要依赖预设时间和固定参数,当车辆初始位置、飞机停放位置或仿真环境发生变化时,车辆无法根据实际偏差自动修正运动状态。例如,在本项目调试过程中,车辆曾出现初始缓慢滑动、转向不完全回中、不同速度下运动效果不一致等现象,如果完全依靠固定脚本控制,容易造成路径偏差累积,影响后续对接效果。 +相比与其他方式而言,最简单实现机场自动牵引驳接的方式是采用固定路径或开环脚本控制,即预先设定车辆的速度、转向角和运动时间,使车辆按照固定流程完成前进、转弯、倒车或停止等动作。但固定路径或开环控制的局限性也比较明显。由于其控制过程主要依赖预设时间和固定参数,当车辆初始位置、飞机停放位置或仿真环境发生变化时,车辆无法根据实际偏差自动修正运动状态。例如,在本项目调试过程中,车辆曾出现初始缓慢滑动、转向不完全回中、不同速度下运动效果不一致等现象,如果完全依靠固定脚本控制,容易造成路径偏差累积,影响后续对接效果。 -本文方法在固定流程的基础上引入了相对位姿误差思想,将车辆与目标对接点之间的位置误差、横向误差和航向误差作为控制依据,并结合预对接点、最终对接点和分阶段模式切换来组织整个作业流程。因此,相较于单纯开环脚本,本文方法具有更强的闭环控制特征,能够更合理地描述自动牵引车在接近目标过程中的修正行为(图4-9)。 +本文方法在固定流程的基础上引入了相对位姿误差思想,将车辆与目标对接点之间的位置误差、横向误差和航向误差作为控制依据,并结合预对接点、最终对接点和分阶段模式切换来组织整个作业流程。因此,相较于单纯开环脚本,本文方法具有更强的闭环控制特征,能够更合理地描述自动牵引车在接近目标过程中的修正行为,如图~\ref{fig:4-11} 所示。 \begin{figure}[htbp] \centering @@ -347,7 +288,7 @@ \subsection{与常见路径跟踪算法的比较} Stanley算法在自动驾驶路径跟踪中应用较多,尤其适合处理中高速行驶过程中的横向误差修正。但机场牵引车对接飞行器属于低速精细作业,车辆运动速度较低,控制重点不是高速稳定循迹,而是小范围内的位置修正和姿态调整。因此,本文采用基于相对误差的分阶段控制思路,比直接套用Stanley方法更符合本课题场景。 -MPC方法可以综合考虑车辆运动约束、转向角限制、速度限制和未来轨迹优化,理论上更适合复杂约束下的车辆控制。但MPC对车辆模型精度、求解器实时性和参数调试要求较高。结合本项目实际情况,课题时间有限,重点又在于完成ROS-Gazebo联合仿真系统搭建和全流程测试,直接采用MPC会显著增加实现难度。因此,本文方法没有追求复杂最优控制,而是选择更容易落地的相对位姿误差控制与规则化流程管理,在可实现性和论文工作量之间取得平衡(图4-10)。 +MPC方法可以综合考虑车辆运动约束、转向角限制、速度限制和未来轨迹优化,理论上更适合复杂约束下的车辆控制。但MPC对车辆模型精度、求解器实时性和参数调试要求较高。结合本项目实际情况,课题时间有限,重点又在于完成ROS-Gazebo联合仿真系统搭建和全流程测试,直接采用MPC会显著增加实现难度。因此,本文方法没有追求复杂最优控制,而是选择更容易落地的相对位姿误差控制与规则化流程管理,在可实现性和论文工作量之间取得平衡,如图~\ref{fig:4-12} 所示。 \begin{figure}[htbp] \centering @@ -359,16 +300,14 @@ \subsection{与常见路径跟踪算法的比较} \subsection{对比结果总结} 综合上述分析,本文方法的主要特点并不是在所有指标上优于人工或其他算法,而是在特定研究阶段和特定应用目标下具有较好的适用性。其优势主要体现在以下几个方面: - -第一,本文方法能够把机场牵引作业拆解为多个可控阶段,使``前往飞行器区域、对接飞行器、推出飞行器、解除牵引、车辆撤离''形成较完整的仿真流程。 - -第二,本文基于ROS与Gazebo构建了可重复测试的仿真平台,便于对车辆模型、控制策略和作业流程进行验证,相比直接进行真实车辆测试,风险和成本更低。 - -第三,本文方法结合车辆相对位姿误差进行控制分析,比单纯开环脚本更能体现自动对接过程中的误差修正思想。 - -第四,本文采用较为清晰的分层结构,将感知、任务管理、局部目标生成、误差控制和执行层连接起来,便于后续继续扩展传感器融合、目标识别和路径优化算法。 - -下图能够直观展现各个方法的能效性能对比图(图4-11)。 +\begin{enumerate}[label=(\arabic*),leftmargin=2em] +\item 本文方法能够把机场牵引作业拆解为多个可控阶段,使``前往飞行器区域、对接飞行器、推出飞行器、解除牵引、车辆撤离''形成较完整的仿真流程。 +\item 本文基于ROS与Gazebo构建了可重复测试的仿真平台,便于对车辆模型、控制策略和作业流程进行验证,相比直接进行真实车辆测试,风险和成本更低。 +\item 本文方法结合车辆相对位姿误差进行控制分析,比单纯开环脚本更能体现自动对接过程中的误差修正思想。 +\item 本文采用较为清晰的分层结构,将感知、任务管理、局部目标生成、误差控制和执行层连接起来,便于后续继续扩展传感器融合、目标识别和路径优化算法。 +\end{enumerate} + +图~\ref{fig:4-13} 能够直观展现各个方法的综合能力对比。 总而言之,本文算法思路建立在对以上多种手动、自动牵引作业优缺点综合考虑下,最大可能集成上述方法的优点减少缺陷,提升车辆在复杂环境下的自适应能力与任务鲁棒性。 diff --git a/co/undergraduate/content/chapter5.tex b/co/undergraduate/content/chapter5.tex index f8e1292a..f97a548a 100644 --- a/co/undergraduate/content/chapter5.tex +++ b/co/undergraduate/content/chapter5.tex @@ -23,6 +23,6 @@ \section{展望} 第二,受设备性能限制,没有考虑多变气候环境对车辆飞行器之间的影响,后续可进一步完善感知系统。可引入更复杂的视觉识别、点云处理和多传感器融合方法,提高系统在光照变化、遮挡和复杂环境下的可靠性。 -第三,此次模拟环境较为简单,只放置了一架飞行器和牵引车模型,对现今大型国际机场起到的参考作用很小,后续可结合模型预测控制、动态避障算法和智能优化方法,在添加多机协作的同时,提高系统在动态障碍物、多车辆协同和复杂机场场景下的适应能力\textsuperscript{[20,25,28]}。 +第三,此次模拟环境较为简单,只放置了一架飞行器和牵引车模型,对现今大型国际机场起到的参考作用很小,后续可结合模型预测控制、动态避障算法和智能优化方法,在添加多机协作的同时,提高系统在动态障碍物、多车辆协同和复杂机场场景下的适应能力\cite{ref20,ref25,ref28}。 综上,机场自动牵引与飞机对接是一个融合车辆控制、机器人感知、路径规划和系统仿真的综合性课题。本文完成了基础平台和核心方法的搭建,后续仍可在模型精细化、感知鲁棒性、控制智能化和工程实用化方面继续深入研究。 diff --git a/co/undergraduate/content/declarationzh.tex b/co/undergraduate/content/declarationzh.tex index cb3d1ab4..92d0d115 100644 --- a/co/undergraduate/content/declarationzh.tex +++ b/co/undergraduate/content/declarationzh.tex @@ -1,18 +1,16 @@ %!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]{\qquad2026年\quad1月\quad3日 }} \\ - \end{tabular} - - -\end{declarationzh} \ No newline at end of file +\vspace{36pt} +\begin{flushright} +\begin{tabular}{rl} +作者签名: & \underline{\makebox[100pt][c]{雷宇杰}} \\[10pt] +日\qquad 期: & \underline{\makebox[100pt][c]{2026年5月25日}} +\end{tabular} +\end{flushright} + +\end{declarationzh} diff --git a/co/undergraduate/content/reference.bib b/co/undergraduate/content/reference.bib new file mode 100644 index 00000000..5fa2d85c --- /dev/null +++ b/co/undergraduate/content/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 diff --git a/co/undergraduate/figures/image17.png b/co/undergraduate/figures/image17.png index 531ef337..3378589f 100644 Binary files a/co/undergraduate/figures/image17.png and b/co/undergraduate/figures/image17.png differ diff --git a/co/undergraduate/figures/image2.png b/co/undergraduate/figures/image2.png index b0aa1720..51e59939 100644 Binary files a/co/undergraduate/figures/image2.png and b/co/undergraduate/figures/image2.png differ diff --git a/co/undergraduate/figures/image8.png b/co/undergraduate/figures/image8.png index 8037bda5..2b9238a6 100644 Binary files a/co/undergraduate/figures/image8.png and b/co/undergraduate/figures/image8.png differ diff --git a/co/undergraduate/hutbthesis.cls b/co/undergraduate/hutbthesis.cls index 0dbe1e7e..b246d6c8 100644 --- a/co/undergraduate/hutbthesis.cls +++ b/co/undergraduate/hutbthesis.cls @@ -613,7 +613,7 @@ % 设置页眉和页脚 % \pagestyle{fancy} % 本科学位论文底部样式 -\newcommand{\hutb@thepage@format@zh}[2]{第~{#1}~页 共~{#2}~页} +\newcommand{\hutb@thepage@format@zh}[2]{第{#1}页,共{#2}页} \newcommand{\hutb@thepage@format@en}[1]{#1} % 空白页清空页眉页脚 \patchcmd{\cleardoublepage}{\newpage}{\thispagestyle{empty}\newpage}{}{} @@ -636,7 +636,14 @@ \pagenumbering{Roman} \def\hutb@thepage{\thepage} \def\hutb@lastpageref{\pageref{LastPage}} - \fancyfoot[C]{\zihao{-5} \hutb@thepage@format@en{\hutb@thepage}} + % 目录页单独使用罗马页码;只设置页脚,避免前面 \pagestyle{empty} 影响目录页码。 + \pagestyle{fancy} + \fancyhf{} + \fancyfoot[C]{\zihao{-5} \hutb@thepage@format@en{\hutb@thepage}} + \fancypagestyle{plain}{% + \fancyhf{}% + \fancyfoot[C]{\zihao{-5} \hutb@thepage@format@en{\hutb@thepage}}% + } } % mainmatter设置 \renewcommand{\mainmatter}{ @@ -646,7 +653,14 @@ \pagenumbering{arabic} \def\hutb@thepage{\thepage} \def\hutb@lastpageref{\pageref{LastPage}} + % 正文、致谢、参考文献和附录统一使用“第 x 页,共 x 页”页脚格式。 + \pagestyle{fancy} + \fancyhf{} \fancyfoot[C]{\zihao{-5} \songti \hutb@thepage@format@zh{\hutb@thepage}{\hutb@lastpageref}} + \fancypagestyle{plain}{% + \fancyhf{}% + \fancyfoot[C]{\zihao{-5} \songti \hutb@thepage@format@zh{\hutb@thepage}{\hutb@lastpageref}}% + } } % 给页眉留足空间(否则会有 \headheight is too small的warning) \setlength{\headheight}{14.5pt} diff --git a/co/undergraduate/hutbthesis.cls.bak b/co/undergraduate/hutbthesis.cls.bak deleted file mode 100644 index 00baaad8..00000000 --- a/co/undergraduate/hutbthesis.cls.bak +++ /dev/null @@ -1,1221 +0,0 @@ -% -% 本模版根据湖南工商大学本科生学位论文撰写规范创建 -% 论文内容一般应由十一个主要部分组成,依次为: -% 1.封面 -% 2.中文摘要; -% 3.英文摘要; -% 4.目录; -% 5.符号说明(必要时); -% 6.论文正文; -% 7.参考文献; -% 8.致谢。 -% -% -% 重构 -% 参考CSU Thesis,以及SJTU Thesis和WHU Thesis Latex模板进行重构。 - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 声明部分(Identification) -% -% 指定模板使用的 Latex 版本,标识输出模板名 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\NeedsTeXFormat{LaTeX2e} -\ProvidesClass{hutbthesis}[v0.1, edited by tp2008] - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 预先定义(Preliminary declarations) -% -% 定义kv对,在模板文件中使用的指令并引入依赖的包 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -% 定义一些命令用于写文档 -% /cs 在ltxdoc 包中也提供,剩下是自定义的 -% 借鉴自thuthesis和ustcthesis模板 -\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}} -\DeclareRobustCommand\file{\nolinkurl} -\DeclareRobustCommand\env{\textsf} -\DeclareRobustCommand\pkg{\textsf} -\DeclareRobustCommand\cls{\textsf} - -% 模板类型选取 -\newif\ifhutb@type@bachelor -\hutb@type@bachelortrue -\newif\ifhutb@type@master -\hutb@type@masterfalse -\newif\ifhutb@type@doctor -\hutb@type@doctorfalse -\newif\ifhutb@type@course -\hutb@type@coursefalse -\newif\ifhutb@type@print -\hutb@type@printfalse -\newif\ifhutb@type@graduate -\hutb@type@graduatefalse -\ifhutb@type@master - \hutb@type@graduatetrue -\fi -\ifhutb@type@doctor - \hutb@type@graduatetrue -\fi - -% 定义致谢环境,盲审下隐藏致谢 -\newif\ifhutb@review -\hutb@reviewfalse - -% 定义模板选项 -\DeclareOption{doctor}{\hutb@type@doctortrue} -\DeclareOption{master}{\hutb@type@mastertrue} -\DeclareOption{bachelor}{\hutb@type@bachelortrue} -\DeclareOption{course}{\hutb@type@coursetrue} -%\DeclareOption{forprint}{\hutb@type@printtrue} -% 使用 \XeTeX{} 引擎时,\pkg{fontspec} 宏包会被 \pkg{xeCJK} 自动调用。传递给 -% \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}% - }% - \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} -% -% 载入西文字体集。 -% \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} - \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} - \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 % 内容为四号宋体 - - %\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} - - \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} -} - - - -\setcounter{secnumdepth}{3} -% 定义作为标题的格式 -% \titleformat{command}[shape]%定义标题类型和标题样式 -% {format}%定义标题格式 -% {label}%定义标题的标签,即标题的标号等 -% {sep}%定义标题和标号之间的水平距离 -% {before-code}%定义标题前的内容 -% [after-code]%定义标题后的内容 - -% TODO: 修复章节标题样式 -% \renewcommand{\chaptername}{第{\thesection}章} -% \titleformat{\chapter}{\zihao{3} \heiti \centering}{\chaptername}{1em}{} -% \titleformat{\section}{\zihao{-4} \heiti}{\thesection}{1em}{} -% \titleformat{\subsection}{\zihao{-4} \kaishu}{\thesubsection}{1em}{} - -% 定义在目录中的格式 -% \titlecontents{标题名} -% [左间距] -% {标题格式} -% {标题标志} -% {无序号标题} -% {指引线与页码} -% [下间距] - -% \titlecontents{section} -% [0em] % 按样例目录左侧是和前置部分文字左侧对齐的 -% {\zihao{-4} \songti} -% %{\contentslabel {1em}} -% {第\thecontentslabel\ 章\quad}% -% {\hspace*{-1em}} -% {\titlerule*[0.5pc]{.}\contentspage} - -% \titlecontents{subsection} -% [4em] -% {\zihao{-4} \songti} % note that 3.8 = 1.5 + 2.3 -% {\contentslabel{2.2em}} -% {\hspace*{-3.5em}} -% {\titlerule*[0.5pc]{.}\contentspage} - -% \titlecontents{subsubsection} -% [7em] -% {\zihao{-4} \songti} % note that 3.8 = 1.5 + 2.3 -% {\contentslabel{3.0em}} -% {\hspace*{-5em}} -% {\titlerule*[0.5pc]{.}\contentspage} - -% 6. 符号说明(必要时)% -% ---------------------------------------------------------% -% TODO: -% -% 如果论文中使用了大量的物理量符号、标志、缩略词、专门计量单位、自定义名词和术语等,应编写成注释说明汇集表,说明论文中所用符号所表示的意义及单位(或量纲)。若上述符号和缩略词使用数量不多,可以不设专门的注释说明汇集表,仅在论文中出现时加以说明。 -% “符号说明”四字居中(三号黑体)。 - - -% 7. 论文正文 % -% -------------------------------------------------------% -% 论文正文是主体,主体部分应从另页右页开始,每一章应另起页。一般由序号标题、文字叙述、图、表格和公式等五个部分构成。 -% 写作形式可因研究内容的性质不同而变化,一般可包括绪论(或综述)、理论分析、计算方法、实验装置和测试方法、实验结果分析和讨论、研究成果、结论及意义等。 -% 该部分由用户编写 - -% 图表等浮动环境设置 % -% ----------------------------------------------------------% -% TODO % -% 图、表、公式:文中的图、表、附注、公式一律采用阿拉伯数字分章(或连续)编号,如:图2-5,表3-2,公式(5-1)等。 -% 图序及图名居中置于图的下方,如果图中含有几个不同部分,应将分图号标注在分图的左上角,并在图解下列出各部分内容。图中的术语、符号、单位等应与正文表述所用一致。 -% 表序及表名置于表的上方,表中参数应标明量和单位的符号。表的编排应采用国际通用的三线表。续表均应重复表头,如表需转页接排,随后各页应重复表的编号,其后跟表题(可省略)和“续”置于表上方。 -% 图序及图名、表序及表名采用五号楷体字。若图或表中有附注,采用英文小写字母顺序编号,附注写在图或表的下方。公式的编号用括号括起写在右边行末,其间不加虚线。 -% 图、表、公式等与正文之间要有一定的行间距。 -% \RequirePackage{caption} -% 默认情况下, \LaTeX{} 要求每页的文字至少占据 20%,否则该页就只单独放置一个浮动环境, -% 而这通常不是我们想要的, 我们将这个要求降低到 5%. -\renewcommand*{\textfraction}{0.05} -% 有时如果多个浮动环境连续放在一起, \LaTeX{} -% 会将它们分在几个不同页,即使它们可在同一页放 -% 得下. 我们可以通过修改 |\topfraction| 和 |\bottomfraction| 分别设置顶端和底端的浮 -% 动环境的最大比例. -\renewcommand*{\topfraction}{0.9} -\renewcommand*{\bottomfraction}{0.8} -% 有时\LaTeX{}会把一个浮动环境单独放在一页, -% 我们要求这个环境至少要占据 85% 才能单独放在一页. -% 注意: |\floatpagefraction| 的数值必须小于 |\topfraction|. -\renewcommand*{\floatpagefraction}{0.85} -% 关于图片 graphicx -% 如果图片没有指定后缀, 依次按下列顺序搜索 -\DeclareGraphicsExtensions{.pdf,.eps,.jpg,.png,.tif} -% 设置图表搜索路径, 可以给图表文件夹取如下名字 -\graphicspath{{figures/}{figure/}{pictures/}% -{picture/}{pic/}{pics/}{image/}{images/}} - - - - -% 插图格式 -% ------------------------------------------------------% -% \captionsetup[subfigure]{labelfont=normalfont,textfont=normalfont,singlelinecheck=off,justification=raggedright} -% singlelinecheck=off 表示即使caption只有一行, justification 也生效 -% justification=raggedright 使子图 caption 靠左对齐,而caption的上下位置由\caption标签的位置决定,以此实现了学校要求的子图标签在左上角显示。 -% 这部分功能由 subcaption 这个包实现,而这个包不能和 subfigure 同时使用,所以子图的写法也与 subfigure 包的不大一样。 -\captionsetup[subfigure]{singlelinecheck=off,justification=raggedright} - -% 图下方描述的黑体 -\DeclareCaptionFont{hei}{\heiti} -\DeclareCaptionFont{five}{\zihao{5}} -\renewcommand{\thefigure}{\arabic{chapter}-\arabic{figure}} -% \renewcommand{\thefigure} {\thesection-\arabic{figure}} - -\captionsetup[figure]{ -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 -} - - - -% 列表环境设置 % -% ------------------------------------------------------------------% -\setlist{% -topsep=0.3em, % 列表顶端的垂直空白 -partopsep=0pt, % 列表环境前面紧接着一个空白行时其顶端的额外垂直空白 -itemsep=0ex plus 0.1ex, % 列表项之间的额外垂直空白 -parsep=0pt, % 列表项内的段落之间的垂直空白 -leftmargin=1.5em, % 环境的左边界和列表之间的水平距离 -rightmargin=0em, % 环境的右边界和列表之间的水平距离 -labelsep=0.5em, % 包含标签的盒子与列表项的第一行文本之间的间隔 -labelwidth=2em % 包含标签的盒子的正常宽度;若实际宽度更宽,则使用实际宽度。 -} - -% 表格 % -% ------------------------------------------------------% -% 修改tabular 环境, 设置表格中的行间距为正文行间距. -\let\hutb@oldtabular\tabular -\let\hutb@endoldtabular\endtabular -\renewenvironment{tabular} { -\bgroup -\renewcommand{\arraystretch}{0.92} -\hutb@oldtabular -} { -\hutb@endoldtabular\egroup -} - -% 表格字号应比正文小,一般五号/10.5pt,但是暂时没法再cls里设置(不然会影响到封面等tabular环境) -% 所以目前只好在主文件里局部\AtBeginEnvironment - -% 数学环境, 定理等设置 % -% -------------------------------------------------------% -\newtheorem{definition}{\hutb@cap@definition} -\newtheorem{theorem}{\hutb@cap@theorem} -\newtheorem{lemma}{\hutb@cap@lemma} -\newtheorem{corollary}{\hutb@cap@corollary} -\newtheorem{assumption}{\hutb@cap@assumption} -\newtheorem{conjecture}{\hutb@cap@conjecture} -\newtheorem{axiom}{\hutb@cap@axiom} -\newtheorem{principle}{\hutb@cap@principle} -\newtheorem{problem}{\hutb@cap@problem} -\newtheorem{example}{\hutb@cap@example} -\newtheorem{proof}{\hutb@cap@proof} -\newtheorem{solution}{\hutb@cap@solution} - -% 数学定理相关的常量 -\newcommand*{\hutb@cap@definition}{定义} -\newcommand*{\hutb@cap@theorem}{定理} -\newcommand*{\hutb@cap@lemma}{引理} -\newcommand*{\hutb@cap@corollary}{推论} -\newcommand*{\hutb@cap@assumption}{假设} -\newcommand*{\hutb@cap@conjecture}{猜想} -\newcommand*{\hutb@cap@axiom}{公理} -\newcommand*{\hutb@cap@principle}{定律} -\newcommand*{\hutb@cap@problem}{问题} -\newcommand*{\hutb@cap@example}{例} -\newcommand*{\hutb@cap@proof}{证明} -\newcommand*{\hutb@cap@solution}{解} - - -% 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, -}, -} - -% 定义描述距离的变量 -\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, -} -} -\hutb@style@set@indent@heading - -% 全文首行缩进 2 字符, 标点符号用全角 -% \ctexset{% -% punct = quanjiao, -% space = auto, -% autoindent = true, -% } - -% % 编号分章节。如需要连续编号,注释\makeatletter下面对应内容即可。 -% \renewcommand{\theequation}{\arabic{section}-\arabic{equation}} -% \makeatletter -% \@addtoreset{figure}{section} -% \@addtoreset{table}{section} -% \@addtoreset{equation}{section} -% \makeatother - -% 8. 参考文献 % -% ------------------------------------------------------% -% TODO % -% 文后参考文献只列出作者直接阅读过、在正文中被引用过的文献资料,务必实事求是。参考文献一律列在正文的末尾,不得放在各章之后。人文社科类学位论文中不宜用文后参考文献列出的注释可采用页下注,包括对学位论文中某些关键词句、论点的详细说明。在引用别人的科研成果时,应在引用处加以说明,遵循学术道德规范,严禁论文抄袭、剽窃等学术不端行为。 -% 参考文献可以采用顺序编码制组织,也可以按“著者-出版年”制组织。建议按顺序编码制,即按中文引用的顺序将参考文献附于文末。作者姓名写到第三位,余者写“,等”或“,et al.”。“参考文献”四字居中(三号黑体),空一行左起按顺序依次列出参考文献,将序号置于方括号内(如[1]),用小四号宋体字,所有符号均用半角编排。 -% 目前采用bgt7714-2005标准进行文献索引,详见gbt7714-2005.bst. - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 附录 -% -% 附录中主要列入正文内不便列出的过分冗长的公式推导,供查读方便所需的辅助性数学工具或表格、重复性数据图表、计算程序及说明等。 -% 附录依次为附录1,附录2……等,“附录X”三字居中(三号黑体)。附录中的图表公式另编排序号,与正文分开。 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 定义附录环境 -% 在\appendix 后直接使用 chapter -% 暂不需要 -% \newenvironment{appendixs}{ -% % \ifhutb@review\else -% \hutb@chapter{\hutb@name@appendix} -% % \fi -% } - - -% 10. 攻读学位期间主要研究成果 % -% --------------------------------------------------------% -% 分类按时间顺序列出作者在攻读学位期间取得的与学位论文相关的研究成果,含参加的研究项目、获奖情况、专利、专著、发表学术论文(含正式录用论文)等,书写格式参照参考文献格式。“攻读学位期间主要研究成果”字体居中(三号黑体) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 致谢 -% -% 作者对给予指导、各类资助和协助完成研究工作以及提供各种对论文工作有利条件的单位及个人表示感谢。“致谢”二字居中(三号黑体)。 -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% 定义致谢环境 -\newenvironment{acknowledgements}{ -% \ifhutb@review\relax\else -\ifhutb@review\else -% \hutb@chapter{\hutb@name@acknowledgements} -\hutb@chapter{\hutb@name@acknowledge} -\fi -} - - -% 篇眉和页码要求 % -% ---------------------------------------------------------% -% 篇眉从正文开始至全文结束,采用宋体五号字左起书写“博(或硕)士学位论文”,靠右写章标题。 -% 页码从正文开始至全文结束按阿拉伯数字连续编排,前置部分(如学位论文原创性声明和版权使用授权书、中文摘要、英文摘要、目录、符号说明等)用罗马数字分别单独编排。页码位于页面底端,居中书写。 - - - - -%\endinput diff --git a/co/undergraduate/hutbthesis_main.tex b/co/undergraduate/hutbthesis_main.tex index 6fcaae88..a5d400a3 100644 --- a/co/undergraduate/hutbthesis_main.tex +++ b/co/undergraduate/hutbthesis_main.tex @@ -7,6 +7,16 @@ \documentclass[AutoFakeBold]{hutbthesis} \usepackage{calc} +\usepackage{enumitem} +\usepackage{listings} +\lstset{ + basicstyle=\ttfamily\small, + breaklines=true, + columns=fullflexible, + frame=single, + xleftmargin=2em, + xrightmargin=2em +} % 少数字体不包含个别生僻字时使用的兼容宏;Windows 下若有宋体则不影响显示。