宋 晓,吴云洁
(北京航空航天大学自动化学院,北京100191)
“C语言程序设计”是学生学习的重要课程,在研究生阶段是其开展科研的重要技能之一。然而,目前C语言课程的上机实验环节以书本上和习题集的例题或习题为主,缺乏一个比较接近工程项目实际的并包括界面/文件输入输出操作等在内的综合训练案例。
本文介绍我们在已有的车辆仿真系统基础上,提取部分代码,开发了以车辆队形变换模型为核心的本科生C语言实验案例[1-3]。我们以该实验系统为范例,在实验课环节给学生讲解和示范运用C语言开发实际计算机软件系统的基本过程,并且要求学生运用数组、指针和文件输入输出等编程手段完成解决已有系统的一系列编程问题。
在实际工程中,每3辆车为一编队,可能出现的队形如图1所示,包括横队、纵队、前三角和后三角等。其中标号1是长车,标号2和3是从车。队形变换模型主要考虑的是车队在行进过程中接收到要求变换队形的命令时,驾驶员应该如何执行自己的动作。实际情况中,一般以长车为基准进行队形变换,即长车继续按先前的动作行进,而从车驾驶员执行相应动作力求与长车保持指令下达的队形。
图1 车辆队形
我们可以采用如下的算法:
(1)由于队形变换是以长车为基准的,因此长车驾驶员不需要针对队形变换而改变动作。我们首先估算出长车以当前时刻的速度和加速度运动到下一时刻的位置坐标。
(2)根据上级下达的需要改变的队形信息,计算出其余从车下一时刻要与长车保持指令下达的队形需要达到的位置坐标(x0,y0)。
(3)估算从车以当前时刻的速度和加速度,将偏航角方向调整为朝着点(x0,y0)方向,从当前坐标点(xt,yt)出发,下一时刻能到达的位置坐标为
式中,vt是车辆速度绝对值,Δt是仿真步长,α为连接点(xt,yt)与(x0,y0)的线段与x轴之间的夹角。
为了巩固学生学到的数组、函数、指针、结构体和文件等知识点内容,拓展学生的编程能力,要求学生在已有的车辆机动模型中加入以下功能模块。
(1)定义队形枚举类型和位置点结构:
(2)定义队形变换函数:
该函数中参数1是仿真步长,参数2是输入的队形命令,参数3是长车的当前位置,参数4是输出的从车1下一时刻的位置,参数5是输出的从车2下一时刻的位置。函数体一般要求学生按以上算法进行编写。
在本实例实施时,4个小班(110人)有约20名学生较好地完成了实验设计及编程实现,下面以某一组学生的实验方案为例说明。
此例为车辆编队由纵队变横队,其结果的数据显示了预先规划的队形变换轨迹,如图2所示。图中曲线1是长车轨迹,曲线2和3分别是从车2和3的轨迹。
图2 车辆由纵队变横队
假设长车做匀速直线运动
下面我们以从车2为例详细介绍从车的运动轨迹规划及实现过程。
我们规划从车在队形变换时做图3所示圆弧曲线运动(al≠0时),al是变队形后车与车之间的间距,bl是队形变换开始点A到结束点B之距离。
图3 从车2运动轨迹规划
图3中,从车在AC段做匀角加速度圆周运动。在此加速过程中总的转过角度为
图中,由相似三角形ΔAOD:ΔABE可得到
式中,R=(a2+b2)/4a。进一步,由 θ0=ω0t+αt2/2可得出
代入θi=ω0i+αt2/2(i为循环变量)后,再进行直角坐标变换为
图3中,从车在CB段做匀角加速度圆周减速运动,在此加速过程中角加速度α大小保持不变,方向反向,由θ0=ω0t+αt2/2得出
代入θi=ω0i+αi2/2(i为循环变量)后,再进行直角坐标变换为
从车的直线运动(a=0时)分为匀加速直线运动阶段和匀减速直线运动阶段。
1)匀加速直线运动阶段
由s=vt+at2/2得出
代入si=vi+ai2/2(i为循环变量)后,得到直角坐标:
2)匀减速直线运动阶段
加速度a大小保持不变,方向反向,由s=v0t+at2/2得出
代入si=v0i+ai2/2(i为循环变量)后,得到从车的直角坐标变换公式:
总的来说,本程序的设计较为灵活,应用范围较为广泛。可以做到对于任意输入速度v和步长step进行四种编队之间任意的队形变换,且变换灵活,所需距离较短,不受函数设计的限制。同时,可以在此程序的基础上根据不同的作战环境与要求,改变相关始末坐标(x0,y0)和(x1,y1),也能形成符合特殊要求的轨迹曲线。
我们通过对多名学生在实际上机过程的观察和记录,体会到在实际上机过程中,应根据学生掌握C语言编程技巧的程度实施如下差异化要求。
(1)对有一定基础的学生,只把以上功能需求提出,结构体、函数的定义以及函数体的实现都要求学生自己实现,在学生遇到编程困难时,教师可给予一定提示;
(2)对基础比较差的学生,可以给出结构体和函数的定义,要求其实现函数体。同时,每当其遇到困难时采取讨论的方式进一步讲解,直至学生理解并实现函数功能。
实践证明,本文设计的车辆队形变换案例可以有效地应用于大一或大二本科生的C语言上机实验,是帮助学生理解课程中诸多C语言概念和掌握相应编程技巧的行之有效的教学手段。
[1]汪沛,基于OpenCV库的C语言编程学习方法,[J]南京:电气电子教学学报,2012,34(4)
[2]赵锋,刘进,肖顺平,仿真在“雷达原理与系统”课程教学中的应用,[J].南京:电气电子教学学报,2012,34(1)
[3]侯春望,薄迎春,宋曙芹,“Visual C+ +语言”课程教学改革研究,[J].南京:电气电子教学学报,2012,34(4)