简 介: 本文详细介绍了我们为了十六届全国大学生智能车大赛全向行进组准备的车模。车模采用沁恒微电子公司的CH32V103芯片作为控制器;通过总钻风摄像头采集,经摄像头处理以后得到位置信息;利用编码器测量车模速度,构成速度闭环控制;利用左右轮子的差速,实现车模转向;利用PID控制算法控制电机和舵机;通过减轻车模质量,来获得更好的加速和转弯性能;利用蓝牙、上位机、OLED屏幕等对程序进行调试,获得更好的运行效果。

关键词智能车单片机PIDCH32V103麦克纳姆轮

学 校:哈尔滨工业大学   
队伍名称:紫丁香四队     
参赛队员:尚世迪 刘馨元 徐向瑞
带队教师:王盼宝 齐超     

第一章 引言


  智能车是以汽车电子为背景,涵盖控制、模式识别、传感技术、电子、电气、计算机、机械等多学科的科技创意性设计,由主要路径识别、速度采集、角度控制及车速控制等模块组成。其设计与开发涉及控制、模式识别、传感技术、汽车电子、电气、计算机、机械等多个学科,可以分为三大部分:传感器检测部分,执行部分,CPU。

  全国大学生智能汽车竞赛以“立足培养,重在参与,鼓励探索,追求卓越”为指导思想,旨在促进高等学校素质教育,培养大学生的综合知识运用能力、基本工程实践能力和创新意识,激发大学生从事科学研究与探索的兴趣和潜能,倡导理论联系实际、求真务实的学风和团队协作的人文精神,为优秀人才的脱颖而出创造条件,是一项鼓励创新的科技竞赛活动。

  全向行进组要求在规定的汽车模型平台上,使用沁恒微电子公司的微控制器作为核心控制模块,通过增加传感器、电机驱动模块以及编写相应控制程序,制作完成一个能够自主识别道路元素的模型汽车。针对全向行进组的任务要求,我们采用具有控速特性和转弯性能较好的H车模,使用总钻风摄像头采集赛道信息,控制芯片选择CH32V103单片机。

  本篇技术报告主要从机械、硬件、软件、调试工具等方面,详细的介绍了车模的设计和制作方案,以及我们做车过程积累的经验,希望对以后的参赛选手能够带来启发和帮助。

第二章 车模整体设计


2.1系统概述

  车模主要分三个部分:控制器、传感器和执行器。控制器采用CH32V103单片机,负责处理由各传感器采集到的赛道信息,并且根据摄像头采集赛道信息并进行处理以后输出控制信号;传感器包括编码器、陀螺仪等,执行器有电机及相应的驱动电路,接收单片机控制信号,对车模运行状态进行控制。

  车模运行的整体流程为:摄像头模块对赛道信息进行采集,通过单片机进行处理得到赛道信息,同时编码器采集电机转速并传给单片机,形成速度闭环控制,电机采用增量式PI控制,用PWM波控制电机输出功率;差速采用PD控制;单片机得到的信息,计算出电机的期望速度值,通过速度环控制车模速度。

2.2整车布局及参数

  我们组采用H型车模,尺寸为250215295mm,轮胎尺寸为61*24mm,极。驱动电机为RS-380,7.2vRS-380 马达,工作电压范围是5.4V-9V,空载转速15000r左右,空载电流0.55A,最大力矩91.32g.cm,最大输出功率12.6W,车身总体重量1.6kg。

  车模三视图如图2.1所示:

▲ &+

第三章 系统机械系统设计及实现


  我们选用的车模是H车模。H车模使用4个380电机,由于H车没有舵机,所以过弯采用电机主动差速的方式。同时,为了获得更好的加减速效果,我们尽量减轻车模质量、尽量将重心降低,在电机输出力矩一定时,轻便的车模将获得更高的加速度,这是我们机械设计的基本原则。

3.1编码器的安装

  如果采用普通低转速编码器,在小车高速运转时很容易出现丢步的情况,进而有可能导致跑飞,我们选用龙邱生产的512线mini增量式编码器,该编码器体积小、质量轻、稳定性好、精度高,输出型号类型为CMOS信号,抗干扰能力强。安装时要仔细调节编码器齿轮与电机齿轮的啮合,保证阻尼适中,啮合太紧会增加电机负载,太松又会影响编码器测量精度或者打齿。实际安装如图3.1所示:

