diff --git a/co/main.tex b/co/main.tex new file mode 100644 index 00000000..1167ab4c --- /dev/null +++ b/co/main.tex @@ -0,0 +1,85 @@ +\documentclass{article} +\usepackage{hyperref} + +\title{论文提纲} +\author{} +\date{\today} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{绪论} +\subsection{研究背景与意义} +\subsection{国内外研究现状} +\subsection{研究内容与技术路线} + +\section{机场牵引车辆系统建模与问题描述} +\subsection{机场牵引作业场景抽象} +\subsection{坐标系与状态变量定义} +\subsection{车辆运动学模型建立} +\subsubsection{非完整约束条件} +\subsubsection{单轨等效模型} +\subsubsection{双桥转向角速度表达式} +\subsection{转弯半径与曲率模型} +\subsection{典型转向模式分析} +\subsubsection{前桥单独转向模式} +\subsubsection{前后桥反向转向模式} +\subsubsection{前后桥同向转向模式} +\subsection{速度、转角与曲率约束建模} +\subsubsection{速度约束} +\subsubsection{转向角约束} +\subsubsection{曲率约束} +\subsection{车辆动力学简化与驱动关系} +\subsection{状态方程统一表达} +\subsection{仿真实现中的参数映射关系} +\subsection{本章小结} + +\section{基于飞机辅助感知的自动对接识别方法} +\subsection{感知任务分析与总体方案设计} +\subsection{飞机辅助感知目标与识别信息设计} +\subsection{感知系统组成与传感器配置} +\subsubsection{视觉识别模块} +\subsubsection{近距测量模块} +\subsection{目标身份确认模型} +\subsection{相对位姿感知模型} +\subsection{近距离态势感知与安全判定} +\subsection{感知流程设计} +\subsection{本章小结} + +\section{基于相对位姿误差的自动接近与对接控制方法} +\subsection{控制任务描述与总体思路} +\subsection{状态变量、控制输入与误差定义} +\subsubsection{车辆状态与控制输入} +\subsubsection{感知误差接口} +\subsection{对接过程分析与分层控制架构} +\subsubsection{对接过程分阶段描述} +\subsubsection{分层控制架构} +\subsection{误差动力学模型建立} +\subsection{局部参考轨迹生成方法} +\subsubsection{预对接点与对接点构造} +\subsubsection{三次多项式局部轨迹} +\subsection{参考速度调度策略} +\subsection{误差反馈控制律设计} +\subsubsection{纵向速度控制律} +\subsubsection{角速度控制律} +\subsubsection{对接过程中的控制行为分析} +\subsection{四轮转向映射与约束处理} +\subsubsection{曲率计算} +\subsubsection{双桥反向转向模式} +\subsubsection{前桥单转向模式} +\subsubsection{速度与转角} +\subsection{终端停车判定与模式切换} +\subsection{控制算法主流程} +\subsection{本章小结} + +\section{仿真系统构建与实现} +\subsection{系统总体架构与软硬件环境} +\subsection{牵引车模型与传感器建模} +\subsection{任务与模式管理} +\subsection{ROS与Gazebo接口实现} +\subsection{本章小结} + +\end{document} \ No newline at end of file diff --git a/co/scripts/auto_tug_core_appendix.py b/co/scripts/auto_tug_core_appendix.py new file mode 100644 index 00000000..53e04230 --- /dev/null +++ b/co/scripts/auto_tug_core_appendix.py @@ -0,0 +1,600 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +""" +自动牵引作业核心控制程序 + +文件用途: + 本程序用于论文附录或工程说明中展示自动牵引作业的核心算法逻辑。 + 程序保留了自动牵引任务状态机、关键目标点生成、相对位姿误差控制、 + 路径曲率计算以及前后转向桥角度映射等核心内容。 + +说明: + 1. 本文件为核心算法脚本,省略 ROS 节点初始化、Gazebo 服务调用、 + 控制器话题发布等工程外围代码。 + 2. 实际仿真运行时,可将 publish_motion() 替换为 ROS 控制器发布函数。 + 3. 飞机位姿 aircraft_pose 可由 Gazebo 真值、视觉识别、激光雷达定位 + 或其他感知模块提供。 +""" + +import math +import enum +from dataclasses import dataclass +from typing import Tuple + + +# ============================================================ +# 基础数学工具 +# ============================================================ + +def clamp(value: float, lower: float, upper: float) -> float: + """将数值限制在指定范围内。""" + return max(lower, min(upper, value)) + + +def wrap_to_pi(angle: float) -> float: + """将角度归一化到 [-pi, pi]。""" + while angle > math.pi: + angle -= 2.0 * math.pi + while angle < -math.pi: + angle += 2.0 * math.pi + return angle + + +def distance_2d(p1: "Pose2D", p2: "Pose2D") -> float: + """计算两个二维位姿点之间的平面距离。""" + dx = p2.x - p1.x + dy = p2.y - p1.y + return math.sqrt(dx * dx + dy * dy) + + +@dataclass +class Pose2D: + """ + 二维位姿数据结构。 + + 参数: + x : 世界坐标系下的 x 坐标 + y : 世界坐标系下的 y 坐标 + yaw : 世界坐标系下的航向角,单位 rad + """ + + x: float = 0.0 + y: float = 0.0 + yaw: float = 0.0 + + +@dataclass +class ControlCommand: + """ + 车辆控制指令。 + + 参数: + speed : 车辆线速度,单位 m/s + front_delta : 前转向桥角度,单位 rad + back_delta : 后转向桥角度,单位 rad + reached : 是否到达当前目标点 + """ + + speed: float + front_delta: float + back_delta: float + reached: bool = False + + +class TaskState(enum.Enum): + """ + 自动牵引作业状态机。 + """ + + SEARCH_TARGET = 0 # 搜索并确认飞机目标 + APPROACH_PRE_DOCK = 1 # 前往预对接点 + PRECISE_DOCK = 2 # 低速精确对接 + ATTACH = 3 # 建立牵引连接 + PUSHBACK = 4 # 推出飞机 + RELEASE = 5 # 解除牵引连接 + RETREAT = 6 # 车辆撤离 + DONE = 7 # 作业完成 + ABORT = 8 # 任务中止 + + +# ============================================================ +# 自动牵引核心算法 +# ============================================================ + +class AutoTugCore: + """ + 自动牵引作业核心控制类。 + + 主要功能: + 1. 根据飞机位姿生成预对接点、对接点、推出点和撤离点; + 2. 根据牵引车与目标点之间的相对位姿误差生成速度和曲率; + 3. 将路径曲率映射为前后转向桥角度; + 4. 通过有限状态机组织完整自动牵引作业流程。 + """ + + def __init__(self): + # ----------------------------- + # 车辆几何参数 + # ----------------------------- + self.wheelbase = 1.20 + self.max_steer_angle = 0.32 + + # 牵引车前牵引钩相对车体中心的偏移 + self.hitch_offset_x = 0.65 + self.hitch_offset_y = 0.00 + + # 飞机模型原点到前起落架目标点的偏移 + self.nose_gear_offset_x = 2.50 + self.nose_gear_offset_y = 0.00 + + # ----------------------------- + # 作业路径参数 + # ----------------------------- + self.pre_dock_distance = 2.00 + self.pushback_distance = 5.00 + self.retreat_offset_x = -1.50 + self.retreat_offset_y = -2.00 + + # ----------------------------- + # 控制参数 + # ----------------------------- + self.k_rho = 0.75 + self.k_alpha = 1.80 + self.k_yaw = 0.90 + + self.position_tolerance = 0.12 + self.yaw_tolerance = 0.10 + + # ----------------------------- + # 分阶段速度限制 + # ----------------------------- + self.max_approach_speed = 0.70 + self.max_dock_speed = 0.22 + self.max_pushback_speed = 0.35 + self.max_retreat_speed = 0.55 + self.min_motion_speed = 0.06 + + # 当前任务状态 + self.state = TaskState.SEARCH_TARGET + + # ======================================================== + # 坐标变换与任务点生成 + # ======================================================== + + def transform_local_to_world( + self, + base_pose: Pose2D, + local_x: float, + local_y: float, + local_yaw: float = 0.0 + ) -> Pose2D: + """ + 将局部坐标系下的点转换到世界坐标系。 + + 参数: + base_pose : 基准位姿 + local_x : 局部坐标系 x 方向偏移 + local_y : 局部坐标系 y 方向偏移 + local_yaw : 相对航向角 + + 返回: + 转换后的世界坐标系位姿 + """ + + 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: Pose2D + ) -> Tuple[Pose2D, Pose2D, Pose2D, Pose2D]: + """ + 根据飞机位姿生成自动牵引作业所需关键目标点。 + + 生成点包括: + pre_dock_pose : 预对接点 + dock_pose : 精确对接点 + pushback_pose : 推出目标点 + retreat_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 + + # ======================================================== + # 相对位姿误差控制 + # ======================================================== + + def compute_pose_control( + self, + current_pose: Pose2D, + target_pose: Pose2D, + max_speed: float + ) -> Tuple[float, float, float, float]: + """ + 基于相对位姿误差的车辆运动控制律。 + + 控制步骤: + 1. 计算目标点相对牵引车的位置误差; + 2. 将世界坐标误差转换到车辆自身坐标系; + 3. 根据距离误差生成线速度; + 4. 根据横向误差和航向误差生成角速度; + 5. 将角速度转换为参考路径曲率。 + + 返回: + speed : 车辆线速度 + curvature : 参考路径曲率 + distance : 车辆到目标点的距离 + yaw_error : 航向角误差绝对值 + """ + + 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) + + # ======================================================== + # 四轮转向映射 + # ======================================================== + + def curvature_to_steering( + self, + curvature: float, + mode: str + ) -> Tuple[float, float]: + """ + 将参考路径曲率转换为前后转向桥角度。 + + 参数: + curvature : 参考路径曲率 + mode : 转向模式 + + 转向模式: + front_only : 前桥转向,后桥回中; + counter_phase : 前后桥反相转向,适合小半径转弯和精确对接; + crab : 前后桥同相转向,适合斜行或横向微调。 + + 返回: + front_delta : 前桥转角 + back_delta : 后桥转角 + """ + + if abs(curvature) < 1e-6: + return 0.0, 0.0 + + if mode == "front_only": + front_delta = math.atan(self.wheelbase * curvature) + back_delta = 0.0 + + elif mode == "counter_phase": + front_delta = math.atan(0.5 * self.wheelbase * curvature) + back_delta = -front_delta + + elif mode == "crab": + front_delta = math.atan(0.5 * self.wheelbase * curvature) + back_delta = front_delta + + else: + front_delta = math.atan(self.wheelbase * curvature) + back_delta = 0.0 + + front_delta = clamp( + front_delta, + -self.max_steer_angle, + self.max_steer_angle + ) + + back_delta = clamp( + back_delta, + -self.max_steer_angle, + self.max_steer_angle + ) + + return front_delta, back_delta + + def go_to_pose_step( + self, + current_pose: Pose2D, + target_pose: Pose2D, + max_speed: float, + steering_mode: str + ) -> ControlCommand: + """ + 执行一次目标点跟踪控制。 + + 实际 ROS 工程中,该函数应被周期性调用, + 并将返回的速度和转角发送至车辆控制器。 + """ + + speed, curvature, distance, yaw_error = self.compute_pose_control( + current_pose, + target_pose, + max_speed + ) + + if distance < self.position_tolerance and yaw_error < self.yaw_tolerance: + return ControlCommand( + speed=0.0, + front_delta=0.0, + back_delta=0.0, + reached=True + ) + + front_delta, back_delta = self.curvature_to_steering( + curvature, + steering_mode + ) + + return ControlCommand( + speed=speed, + front_delta=front_delta, + back_delta=back_delta, + reached=False + ) + + # ======================================================== + # 自动牵引作业状态机 + # ======================================================== + + def run_task_state_machine( + self, + aircraft_pose: Pose2D, + current_tug_pose: Pose2D, + target_valid: bool = True + ) -> ControlCommand: + """ + 自动牵引作业状态机主逻辑。 + + 参数: + aircraft_pose : 飞机当前位姿 + current_tug_pose : 牵引车当前位姿 + target_valid : 飞机目标识别是否有效 + + 返回: + 当前周期的车辆控制指令 + """ + + if not target_valid or aircraft_pose is None: + self.state = TaskState.SEARCH_TARGET + return ControlCommand(0.0, 0.0, 0.0, reached=False) + + pre_dock_pose, dock_pose, pushback_pose, retreat_pose = \ + self.generate_task_points(aircraft_pose) + + # 1. 搜索并确认飞机目标 + if self.state == TaskState.SEARCH_TARGET: + self.state = TaskState.APPROACH_PRE_DOCK + return ControlCommand(0.0, 0.0, 0.0, reached=False) + + # 2. 前往预对接点 + if self.state == TaskState.APPROACH_PRE_DOCK: + cmd = self.go_to_pose_step( + current_tug_pose, + pre_dock_pose, + self.max_approach_speed, + "front_only" + ) + + if cmd.reached: + self.state = TaskState.PRECISE_DOCK + + return cmd + + # 3. 低速精确对接 + if self.state == TaskState.PRECISE_DOCK: + cmd = self.go_to_pose_step( + current_tug_pose, + dock_pose, + self.max_dock_speed, + "counter_phase" + ) + + if cmd.reached: + self.state = TaskState.ATTACH + + return cmd + + # 4. 建立牵引连接 + if self.state == TaskState.ATTACH: + # 实际工程中,此处可建立虚拟牵引约束或机械连接模型。 + self.state = TaskState.PUSHBACK + return ControlCommand(0.0, 0.0, 0.0, reached=False) + + # 5. 飞机推出 + if self.state == TaskState.PUSHBACK: + cmd = self.go_to_pose_step( + current_tug_pose, + pushback_pose, + self.max_pushback_speed, + "counter_phase" + ) + + if cmd.reached: + self.state = TaskState.RELEASE + + return cmd + + # 6. 解除牵引连接 + if self.state == TaskState.RELEASE: + # 实际工程中,此处解除虚拟牵引约束或机械连接。 + self.state = TaskState.RETREAT + return ControlCommand(0.0, 0.0, 0.0, reached=False) + + # 7. 车辆撤离 + if self.state == TaskState.RETREAT: + cmd = self.go_to_pose_step( + current_tug_pose, + retreat_pose, + self.max_retreat_speed, + "front_only" + ) + + if cmd.reached: + self.state = TaskState.DONE + + return cmd + + # 8. 作业完成 + if self.state == TaskState.DONE: + return ControlCommand(0.0, 0.0, 0.0, reached=True) + + # 9. 异常中止 + self.state = TaskState.ABORT + return ControlCommand(0.0, 0.0, 0.0, reached=False) + + # ======================================================== + # 工程接口占位函数 + # ======================================================== + + def publish_motion(self, command: ControlCommand) -> None: + """ + 工程接口占位函数。 + + 在实际 ROS + Gazebo 工程中,应将该函数替换为控制器话题发布逻辑: + 1. 将 command.speed 转换为四个车轮的角速度; + 2. 将 command.front_delta 发布给前转向桥位置控制器; + 3. 将 command.back_delta 发布给后转向桥位置控制器。 + """ + + print( + "speed = {:.3f} m/s, front_delta = {:.3f} rad, " + "back_delta = {:.3f} rad, reached = {}".format( + command.speed, + command.front_delta, + command.back_delta, + command.reached + ) + ) + + +# ============================================================ +# 示例调用 +# ============================================================ + +def main(): + """ + 示例主函数。 + + 注意: + 该示例仅用于说明核心算法调用方式。 + 实际仿真中 current_tug_pose 和 aircraft_pose 应由 Gazebo 或感知节点实时提供。 + """ + + controller = AutoTugCore() + + # 示例:飞机位姿 + aircraft_pose = Pose2D( + x=6.0, + y=0.0, + yaw=0.0 + ) + + # 示例:牵引车当前位姿 + current_tug_pose = Pose2D( + x=0.0, + y=-1.0, + yaw=0.0 + ) + + # 执行一次状态机计算 + command = controller.run_task_state_machine( + aircraft_pose=aircraft_pose, + current_tug_pose=current_tug_pose, + target_valid=True + ) + + controller.publish_motion(command) + + +if __name__ == "__main__": + main() diff --git "a/co/undergraduate/README_\347\274\202\346\240\254\347\230\247\347\222\207\345\255\230\346\247\221.txt" "b/co/undergraduate/README_\347\274\202\346\240\254\347\230\247\347\222\207\345\255\230\346\247\221.txt" new file mode 100644 index 00000000..6deb1f67 --- /dev/null +++ "b/co/undergraduate/README_\347\274\202\346\240\254\347\230\247\347\222\207\345\255\230\346\247\221.txt" @@ -0,0 +1,6 @@ +编译说明: +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/ 目录。 diff --git a/co/undergraduate/cmdel.bat b/co/undergraduate/cmdel.bat new file mode 100644 index 00000000..c9642e0a --- /dev/null +++ b/co/undergraduate/cmdel.bat @@ -0,0 +1,2 @@ +del /a /f *.xml *.bcf *.out *.log *.sav *.gz *.aux *.bbl *.bak *.dvi *.blg + diff --git a/co/undergraduate/content/abstracten.tex b/co/undergraduate/content/abstracten.tex new file mode 100644 index 00000000..704a7800 --- /dev/null +++ b/co/undergraduate/content/abstracten.tex @@ -0,0 +1,13 @@ +%!TEX root = ../csuthesis_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. + First, the airport towing operation scenario is abstracted, and a kinematic model of a dual-axle steering towing vehicle is established. The relationships among steering angle, vehicle speed, and trajectory curvature are analyzed. On this basis, an aircraft-assisted perception method and a relative pose error-based control strategy are designed. By using target identity confirmation, relative distance estimation, and attitude error calculation, the towing vehicle can realize autonomous approaching, attitude adjustment, and terminal stopping judgment. Then, the towing vehicle model, aircraft target, and airport operation environment are built in Gazebo. Under the ROS framework, vehicle control, sensor data acquisition, task mode switching, and system communication are implemented through ROS nodes. + The simulation results show that the proposed ROS-Gazebo co-simulation system can realize basic processes such as vehicle model loading, steering control, wheel speed control, target approaching, docking, pushback, and retreat. The feasibility of the proposed method in the airport automatic towing and docking scenario is verified. This study provides a reference for future prototype development, control algorithm optimization, and further research on intelligent airport ground operation systems. + + + + + +\end{abstracten} \ No newline at end of file diff --git a/co/undergraduate/content/abstractzh.tex b/co/undergraduate/content/abstractzh.tex new file mode 100644 index 00000000..bd607e1b --- /dev/null +++ b/co/undergraduate/content/abstractzh.tex @@ -0,0 +1,15 @@ +%!TEX root = ../csuthesis_main.tex +% 设置中文摘要 +\keywordscn{自动牵引车\quad 飞机对接\quad ROS\quad Gazebo\quad 路径规划\quad 联合仿真} +%\categorycn{TP391} +\begin{abstractzh} + + + 随着机场地面运行智能化水平的提升,飞机牵引与对接作业对自动化、精确性和安全性提出了更高要求。针对传统人工牵引方式依赖经验、作业效率受限及安全风险较高等问题,本文以自动牵引车与飞机对接过程为研究对象,基于ROS与Gazebo平台构建联合仿真系统。 + 本文首先对机场牵引作业场景进行抽象,建立双桥转向牵引车运动学模型,并分析转向角、速度与轨迹曲率之间的约束关系。在此基础上,设计飞机辅助感知与相对位姿误差控制方法,通过目标身份确认、相对距离与姿态误差获取,实现牵引车的自动接近、姿态调整和停车判定。随后,基于Gazebo搭建牵引车、飞机目标和机场作业环境,并通过ROS节点完成车辆控制、传感器数据获取、任务模式切换和系统通信。 + 仿真结果表明,所构建的ROS-Gazebo联合仿真系统能够实现牵引车模型加载、转向控制、轮速控制、目标接近、对接、推出和撤离等基本流程,验证了所提方法在机场自动牵引对接场景中的可行性。本文研究可为后续真实样机开发、控制算法优化和多传感器融合研究提供一定参考 + + + + +\end{abstractzh} \ No newline at end of file diff --git a/co/undergraduate/content/acknowledgements.tex b/co/undergraduate/content/acknowledgements.tex new file mode 100644 index 00000000..83a4034d --- /dev/null +++ b/co/undergraduate/content/acknowledgements.tex @@ -0,0 +1,16 @@ +%!TEX root = ../hutbthesis_main.tex +\begin{acknowledgements} + +这篇课题从开题到落地,离不开相关老师朋友以及家人的支持与帮助。 + +首先,我想要感谢导师在论文选题、研究思路、系统设计和论文撰写过程中给予的耐心指导。从课题方向的确定,到ROS与Gazebo联合仿真方案的完善,再到论文结构、技术路线和文字表达的修改,老师都提出了许多宝贵意见,使我能够更加清晰地理解课题研究重点,并逐步完成毕业设计任务;同时,在改进的过程中又学到了新的设计理念。 + +其次,感谢实习单位相关部门前辈给出的经验,是他们及时的经验分享让我在设计方案上少走了很多弯路。 + +同时,我还要感谢家人在整个课题周期所给予的情绪理解与资金支持,感谢朋友给予的设备支持。没有他们的帮助我无法在短时间完成第一辆实体车辆的硬件测试。 + +最后,我还想留一份给自己。作为一项早已躺在桌面的``新建文件夹'',这个论文的完成标志着整个项目的突破进展。我也要感谢那个三年来不曾放弃这个想法的自己。 + +总之,通过本次毕业设计,我对机器人系统建模、ROS仿真平台、车辆运动控制以及工程项目实施流程有了更深入的认识,也进一步提高了独立分析问题和解决问题的能力。今后我将继续保持严谨踏实的学习态度,在相关专业方向上不断积累和提升。 + +\end{acknowledgements} diff --git a/co/undergraduate/content/appendix.tex b/co/undergraduate/content/appendix.tex new file mode 100644 index 00000000..6568330e --- /dev/null +++ b/co/undergraduate/content/appendix.tex @@ -0,0 +1,467 @@ +%!TEX root = ../hutbthesis_main.tex +\chapter{主要符号、缩写说明、方法对比表格} + +\begin{longtable}[]{@{} + >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.1551}} + >{\raggedright\arraybackslash}p{(\columnwidth - 2\tabcolsep) * \real{0.8449}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +\textbf{缩写/符号} +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +\textbf{含义} +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +ROS & Robot Operating System,机器人操作系统 \\ +Gazebo & 机器人三维物理仿真平台 \\ +URDF & Unified Robot Description Format,机器人统一描述格式 \\ +A-SMGCS & 高级场面活动引导与控制系统 \\ +LiDAR & 激光雷达 \\ +\(v\) & 车辆纵向速度 \\ +\(\omega\) & 车辆偏航角速度 \\ +\(\delta_{f}\) & 前桥转角 \\ +\(\delta_{r}\) & 后桥转角 \\ +\(e_{x}\) & 纵向误差 \\ +\(e_{y}\) & 横向误差 \\ +\(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}}@{}} +\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{} +\endhead +\bottomrule\noalign{} +\endlastfoot +人工牵引 & 驾驶员和地面人员协同完成牵引作业 & +经验判断灵活,适应真实复杂环境能力强 & +依赖人员经验,标准化和重复精度受人为因素影响 & +本文方法不能直接替代人工,但可为自动化流程提供仿真验证基础 \\ +固定路径/开环脚本 & 通过预设速度、转向角和时间完成动作 & +实现简单,适合早期动画和模型验证 & +缺少误差反馈,环境或初始状态变化后适应性差 & +本文在此基础上增加相对位姿误差控制思想 \\ +PID控制 & 对速度、角度等单变量进行反馈调节 & 结构简单,工程应用广 & +难以单独处理多变量耦合的精确对接问题 & +可作为底层控制基础,但不足以完整描述对接策略 \\ +Pure Pursuit & 基于前视点进行路径跟踪 & 路径跟踪平滑,实现难度适中 & +末端精确姿态对准能力有限 & 适合普通循迹,本文更强调近距离位姿误差修正 \\ +Stanley算法 & 基于横向误差和航向误差进行控制 & +适合车辆路径跟踪,横向误差修正能力较好 & +更偏向中高速路径跟踪,低速精细对接针对性不足 & +可作为参考,但本文场景更偏低速对接 \\ +MPC控制 & 在约束条件下进行预测优化控制 & 理论效果好,可处理多约束问题 & +建模和调参复杂,实现难度较高 & 后续可作为优化方向,本文阶段暂不采用 \\ +SLAM/深度学习方法 & 依赖建图、视觉识别或数据驱动决策 & +自主性和智能化程度高 & 数据、算力和系统复杂度要求高 & +本文保留扩展接口,但现阶段以规则化仿真验证为主 \\ +本文方法 & 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 diff --git a/co/undergraduate/content/chapter1.tex b/co/undergraduate/content/chapter1.tex new file mode 100644 index 00000000..40857328 --- /dev/null +++ b/co/undergraduate/content/chapter1.tex @@ -0,0 +1,73 @@ +%!TEX root = ../hutbthesis_main.tex +\chapter{绪论} + +\section{研究背景与意义} + +在一次航班离港流程中,飞机从停机位推出到进入滑行路线,看起来只是周转链条中的一个短环节,但它实际上同时牵涉机坪交通、廊桥区域安全、地勤人员协同和后续放行节奏。牵引车需要在飞机前起落架附近低速靠近,车身周围又存在机翼、发动机、廊桥、保障车辆和地面标线等多种约束。任何一次偏航过大、停车不及时或目标识别错误,都可能使简单的推出作业演变为安全事件。因此,飞机牵引与推出并不是单纯的``车辆驾驶''问题,而是一个典型的低速、高精度、多约束协同作业问题\textsuperscript{[1-2]}。 + +目前多数机场的推出与牵引仍以人工驾驶牵引车、机务或指挥员目视协同为主。该方式在经验丰富、交通密度较低的情况下较为可靠,但其稳定性很大程度取决于人员状态和现场沟通质量。航班高峰、夜航、雨雾天气以及机坪车辆交叉运行时,人工判断容易受到视距、噪声和遮挡影响,牵引路径规划、翼尖安全距离判断、前起落架对准等环节都可能出现误差。对智慧机场而言,这类高度依赖人工经验的作业环节,会限制地面运行系统继续向闭环调度和自动执行方向发展。 + +相关资料表明,机场地面运行阶段的安全风险并不低,推出、牵引和低速滑行是典型的风险集中环节之一,常见问题包括牵引车与机体接触、翼尖剐蹭、人员误入作业区域等。同时,地面运行延误还会沿航班计划向后传递,使单个机位或单个航班的问题进一步影响后续起飞排序和机坪资源利用。因此,提高牵引作业的自动化水平,不仅有助于降低局部操作风险,也有助于提升机场地面运行的整体稳定性\textsuperscript{[3-6]}。 + +从技术发展看,机场场面运行系统正由传统SMGCS向A-SMGCS(Advanced Surface +Movement Guidance and Control +System)升级。A-SMGCS强调对地面目标的监视、引导、冲突预警和运行协同,为机场车辆与航空器的统一管理提供了系统框架\textsuperscript{[2-4]}。不过,现有研究和工程应用更多集中在飞机滑行监视、场面交通管理和冲突告警层面,对``牵引车---飞机''这一强耦合、近距离、低速精对准对象的自动控制研究仍不充分。尤其是在牵引车接近前起落架、姿态对齐、低速停车和后续推出这一连续过程中,仍缺少面向仿真验证的完整方法。 + +基于上述背景,本文选择以高保真仿真环境为研究支撑,围绕机场牵引车与飞行器的协同控制展开建模、感知、路径规划和控制验证。通过在ROS与Gazebo环境中构建牵引车、飞机目标和机坪作业场景,可以在较低成本下复现实车试验中难以频繁开展的对接过程,观察车辆转向、速度、目标识别和安全约束之间的相互影响\textsuperscript{[11-13]}。这对于后续自动牵引系统的样机设计、控制算法调试以及机场地面作业智能化研究都具有现实意义。 + +\section{国内外研究现状} + +\subsection{机场牵引与地面自动化研究现状} + +机场地面自动化研究的出发点,是在不降低安全裕度的前提下减少人工重复操作,并提高机坪资源的利用效率\textsuperscript{[1-4]}。飞机推出与牵引处在航班周转和场面交通之间:一方面,它需要服从停机位、滑行通道、速度限制和指挥流程等机场运行规则;另一方面,它又要求牵引车在飞机前起落架附近完成低速对准、连接和稳定牵引。因此,该环节既有车辆控制问题,也有机场运行组织问题。 + +国外较早围绕``无发动机滑行''和自动牵引开展研究。以TaxiBot、e-Taxi等方案为代表,相关工作尝试通过牵引车或机轮电驱系统减少飞机发动机地面运行时间,从而降低燃油消耗、噪声和排放\textsuperscript{[6,8-9]}。Zaninotto等面向自动牵引作业提出调度与路径规划方法,通过冲突检测和时序优化减少牵引车之间、牵引车与飞机之间的运行冲突,说明自动牵引在提高滑行效率和减少人为差错方面具有可行性\textsuperscript{[7]}。此外,也有研究从牵引车---飞机组合体的制动、转向和纵向耦合特性入手,为低速牵引控制提供动力学基础\textsuperscript{[6,10,19]}。 + +在机场系统层面,SESAR等项目持续推动场面运行从单点自动化向系统协同自动化发展。A-SMGCS的相关研究强调将监视、路径引导、冲突预警与运行管理结合起来,使机场能够对航空器和车辆目标进行更精细的状态管理\textsuperscript{[2-4]}。这类研究为自动牵引提供了上层运行框架,但其重点通常不在牵引车末端对接控制本身,而在于更大范围的场面交通监视与运行调度。 + +国内关于飞机牵引滑行和地面运行智能化的研究起步相对较晚,但近年来进展明显。孙艳坤等对飞机牵引滑行技术进行了系统综述,内容涉及牵引装备类型、动力学特性、运行模式和发展趋势,并指出自动牵引与智能调度是后续重要方向\textsuperscript{[6]}。在规范层面,中国民航局发布的A-SMGCS相关技术指南和行业标准,也为机场场面运行的信息化和智能化建设提供了依据\textsuperscript{[1-2]}。不过,从现有公开研究看,国内工作仍较多停留在系统规划、装备综述或单一算法分析层面,对牵引车自动接近飞机、对准前起落架并完成安全停车这一末端过程的仿真验证仍然不足。 + +因此,本文的研究切入点并不是重新讨论机场自动化的宏观框架,而是将问题压缩到一个更具体的作业单元:在给定机场作业规则和车辆结构约束下,牵引车如何识别飞机目标、生成可执行路径,并以稳定方式完成对接。这个问题更贴近实际工程调试,也更适合通过ROS-Gazebo联合仿真进行反复验证。 + +\subsection{协同控制与路径规划方法研究现状} + +从方法上看,机场牵引自动化可归入移动机器人导航和智能车辆控制范畴,但它又不能完全照搬普通道路自动驾驶或仓储AGV的方案\textsuperscript{[17-20,28]}。原因在于,牵引车面对的是航空器这一高价值目标,运行区域空间狭窄、规则刚性强,而且最终对接阶段对横向误差和姿态误差都十分敏感。也就是说,路径规划不仅要``走得到'',还要``转得过、停得住、对得准''。 + +图搜索与采样类算法是路径规划研究中的基础方法。A*、Dijkstra等图搜索算法结构清晰、结果可解释性强,适合在机场滑行道、机坪通道等规则环境中生成全局参考路径\textsuperscript{[22-23]};RRT及其改进算法则更适合在连续空间中快速搜索可行路径,常用于机器人和自动车辆的运动规划\textsuperscript{[20-21,24]}。这类方法的优势在于稳定和易于检查,但在动态障碍较多、局部空间受限或车辆曲率约束较强时,单独使用往往需要额外的平滑、重规划和可行性筛选。 + +智能优化算法也被广泛用于路径规划问题。例如蚁群算法、粒子群算法等可以把路径长度、安全距离、能耗或时间代价写入统一目标函数,对多约束规划具有一定灵活性。但这类算法通常对参数设置较敏感,收敛速度和解的稳定性会随场景复杂度变化而波动。机场牵引属于安全敏感任务,若规划结果难以解释或每次计算结果差异较大,工程应用就会受到限制。 + +近年来,强化学习和深度强化学习在复杂动态环境决策中受到关注。它们能够通过与环境交互学习策略,对未知障碍或非结构化场景具有一定适应能力。但机场场景对安全性、可验证性和监管合规性要求较高,单纯依赖黑箱策略并不合适;同时,强化学习对训练数据规模和仿真真实性依赖较强,若仿真与真实机坪差异较大,策略迁移效果也难以保证。 + +综合来看,适合本课题的路线应是分层式、融合式的。上层规划尽量保留机场规则、车辆曲率和安全距离等显式约束,保证路径可解释、可检查;下层控制根据实时感知误差进行局部修正,解决对接过程中的小偏差和动态干扰。这样的框架既不过分依赖单一智能算法,也能避免纯规则方法在复杂局部场景中反应不足的问题,为后续牵引车---飞机协同控制提供了更稳妥的技术基础\textsuperscript{[25,28]}。 + +\section{研究内容与技术路线} + +本文以机场飞机推出与牵引作业为应用背景,重点研究牵引车与飞行器在低速近距场景下的协同控制问题。课题并不追求单一算法指标,而是围绕``建模---感知---规划---控制---仿真验证''这条链路展开:先把机场牵引作业抽象成可计算的问题,再利用仿真平台检验车辆能否按预期完成目标识别、接近、对准和停车。结合本文已经开展的ROS/Gazebo建模、SolidWorks车辆模型导入、双桥转向控制调试等工作,主要研究内容如下。 + +(1)机场牵引作业流程建模与问题抽象 + +从停机位推出和前起落架对接过程出发,分析牵引车、飞机、机坪通道、禁行区域和障碍物之间的关系。根据作业顺序,将自动牵引过程划分为目标确认、初始接近、姿态对准、微动对接和停车保持等阶段,并把实际约束转化为状态变量、控制输入和安全边界。该部分的目的,是为后续控制算法提供一个统一的问题描述,而不是只停留在场景文字说明上。 + +(2)面向自动对接的飞机辅助感知方法 + +在仿真环境中,飞机前起落架区域被设计为主要识别对象,通过设置可识别标识,使牵引车能够获取目标身份、相对距离、横向偏差和姿态偏差等信息。视觉传感器用于目标确认与相对位姿估计,激光雷达、超声波或等效近距传感器用于安全距离判断。该部分重点解决``牵引车如何知道自己应该接近哪一架飞机、朝哪个方向对准、何时需要停车''的问题。 + +(3)多约束条件下的路径规划与协同控制方法 + +在车辆运动学模型和感知误差接口的基础上,设计自动接近与对接控制方法。全局层面,根据机场运行规则和车辆曲率约束生成可执行参考路径;局部层面,根据实时感知误差对速度和转向进行在线修正。控制策略需要同时考虑低速稳定性、转向角限制、安全距离、终端停车阈值和对接姿态要求。本文采用分层控制思路,将模式管理、局部规划、误差反馈和执行器映射分开处理,使算法结构更便于在ROS节点中实现。 + +(4)基于高保真模拟器的系统集成与验证 + +依托ROS与Gazebo搭建牵引车---飞机对接仿真系统。车辆模型由SolidWorks建立并经URDF/STL等形式导入Gazebo,前后桥转向关节和四个驱动车轮通过控制器实现位置和速度控制,传感器模型挂载于车体前部。通过设置典型机场作业场景,对牵引车模型加载、转向回中、轮速控制、目标接近和停车判定等功能进行验证,并从安全性、路径平滑性和控制稳定性等角度分析系统表现。 + +(5)牵引车辆结构与动力系统的工程化思考 + +在完成仿真和控制算法研究的同时,结合机场牵引车实际需求,对车辆结构、动力布置和维护便利性进行初步分析。该部分不作为完整机械设计展开,而是从工程实现角度讨论车辆硬件结构与控制策略之间的关系,例如双桥转向结构对小半径机动和精细对位的影响、动力响应对低速控制稳定性的影响等,为后续实物样机或半实物平台研究提供参考。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=5.76806in,height=3.76181in]{figures/image2.png} + \caption{研究内容与技术路线图} + \label{fig:1-1} +\end{figure} diff --git a/co/undergraduate/content/chapter2.tex b/co/undergraduate/content/chapter2.tex new file mode 100644 index 00000000..37bf1356 --- /dev/null +++ b/co/undergraduate/content/chapter2.tex @@ -0,0 +1,280 @@ +%!TEX root = ../hutbthesis_main.tex +\chapter{机场牵引车辆系统建模与问题理论基础} + +\section{机场牵引作业场景抽象} + +机场牵引作业通常发生在停机位、廊桥附近和机坪连接滑行通道区域。与普通道路车辆行驶相比,牵引车的运行速度很低,但控制难度并不低:车辆要在有限空间内靠近飞机前起落架,既要避免车体、机翼和地面保障设备之间发生干涉,又要保证车头方向、横向位置和停车距离满足后续机械连接要求。对于本课题中的双桥转向牵引车而言,前后转向桥能够提高机动性,但也使车辆运动模式和控制输入之间的关系更加复杂。 + +结合本文研究目标,可将自动牵引对接过程抽象为五个连续阶段。第一阶段为任务初始化与目标确认,牵引车接收目标飞机信息并通过辅助识别标识完成身份判断;第二阶段为初始接近,车辆从给定初始位姿向飞机前起落架附近的预对接区域运动;第三阶段为姿态对准,车辆重点减小横向偏差和航向误差,使车体中心线逐步贴近目标对接方向;第四阶段为微动对接,牵引车在低速状态下完成小范围位置修正;第五阶段为停车保持,系统在满足距离、姿态和安全阈值后发布停车与转向回中命令。 + +由此可见,飞机推出不是一条轨迹从起点跟到终点这么简单,而是目标识别、车辆运动学约束、安全边界和模式切换共同作用的状态演化过程\textsuperscript{[17-21]}。本章只先处理牵引车本体在机坪平面内如何运动的问题,即建立位姿状态、曲率关系和输入约束;飞机辅助识别、局部安全判断和最终对接控制将在第三章统一展开。 + +\section{坐标系与状态变量定义} + +为统一描述牵引车在机坪平面内的运动状态,建立全局惯性坐标系 +\(O\text{\,} - \text{\,}XY\)与车体坐标系 +\(C\text{\,} - \text{\,}xy\)。其中,全局坐标系固定于地面,主要用于描述车辆在场景中的绝对位置;车体坐标系原点取在车辆参考点 +\(C\)处,该点可取车辆几何中心、质心或控制参考中心,\(x\) +轴沿车辆纵向前进方向,\(y\) 轴沿车辆横向方向。 + +定义车辆位姿状态为\(\mathbf{q} = \begin{bmatrix} +x & y & \theta +\end{bmatrix}^{T}\) 。其中,\(x\) 与 +\(y\)分别表示车辆参考点在全局坐标系中的位置坐标,\(\theta\) +表示车体纵向轴相对于全局 +\(X\)轴的夹角,即车辆航向角。进一步地,为描述车辆运动过程中的速度状态,引入线速度 +\(v\)作为系统运动输入或状态扩展量,则可将系统状态写为\(\mathbf{x} = \begin{bmatrix} +x & y & \theta & v +\end{bmatrix}^{T}\) 。式中\(v\) +表示车辆沿车体纵向的速度分量。该状态定义方式具有两点作用:一方面,\(\left( x,y,\theta \right)\) +可直接用于描述车辆轨迹;另一方面,\(v\) +可与转向输入共同决定系统状态的实时演化。 + +对于本课题所研究的双桥转向牵引车,前桥和后桥均具有独立转向能力,因此进一步定义前桥转角与后桥转角分别为 +\(\delta_{f}\)与 +\(\delta_{r}\)。若将系统控制输入写为\(\mathbf{u} = \begin{bmatrix} +v & \delta_{f} & \delta_{r} +\end{bmatrix}^{T}\),则后续运动学模型即可统一写成关于 \(\mathbf{x}\)与 +\(\mathbf{u}\)的非线性状态方程。 + +\section{车辆运动学模型建立} + +\subsection{非完整约束条件} + +牵引车在机坪低速运行过程中,车轮主要满足纯滚动约束,即轮胎可沿轮平面方向滚动,但不能在垂直于轮平面的方向上发生理想横向滑移。因此,车辆系统属于典型非完整约束系统。对于车体参考点 +\(C\),其速度在车体横向方向上的投影应为零,可写为\(\dot{y}\cos\theta - \dot{x}\sin\theta = 0\)。该式的物理意义在于:车辆不能瞬时``侧向平移'',其平面运动只能由纵向速度与航向变化共同形成。这一约束是移动机器人与地面车辆运动学建模中的基本条件,也是后续推导轨迹方程的前提\textsuperscript{[17,19]}。 + +\subsection{单轨等效模型} + +由于前桥左右轮、后桥左右轮在同一转向控制下可近似视为对称运动,因此可采用单轨等效方法,将实际四轮结构抽象为前后两虚拟轮\textsuperscript{[19]}。设前、后桥中心点分别位于车体参考点前后,车辆轴距为 +\(L\)。在低速、小侧偏工况下,车辆瞬时旋转中心满足几何关系,车辆平面运动可表示为(1) + +\(\left\{ \begin{array}{r} +\dot{x} = vcos\theta \\ +\dot{y} = vsin\theta \\ +\dot{\theta} = \omega\ +\end{array} \right.\ \) (1) + +式中,\(\omega\) +为车辆偏航角速度。前两式给出了车辆质点速度在全局坐标系中的分解形式,第三式给出了车辆姿态随时间的演化规律。车辆轨迹由两个因素共同决定:一是沿当前朝向的平移速度 +\(v\),二是决定航向变化速率的角速度 \(\omega\)。 + +\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}\) +为前桥转角,\(\delta_{r}\) 为后桥转角,\(L\) +为前后桥中心距。该式表明,前桥转向与后桥转向对车辆角速度的作用方向相反。当后桥不转向,即 +\(\delta_{r} = 0\)时,模型退化为普通前轮转向模型;当前后桥反向转向时,\(\tan\delta_{f} - \tan\delta_{r}\) +的绝对值增大,车辆角速度提高,转弯半径减小;当前后桥同向转向时,两者效应相互抵消,车辆偏航角速度下降,车辆运动趋于``蟹行''模式。 + +将上述关系代入状态方程,可得双桥转向牵引车的运动学模型(2) + +\(\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) + +该模型是本课题后续路径规划、轨迹跟踪与对接控制设计的基础模型\textsuperscript{[17,19,28]}。 + +\section{转弯半径与曲率模型} + +车辆轨迹几何特性通常由曲率或转弯半径刻画。设车辆瞬时转弯半径为 +\(R\),则有 + +\begin{equation} +\omega = \frac{v}{R} +\tag{3} +\label{eq:3} +\end{equation} + +结合上一节所得角速度表达式,可得双桥转向牵引车的等效转弯半径为 + +\begin{equation} +R = \frac{L}{\tan\delta_{f} - \tan\delta_{r}} +\tag{4} +\label{eq:4} +\end{equation} + +若进一步定义轨迹曲率 \(\kappa\)为转弯半径的倒数,则有 + +\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]}。 + +需要指出的是,理论上当 +\(\tan\delta_{f} - \tan\delta_{r} = 0\)时,\(R \rightarrow \infty\),车辆轨迹退化为直线或近似平移;而当 +\(\mid tan\delta_{f} - \tan\delta_{r} \mid\)增大时,车辆可实现更强的转向能力。但在工程应用中,前后桥转角均受机械结构、执行器能力和稳定性要求限制,因此曲率不可能无限增大,而必须满足可实现性约束。 + +\section{典型转向模式分析} + +双桥转向车辆较普通单桥转向车辆具有更丰富的运动模式。为明确不同转向策略对车辆机动性的影响,分别讨论以下三种典型工况。 + +\subsection{前桥单独转向模式} + +当后桥不参与转向,即\(\delta_{r} = 0\)时,车辆运动学模型退化为 + +\begin{equation} +\dot{\theta} = \frac{v}{L}\tan\delta_{f} +\tag{6} +\label{eq:6} +\end{equation} + +此时车辆行为与传统前轮转向车辆基本一致(图2-1)。该模式实现简单、控制逻辑清晰,但在对接空间受限的场景下,其最小转弯半径较大,不利于快速完成姿态调整。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.66955in,height=2.12251in]{figures/image3.png} + \caption{传统转向模式} + \label{fig:2-1} +\end{figure} + +\subsection{前后桥反向转向模式} + +当后桥转角与前桥转角方向相反,且幅值近似相等,即\(\delta_{r} = - \delta_{f}\)代入角速表达式可得 + +\(\dot{\theta} = \frac{v}{L}\left( tan\delta_{f} - tan( - \delta_{f}) \right) = \frac{2v}{L}tan\delta_{f}\) +(7) + +此时车辆偏航角速度约为单桥转向工况的两倍,转弯半径显著减小(图2-2),适用于牵引车在狭小机坪空间内快速调整姿态、靠近飞机前轮或完成局部避障。该模式是本课题中实现高机动性接近控制的重要运动模式。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=5.05627in,height=2.29662in]{figures/image4.png} + \caption{前后桥反向转向模式} + \label{fig:2-2} +\end{figure} + +\subsection{前后桥同向转向模式} + +当\(\delta_{r} = \delta_{f}\)时,有\(\dot{\theta} = \frac{v}{L}\left( \tan\delta_{f} - \tan\delta_{f} \right) = 0\) + +当车辆偏航角速度为零,此时车辆整体保持原有航向并沿车轮切线方向斜向平移,表现为 +``蟹行''运动(图2-3)。该模式并不适合大幅姿态修正,但对于微小横向误差修正、精细对位和低速贴近控制具有较高实用价值。 + +通过上述分析可知,双桥转向结构使牵引车不再局限于单一的``直行---转弯''运动,而具备在姿态快速修正与横向精细调节之间切换的能力,这也是其适用于飞机自动对接场景的重要原因。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.99734in,height=2.27042in]{figures/image5.png} + \caption{前后桥同向转向模式} + \label{fig:2-3} +\end{figure} + +\section{速度、转角与曲率约束建模} + +运动学模型给出了系统状态演化规律,但在实际推引作业中,车辆运动必须满足结构约束与运行约束。因此,需要进一步建立输入与状态约束。 + +\subsection{速度约束} + +牵引车在机场作业环境中通常处于低速运行状态,故其线速度应满足\(0 \leq v \leq v_{\max}\) +。 + +其中,\(v_{\max}\) +为车辆允许的最大作业速度。该约束保证车辆在接近、对接和牵引过程中具有足够的可控性,同时减小碰撞风险。 + +\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) + +其中,\(\delta_{f,\max}\) 与 +\(\delta_{r,\max}\)分别为前桥与后桥最大允许转角。该约束直接限制车辆最大可实现曲率,也是最小转弯半径存在下界的原因。 + +\subsection{曲率约束} + +由转向角约束可进一步得到曲率约束\(\mid \kappa \mid \leq \kappa_{\max}\)。其中, + +\(\kappa_{\max} = \frac{tan\delta_{f,max} - tan( - \delta_{r,max})}{L}\) +(9) + +当车辆采用对称反向转向策略时,上式取到较大值。曲率约束在路径规划中具有重要作用,因为若规划轨迹的局部曲率超过车辆可实现上限,则该轨迹在物理上不可执行\textsuperscript{[20-21,28]}。 + +\section{车辆动力学简化与驱动关系} + +本课题以低速自主牵引控制为研究重点,后续控制层主要关注位姿演化与轨迹误差收敛,因此在第二章中不引入完整轮胎力学模型,而仅保留纵向驱动的简化动力学关系\textsuperscript{[19]}。设车辆等效质量为 +\(m\),驱动力为 \(F\),纵向加速度为 \(a\),则有\(F = ma\) +;若用速度导数表示,则有\(a = \dot{v}\)。\( +\) 从而可得 + +\begin{equation} +F = m\dot{v}\ \ +\tag{10} +\label{eq:10} +\end{equation} + +上述表达式的意义在于建立控制输入与速度变化之间的基本联系。式中,\(F\) +不再作为独立控制量直接参与路径规划,而是通过车轮速度控制器间接实现。对本课题而言,该简化处理已经足以支撑Gazebo中的低速驱动仿真;若后续需要研究载荷变化、附着系数变化或高精度制动响应,再在此基础上扩展更高阶动力学模型即可。 + +\section{状态方程统一表达} + +综合车辆位姿状态、双桥转向输入与速度演化关系,可将系统模型统一表示为非线性状态方程\(\dot{\mathbf{x}} = f(\mathbf{x},\mathbf{u})\)。其中,\(\mathbf{x} = \begin{bmatrix} +x & y & \theta & v +\end{bmatrix}^{T}\),\(\mathbf{u} = \begin{bmatrix} +v & \delta_{f} & \delta_{r} +\end{bmatrix}^{T}\)或\(\mathbf{u} = \begin{bmatrix} +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) + +若进一步考虑纵向加速度,则可扩展为 + +\(\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) + +后一形式更适合用于模型预测控制、轨迹平滑优化及速度规划问题,而前三维形式更适合用于基本路径跟踪与状态传播计算。考虑到本课题当前阶段主要完成仿真验证与控制策略设计,后续章节可根据算法需求在两种表达之间进行选取。 + +\section{仿真实现中的参数映射关系} + +在ROS-Gazebo联合仿真中,理论模型并非直接以连续方程形式运行,而是通过URDF关节、控制器与话题通信进行离散实现\textsuperscript{[11-16]}。为保证理论模型与仿真实体一致,需要建立控制量到仿真执行量之间的映射关系。 + +首先,前桥转角 \(\delta_{f}\)与后桥转角 +\(\delta_{r}\)分别对应转向关节的位置控制输入,其本质为关节目标角度;其次,车辆线速度 +\(v\)需要映射为车轮角速度命令。设车轮半径为 \(r_{w}\),则车轮角速度 +\(\omega_{w}\)与车辆线速度之间满足 + +\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) + +其中,\(\omega_{fl},\omega_{fr},\omega_{rl},\omega_{rr}\) +分别表示四个车轮的角速度。该关系建立了车辆运动学速度与Gazebo关节控制量之间的直接映射,是仿真中实现``给定线速度---车辆前进''行为的基础。 + +此外,为减小仿真过程中车辆初始松垮、溜车和转向漂移等现象,通常需要在关节层引入阻尼与摩擦参数\textsuperscript{[13-14,16]}。若转向关节阻尼系数记为 +\(c_{d}\),摩擦系数记为 +\(c_{f}\),则其作用在于抑制关节自由振荡和无控制输入下的残余摆动。虽然这些参数不显式写入上述运动学方程,但它们决定了仿真模型是否能够稳定呈现理论轨迹。因此,第二章中的理论建模与仿真实现并不是相互割裂的,而是通过参数映射与控制接口紧密关联。 + +\section{本章小结} + +本章针对机场飞机自动牵引场景,建立了双桥转向牵引车的平面运动学模型。首先,通过坐标系定义与状态变量选取,给出了车辆位姿与控制输入的统一描述;其次,在纯滚动与低速假设下,建立了车辆非完整约束条件,并推导了双桥转向工况下的状态方程、转弯半径表达式与曲率模型;随后,结合前桥单独转向、前后桥反向转向和同向转向三种典型模式,分析了不同转向策略对车辆机动能力的影响;最后,引入速度、转角与曲率约束,并说明了理论模型在ROS-Gazebo环境中的参数映射方式。 + +本章所建立的模型为后续自动接近控制、路径规划与仿真实验设计提供了统一的数学基础。与普通道路车辆模型相比,该模型能够更准确反映双桥转向牵引车在狭窄机场作业空间中的运动特性,因此更适用于飞机自动对接与牵引任务的研究。 diff --git a/co/undergraduate/content/chapter3.tex b/co/undergraduate/content/chapter3.tex new file mode 100644 index 00000000..70482edc --- /dev/null +++ b/co/undergraduate/content/chapter3.tex @@ -0,0 +1,515 @@ +%!TEX root = ../hutbthesis_main.tex +\chapter{基于飞机辅助感知的自动接近与对接控制方法} + +\section{感知任务分析与总体方案设计} + +在机场飞机自动牵引作业过程中,牵引车能否安全、准确地完成对接,不仅取决于车辆本体的运动控制能力,还取决于其对目标飞机及作业环境的感知能力。特别是在接近飞机前起落架并执行最终对接时,系统需要同时解决目标身份确认、目标位置识别、姿态估计及近距离安全态势判断等问题。因此,感知系统是实现自动牵引作业闭环控制的关键组成部分\textsuperscript{[18,29-30]}。 + +结合本课题的研究目标与仿真实现条件,本文引入飞机辅助感知方案,即在飞机前起落架区域设置可识别的特征标识,通过牵引车搭载的视觉与近距离传感器完成目标识别与态势获取。该方案的核心思想是:将原本难以直接观测、难以稳定识别的前起落架对接区域,转化为具有明确标志特征和身份属性的感知目标,使牵引车能够在接近过程中实现``先确认、后接近、再对准''的分阶段感知决策\textsuperscript{[29-30]}。 + +与传统依赖人工目视判断的作业方式相比,该方案具有以下特点:其一,能够为牵引车提供明确的目标身份信息,避免牵引对象识别错误;其二,能够在接近过程中持续提供目标相对位置与姿态信息,为控制器提供实时反馈;其三,能够将飞机对接区域的局部环境显式化,使碰撞风险、偏航误差和横向偏差能够被量化描述。 + +因此,飞机辅助感知并不是单纯的``加一个二维码''或``加一个标签'',而是将目标飞机前起落架区域设计为牵引系统可识别、可验证、可跟踪的感知节点,从而为后续自动控制提供稳定的先验信息和观测依据。 + +基于上述分析,本文构建的感知总体方案由三部分组成:\\ +第一部分为目标身份确认模块,用于确认当前牵引任务对应的飞机对象是否与预设目标一致; + +第二部分为相对位姿感知模块,用于估计牵引车与飞机前起落架之间的相对距离、横向偏差和姿态偏差; + +第三部分为近距态势判断模块,用于在对接过程中识别安全边界、碰撞风险与姿态偏离程度,并向控制层输出约束信息。 + +从系统结构上看,该方案形成了由``飞机端目标标识---牵引车端感知模块---控制决策节点''构成的信息链路。飞机前起落架不再只是被动的对接对象,而是成为局部识别信息载体;牵引车通过传感器采集这些信息,再将其转换为控制层能够使用的状态量。这样一来,第二章中的车辆运动学模型与本章中的感知输出自然衔接:前者解决牵引车如何运动,后者解决车辆如何获得目标、误差和停车依据。 + +\section{飞机辅助感知目标与识别信息设计} + +为使牵引车能够稳定获取飞机前起落架区域的目标信息,本文将飞机辅助感知对象限定为前起落架附近的局部功能区域,并对该区域引入结构化识别信息。该识别信息并不改变飞机本体的运动学特性,而是作为一种面向自动牵引任务的感知标识,用于提升牵引车对目标区域的可识别性与可确认性。 + +具体而言,本文在飞机前起落架区域设置特殊识别码,用以表征以下信息:\\ +(1)目标飞机身份编号;\\ +(2)对接区域中心参考位置;\\ +(3)局部方向参考特征;\\ +(4)用于视觉识别的几何轮廓特征。 + +上述信息在仿真环境中可通过纹理标识、平面标记、特征板或特定图案实现,其本质是为牵引车提供一个稳定的局部观测基准\textsuperscript{[29-30]}。与仅依赖起落架自然外形特征相比,这种方式具有识别特征清晰、误识别率低、对光照与视角变化更鲁棒等优点\textsuperscript{[30]}。 + +在功能上,该识别码作用是身份确认作用。牵引车在进入接近区域后,首先应判断当前视野中的目标是否为任务指定飞机,防止在多机位、多目标环境中出现识别混淆。使牵引车能够从图像观测中计算出目标中心偏移量与方向偏差,从而将视觉结果映射为控制器可直接使用的误差信号。进而实现课题上对``车机互动''的指标要求。 + +为了表述方便,设飞机辅助感知标识的中心点在飞机局部坐标系中的位置为 +\(P_{a}\),其在牵引车传感器坐标系中的观测位置为 +\(P_{s}\)。则通过图像解算或传感器映射后,可得到牵引车与目标之间的相对位置关系。若进一步以对接目标中心作为参考点,则可将识别码的中心点看作前起落架对接区域的等效特征点,后续所有相对偏差计算均围绕该特征点展开。这样做的目的在于将复杂的机械接触区域抽象为一个可观测、可追踪、可控制的数学目标,从而显著降低系统的感知复杂度。 + +\section{感知系统组成与传感器配置} + +结合本课题当前的仿真实现路线,牵引车感知系统采用``视觉识别为主、近距测量为辅''的配置方式。其中,视觉传感器主要负责飞机辅助感知标识的检测与识别,激光雷达或近距传感器主要负责障碍物检测、距离补偿和安全边界判断。该配置既符合现有ROS-Gazebo仿真平台的实现条件,也能够较好覆盖自动接近与对接阶段的主要感知需求。 + +\subsection{视觉识别模块} + +视觉识别模块安装于牵引车前部,主要面向飞机前起落架区域进行图像采集。其核心任务包括: + +(1)检测比对目标识别码;\\ (2)提取目标区域方向特征;\\ (3)输出目标身份确认结果。 + +在实际实现中,该模块可基于深度相机或RGB相机完成\textsuperscript{[29]}。如果采用深度视觉相机,则除可获取二维图像信息外,还可同步获得目标区域的深度信息,有助于提升相对距离估计精度。鉴于本课题当前重点为仿真验证与控制逻辑建立,本文将视觉模块的功能重点放在``目标检测+中心定位+方向识别''三个方面,而不展开复杂的深度神经网络识别框架\textsuperscript{[29-30]}。 + +\subsection{近距测量模块} + +近距测量模块用于补充视觉感知在近距离工况下的局部测量能力。由于牵引车在最终对接阶段距离飞机前起落架较近,此时即使视觉系统能够识别目标,也可能受到视角遮挡、自动对焦的影响。因此,有必要引入激光雷达、超声或等效测距模块,对前方局部区域的距离边界进行测量,以作为视觉估计的校核或补充\textsuperscript{[18]}。 + +该模块的主要作用包括:\\ (1)判断牵引车前端与飞机局部结构之间的最近距离;\\ (2)检测非目标障碍物是否进入安全边界;\\ (3)在最终接近阶段为停车判定提供阈值依据。 + +通过视觉与近距测量的组合,牵引车能够在不同距离区间内采用不同感知主导方式:中远距离阶段以视觉为主,近距离阶段以视觉与测距联合判断为主,从而提升系统整体鲁棒性。 + +\section{目标身份确认模型} + +目标身份确认是自动牵引作业的首要感知任务。只有在确认当前目标为预定飞机对象之后,牵引车才应进入自动接近与对接控制阶段。否则,即使轨迹控制精度足够高,也可能因目标对象错误而导致整个作业任务失败。 + +设任务调度系统下发的目标飞机身份编码为 +\(I_{t}\),牵引车视觉模块从识别码中解算得到的观测身份编码为 +\(I_{o}\)。则目标身份确认条件可表示为 + +\begin{equation} +I_{o} = I_{t} +\tag{15} +\label{eq:15} +\end{equation} + +当上式成立时,判定目标身份匹配;当上式不成立时,系统应保持等待状态、重新识别或发出异常警告,而不应直接进入对接控制流程。 + +上述表达式的物理含义非常明确:它并不是一个几何模型,而是一个任务逻辑判定模型。其作用在于建立从``任务分配''到``目标确认''的第一道闭环。对于机坪多机位、多牵引任务并行的应用场景而言,这一步尤其重要。若无身份确认过程,系统只能依赖``看见一个起落架就去接近''的局部策略,这在真实机场环境中是不可靠的。 + +进一步地,考虑到识别系统存在误检、漏检或图像丢失的情况,可引入确认置信度 +\(C_{I}\),并设置确认阈值 +\(C_{\min}\)。则身份确认判据可扩展为\(C_{I} \geq C_{\min}\) +\textsuperscript{[18,30]}。\( +\) +该式表示:只有当识别结果的置信度高于设定阈值时,系统才认为目标身份识别有效。尽管在当前论文阶段可以不深入展开具体置信度计算方法,但在表述上引入这一概念,有助于增强论文在工程实现层面的严谨性。 + +\section{相对位姿感知模型} + +在完成目标身份确认后,牵引车还需进一步获取自身与飞机前起落架区域之间的相对几何关系。自动接近与对接控制的本质,并不是让牵引车``接近某个图像目标'',而是让其在物理空间中逐渐消除相对位置误差与方向误差。因此,感知系统必须将图像信息转化为可用于控制的相对位姿量\textsuperscript{[18,29-30]}。 + +为此,定义牵引车参考点为 \(P_{v}\),飞机辅助感知目标中心为 +\(P_{a}\),则两者之间的相对位置误差向量可表示为 + +\(\mathbf{e}_{p} = \left\lbrack \begin{array}{r} +e_{x} \\ +e_{y} +\end{array} \right\rbrack\ \ \ \) (16) + +其中,\(e_{x}\) 表示沿牵引车纵向方向的距离误差,\(e_{y}\) +表示沿牵引车横向方向的偏移误差。若从控制意义出发,\(e_{x}\) +主要决定前进或减速行为,\(e_{y}\) 主要决定转向修正行为。 + +同时,定义飞机辅助感知目标区域的参考方向角为 +\(\theta_{a}\),牵引车当前航向角为 +\(\theta_{v}\),则相对姿态误差可表示为 + +\begin{equation} +e_{\theta} = \theta_{a} - \theta_{v} +\tag{17} +\label{eq:17} +\end{equation} + +该式表示牵引车当前朝向与目标对接方向之间的夹角偏差。其物理意义在于:即使车辆已经接近目标中心区域,如果 +\(e_{\theta}\)仍较大,则机械对接过程仍可能失败。因此,在最终对接阶段,姿态误差控制通常与横向误差控制具有同等重要性。 + +综合来看,牵引车在自动接近过程中需要实时感知的核心状态量可归纳为 + +\(\mathbf{z} = \begin{bmatrix} +e_{x} & e_{y} & e_{\theta} +\end{bmatrix}^{T}\) (18) + +该状态向量构成本章感知环节向控制环节输出的核心接口。换言之,感知层的任务不是直接控制车辆,而是持续向控制层提供``还差多远、偏了多少、方向还差多少''的量化描述。 + +\section{近距离态势感知与安全判定} + +当牵引车进入飞机前起落架附近的近距离区域后,系统感知重点将从``识别并接近目标''转向``评估局部态势并安全完成对接''。在这一阶段,局部环境中的安全边界、机械接触风险与障碍物侵入风险将显著上升,因此有必要建立近距离态势判断机制。设牵引车前部关键点到飞机局部结构的最小距离为 +\(d_{\min}\),系统设定的安全阈值为 +\(d_{s}\)。则基本安全约束可写为\(d_{\min} \geq d_{s}\) 。\( +\) +该式的含义是:在非接触阶段,牵引车与飞机局部结构之间必须始终保持不小于安全阈值的距离,以防止由于感知误差或控制滞后导致提前碰撞\textsuperscript{[5,18]}。 + +对于最终对接阶段,还可设置停车触发阈值 +\(d_{t}\)。当系统判定牵引车与目标对接位置之间的剩余距离满足\(e_{x} \leq d_{t}\) +。\( +\) +且同时满足横向误差与姿态误差均处于允许范围内时,系统可进入停止或低速微调状态。设横向误差允许阈值为 +\(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) + +这组三重约束共同定义了自动对接的局部成功条件。只有当纵向距离足够接近、横向偏差足够小且方向偏差足够小时,系统才可判定当前已具备机械对接条件。由此可见,近距态势感知并非孤立地``测个距离'',而是要将距离信息、位置误差和姿态误差统一纳入同一判定框架中。 + +\section{感知流程设计} + +结合上述模型,本文将飞机辅助感知系统的工作流程划分为以下步骤: + +(1)牵引车进入任务区域后,启动视觉识别模块,对前方目标进行搜索;\\ +(2)检测到飞机辅助感知识别码后,解析目标身份信息,并与任务目标编号进行匹配;\\ +(3)若身份匹配成功,则提取目标中心点和方向参考特征,计算相对位置误差与姿态误差;\\ +(4)结合近距测量模块输出,对当前局部安全状态进行判断;\\ +(5)将 \(e_{x}\)、\(e_{y}\)、\(e_{\theta}\) +及安全边界状态发送给控制模块,驱动牵引车完成接近与对准;\\ +(6)当对接有效条件满足后,系统进入低速停止或机械连接准备状态。 + +上述流程体现了``目标确认---误差提取---安全判定---控制反馈''的感知闭环逻辑。与传统单纯依赖图像中心偏差的视觉伺服方法相比,该流程更适合机场牵引这种高安全要求、低速精对位作业任务,因为其将身份确认与近距安全判断一并纳入感知体系,使系统具有更完整的任务语义理解能力。 + +\section{控制任务描述与总体思路} + +在完成第二章牵引车运动学建模以及前文飞机辅助感知方案设计后,系统已经具备了两类基础:其一,双桥转向牵引车的平面运动规律可以用数学模型表示;其二,飞机前起落架区域能够向牵引车提供身份确认结果以及相对位置、相对姿态等感知信息。在此基础上,本节进一步研究牵引车如何利用这些信息完成自动接近与最终对接控制。 + +从实际作业过程看,牵引车对接飞机前起落架并不是一次性完成的单步动作,而是一个具有明显阶段特征的连续过程。牵引车首先需要确认当前目标是否为任务指定飞机;在确认目标有效后,车辆应由较远位置向飞机前起落架方向稳定接近;当进入近距离区域后,系统控制重点应从``尽快接近目标''转变为``尽快减小横向偏差和姿态偏差'';在最后的微动阶段,车辆需要以极低速度缓慢推进,并在满足安全距离和几何对准条件时稳定停车。因此,自动对接控制的本质不是简单的路径跟踪,而是一个包含任务逻辑、局部轨迹生成、误差反馈控制和终端停车判定的分层闭环控制问题\textsuperscript{[25,27-28]}。 + +为此,本文采用``模式管理---局部规划---误差反馈---执行器映射''的分层控制方法。其基本思想是:由感知系统实时提供牵引车与飞机辅助感知目标之间的相对误差;由上层逻辑根据当前距离、障碍物情况和识别有效性确定控制模式;由局部规划器生成短时域可行参考轨迹;再由下层控制器根据相对位姿误差计算期望速度和期望转向需求,并进一步映射为前后桥转角与车轮速度命令。该方法既能够保证控制结构清晰,也便于在ROS与Gazebo环境中分模块实现\textsuperscript{[11-16]}。 + +\section{状态变量、控制输入与误差定义} + +\subsection{车辆状态与控制输入} + +依据第二章建立的车辆模型,定义牵引车状态向量为 + +\(\mathbf{x} = \begin{bmatrix} +x & y & \theta & v +\end{bmatrix}^{T}\) (20) + +其中,\(x\) 与 \(y\)表示牵引车参考点在全局坐标系中的位置坐标,\(\theta\) +表示车辆航向角,\(v\) 表示车辆纵向线速度。 + +双桥转向牵引车的控制输入定义为 + +\(\mathbf{u} = \begin{bmatrix} +v & \delta_{f} & \delta_{r} +\end{bmatrix}^{T}\) (21) + +或扩展为 + +\(\mathbf{u} = \begin{bmatrix} +a & \delta_{f} & \delta_{r} +\end{bmatrix}^{T}\) (22) + +其中,\(\delta_{f}\) 与 \(\delta_{r}\)分别为前桥和后桥转角,\(a\) +为车辆纵向加速度。前一种形式适用于直接速度控制实现,后一种形式更适合做速度平滑约束或模型预测控制扩展。 + +\subsection{感知误差接口} + +前文已经将飞机辅助感知结果统一表示为相对误差向量\(\mathbf{z} = \begin{bmatrix} +e_{x} & e_{y} & e_{\theta} +\end{bmatrix}^{T}\) +\(\ \)------\(e_{x}\)表示牵引车与目标区域之间的纵向距离误差; +\(e_{y}\)表示牵引车相对于目标轴线的横向偏差; +\(e_{\theta}\)表示牵引车当前朝向与目标参考方向之间的姿态误差。 + +在控制意义上,\(e_{x}\) 主要决定车辆应继续前进多少距离,\(e_{y}\) +主要决定车辆应向哪一侧修正,\(e_{\theta}\) +则决定车辆当前朝向是否已经满足对接要求。三者共同构成牵引车自动接近和对准控制的核心反馈量。 + +\section{对接过程分析与分层控制架构} + +\subsection{对接过程分阶段描述} + +为了使控制方法与真实作业过程保持一致,本文将牵引车自动对接过程划分为以下五个阶段。 + +(1)搜索与等待阶段 + +牵引车进入任务区域后,首先由视觉模块搜索飞机前起落架区域的特殊识别码,并与任务编号进行匹配。若当前识别结果与任务目标不一致,或者识别置信度低于阈值,则系统保持等待状态,不进入自动接近控制。此时输出为零速度、零转角保持命令,以防止误接近。 + +(2)自动接近阶段 + +当目标身份确认有效后,系统开始进入自动接近阶段。该阶段的主要目标是让牵引车从较远初始位置稳定接近飞机前起落架前方的预对接区域。此时控制重点不在于最终精确对位,而在于快速减小纵向距离,同时保持可接受的横向误差和姿态误差。 + +(3)姿态对准阶段 + +当牵引车与目标之间的纵向距离降低到一定阈值后,系统切换到姿态对准阶段。该阶段中,车辆不再追求较高接近速度,而是优先减小横向误差 +\(e_{y}\)和姿态误差 +\(e_{\theta}\),使牵引车中心线逐步与飞机前起落架对接方向重合。 + +(4)微动对接阶段 + +当姿态误差和横向误差已经较小,且车辆进入最终接近区域后,系统进入微动对接阶段。此时车辆以低速蠕动方式向前推进,控制重点从``大范围修正''转为``小范围精调'',避免出现冲撞、擦碰或越位现象。 + +(5)停车保持阶段 + +当牵引车与目标区域之间的纵向、横向和姿态误差同时满足终端条件,且安全距离约束有效时,系统进入停车保持阶段。此时发布零速度命令,并将前后桥转角回中,保持车辆稳定等待后续机械连接或任务切换。 + +\subsection{分层控制架构} + +根据上述阶段分析,本文建立的分层控制架构如图3-1所示。 + +这种架构的优点在于:可以把任务逻辑与连续控制分离,从而降低算法复杂度,并且更加符合ROS节点化实现习惯。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=3.09407in,height=4.63924in]{figures/image6.png} + \caption{分层控制架构} + \label{fig:3-1} +\end{figure} + +\section{误差动力学模型建立} + +为了构造适用于对接过程的控制律,需要首先建立牵引车相对于参考轨迹或参考目标点的误差动力学模型。 + +设局部参考状态为\(\mathbf{q}_{r} = \begin{bmatrix} +x_{r} & y_{r} & \theta_{r} +\end{bmatrix}^{T}\)。 + +其中,\(\left( x_{r},y_{r} \right)\) 为局部参考点位置,\(\theta_{r}\) +为参考航向。进一步定义参考速度和参考角速度分别为 \(v_{r}\)与 +\(\omega_{r}\)。 + +将全局位置误差变换到车体坐标系,可以得到 + +\(\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) + +该式的作用是把全局误差转化为车体系误差,使纵向和横向误差具有明确物理意义。其中,\(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{enumerate} +\def\labelenumi{\arabic{enumi}.} +\item + 纵向误差 \(e_{x}\)的变化不仅与前进速度 + \(v\)有关,还受姿态误差和横向运动耦合影响; +\item + 横向误差 \(e_{y}\)的变化主要由角速度控制; +\item + 姿态误差 \(e_{\theta}\)的变化取决于参考角速度与实际角速度的差异。 +\end{enumerate} + +这说明自动对接控制本质上是一个非线性耦合误差调节问题,不能简单把纵向和横向完全独立看待\textsuperscript{[19,27-28]}。 + +\textbf{3.12 局部参考轨迹生成方法} + +\subsection{预对接点与对接点构造} + +为了避免车辆直接朝最终机械连接位置冲击,本文采用两级目标点设计,即``预对接点''和``对接点''。 + +设飞机辅助感知系统给出的目标中心点为 + +\(\mathbf{p}_{a} = \left\lbrack \begin{array}{r} +x_{a} \\ +y_{a} +\end{array} \right\rbrack\) (25) + +目标方向为 \(\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) + +\(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) + +\(d_{hook}\) +为机械连接前的停车距离。该点用于微动对接阶段的最终停靠。如果牵引车从较远位置直接朝最终对接点收敛,往往会导致中后段横向修正不足或姿态调节过猛;引入预对接点后,车辆可以先对准姿态,再进行最后的缓慢接近\textsuperscript{[20-21,26-28]}。 + +\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) + +其中:\(v_{stage}\)为当前控制模式允许的最大速度; +\(a_{y,\max}\)为允许的最大横向加速度; \(\kappa_{r}\)为参考轨迹曲率; +\(d_{\min}\)为前方最近障碍距离; \(d_{s}\)为安全距离阈值; +\(k_{d}\)为距离---速度缩放系数\textsuperscript{[25,27-28]}。 + +\section{误差反馈控制律设计} + +\subsection{纵向速度控制律} + +纵向控制律设计为 + +\(v_{d} = {sat}_{\left\lbrack 0,v_{\max} \right\rbrack}\left( v_{r}cose_{\theta} + k_{x}e_{x} \right)\) +(29) + +其中,\(k_{x}\) 为纵向误差增益,\(sat\) 表示饱和函数。 + +该控制律由两部分组成:\(v_{r}\cos e_{\theta}\):表示当车辆姿态误差较大时,自动减小前进速度,防止车辆在未对准状态下强行推进; +\(k_{x}e_{x}\):表示根据纵向误差大小补偿推进速度,使车辆逐步靠近目标。 + +这种设计符合车辆对接实际过程:距离远时可较快前进;姿态偏差大时必须主动减速\textsuperscript{[19]}。 + +\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) + +其中,\(k_{y}\) 和 +\(k_{\theta}\)分别为横向误差增益和姿态误差增益。该控制律的物理意义如下\textsuperscript{[17,26-28]}: + +\(\omega_{r}\):参考轨迹自身的前馈角速度,用于保证车辆沿局部参考曲线运行; + +\(v_{r}k_{y}e_{y}\):根据横向偏差调节转向,使车辆向目标轴线靠拢; + +\(v_{r}k_{\theta}\sin e_{\theta}\):根据姿态误差修正车辆方向。 + +之所以采用 \(\sin e_{\theta}\)而不是直接用 +\(e_{\theta}\),是因为前者在大角度误差情况下更平滑,且在小角度时近似等于 +\(e_{\theta}\),便于后续稳定性分析。 + +\subsection{对接过程中的控制行为分析} + +结合车辆对接全过程,上述控制律在不同阶段表现如下: + +\begin{quote} +(1)自动接近阶段:\\ +此时 \(e_{x}\)较大,速度项 +\(k_{x}e_{x}\)占主导,车辆以较快速度向预对接点推进。 +\end{quote} + +(2)姿态对准阶段\\ +随着 \(e_{x}\)逐步减小,横向误差 \(e_{y}\)和姿态误差 +\(e_{\theta}\)开始主导控制器输出,角速度命令增大,车辆重点完成方向修正。 + +(3)微动对接阶段\\ +此时 +\(v_{r}\)已被速度调度压低,车辆角速度输出较平缓,控制器主要进行细小偏差修正,避免出现末端振荡。 + +因此,这组控制律不仅在数学上闭合,而且在物理意义上能够与整个对接过程自然对应。 + +\section{四轮转向映射与约束处理} + +\subsection{曲率计算} + +由期望线速度和角速度得到期望曲率 + +\begin{equation} +\kappa_{d} = \frac{\omega_{d}}{max(v_{d},\varepsilon_{v})} +\tag{31} +\label{eq:31} +\end{equation} + +其中, \(\varepsilon_{v}\)为防止低速时分母趋近于零的安全常数。 + +\subsection{双桥反向转向模式} + +在自动接近阶段,如果需要较大机动能力,则采用双桥反向转向模式\textsuperscript{[19,28]}: + +\(\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) + +该模式可以显著减小等效转弯半径,适合从较远位置快速接近飞机前起落架区域。 + +\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) + +该模式虽然机动性不如双桥反向转向,但执行器协调更简单,转向响应更平顺,适合最终精调。 + +\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) + +同时对速度变化率和转角变化率限制为 + +\(\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) + +这样可以避免由于离散控制导致的命令突变,从而减小Gazebo中常见的抖振与过冲现象。 + +\section{终端停车判定与模式切换} + +\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) + +将其定义为终端停车集合 + +\(\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) + +与单纯依靠纵向距离判定停车不同,这种集合式判定可以避免``距离够近但方向没对准''的错误停车问题。 + +\subsection{模式切换规则} + +系统模式切换规则如下: + +搜索-自动接近:识别码身份确认成功且置信度满足阈值; + +自动接近-姿态对准:\(e_{x}\) 进入近距阈值; + +姿态对准-微动对接:\(e_{x}\) 足够小且 \(e_{\theta}\)已较小; + +任意模式-中止:目标丢失或最近距离低于中止阈值; + +微动对接-停车保持:进入终端集合 \(\Omega_{t}\)。 + +这意味着控制系统并不是依赖一条连续控制律从头走到尾,而是通过``阶段切换 + +连续控制''的混合方式实现更符合工程需求的动作组织。 + +\section{控制算法主流程} + +图3-2给出自动接近与对接控制算法主流程。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=2.72233in,height=4.05695in]{figures/image7.png} + \caption{全过程算法流程图} + \label{fig:3-2} +\end{figure} + +\section{本章小结} + +本章将原有飞机辅助感知与自动接近控制内容整合为同一技术链路。首先,围绕飞机前起落架对接区域设计了目标标识、视觉识别和近距测量方案,并给出了目标身份确认、相对位姿误差和安全边界判定方法;其次,在第二章双桥转向运动学模型基础上,建立了车体系误差动力学模型,设计了预对接点、对接点、速度调度、误差反馈控制和四轮转向映射方法;最后,通过终端停车集合与模式切换规则,将目标确认、接近、姿态对准、微动对接和停车保持组织为完整闭环。 + +与单纯的路径跟踪控制相比,本章方法更加贴合机场低速高精度对接工况,能够把目标身份确认、局部态势感知、轨迹可行性、误差收敛性和停车安全性放在同一控制框架中,为后续仿真实验与系统实现提供算法基础。 diff --git a/co/undergraduate/content/chapter4.tex b/co/undergraduate/content/chapter4.tex new file mode 100644 index 00000000..b74c9cb3 --- /dev/null +++ b/co/undergraduate/content/chapter4.tex @@ -0,0 +1,384 @@ +%!TEX root = ../hutbthesis_main.tex +\chapter{仿真系统构建与实现} + +\section{系统总体架构与软硬件环境} + +仿真平台由五个层次组成:Ubuntu 18.04 提供系统运行基础;ROS Noetic +提供节点通信、参数服务器、TF 与消息系统;Gazebo 11 +提供刚体动力学、碰撞、接触与传感器仿真;gazebo\_ros\_pkgs~和~gazebo\_ros\_control~将 +Gazebo 的模型、传感器与控制接口映射到 +ROS;项目自定义节点完成飞机辅助感知、局部规划、牵引对接控制与任务调度\textsuperscript{[11-13,16]}。Gazebo +官方 ROS 教程明确指出,gazebo\_ros\_pkgs~负责 ROS 与 Gazebo +的接口层,而~gazebo\_ros\_control~通过解析 URDF +中的~\textless transmission\textgreater~与插件配置,实现对仿真关节的 +controllers 接入\textsuperscript{[13,16]}。 + +在实际工程目录上,采用四包式组织方式:tug\_description~保存 +xacro/URDF、网格模型与材料;tug\_gazebo~保存 world、spawn +与传感器插件;tug\_control~保存控制器参数、接口桥接与控制节点;tug\_bringup~保存联调 +launch 文件。 + +Gazebo +的~roslaunch~教程还给出了较为稳定的包层级约定,即~MYROBOT\_description/urdf、MYROBOT\_gazebo/worlds~与~MYROBOT\_gazebo/launch~的分离组织,这一约定适合本课题的工程化管理\textsuperscript{[11-16]}。 + +下表给出本文采用的基准软件栈。(表4-1) + +\textbf{表4-1 基准软件栈} + +\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}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +组件 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +版本/状态 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +用途 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +Ubuntu & 18.04 LTS & 主机操作系统 \\ +ROS & Noetic Ninjemys & 节点通信、参数、消息、TF \\ +Gazebo & 11 & 刚体动力学、传感器与场景仿真 \\ +gazebo\_ros\_pkgs & Noetic 对应发行 & Gazebo 与 ROS 接口桥 \\ +gazebo\_ros\_control & Noetic 对应发行 & ros\_control 接入 Gazebo \\ +ros\_control & ROS 1 经典控制框架 & 控制器抽象与管理 \\ +robot\_state\_publisher & Noetic 对应发行 & 根据 URDF ++~joint\_states发布 TF \\ +tf2\_ros & Noetic 对应发行 & 坐标变换管理 \\ +xacro & Noetic 对应发行 & 宏化 URDF 生成 \\ +image\_pipeline & Noetic 对应发行 & 相机标定与图像处理链 \\ +OpenCV & ROS Noetic 兼容版本 & 飞机辅助感知标识识别 \\ +\end{longtable} + +如下系统架构图适合在论文中绘制为 PNG 或 SVG,用于说明 ROS/Gazebo +联合仿真的模块层级关系。其图元关系与 Gazebo ROS +插件、ros\_control~和~robot\_state\_publisher~的官方工作方式一致。 + +\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]}。 + +对于双桥转向牵引车,面向第三章算法实现,推荐将车体模型拆分为以下 +link:、base\_link、front\_ateer、back\_steer、四个车轮 link、相机 +link、深度相机 link、激光雷达 link,以及飞机辅助感知所需的可视化或调试 +link。关节层面至少需要:前桥转向关节、后桥转向关节、四个轮子的转动关节,以及各传感器与车体的固定关节。该拆分方式既符合 +URDF +树结构,也便于单独对前后桥转向与轮速控制器建模\textsuperscript{[14,16]}。 + +车辆基础仿真与机械模型都基于SOLIDWORKS实现。考虑到ROS与Gazebo在虚拟机环境下性能受限的影响,将模型分为两种建立------仿真模型与机械模型。其中仿真面向基本运行逻辑的测试与较为极端的算法测试,保证项目推进速度的同时最大程度降低硬件成本。其结构较为简单,隐藏了不必要的机械结构部分,只保留最基础的车辆外形与少量运动模块;机械模型是最终提交到现实生产的版本,其结构更为复杂,相比仿真模型要考虑更多的机械及电气布局。首篇幅限制,下面只给出仿真模型(图4-1) + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.97629in,height=3.08022in]{figures/image8.png} + \caption{模型图总览} + \label{fig:4-1} +\end{figure} + +模型设计完成后,需要对各个活动关节进行定义与功能区分。根据实际功能------continuous(关节持续转动)、fixed(关节固定)、revolute(关节有限制有角度旋转),对车轮、转向桥以及功能部件定义。下表给出面向论文复现的一组牵引车 +URDF +结构定义。表中``用途''与``建议参数''基于本项目双桥转向、小尺度机场地面车辆仿真的工程需求给出;若项目后续补充了 +CAD/BOM 或实测参数,应以实测量替换。(表4-2) + +\textbf{表4-2 车辆主要URDF结构定义} + +\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}}@{}} +\toprule\noalign{} +\begin{minipage}[b]{\linewidth}\raggedright +组件 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +类型 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +命名 +\end{minipage} & \begin{minipage}[b]{\linewidth}\raggedright +说明 +\end{minipage} \\ +\midrule\noalign{} +\endhead +\bottomrule\noalign{} +\endlastfoot +车体根坐标 & link & base\_link & 仅作平面参考,不带惯量 \\ +主车体 & link & base\_link & 车体惯量、碰撞主体 \\ +前桥 & link & front\_steer\_link & 前转向桥中间体 \\ +后桥 & link & back\_steer\_link & 后转向桥中间体 \\ +前桥转向 & revolute & front\_steer & 绕 z 轴转向 \\ +后桥转向 & revolute & rear\_steer & 绕 z 轴转向 \\ +相机 & fixed & front\_camera\_joint & 识别飞机辅助码主相机 \\ +深度相机 & fixed & depth\_camera\_joint & 近距深度感知 \\ +激光雷达 & 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{} + +\section{任务与模式管理} + +任务与模式管理器在整个控制系统中起着核心作用\textsuperscript{[25,28]}。该模块的主要任务是根据感知系统提供的信息(如目标身份确认、位姿识别结果、障碍物检测等),决定当前的控制模式。具体模式包括\textsuperscript{[5,7,28]}: + +搜索模式:当目标身份未确认时,系统处于搜索模式,牵引车保持静止或缓慢扫描。 + +自动接近模式:当目标身份确认并且距离较远时,系统启动自动接近模式,牵引车沿预设路径接近目标飞机。 + +姿态对准模式:当牵引车距离目标飞机较近时,系统切换到姿态对准模式,通过调整转向角度和速度逐步减少横向误差和姿态误差。 + +微动对接模式:在接近阶段,系统切换到微动对接模式,牵引车以非常低的速度精确接近并最终完成对接。 + +停车模式:当目标对接完成或无法继续推进时,系统进入停车模式,发布停车命令。 + +\section{系统全流程测试} + +为验证自动牵引对接系统在完整作业流程中的可行性与连续性,本文在ROS与Gazebo联合仿真环境中设计了自动牵引车全流程测试。测试过程按照机场地面牵引作业的基本逻辑展开,主要包括车辆前往飞行器区域、车辆对接飞行器、车辆推出飞行器、解除牵引以及车辆撤离五个阶段\textsuperscript{[5-7]}。通过该测试,可以较为直观地观察牵引车在不同作业阶段下的运动状态、姿态变化以及控制指令执行效果。 + +\paragraph{车辆前往飞行器区域} +测试开始,牵引车从模拟航站楼附近出发,根据地勤车辆道路向飞行器所在区域移动。在该阶段,系统主要完成车辆启动、路径跟踪和环境感知等任务。牵引车通过传感器获取周围环境信息,并结合控制算法调整自身速度与转向角,使车辆能够沿规划路径稳定行驶至飞行器附近。 + +在仿真过程中,车辆需要保持较低且平稳的行驶速度,避免因速度过高造成轨迹偏差或姿态调整不及时。当前往飞行器区域时,系统重点关注车辆行驶方向是否稳定、路径跟踪是否连续,以及车辆是否能够准确进入后续对接准备区域。(图4-2) + +\begin{figure}[htbp] + \centering + \includegraphics[width=3.94139in,height=1.88148in]{figures/image9.png} + \caption{车辆在航站楼下运行,前往目标飞行器} + \label{fig:4-2} +\end{figure} + +\paragraph{车辆对接飞行器} +当牵引车进入飞行器附近区域后,系统切换至对接控制阶段。该阶段的核心任务是使牵引车与飞行器牵引点逐步对准,并在满足位置和姿态要求的情况下完成接近动作。系统根据感知模块提供的飞行器相对位姿信息,计算牵引车与目标对接点之间的位置误差和航向误差,并通过控制算法修正车辆运动状态。(图4-3) + +在对接过程中,牵引车首先进入预对接位置,然后以低速向最终对接点靠近。相比普通路径跟踪阶段,对接阶段对控制精度和车辆稳定性要求更高,因此需要限制车辆速度,并使转向角变化更加平缓,避免出现车身摆动过大或对接偏差过大的情况。(图4-4) + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.42872in,height=2.49642in]{figures/image10.png} + \caption{尝试对接。此时车辆没有正对飞行器,正在通过蟹行平移进行调整} + \label{fig:4-3} +\end{figure} + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.57559in,height=2.01842in]{figures/image11.png} + \caption{对接成功,拖把末端固定装置放下。等待推出命令} + \label{fig:4-4} +\end{figure} + +该阶段主要验证牵引车是否能够根据飞行器目标位置完成姿态调整,并稳定接近指定对接点。 + +\paragraph{车辆推出飞行器} +完成对接后,系统进入飞行器推出阶段。此时牵引车与飞行器被视为一个整体运动系统,牵引车根据预设推出路径向指定方向行驶,将飞行器从停放区域推出至目标位置。在该阶段,牵引车需要保持稳定牵引状态,并避免转向过大导致飞行器姿态变化不平顺。 + +推出过程中,控制系统重点保证车辆速度平稳、转向连续,并使飞行器整体运动轨迹满足预设作业要求。由于推出阶段涉及车辆与飞行器之间的相对约束关系,因此相比单车行驶更需要关注运动过程的稳定性和路径偏差。(图4-5------图4-7) + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.50022in,height=1.95374in]{figures/image12.png} + \caption{飞行器被推出过程} + \label{fig:4-5} +\end{figure} + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.50145in,height=1.97in]{figures/image13.png} + \caption{飞行器被推出过程} + \label{fig:4-6} +\end{figure} + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.55202in,height=2.00583in]{figures/image14.png} + \caption{飞行器被推出过程} + \label{fig:4-7} +\end{figure} + +\paragraph{解除牵引} +当飞行器被推出至指定位置后,牵引车停止运动,并执行解除牵引动作。该阶段主要用于模拟实际机场作业中牵引车与飞行器之间的脱离过程。系统首先控制车辆减速至停止状态,随后解除与飞行器之间的连接关系,使飞行器保持在目标位置,牵引车进入独立运动状态。 + +解除牵引阶段的关键在于保证车辆停止平稳,避免因惯性造成飞行器位置偏移。同时,解除牵引后应确认飞行器姿态稳定,牵引车与飞行器之间保持安全距离,为后续车辆撤离提供空间。(图4-6) + +\begin{figure}[htbp] + \centering + \includegraphics[width=5.06721in,height=2.03762in]{figures/image15.png} + \caption{拖把解除,车辆倒退一部分距离等待飞行器报告} + \label{fig:4-8} +\end{figure} + +\paragraph{车辆撤离} +完成解除牵引后,牵引车按照预设撤离路径离开飞行器区域。撤离阶段主要验证牵引车在完成作业任务后能否安全驶离,并避免与飞行器或周围环境发生干涉。系统根据撤离方向控制车辆转向与速度,使其逐步远离飞行器,并回到指定待命区域或安全区域。 + +在该阶段,车辆应保持稳定行驶状态,转向过程应尽量平缓,避免因急转或急停影响仿真效果。车辆撤离后,整个自动牵引对接与推出流程结束。(图4-7) + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.97258in,height=2.28573in]{figures/image16.png} + \caption{车辆撤离} + \label{fig:4-9} +\end{figure} + +\section{本文方法与人工操作以及其它方法对比分析} + +为进一步说明本文所设计系统的特点,有必要将其与传统人工牵引方式、固定路径控制方式以及常见自动驾驶控制算法进行对比分析。 + +\subsection{与传统人工牵引方式的比较} + +传统机场牵引作业主要依靠驾驶员、地面指挥员以及现场协同人员完成。其优势在于人工判断灵活,能够根据飞机位置、现场障碍物和突发情况快速调整操作策略,因此在真实复杂环境中的适应性较强。但是,该方式也存在对人员经验依赖较大、操作标准不易统一、重复作业精度受人为因素影响等问题。 + +本文所提出的方法主要面向仿真环境下的自动化流程验证。相比人工牵引方式,本文方法的优势并不在于真实复杂环境中的经验判断能力,而在于能够将牵引作业过程转化为可建模、可重复、可分析的控制流程。通过ROS节点通信、Gazebo物理仿真、车辆运动控制和目标位姿误差反馈,可以较为清晰地表达车辆接近、对准、推出和撤离等动作过程。 + +从本项目实际测试过程来看,车辆模型在Gazebo中能够完成基本行驶、转向、刹停和回中等控制动作,并可通过脚本或控制节点实现分阶段作业流程。这说明本文方法在标准化仿真验证方面具有一定价值。下图给出了本文方法与其它方法的比较柱状图(图4-8)。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.48812in,height=2.8485in]{figures/image17.png} + \caption{本文方法与主流方法以及理论方法比较} + \label{fig:4-10} +\end{figure} + +\subsection{与固定路径或开环脚本控制方式的比较} + +相比与其它方式而言,最简单实现机场自动牵引驳接的方式是采用固定路径或开环脚本控制,即预先设定车辆的速度、转向角和运动时间,使车辆按照固定流程完成前进、转弯、倒车或停止等动作。但固定路径或开环控制的局限性也比较明显。由于其控制过程主要依赖预设时间和固定参数,当车辆初始位置、飞机停放位置或仿真环境发生变化时,车辆无法根据实际偏差自动修正运动状态。例如,在本项目调试过程中,车辆曾出现初始缓慢滑动、转向不完全回中、不同速度下运动效果不一致等现象,如果完全依靠固定脚本控制,容易造成路径偏差累积,影响后续对接效果。 + +本文方法在固定流程的基础上引入了相对位姿误差思想,将车辆与目标对接点之间的位置误差、横向误差和航向误差作为控制依据,并结合预对接点、最终对接点和分阶段模式切换来组织整个作业流程。因此,相较于单纯开环脚本,本文方法具有更强的闭环控制特征,能够更合理地描述自动牵引车在接近目标过程中的修正行为(图4-9)。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.22247in,height=2.14174in]{figures/image18.png} + \caption{几种方法对接过程中的横向误差收敛对比} + \label{fig:4-11} +\end{figure} + +\subsection{与常见路径跟踪算法的比较} + +在移动机器人和智能车辆研究中,常见路径跟踪方法包括PID控制、Pure +Pursuit算法、Stanley算法以及模型预测控制等。 + +PID控制结构简单、实现方便,适合速度控制、角度控制等单一变量调节。在本项目中,车辆的车轮速度控制器和转向关节控制器本身就需要依赖底层控制参数实现稳定执行。但如果仅采用简单PID完成整体对接任务,则难以同时处理车辆纵向距离、横向偏差和航向角误差之间的耦合关系。牵引车对接飞行器时不仅要``走到目标附近'',还要保证车身姿态与牵引点方向基本一致,因此单一PID控制难以完整表达对接过程。 + +Pure +Pursuit算法适合一般路径跟踪,能够根据前视点生成较平滑的转向控制量。但在近距离精确对接阶段,车辆与目标点之间距离较短,速度较低,对末端姿态要求较高,单纯依靠前视点跟踪可能会出现末端对准不够精细的问题。本文方法更加关注车辆与对接目标之间的相对位姿关系,因此更适合描述低速、近距离、姿态约束较强的对接场景。 + +Stanley算法在自动驾驶路径跟踪中应用较多,尤其适合处理中高速行驶过程中的横向误差修正。但机场牵引车对接飞行器属于低速精细作业,车辆运动速度较低,控制重点不是高速稳定循迹,而是小范围内的位置修正和姿态调整。因此,本文采用基于相对误差的分阶段控制思路,比直接套用Stanley方法更符合本课题场景。 + +MPC方法可以综合考虑车辆运动约束、转向角限制、速度限制和未来轨迹优化,理论上更适合复杂约束下的车辆控制。但MPC对车辆模型精度、求解器实时性和参数调试要求较高。结合本项目实际情况,课题时间有限,重点又在于完成ROS-Gazebo联合仿真系统搭建和全流程测试,直接采用MPC会显著增加实现难度。因此,本文方法没有追求复杂最优控制,而是选择更容易落地的相对位姿误差控制与规则化流程管理,在可实现性和论文工作量之间取得平衡(图4-10)。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.6923in,height=2.3501in]{figures/image19.png} + \caption{多种方法对接平稳度对比} + \label{fig:4-12} +\end{figure} + +\subsection{对比结果总结} + +综合上述分析,本文方法的主要特点并不是在所有指标上优于人工或其他算法,而是在特定研究阶段和特定应用目标下具有较好的适用性。其优势主要体现在以下几个方面: + +第一,本文方法能够把机场牵引作业拆解为多个可控阶段,使``前往飞行器区域、对接飞行器、推出飞行器、解除牵引、车辆撤离''形成较完整的仿真流程。 + +第二,本文基于ROS与Gazebo构建了可重复测试的仿真平台,便于对车辆模型、控制策略和作业流程进行验证,相比直接进行真实车辆测试,风险和成本更低。 + +第三,本文方法结合车辆相对位姿误差进行控制分析,比单纯开环脚本更能体现自动对接过程中的误差修正思想。 + +第四,本文采用较为清晰的分层结构,将感知、任务管理、局部目标生成、误差控制和执行层连接起来,便于后续继续扩展传感器融合、目标识别和路径优化算法。 + +下图能够直观展现各个方法的能效性能对比图(图4-11)。 + +总而言之,本文算法思路建立在对以上多种手动、自动牵引作业优缺点综合考虑下,最大可能集成上述方法的优点减少缺陷,提升车辆在复杂环境下的自适应能力与任务鲁棒性。 + +\begin{figure}[htbp] + \centering + \includegraphics[width=4.38981in,height=3.96489in]{figures/image20.png} + \caption{不同方法的综合能力对比} + \label{fig:4-13} +\end{figure} + +\section{本章小结} + +本章围绕ROS-Gazebo联合仿真系统的构建与实现展开,重点说明了仿真软件栈、牵引车模型、传感器挂载、任务模式管理以及ROS与Gazebo之间的接口关系。通过URDF模型、Gazebo场景、ros\_control控制器和ROS节点通信,牵引车模型能够完成加载、转向回中、轮速控制、目标接近和停车保持等基础动作,为第三章提出的感知与控制方法提供了验证环境。后续可在此基础上替换车辆模型、调整控制器参数或增加更复杂的机场地图与传感器配置。为接下来的实际任务部署提供一个快速迭代的实验平台。 diff --git a/co/undergraduate/content/chapter5.tex b/co/undergraduate/content/chapter5.tex new file mode 100644 index 00000000..f8e1292a --- /dev/null +++ b/co/undergraduate/content/chapter5.tex @@ -0,0 +1,28 @@ +%!TEX root = ../hutbthesis_main.tex +\chapter{总结与展望} + +\section{总结} + +本文围绕机场飞机牵引与自动对接作业需求,以自动牵引车和飞机协同控制为研究对象,基于ROS与Gazebo联合仿真平台,开展了作业问题抽象、车辆运动学建模、感知与控制方法设计以及仿真实现等方面的研究。 + +首先,本文对机场牵引作业场景进行了分析,将飞机推出与前起落架对接过程抽象为低速、高精度、多约束的车辆控制问题。在此基础上,建立了双桥转向牵引车平面运动学模型,分析前桥单独转向、前后桥反向转向和同向转向等典型模式,并推导速度、转角和曲率之间的约束关系,为后续自动接近与对接控制提供数学基础。 + +其次,本文将飞机辅助感知与自动接近控制合并为一条完整技术链路。通过在飞机前起落架区域设置可识别标识,牵引车能够获得目标身份、相对距离、横向偏差和姿态偏差;在此基础上,结合近距测量和安全阈值判断,建立目标确认、误差提取、安全判定和终端停车条件。 + +再次,本文设计了基于相对位姿误差的分层控制方法。对接过程被划分为搜索等待、自动接近、姿态对准、微动对接和停车保持等阶段,并采用``模式管理---局部规划---误差反馈---执行器映射''的结构,使牵引车能够从目标识别开始,逐步完成低速接近、方向修正和最终停车。 + +最后,本文完成了ROS-Gazebo联合仿真系统的搭建。通过SolidWorks车辆模型、URDF结构描述、Gazebo场景、控制器配置和ROS节点通信,实现牵引车模型加载、转向控制、轮速控制、传感器挂载和自动接近对接流程验证。仿真结果表明,该系统能够支持牵引车在机场作业场景中的低速运动和对接过程分析,为后续实物样机开发、控制参数优化和传感器融合研究提供参考。 + +总体来看,本文完成了自动牵引车与飞机对接任务从理论建模、感知控制方法到仿真实现的初步研究,验证了基于ROS与Gazebo开展机场牵引车联合仿真的可行性。 + +\section{展望} + +虽然本文完成了自动牵引对接系统的基本设计与仿真验证,但受研究周期和实验条件限制,仍存在一些需要进一步完善的方面。 + +第一,建模/车辆设计阶段耗时过长且采用了非常高精度的建模(首轮导出.stl模型文件达到了1.8G),直接导致模型预览困难、仿真模拟效率低下的问题;同时,本文对车辆动力学、轮胎接触、牵引连接机构和飞机受力过程进行了简化,后续需要建立更加完整的牵引车---飞机组合体动力学模型,使仿真结果更接近真实机场作业工况。 + +第二,受设备性能限制,没有考虑多变气候环境对车辆飞行器之间的影响,后续可进一步完善感知系统。可引入更复杂的视觉识别、点云处理和多传感器融合方法,提高系统在光照变化、遮挡和复杂环境下的可靠性。 + +第三,此次模拟环境较为简单,只放置了一架飞行器和牵引车模型,对现今大型国际机场起到的参考作用很小,后续可结合模型预测控制、动态避障算法和智能优化方法,在添加多机协作的同时,提高系统在动态障碍物、多车辆协同和复杂机场场景下的适应能力\textsuperscript{[20,25,28]}。 + +综上,机场自动牵引与飞机对接是一个融合车辆控制、机器人感知、路径规划和系统仿真的综合性课题。本文完成了基础平台和核心方法的搭建,后续仍可在模型精细化、感知鲁棒性、控制智能化和工程实用化方面继续深入研究。 diff --git a/co/undergraduate/content/content.tex b/co/undergraduate/content/content.tex new file mode 100644 index 00000000..0d60f64c --- /dev/null +++ b/co/undergraduate/content/content.tex @@ -0,0 +1,6 @@ +%!TEX root = ../hutbthesis_main.tex +\input{content/chapter1} +\input{content/chapter2} +\input{content/chapter3} +\input{content/chapter4} +\input{content/chapter5} diff --git a/co/undergraduate/content/cover.tex b/co/undergraduate/content/cover.tex new file mode 100644 index 00000000..1d39f77d --- /dev/null +++ b/co/undergraduate/content/cover.tex @@ -0,0 +1,22 @@ +%!TEX root = ../hutbthesis_main.tex +% 文章信息 +\titlecn{基于高保真模拟器的车辆与飞行器协同控制 } +\titleen{Hunan University of Technology and Business Thesis \LaTeX{} Template v0.1} + + +%\minormajor{人工智能} +%\interestmajor{智慧城市管理} +\author{雷宇杰} +\subsupervisor{} +\studentid{2209040011} +\priormajor{机器人工程} +\myclass{机器人2201班} +\supervisor{王海东讲师} +\department{智能机器人学院} +\thesisdate{year=2026, month=5} + +%以下的对本科生没有用 +\clcnumber{TP391} % 中图分类号 Chinese Library Classification +\schoolcode{10533} % 学校代码 +\udc{004.9} % UDC +\academiccategory{学术学位} % 学术类别 \ No newline at end of file diff --git a/co/undergraduate/content/declarationzh.tex b/co/undergraduate/content/declarationzh.tex new file mode 100644 index 00000000..cb3d1ab4 --- /dev/null +++ b/co/undergraduate/content/declarationzh.tex @@ -0,0 +1,18 @@ +%!TEX root = ../hutbthesis_main.tex + +\begin{declarationzh} + +本人郑重声明:所呈交的本科毕业设计 \uline{ 《基于高保真模拟器的车辆与飞行器协同控制》 } 是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议,除文中已经注明引用的内容外,本设计不含任何其他个人或集体已经发表或撰写过的作品成果。 +对本设计做出重要贡献的个人和集体均已在文中以明确方式标明。本人完全意识到本声明的法律结果由本人承担。 + + \vspace{30pt} + \begin{tabular}{ll} + %\renewcommand{\arraystretch}{2} + \hspace{240pt} \makebox[4em][s]{作者签名: 雷宇杰 } & \underline{\makebox[100pt][c]{ }} \\ + \hspace{240pt} \makebox[4em][s]{日\qquad 期:} & + \underline{\makebox[100pt][c]{\qquad2026年\quad1月\quad3日 }} \\ + \end{tabular} + + + +\end{declarationzh} \ No newline at end of file diff --git a/co/undergraduate/content/info.tex b/co/undergraduate/content/info.tex new file mode 100644 index 00000000..5f19178c --- /dev/null +++ b/co/undergraduate/content/info.tex @@ -0,0 +1,22 @@ +%!TEX root = ../csuthesis_main.tex +% 文章信息 +\titlecn{中南大学学位论文 \LaTeX{} 模板使用示例 v0.1.2} +\titleen{Central South University Thesis \LaTeX{} Template v0.1.2} + +\priormajor{计算机科学与技术} +\minormajor{计算机应用技术} +\interestmajor{计算机科学与技术} +\author{Edwardzcn} +\supervisor{徐德智\ 教授} +\subsupervisor{} +\department{计算机学院} +\studentid{1112223334} +\thesisdate{year=2021,month=1} +\myclass{计算机科学与技术} + + +%以下的对本科生没有用 +\clcnumber{TP391} % 中图分类号 Chinese Library Classification +\schoolcode{10533} % 学校代码 +\udc{004.9} % UDC +\academiccategory{学术学位} % 学术类别 \ No newline at end of file diff --git a/co/undergraduate/content/references.tex b/co/undergraduate/content/references.tex new file mode 100644 index 00000000..f09600f6 --- /dev/null +++ b/co/undergraduate/content/references.tex @@ -0,0 +1,41 @@ +%!TEX root = ../hutbthesis_main.tex +\begin{thebibliography}{99} +\bibitem{ref1} FAA. Towbar and Towbarless Movement of Aircraft: Advisory Circular AC 00-65A{[}R{]}. Washington, DC: Federal Aviation Administration, 2023. +\bibitem{ref2} 孙艳坤,张威,杨雄伟,刘佳辉,朱海军,刘宇轩,秦嘉浩. 飞机牵引滑行技术综述{[}J{]}. 交通运输工程学报,2023,23(3):23-43. +\bibitem{ref3} 中国民用航空局. 民用机场地面活动引导与控制系统(SMGCS)建设和运行指南{[}R{]}. 北京:中国民用航空局,2024. +\bibitem{ref4} MH/T 4042---2023,高级场面活动引导与控制系统技术规范{[}S{]}. 北京:中国民用航空局,2023. +\bibitem{ref5} ICAO. Advanced Surface Movement Guidance and Control Systems (A-SMGCS) Manual: Doc 9830 AN/452{[}R{]}. Montreal: International Civil Aviation Organization, 2004. +\bibitem{ref6} EUROCONTROL. EUROCONTROL Specification for Advanced-Surface Movement Guidance and Control System (A-SMGCS) Services: SPEC-171{[}R{]}. Brussels: EUROCONTROL, 2020. +\bibitem{ref7} 孙艳坤,杨慧,张威,秦嘉浩. 飞机牵引滑行入港安全运动路径生成及其轨迹跟踪控制方法{[}J{]}. 交通信息与安全,2022,40(5):91-101. +\bibitem{ref8} 张军,黄明辉,王\CJKfallbackchar{玥}琳,阳星,叶敏,贾永乐. 基于MPC的飞机牵引车轨迹跟踪{[}J{]}. 北京航空航天大学学报,2025,51(9):2916-2926. +\bibitem{ref9} 张军,文川,阳星,等. 基于ADRC的电传动飞机牵引车控制系统设计{[}J{]}. 北京航空航天大学学报,2023,49(5):1017-1026. +\bibitem{ref10} ZANINOTTO S, GAUCI J, ZAMMIT B. An Autonomous Tow Truck Algorithm for Engineless Aircraft Taxiing{[}J{]}. Aerospace, 2024, 11(4):307. +\bibitem{ref11} ZOUTENDIJK M, MITICI M, HOEKSTRA J M. An investigation of operational management solutions and challenges for electric taxiing of aircraft{[}J{]}. Research in Transportation Business \& Management, 2023, 49:101019. +\bibitem{ref12} ZOUTENDIJK M, MITICI M. Fleet scheduling for electric towing of aircraft under limited airport energy capacity{[}J{]}. Energy, 2024, 294:130924. +\bibitem{ref13} BILIAKOVYCH O, KHARCHENKO O. The concept of an unmanned airport tug as an alternative to traditional aircraft tugs{[}J{]}. Modern Engineering and Innovative Technologies, 2023, 1(28-01):69-73. +\bibitem{ref14} QUIGLEY M, CONLEY K, GERKEY B, FAUST J, FOOTE T, LEIBS J, WHEELER R, NG A. ROS: an open-source Robot Operating System{[}A{]}. ICRA Workshop on Open Source Software{[}C{]}. Kobe: IEEE, 2009:1-6. +\bibitem{ref15} KOENIG N, HOWARD A. Design and use paradigms for Gazebo, an open-source multi-robot simulator{[}A{]}. Proceedings of the 2004 IEEE/RSJ International Conference on Intelligent Robots and Systems{[}C{]}. Sendai: IEEE, 2004:2149-2154. +\bibitem{ref16} 王雅清,倪晓昌,李静,周杰,杜博文. 移动机器人路径规划算法研究进展{[}J{]}. 智能计算机与应用,2024,14(11):211-216. +\bibitem{ref17} 霍凤财,迟金,黄梓健,任璐,孙勤江,陈建玲. 移动机器人路径规划算法综述{[}J{]}. 吉林大学学报:信息科学版,2018,36(6):639-647. +\bibitem{ref18} 龚建伟,姜岩,徐威. 无人驾驶车辆模型预测控制{[}M{]}. 北京:北京理工大学出版社,2014. +\bibitem{ref19} Open Source Robotics Foundation. Gazebo ROS control tutorial{[}EB/OL{]}. \href{https://classic.gazebosim.org/tutorials?tut=ros_control}{https://classic.gazebosim.org/tutorials?tut=ros\_control}, 2026-05-06. +\bibitem{ref20} ROS Wiki. Adding Physical and Collision Properties to a URDF Model{[}EB/OL{]}. \href{https://wiki.ros.org/urdf/Tutorials/Adding\%20Physical\%20and\%20Collision\%20Properties\%20to\%20a\%20URDF\%20Model}{https://wiki.ros.org/urdf/Tutorials/Adding\%20Physical\%20and\%20Collision\%20Properties\%20to\%20a\%20URDF\%20Model}, 2026-05-06. +\bibitem{ref21} ROS Index. xacro: XML Macros{[}EB/OL{]}. \href{https://index.ros.org/p/xacro/}{https://index.ros.org/p/xacro/}, 2026-05-06. +\bibitem{ref22} 赵景波,朱梁鹏,刘成晔. 四轮转向智能车辆路径跟踪控制策略研究{[}J{]}. 系统仿真学报,2021,33(10):2390-2398. +\bibitem{ref23} 毛丁丁,邓亚东. 四轮转向智能车辆轨迹跟踪及稳定控制研究{[}J{]}. 机械科学与技术,2020,39(7):1094-1099. +\bibitem{ref24} ROS Index. gazebo\_ros\_control: Gazebo ros\_control Interfaces{[}EB/OL{]}. \href{https://index.ros.org/p/gazebo_ros_control/}{https://index.ros.org/p/gazebo\_ros\_control/}, 2026-05-06. +\bibitem{ref25} SIEGWART R, NOURBAKHSH I R, SCARAMUZZA D. Introduction to Autonomous Mobile Robots{[}M{]}. 2nd ed. Cambridge: MIT Press, 2011:13-120. +\bibitem{ref26} THRUN S, BURGARD W, FOX D. Probabilistic Robotics{[}M{]}. Cambridge: MIT Press, 2005:1-672. +\bibitem{ref27} RAJAMANI R. Vehicle Dynamics and Control{[}M{]}. 2nd ed. New York: Springer, 2012:15-165. +\bibitem{ref28} LAVALLE S M. Planning Algorithms{[}M{]}. Cambridge: Cambridge University Press, 2006:1-826. +\bibitem{ref29} LATOMBE J C. Robot Motion Planning{[}M{]}. Norwell: Kluwer Academic Publishers, 1991:1-672. +\bibitem{ref30} HART P E, NILSSON N J, RAPHAEL B. A formal basis for the heuristic determination of minimum cost paths{[}J{]}. IEEE Transactions on Systems Science and Cybernetics, 1968, 4(2):100-107. +\bibitem{ref31} DIJKSTRA E W. A note on two problems in connexion with graphs{[}J{]}. Numerische Mathematik, 1959, 1(1):269-271. +\bibitem{ref32} LAVALLE S M, KUFFNER J J. Randomized kinodynamic planning{[}J{]}. The International Journal of Robotics Research, 2001, 20(5):378-400. +\bibitem{ref33} FOX D, BURGARD W, THRUN S. The dynamic window approach to collision avoidance{[}J{]}. IEEE Robotics \& Automation Magazine, 1997, 4(1):23-33. +\bibitem{ref34} COULTER R C. Implementation of the Pure Pursuit Path Tracking Algorithm{[}R{]}. Pittsburgh: Carnegie Mellon University Robotics Institute, 1992. +\bibitem{ref35} HOFFMANN G M, TOMLIN C J, MONTEMERLO M, THRUN S. Autonomous automobile trajectory tracking for off-road driving: controller design, experimental validation and racing{[}A{]}. Proceedings of the 2007 American Control Conference{[}C{]}. New York: IEEE, 2007:2296-2301. +\bibitem{ref36} PADEN B, ČÁP M, YONG S Z, YERSHOV D, FRAZZOLI E. A survey of motion planning and control techniques for self-driving urban vehicles{[}J{]}. IEEE Transactions on Intelligent Vehicles, 2016, 1(1):33-55. +\bibitem{ref37} BRADSKI G. The OpenCV Library{[}J{]}. Dr. Dobb's Journal of Software Tools, 2000, 25(11):120-125. +\bibitem{ref38} OLSON E. AprilTag: A robust and flexible visual fiducial system{[}A{]}. Proceedings of the 2011 IEEE International Conference on Robotics and Automation{[}C{]}. Shanghai: IEEE, 2011:3400-3407. +\end{thebibliography} diff --git a/co/undergraduate/figures/image1.png b/co/undergraduate/figures/image1.png new file mode 100644 index 00000000..6f3c9c63 Binary files /dev/null and b/co/undergraduate/figures/image1.png differ diff --git a/co/undergraduate/figures/image10.png b/co/undergraduate/figures/image10.png new file mode 100644 index 00000000..ff275152 Binary files /dev/null and b/co/undergraduate/figures/image10.png differ diff --git a/co/undergraduate/figures/image11.png b/co/undergraduate/figures/image11.png new file mode 100644 index 00000000..4ef0685e Binary files /dev/null and b/co/undergraduate/figures/image11.png differ diff --git a/co/undergraduate/figures/image12.png b/co/undergraduate/figures/image12.png new file mode 100644 index 00000000..141aedd1 Binary files /dev/null and b/co/undergraduate/figures/image12.png differ diff --git a/co/undergraduate/figures/image13.png b/co/undergraduate/figures/image13.png new file mode 100644 index 00000000..d4f5becf Binary files /dev/null and b/co/undergraduate/figures/image13.png differ diff --git a/co/undergraduate/figures/image14.png b/co/undergraduate/figures/image14.png new file mode 100644 index 00000000..5075d60f Binary files /dev/null and b/co/undergraduate/figures/image14.png differ diff --git a/co/undergraduate/figures/image15.png b/co/undergraduate/figures/image15.png new file mode 100644 index 00000000..59747cd6 Binary files /dev/null and b/co/undergraduate/figures/image15.png differ diff --git a/co/undergraduate/figures/image16.png b/co/undergraduate/figures/image16.png new file mode 100644 index 00000000..e7e43244 Binary files /dev/null and b/co/undergraduate/figures/image16.png differ diff --git a/co/undergraduate/figures/image17.png b/co/undergraduate/figures/image17.png new file mode 100644 index 00000000..531ef337 Binary files /dev/null and b/co/undergraduate/figures/image17.png differ diff --git a/co/undergraduate/figures/image18.png b/co/undergraduate/figures/image18.png new file mode 100644 index 00000000..89c7e0e0 Binary files /dev/null and b/co/undergraduate/figures/image18.png differ diff --git a/co/undergraduate/figures/image19.png b/co/undergraduate/figures/image19.png new file mode 100644 index 00000000..20f0f24a Binary files /dev/null and b/co/undergraduate/figures/image19.png differ diff --git a/co/undergraduate/figures/image2.png b/co/undergraduate/figures/image2.png new file mode 100644 index 00000000..b0aa1720 Binary files /dev/null and b/co/undergraduate/figures/image2.png differ diff --git a/co/undergraduate/figures/image20.png b/co/undergraduate/figures/image20.png new file mode 100644 index 00000000..6937bd4a Binary files /dev/null and b/co/undergraduate/figures/image20.png differ diff --git a/co/undergraduate/figures/image3.png b/co/undergraduate/figures/image3.png new file mode 100644 index 00000000..0bbecbea Binary files /dev/null and b/co/undergraduate/figures/image3.png differ diff --git a/co/undergraduate/figures/image4.png b/co/undergraduate/figures/image4.png new file mode 100644 index 00000000..3474c78d Binary files /dev/null and b/co/undergraduate/figures/image4.png differ diff --git a/co/undergraduate/figures/image5.png b/co/undergraduate/figures/image5.png new file mode 100644 index 00000000..06b32146 Binary files /dev/null and b/co/undergraduate/figures/image5.png differ diff --git a/co/undergraduate/figures/image6.png b/co/undergraduate/figures/image6.png new file mode 100644 index 00000000..56698086 Binary files /dev/null and b/co/undergraduate/figures/image6.png differ diff --git a/co/undergraduate/figures/image7.png b/co/undergraduate/figures/image7.png new file mode 100644 index 00000000..0b4b2812 Binary files /dev/null and b/co/undergraduate/figures/image7.png differ diff --git a/co/undergraduate/figures/image8.png b/co/undergraduate/figures/image8.png new file mode 100644 index 00000000..8037bda5 Binary files /dev/null and b/co/undergraduate/figures/image8.png differ diff --git a/co/undergraduate/figures/image9.png b/co/undergraduate/figures/image9.png new file mode 100644 index 00000000..73d678f0 Binary files /dev/null and b/co/undergraduate/figures/image9.png differ diff --git a/co/undergraduate/hutb_logo.png b/co/undergraduate/hutb_logo.png new file mode 100644 index 00000000..6a69f386 Binary files /dev/null and b/co/undergraduate/hutb_logo.png differ diff --git a/co/undergraduate/hutb_logo_maoti.png b/co/undergraduate/hutb_logo_maoti.png new file mode 100644 index 00000000..f6878c62 Binary files /dev/null and b/co/undergraduate/hutb_logo_maoti.png differ diff --git a/co/undergraduate/hutbthesis.cls b/co/undergraduate/hutbthesis.cls new file mode 100644 index 00000000..0dbe1e7e --- /dev/null +++ b/co/undergraduate/hutbthesis.cls @@ -0,0 +1,1223 @@ +% +% 本模版根据湖南工商大学本科生学位论文撰写规范创建 +% 论文内容一般应由十一个主要部分组成,依次为: +% 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 +% 参考文献已改为手工 thebibliography 环境,不再强制调用 biblatex/biber。 +% \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 +% Windows/TeXstudio 通常可直接使用 Times New Roman;若系统缺少该字体,则回退到 TeX Live 自带字体,保证可编译。 +\IfFontExistsTF{Times New Roman}{\sjtu@load@fontset@times}{\sjtu@load@fontset@lm} +% 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.cls.bak b/co/undergraduate/hutbthesis.cls.bak new file mode 100644 index 00000000..00baaad8 --- /dev/null +++ b/co/undergraduate/hutbthesis.cls.bak @@ -0,0 +1,1221 @@ +% +% 本模版根据湖南工商大学本科生学位论文撰写规范创建 +% 论文内容一般应由十一个主要部分组成,依次为: +% 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 new file mode 100644 index 00000000..6fcaae88 --- /dev/null +++ b/co/undergraduate/hutbthesis_main.tex @@ -0,0 +1,143 @@ +%!TEX program = xelatex +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 载入模版 +% +% 载入 hutbthesis.cls文件定义的模板 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[AutoFakeBold]{hutbthesis} +\usepackage{calc} + +% 少数字体不包含个别生僻字时使用的兼容宏;Windows 下若有宋体则不影响显示。 + +\newcommand{\CJKfallbackchar}[1]{\IfFontExistsTF{Noto Serif CJK SC}{{\CJKfontspec{Noto Serif CJK SC}#1}}{#1}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 基本信息 +% +% 用户自行输入标题、作者等基本信息 +% 都存储在\content\info.tex文件中 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\include{content/cover} + + + +\begin{document} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 封面绘制 +% +% 1.5版本重新编写了封面绘制宏,并用latex使用者更习惯的 +% \maketitle代替之前的\makecoverpage +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\maketitle + +%\declarationzh + +% 前置部分:封面、承诺书、中英文摘要不显示页码; +% 只从“目录”开始使用罗马数字页码。 +\cleardoublepage +\pagestyle{empty} +\pagenumbering{gobble} + +%\include{content/info} + +\include{content/declarationzh} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 中文摘要 +% +% 存储在\content\abstractzh.tex文件中 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\include{content/abstractzh} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 英文摘要 +% +% 存储在\content\abstracten.tex文件中 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\include{content/abstracten} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 目录 +% +% 使用重定义的tableofcontents宏绘制目录 +% 满足学校的样式要求 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 目录部分:单独使用罗马数字页码,从 I 开始。 +\cleardoublepage +\frontmatter +\setcounter{page}{1} +% 只在目录中显示到二级标题,避免目录过长 +\setcounter{tocdepth}{1} +\tableofcontents + + +% 启用数字编号,改为第 x 页 共 x 页格式 +% 正文从第 1 页开始使用阿拉伯数字页码。 +\cleardoublepage +\mainmatter + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 正文 +% +% 存储在\content\content.tex文件中 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 正文 +%\include{content/content} + + +\include{content/chapter1} +\include{content/chapter2} +\include{content/chapter3} +\include{content/chapter4} +\include{content/chapter5} + +% % 主文件有代码去掉页眉章节编号的“.”,但这会因为bug导致无编号章节显示一个错误编号,所以这里在无编号章节之前再次重定义sectionmark。 +% \renewcommand{\sectionmark}[1]{\markright{#1}} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 致谢 +% +% 存储在\content\acknowledgements.tex文件中 +% 根据本科生院的要求,致谢应该在参考文献的前面,不编章号,而附录应该位于参考文献后。 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\include{content/acknowledgements} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 参考文献 +% +% 存储在\content\acknowledgements.tex文件中 +% 根据本科生院的要求,致谢应该在参考文献的前面,不编章号,而附录应该位于参考文献后。 +% 有待修复 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \section{参考文献} % bibliography会自动显示参考文献四个字 +\addcontentsline{toc}{chapter}{参考文献} +\include{content/references} +%\bibliography{hutbtheisi_main} +\newpage + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% 附录部分 +% +% 根据学校要求,正文中不应出现长篇幅的代码段或公式推证 +% 应单独放置在正文后的附录部分 +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% https://www.zhihu.com/question/29413517/answer/44358389 % +% 说明如下: +% secnumdepth 这个计数器是 LaTeX 标准文档类用来控制章节编号深度的。 +% 在 article 中,这个计数器的值默认是 3,对应的章节命令是 \subsubsection。 +% 也就是说,默认情况下,article 将会对 \subsubsection 及其之上的所有章节标题进行编号,也就是 \part, \section, \subsection, \subsubsection。LaTeX 标准文档类中,最大的标题是 \part。它在 book 和 report 类中的层级是「-1」,在 article 类中的层级是「0」。这里,我们在调用 \appendix 的时候将计数器设置为 -2,因此所有的章节命令都不会编号了。不过,一般还是会保留 \part 的编号的。所以在实际使用中,将它设置为 0 就可以了。 + +% 在修改过程中请注意不要破环命令的完整性 + +% \renewcommand\appendix{\setcounter{secnumdepth}{-2}} +\appendix +\include{content/appendix} + + +\end{document} diff --git a/co/undergraduate/init_proj.m b/co/undergraduate/init_proj.m new file mode 100644 index 00000000..84bb4ecf --- /dev/null +++ b/co/undergraduate/init_proj.m @@ -0,0 +1,40 @@ +% 初始化工程 +% 测试:init_proj('calligraphy_score') +function init_proj(proj_name) + +cur_dir = fileparts(mfilename('fullpath')); + +home_dir = fileparts(cur_dir); + +proj_dir = fullfile(home_dir, proj_name); + +if ~exist(proj_dir, 'dir') + mkdir(proj_dir); +end + +cd(proj_dir); + +% 创建一个空的README.md文件 +fid = fopen('README.md', 'w'); +fclose(fid); + +system('git init') +system('git add README.md') +system('git submodule add https://github.com/OpenHUTB/undergraduate.git') +system('git commit -m init') + +% 添加远程链接 +remote_url = ['https://github.com/OpenHUTB/' proj_name '.git']; +system(['git remote add origin ' remote_url]) + +% 推送到远端 +system('git push --set-upstream origin master') + +cd(cur_dir); + +end + + + + + diff --git a/co/undergraduate/latexmkrc b/co/undergraduate/latexmkrc new file mode 100644 index 00000000..75662f30 --- /dev/null +++ b/co/undergraduate/latexmkrc @@ -0,0 +1,5 @@ +# TeXstudio / TeX Live 2023 兼容编译配置 +# 推荐命令:XeLaTeX 编译 2 次;如使用 latexmk,请执行:latexmk -pdf hutbthesis_main.tex +$pdf_mode = 1; +$pdflatex = 'xelatex -synctex=1 -interaction=nonstopmode -halt-on-error %O %S'; +$max_repeat = 5;