▲ &+

3.2舵机的安装

  由于在赛道运行时需要车体进行旋转,我们选择了一款GDW7080旋转角270°舵机来控制摄像头的旋转,为使得摄像头无论在横向还是竖向都处于中心位置,我们选择将舵机装在两款核心板之间,架在主控上方,用一个简略3D打印件来固定于车体中心,舵机安装如下图3.2所示。
.

▲ &+

3.3电池的安装

  我们选择的电池为一块4000mAh的航模电池,为使得车体重心比较低,结构比较对称,我们选择将电池放于车底盘最中间的位置,其中一边用3D打印件作为固定。我们车上有3块电路板,分别是主控板和两块驱动板,将主控板放在电池上;驱动板放在电机上方。电池和电路板安装如图3.3所示:

▲ &+

第四章 系统硬件设计及实现


  本车硬件设计主要分为以下几个模块:电源管理模块,oled模块,单片机处理核心模块,电机驱动模块,舵机模块。稳定性是硬件的基本要求,我们选取线性电源芯片给MCU供电,减少主控的附件,按照车模外形设计电路板的外形,将驱动电路与MCU分开,分成了主控和驱动部分电路。

4.1主控板

  主控板每个电源网络均设置LED显示各个供电芯片是否正常工作,减少故障排查时间,根据各个传感器的车身分布位置合理安排接口位置,为减轻质量同时使电路板简洁,电路板多采用FPC排线和防反接接口,主控板实物如图4.1所示:

▲ &+

4.1.1主控芯片

  本车模采用沁恒微电子公司的CH32V103芯片作为主控芯片,单片机及外围电路图4.1.1所示:

▲ &+

4.1.2电源管理模块

  电源模块方面采用线性转压芯片,线性转压相比于开关转压更加稳定,更加适用于用多级转压电路中,但是缺点是效率较低,容易发热,最后我们采用TPS76850与TPS76833作为转压芯片为单片机供电,效果较为理想。转压电路原理图如图4.1.2所示:

▲ &+

4.1.3调试模块

  在调试时必要的会需要对行进时实时数据进行监测,运用wifi模块可以很方便的实现,OLED对菜单显示可以方便调节参数。wifi和OLED接口原理图如图4.1.3所示:

▲ 图4.1.3 wifi和OLED接口原理图

4.1.4舵机控制模块

  由于舵机仅仅需要电、地与占空比型号,故可直接通过单片机控制舵机,原理图如图4.1.4所示:

▲ 图4.1.4 舵机接口原理图

4.2 驱动板

▲ 图4.2 驱动板安装图

4.2.2全桥驱动

  驱动为分立元件制作的直流电机可逆双极型桥式驱动器,其功率元件由N沟道MOSFET管组成,峰值电流可以达到100A以上,大大提高了电动机的工作转矩和转速,电路图如4.2.2所示:

▲ 图4.2.2 全桥驱动电路原理图

4.2.4测速模块

  测速模块为了减少车辆负载,采用体积较小的可以兼容正交解码的512线增量式龙邱MINI编码器。

▲ 图4.2.3 编码器电路原理图

4.3交互模块

  为了方便调节参数,在主控板上有拨码开关和五向按键。

▲ 图4.3 五向按键和拨码开关

第五章 系统软件设计及算法实现


  高效稳定的控制程序和高适应性的算法是智能车快速平稳运行的基础。我们设计的智能车采用南京沁恒微电子生产的芯片CH32V103单片机作为控制器,通过摄像头获取赛道信息,我们使用了编码器测速对小车进行速度闭环,为使小车快速平稳运行,使用陀螺仪进行辅助。速度和方向控制算法方面,我们采用工业控制广泛采用的经典PID算法,配合理论计算与实际参数调试过程使程序和小车充分契合,使智能车达到快速平稳运行的目的。

5.1赛道中心线提取及优化处理

5.1.1 原始图像的特点

  在单片机采集图像信号后需要对其进行处理以提取主要的赛道信息,同时,由于交叉道、起跑线的存在,光线不均匀、赛道外反光点、赛道远处图像不清楚的干扰,图像效果会大打折扣。因此,在软件上必须排除干扰因素,对赛道进行有效识别,并提供尽可能多的赛道信息供决策使用。

  为契合CH32V103单片机的处理性能,我们对摄像头采集到的画面进行了裁切,裁切为128*60的图像大小,且符合普通oled屏幕的显示效果。

▲ 图5.1 三岔路原始图像

  在图像信号处理中我们提取的赛道信息主要包括:赛道位于图像的位置、赛道边界点信息,赛道宽度信息,赛道中心线位置,赛道类型识别。

  摄像头返回的这个矩阵中,每一个像素点都有一个从0至255的灰度值,值越大表示该像素点越亮,相反,越暗的像素点值就越小。同色间的灰度差很小,而不同色间的灰度差很大,我们使用固定阈值将像素矩阵二值化,得到黑白图像,将赛道与背景区别开来。

5.1.2 赛道搜线算法

  单片机在对原始图像进行二值化之后,再通过逆透视变换得到单片机处理的基本赛道图像,然后用搜线算法来对其进行处理,从而确定出赛道两边的黑线在哪儿,并计算出相对应的赛道中线,从而指导舵机转向和电机的加减速。搜线算法的基本思想如下:

  1. 对赛道图像进行连通域提取,找出正常赛道对应的连通域位置;

  2. 遍历图像,对赛道对应的连通域提取边界信息以及宽度信息,并对边界进行滤波处理,储存在数组中;

  3. 搜线完毕后,就得到了处理好的能够进行赛道分析的完整的矩阵。

5.1.3 赛道中心的计算

  得到完整的赛道信息矩阵后,即可通过一定的算法计算出赛道的中线,由PID控制算法的思想,我们利用智能车的图像中心与赛道的实际中心的偏移量来控制电机的驱动力度。赛道中线算法:

  1. 由图像底部向顶部扫描,将左右边界进行映射,得到一个映射关系,当赛道连通域结束,扫描结束;

  2. 通过步骤(1)得到的映射关系,取对应左右边界的中点,求出中点的位置,保存在数组中。

▲ 图5.2 直道中线合成图

▲ 图4.6 十字中线合成图

5.2 出入岔路策略

5.2.1 入岔路位置判定

  我们小队通过图象识别来判定车库位置,主要通过对岔路顶岔路最低行的判断来限定开始入库时车的位置,经过我们的尝试,这种判断方法在低速时很稳定,对入岔路时机把握良好,速度越快,对应入岔路时机会有所偏差。

5.2.2 出岔路方案

  同样采用图像来进行出岔路时机的判别,效果及原理同入岔路。

5.2.3 舵机旋转摄像头方案

  我们小队为了实现在岔路内进行变向行驶,采用了舵机旋转摄像头的方案,在图像给出适当的入岔路时机后,舵机进行打角,将摄像头旋转固定角度,实现在车体变向行驶时仍然能够正常寻迹的效果。

5.3控制算法

5.3.1 PID算法介绍

  在过程控制中,PID控制器是一直应用最为广泛的一种控制器,也是众多控制算法中应用最为普遍的控制算法当被控对象的结构和参数不能完全掌握,或得不到精确的数学模型时,控制理论的其它技术难以采用时,系统控制器的结构和参数必须依靠经验和现场调试来确 定,这时应用 PID 控制技术最为方便。即当我们不完全了解一个系统和被控对象,或不能通过有效的测量手段来获得系统参数时,最适合用 PID 控制技术。 PID 控制,实际中也有 PI 和 PD 控制。 PID 控制器是一种线性控制器,它根据给定值与实际输出值构成控制偏差。 将偏差的比例§、积分(I)和微分(D)通过线性组合构成控制量,对被控对象进行控制,故称 PID 控制器。

  由于单片机控制是采样控制,只能根据采样时刻的偏差控制输出量,不能计算连续输出量,所以要采用离散化的PID算法。离散PID分为位置式和增量式两种。位置式的输出量直接就是控制量,由于全量输出,所以每次输出均与过去的状态有关,计算时要对过去偏差进行累加,计算机工作量大;而且因为计算机输出量对应的是执行机构的实际输出,如计算机出现故障,输出大幅度变化会引起执行机构位置的大幅度变化,这种情况往往是生产实践中不允许的,在某些场合,还可能造成严重的生产事故。因而产生了增量式 PID 控制的控制算法,所谓增量式PID是指数字控制器的输出只是控制量的增量。由于计算机输出增量,所以误动作时影响小算式中不需要累加。控制增量的确定仅与最近k次的采样值有关,所以较容易通过加权处理而获得比较好的控制效果。

5.3.2转向控制

  麦轮车利用左右差速实现车模的方向控制,根据采集图像算出的偏差使用串级pid计算出期望的编码器差速,输出给速度环。

5.3.3 PI速度控制

  由于增量式PID相对于位置式PID有明显的优势,所以我们选择增量式PI作为速度控制算法,用编码器获取速度作为反馈量,实现闭环控制。

5.3.4 麦轮速度分解

  麦轮车的运动可分解为前进、平移、自转三个分量的速度,将三个分量的期望速度算出,并把期望编码器读数叠加到电机的速度环上,便实现了全向底盘的控制。

第六章 系统开发和调试工具


6.1开发环境:MounRiver Studio

  MounRiver Studio 是一款面向 RISC-V 内核单片机的集成开发环境,为用户提供专业嵌入式项目所需的开发、调试环境、烧录工具及完善的项目管理功能开发工具包括代码编辑,工程模板导入、导出,单步调试,代码烧录等功能,基于EclipseGNU 版本开发,在保留原平台强大代码编辑功能、便捷组件框架的同时,针对嵌入式 C/C++开发,进行了一系列界面、功能、操作方面的修改与优化,以及工具链的指令增添、定制工作,能够为单片机开发提供完整的解决方案。

▲ 图 6.1 MounRiver Studio界面

6.2上位机调试

  为了获取车模在行驶时的运行数据,我们在车上装了蓝牙,可以将关键参数实时发送到上位机查看,上位机我们使用山外的多功能调试助手,它支持查看图像、虚拟示波器、串口助手等功能,使用方便。

  另外,我们社团还自己编写了可以在安卓手机上使用的APP紫丁香调试助手,同样支持虚拟示波器、图像监听、调试遥控等智能车调试常用的功能。

第七章 总结


  本文从机械、硬件、软件等方面详细介绍了车模的设计和制作方案。从机械和硬件方面,我们力求电路的稳定可靠,尽量将车模做的轻快灵活,尽可能降低重心;在软件方面,我们努力追求最有效的行驶路径,不断优化各方面策略。同时,对于对抗过程中的各种不确定因素,尽可能提高车模的稳定性。

  在车模制作过程中,我们学到很多知识,逐渐对单片机控制、电路设计等有了比较好的认识,很感谢社团能够给我们这样的平台,感谢各位指导老师和学长学姐的指导。经过近一年的辛苦准备,我们也积累了很多经验,深刻认识到坚持不懈的重要性,经过一次次残酷的校内选拔,从开始的近百人到最后的二十几人,考验的不是谁更聪明,而是谁可以坚持努力,不断地发现问题解决问题,坚持为比赛付出时间和精力。

  最后,再次感谢哈工大智能车创新俱乐部这个大家庭,感谢一直支持和关注智能车比赛的学校和学院领导以及各位老师,也感谢比赛组委会能组织这样一项很有意义的比赛。

参考文献


[1] 卓晴,黄开胜,邵贝贝.学做智能车.北京:北京航空航天大学出版社.2007.
[2] 蔡述庭.“飞思卡尔”杯智能汽车竞赛设计与实践.北京:北京航空航天大学 出版社. 2012.
[3] 王淑娟,蔡惟铮,齐明.模拟电子技术基础.北京:高等教育出版社.2009
[4] 朱政合.飞思卡尔智能赛车及调试平台开发研究.大连理工大学.硕士学位论 文.2010.
[5] 高隽,谢昭.图像理解理论与方法.北京:科学出版社.2009.
[6] 王映辉.人脸识别——原理、方法与技术.北京:科学出版社.2010.
[7] 余志生主编.汽车理论.北京:机械工业出版社.2009.
[8] 王望予主编.汽车设计.北京:机械工业出版社.2004.
[9] 白志刚.自动调节系统解析与PID整定.化学工业出版社,2012.

■ 附录A 核心程序代码

主机:

#include <headfile.h>
int32_t Item_ID = 1;                  //菜单项ID
Car_data CAR[Max_Item_Amount];        //菜单数据
uint32 *buff;   //菜单数据存储
float wifi_test[20];
uint8_t menu_flag = 1;
uint8_t menu_flag2 = 1;
uint8_t disp_flag = 0;
int16 ssd;
uint8_t xyx;
uint8_t zha_flag;
uint8_t gogogo_flag = 0;
int16 adxxr;
int16 xxr_time = 0;
int16 ssd_time = 0;
int main(void)
{ DisableGlobalIRQ(); board_init();           //务必保留,本函数用于初始化MPU 时钟 调试串口 oled_init(); oled_fill(0x00); Key_Init(); Encoder_Init(); PWM_INIT(); oled_p6x8str(0, 0, "ssd"); mt9v03x_init(); oled_p6x8str(0, 1, "ssd"); oled_fill(0x00); oled_p6x8str(0, 2, "ssd"); Com_Init(); MenuItem_t* MenuRoot = MenuCreate(); MenuItem_t *currItem = MenuRoot->Child_list; oled_p6x8str(0, 0, "init ok"); oled_fill(0x00); MenuPrint(MenuRoot, currItem); EnableGlobalIRQ(0); while(1) { if(gpio_get(BOMA6)==0) { if(menu_flag==1) { menu_flag = 0; oled_fill(0x00); MenuItem_t *currItem = MenuRoot->Child_list; MenuPrint(MenuRoot, currItem); } currItem = ButtonProcess(GetRoot(currItem), currItem); } else { if(menu_flag==0) { menu_flag = 1; oled_fill(0x00); } xxr_time = ssd_time*2; oled_int16(80, 0, ssd); oled_int16(80, 1, run_angle); oled_int16(80, 2, out_temp); oled_int16(80, 3, ramp_angle); oled_int16(80, 4, circle_angle); oled_int16(80, 5, circle_lu); oled_int16(80, 6, inf.road_type); oled_int16(80, 7, my_score); oled_p6x8str(0, 0, "ssd"); oled_p6x8str(0, 1, "cross"); oled_p6x8str(0, 2, "out"); oled_p6x8str(0, 3, "circle"); oled_p6x8str(0, 4, "maybe"); oled_p6x8str(0, 5, "fp"); oled_p6x8str(0, 6, "roadtype"); oled_p6x8str(0, 7, "score"); } }
}

从机:

  i```python

<span id=999000></span>---<font face=宋体 color=gray>**● 相关图表链接:**</font>
* [&+](#987000)
* [&+](#987001)
* [&+](#987002)
* [&+](#987003)
* [&+](#987004)
* [&+](#987005)
* [&+](#987006)
* [图4.1.3 wifi和OLED接口原理图](#987007)
* [图4.1.4 舵机接口原理图](#987008)
* [图4.2 驱动板安装图](#987009)
* [图4.2.2 全桥驱动电路原理图](#987010)
* [图4.2.3 编码器电路原理图](#987011)
* [图4.3 五向按键和拨码开关](#987012)
* [图5.1 三岔路原始图像](#987013)
* [图5.2 直道中线合成图](#987014)
* [图4.6 十字中线合成图](#987015)
* [图 6.1 MounRiver Studio界面](#987016)

智能车竞赛技术报告 | 全向行进组 - 哈尔滨工业大学 - 紫丁香四队相关推荐

  1. 智能车竞赛技术报告 | 节能信标组-哈尔滨工业大学紫丁香五队

    简 介: 本设计以第十六届全国大学生智能汽车竞赛节能信标组赛题要求规范为背景,结合3D打印技术.PCB制板技术等制作一辆以英飞凌单片机为核心控制单元的节能信标车模.以ADS为开发环境.利用摄像头获取赛 ...

  2. 智能车竞赛技术报告 | 电磁越野组 - 哈尔滨工业大学 - 紫丁香三队

    简 介: 本文详细介绍了我们为了十六届全国大学生智能车大赛室外越野组准备的车模.车模采用Infineon公司的TC377芯片作为控制器,通过电感采集数据,并离线训练神经网络,后使用nnom部署到单片机 ...

  3. 智能车竞赛技术报告 | 全向行进组 - 沈阳工业大学 - 找不到北队

    简 介: 本文设计的智能车系统以沁恒CH32V103R微控制器为核心控制单元,通过车体上方摄像头以及车体前方的电磁传感器检测赛道信息:通过1024线迷你正交解码编码器检测模型车的实时速度,反馈给微控制 ...

  4. 智能车竞赛技术报告 | 单车拉力组 - 哈尔滨工业大学 - 紫丁香

    简 介: 本设计以第十六届全国智能车大赛为背景,采用大赛组委会统一指定的K型车模,以16位单片机STC16F为核心控制器,实现电单车的平衡并能通过指定赛道元素.以Keil为开发环境,利用陀螺仪获取车模 ...

  5. 智能车竞赛技术报告 | 全向行进组 - 东北林业大学- 进取号E

    参赛学校:东北林业大学 队伍名称:进取号E     参赛队员:郭誉博    张晓龙    卢佰奇    第一章 引言   全国大学生智能汽车竞赛是以智能汽车为研究对象的创意性科技竞赛,是面向全国大学生 ...

  6. 智能车竞赛技术报告 | 节能信标组 - 华南理工大学 - 华工雨花队

    简 介: 本文以第十六届"恩智浦杯"全国大学生智能车竞赛为背景,介绍了华工雨花队在该次比赛节能信标组别的参赛智能车技术成果.本文将从智能车的机械结构设计,硬件电路设计,摄像头寻灯算 ...

  7. 智能车竞赛技术报告 | 单车拉力组 - 长春理工大学- 追风零队 2021

    简 介: 本文介绍了长春理工大学单车拉力组在此次比赛中的成果.本次比赛采用北京科宇通博科技提供的K车模,该车模为两轮平衡摩托车,对选手们产生了极大的挑战.主控芯片采用STC16F40K128,软件平台 ...

  8. 全国大学生智能车竞赛技术报告细则

    简 介: 本文给出了智能车竞赛技术报告的基本要求 关键词: 智能车竞赛,技术报告   根据全国大学生智能汽车竞赛比赛规则要求,各参加全国总决赛队伍需要在比赛之前提交竞赛模型汽车制作技术报告,该技术报告 ...

  9. 智能车竞赛技术报告 | 智能视觉组 - 北京科技大学智能视觉组

    简 介: 本文设计的智能车系统以 为核心控制单元,通过CMOS摄像头检测赛道信息,使用数字摄像头采集赛道的灰度图,通过动态阈值算法生成二值化图像数组,提取黑色引导线,用于赛道识别:通过光电编码器检测模 ...

最新文章

  1. Android仿QQ界面
  2. linux mint(Ubuntu、Debian) 18修改环境变量
  3. 实践hibernate的应用——struts2+hibernate的简单学生信息管理
  4. Haproxy 与 Cookie
  5. Java Currency getInstance()方法与示例
  6. 将数据导出到文本文档 mysql
  7. native8081端口 react_教你轻松修改React Native的端口(如何同时运行多个React Native、8081端口占用问题)...
  8. C#启动前为所有的Form设置统一的Icon
  9. 国内pip源提示“not a trusted or secure host”解决方案
  10. 程序员实用算法 源码_程序员必须知道的十大基础实用算法综述
  11. 算法图解 各部分回忆
  12. 面对强势顾客,怎样应对才好?
  13. 树莓派是什么?能干什么?和单片机有什么区别?
  14. 顶级域名.tk申请与DNSPOD解析
  15. DOS环境下出现“ ‘javac‘不是内部或外部命令,也不是可运行的程序或皮处理文件 “的报错的解决方法
  16. 利用计算机管理档案,初探档案的计算机管理
  17. Windows系统中vscode+MSVC的C++配置
  18. 未开启window无线服务器,win10未开启远程桌面服务器
  19. python可以实现vba功能吗_再见 VBA!神器工具统一 Excel 和 Python
  20. leetcode 202.Happy Number (python3 )

热门文章

  1. 《Two Dozen Short Lessons in Haskell》学习(十三)迭代及重复的常规模式
  2. ReentrantLock和synchronized两种锁定机制
  3. Poj 1151-Atlantis 矩形切割
  4. 项目管理中常用到的简便工具
  5. Java中Runnable和Thread的区别
  6. 无法访问已释放的对象。 对象名:“System.ServiceModel.Channels.HttpChannelFactory+HttpRequestChannel”。...
  7. 在VSO8中使用QT
  8. 解决应用程序配置不正确,程序无法启动
  9. Visual Studio 2005 Web Application Projects 正式推出
  10. Struts2 格式化输出时间