任务 3.5:信号灯消息处理(SPAT)-学生手册_第1页
任务 3.5:信号灯消息处理(SPAT)-学生手册_第2页
任务 3.5:信号灯消息处理(SPAT)-学生手册_第3页
任务 3.5:信号灯消息处理(SPAT)-学生手册_第4页
任务 3.5:信号灯消息处理(SPAT)-学生手册_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

任务3.5信号灯消息处理(SPAT)项目三:云平台测试与数据处理任务3.5:信号灯消息处理(SPAT)【任务导入】大部分驾驶员都会遇到这样的情况:在行驶车辆过程,自动驾驶车辆容易受到环境影响(遮挡、逆光)或自身感知能力下降(感知失效)的情况下,不能准确识别路口交通信号灯信息,导致出现闯红灯或者交通事故,降低交通效率,于是,你的领导安排你在云服务器上完成信号灯消息(SPAT)的实时处理与监控,然后发送给车辆,车辆上的中控屏实时可视化交通信号灯的状态倒计时信息,帮助驾驶员做出及时的决策和调整。你应该如何完成任务呢?同学们思考一下,云服务器处理和监控SPAT消息包括哪些工作任务?【学习目标】素质目标培养学生以人民为中心的服务理念;引导学生树立正确的社会主义核心价值观;培养学生的创新精神和探索精神。知识目标能说出通行允许相位与通行保护相位的区别[K47];能说出Python基础语法的使用方法[K48];能说出Canvas组件的使用方法[K49]。能力目标能完成SPAT消息的处理功能开发[A29];能完成SPAT消息的实时监控功能开发[A30]。【知识准备】通行允许相位与通行保护相位通行允许相位(Permissive-GreenPhase)和通行保护相位(Protected-GreenPhase)是交通信号控制中的两种不同类型的交通信号灯相位,它们各自有不同的定义和作用。通行允许相位这是一种非强制性的绿灯相位,在这种相位下,车辆被允许进入交叉路口,但必须在进入之前确保安全。换句话说,车辆需要在进入交叉路口前自行判断是否有足够的时间安全通过。通行允许相位通常用于交通量较低的路口,或者作为交通信号灯配时的一部分,以减少等待时间和提高交通流的灵活性。在这种相位下,其他方向的交通可能已经获得绿灯,因此进入交叉路口的车辆需要谨慎行驶,避免与对向车辆发生冲突。通行保护相位这是一种强制性的绿灯相位,在这种相位下,车辆在进入交叉路口时拥有通行权,并且其他方向的交通信号灯显示为红灯,确保不会与交叉的车辆发生冲突。通行保护相位提供了明确的通行权,车辆可以在绿灯期间安全地通过交叉路口,而不需要担心对向车辆的干扰。这种相位通常用于交通量较高的主要道路,以确保交通流的连续性和安全性。Python语法下面介绍进行本节开发任务会涉及的相关的Python语法。信号灯消息的可视化功能依然是基于Python第三方库Tkinter实现,下面也会介绍Tkinter库的相关方法。局部变量与全局变量在Python中,变量可以按照作用域分为局部变量和全局变量:局部变量局部变量是在函数内部定义的变量,它们的作用域仅限于函数内部。当函数执行时,局部变量被创建,函数执行完成后,这些变量被销毁。局部变量只能在其定义的函数内部被访问。局部变量的使用示例:defmy_function():local_var="Iamlocal"#这是一个局部变量print(local_var)my_function()#输出:Iamlocalprint(local_var)#报错:NameError:name'local_var'isnotdefined全局变量全局变量是在函数外部定义的变量,它们的作用域是全局的,可以在程序的任何地方被访问和修改。即使在函数内部,全局变量也可以被访问,但如果想在函数内部修改全局变量的值,需要使用global关键字来声明。全局变量的使用示例:#这是一个全局变量global_var="Iamaglobalvariable"defprint_global_var():#直接访问全局变量print(global_var)defmodify_global_var():#使用global关键字声明我们要修改的是全局变量globalglobal_varglobal_var="Ihavebeenmodified!"#调用函数打印全局变量的值print_global_var()#输出:Iamaglobalvariable#修改全局变量的值modify_global_var()#再次调用函数打印全局变量的值print_global_var()#输出:Ihavebeenmodified!#在函数外部也可以访问和修改全局变量print(global_var)#输出:Ihavebeenmodified!global_var="Iammodifiedagain!"print(global_var)#输出:Iammodifiedagain!局部变量与全局变量的区别作用域:局部变量的作用域限于函数内部,而全局变量的作用域是整个程序。生命周期:局部变量在函数调用结束后会被销毁,全局变量则持续存在直到程序结束。访问权限:局部变量只能在其定义的函数内部访问,全局变量可以在任何地方访问,但修改需要使用global关键字。命名冲突:如果局部变量和全局变量同名,在函数内部访问的是局部变量,全局变量将被局部变量遮蔽。类型转换——int()在Python中,类型转换通常指的是将一个数据类型转换为另一个数据类型。Python提供了许多内置函数来进行类型转换,包括int(),float(),str(),list(),tuple(),dict(),set(),bool()等。本节任务主要讲解int()。int()用于将一个数字或数字表示的字符串转换为一个整数(int)对象。这个函数还可以用于进行数字类型转换,比如将浮点数向下取整为整数,或者将布尔值转换为整数(True转换为1,False转换为0)。将字符串转换为整数s="123"num=int(s)print(num)#输出:123print(type(num))#输出:<class'int'>注意:如果传递给int()的字符串不能被解析为一个整数,Python将抛出一个ValueError异常。将浮点数转换为整数(向下取整)f=123.456num=int(f)print(num)#输出:123print(type(num))#输出:<class'int'>将布尔值转换为整数b=Truenum=int(b)print(num)#输出:1b=Falsenum=int(b)print(num)#输出:0continue与break在Python中,continue和break是两个用于控制循环流程的关键字,但它们的行为和功能有所不同。continue在Python中,continue是一个关键字,用于跳过当前循环迭代中的剩余代码,并立即开始下一次迭代。这通常用于在循环内部基于某个条件跳过某些迭代。以下是一个简单的示例,说明如何在Python中使用continue语句:foriinrange(1,11):#从1到10的循环ifi%2==0:#如果i是偶数continue#跳过当前迭代,不执行下面的print语句print(i)#打印奇数#输出结果#1#3#5#7#9在上面的示例中,有一个从1到10的循环。对于每个循环迭代,会检查当前的数字i是否是偶数。如果是偶数(即i%2==0),则continue语句被执行,这会跳过当前的迭代并立即开始下一次迭代,因此不会执行print(i)语句。如果i是奇数,则print(i)语句会被执行,因此只打印出奇数。需要注意的是,continue语句只能用在循环内部(如for循环或while循环),并且它不会终止整个循环,而只是跳过当前迭代的剩余部分。如果你想要在满足某个条件时终止整个循环,你应该使用break语句。break在Python中,break语句用于立即终止当前循环(无论是for循环还是while循环)。当程序执行到break语句时,它会跳出循环,不再执行循环体中的剩余代码,也不会再检查循环条件是否满足,而是直接跳转到循环后面的代码。以下是一个简单的示例,说明如何在Python中使用break语句:foriinrange(1,11):ifi==5:#如果i等于5break#终止循环print(i)#打印小于5的数#输出结果#1#2#3#4在这个例子中,break语句被用于在i等于5时终止循环,因此只打印了小于5的数。Canvas组件Tkinter的Canvas组件是一个强大的工具,用于在GUI应用程序中绘制图形、文本和图像。以下是Canvas组件的使用方法:创建Canvas首先,需要创建一个Canvas实例,并将其添加到Tkinter窗口中:importtkinterastkroot=tk.Tk()canvas=tk.Canvas(root,width=500,height=400)canvas.place(x=50,y=50)#将Canvas放置在窗口的固定位置1)Canvas()方法说明root是Canvas的父窗口width和height分别是Canvas的宽度和高度2)place()方法说明x和y是Canvas左上角相对于父窗口的位置绘制矩形在Python的Tkinter库中,canvas.create_rectangle()方法用于在Canvas上绘制一个矩形。以下是这个方法的详细用法说明:canvas.create_rectangle(x1,y1,x2,y2,**options)1)参数说明①x1:矩形左上角的x坐标②y1:矩形左上角的y坐标③x2:矩形右下角的x坐标④y2:矩形右下角的y坐标⑤**options:可选的关键字参数,用于设置矩形的样式和属性,以下是一些常用的选项参数:fill:设置矩形的填充颜色。例如:"red"、"blue"或"#FF0000"(红色)。outline:设置矩形边框的颜色width:设置矩形边框的宽度tag:设置此矩形的标签,可以分配一个或多个标签(tags),以便后续可以通过标签来引用或修改它state:设置矩形的状态,如"normal"或"disabled"⑥返回值:此方法返回一个整数,该整数是此矩形的唯一标识符(通常被称为“项ID”或“itemID”),可以用于后续修改或删除此矩形。2)示例importtkinterastkroot=tk.Tk()root.title("CanvasRectangleExample")canvas=tk.Canvas(root,width=400,height=300)canvas.place(x=50,y=50)#创建一个填充颜色为红色,边框颜色为黑色,边框宽度为2的矩形rect_id=canvas.create_rectangle(50,50,150,150,fill="red",outline="black",width=2)#可以通过itemconfig()或itemconfigure()方法来修改矩形(例如,改变填充颜色),注意这两个方法实际上是相同的,只是命名上的简写和完整写法之分。canvas.itemconfig(rect_id,fill="blue")root.mainloop()在上面的示例中,首先创建了一个Tkinter窗口和一个Canvas画布。然后,使用create_rectangle()方法在Canvas上绘制了一个矩形,并设置了其填充颜色、边框颜色和边框宽度。还获取了矩形的项ID,并使用itemconfig()方法通过项ID来修改了矩形的填充颜色。最后,启动Tkinter的事件循环来显示窗口和Canvas。绘制椭圆/圆形在Python的Tkinter库中,canvas.create_oval()方法用于在Canvas上绘制一个椭圆或者圆(当椭圆的宽度和高度相等时)。以下是对create_oval()方法的详细用法说明:canvas.create_oval(x1,y1,x2,y2,**options)1)参数说明①x1,y1:椭圆边界框的左上角的x和y坐标②x2,y2:椭圆边界框的右下角的x和y坐标。如果x1==x2且y1==y2,则绘制一个圆③**options:可选的关键字参数,用于设置椭圆的样式和属性,以下是一些常用的选项参数:fill:椭圆的填充颜色。默认为空字符串,表示不填充outline(或bordercolor):椭圆边框的颜色。默认为黑色width:椭圆边框的宽度。默认为1个像素tag:给椭圆分配一个或多个标签,以便后续引用或修改state:设置椭圆的状态。例如"normal"(默认值)或"hidden"dash:定义一个虚线样式来绘制椭圆的边框stipple:定义一个位图用于在椭圆的边框上创建一个图案效果④返回值:此方法返回一个整数,即椭圆的唯一标识符(也称为“项ID”或“itemID”),该标识符可以用于后续修改或删除此椭圆2)示例importtkinterastkroot=tk.Tk()root.title("CanvasOvalExample")canvas=tk.Canvas(root,width=400,height=300)canvas.place(x=50,y=50)#创建一个蓝色的椭圆,填充颜色为浅蓝色,边框颜色为深蓝色oval_id=canvas.create_oval(50,50,150,150,fill="lightblue",outline="darkblue",width=2,tags="lightblueOval")#创建一个红色的圆,没有边框circle_id=canvas.create_oval(200,100,250,150,fill="red",tags="redCircle")#可以通过itemconfig()或itemconfigure()方法来修改椭圆或圆的属性canvas.itemconfig(oval_id,fill="green")#将椭圆的填充颜色改为绿色#隐藏圆canvas.itemconfig(circle_id,state="hidden")root.mainloop()在上面的示例中,创建了一个Tkinter窗口和一个Canvas,并使用create_oval()方法在Canvas上绘制了一个椭圆和一个圆。还通过itemconfig()方法修改了椭圆的填充颜色,并通过设置状态来隐藏了圆。最后,启动了Tkinter的事件循环来显示窗口和Canvas。绘制文本在Python的Tkinter库中,canvas.create_text()方法用于在Canvas上绘制文本。这个方法可以指定文本的位置、内容、字体、颜色等属性。以下是该方法的详细用法说明:canvas.create_text(x,y,text=string,**options)1)参数说明①x:文本起点的x坐标②y:文本起点的y坐标③text=string(可选):要绘制的文本内容,默认为空字符串④**options(可选):用于设置文本样式和属性的关键字参数,以下是一些常用的选项参数:anchor:文本相对于(x,y)点的对齐方式。例如,"nw"表示文本的西北角(左上角)位于(x,y)点,默认是"center"。fill或color:文本的颜色font:文本字体。你可以使用Tkinter的字体规范字符串,例如"Arial16bold";或者使用元组,例如("Arial",20)justify:文本的多行对齐方式,可以是"left","center"或"right"tag:给文本分配一个或多个标签(tags),以便后续通过Canvas的find_withtag()、itemconfig()、delete()等方法来引用、修改或删除文本项state:设置文本的状态,如"normal"或"hidden"width:文本区域的宽度,用于文本换行。注意,这不会改变字体大小或文本内容的实际大小⑤返回值:此方法返回一个整数,该整数是此文本的唯一标识符(通常被称为“项ID”或“itemID”),可以用于后续修改或删除此文本2)示例importtkinterastkroot=tk.Tk()root.title("CanvasTextExample")canvas=tk.Canvas(root,width=400,height=200)canvas.place(x=50,y=50)#在Canvas上创建一个文本项text_id=canvas.create_text(200,100,text="Hello,World!",fill="blue",font="Arial20bold",tags="blueText")#可以通过itemconfig()或itemconfigure()方法来修改文本(例如,改变文本内容或颜色)canvas.itemconfig(text_id,text="Hello,Tkinter!",fill="red",state="normal")root.mainloop()在上面的示例中,首先创建了一个Tkinter窗口和一个Canvas。然后,使用create_text()方法在Canvas上绘制了一个文本项,并设置了其位置、内容、颜色和字体。另外,还获取了文本的项ID,并使用itemconfig()方法通过项ID来修改了文本的内容、颜色和状态。最后,启动了Tkinter的事件循环来显示窗口和Canvas。图形闪烁效果的实现要实现一个闪烁效果,比如交通信号灯中的绿灯闪烁,你可以使用Python的Tkinter库和threading模块来创建一个独立的线程,该线程控制Canvas上的一个图形(在下面例子中是圆形或椭圆形,代表绿灯)在两种颜色之间切换,从而产生闪烁效果。首先,需要定义全局变量greenFlickerStatus,它将控制闪烁线程的启动和停止。然后,定义green_flicker函数,它将在一个无限循环中运行,根据greenFlickerStatus的值来决定是否改变图形的颜色。importtkinterastkimporttimeimportthreading#定义控制闪烁的全局变量greenFlickerStatus=Truedefgreen_flicker(canvas,light):globalgreenFlickerStatuswhileTrue:ifgreenFlickerStatus:#当greenFlickerStatus为True时,开始闪烁canvas.itemconfigure(light,fill="green")#设置为绿色time.sleep(0.5)#等待0.5秒canvas.itemconfigure(light,fill="white")#设置为白色time.sleep(0.5)#等待0.5秒else:break#如果greenFlickerStatus为False,则退出循环#创建Tkinter主窗口root=tk.Tk()root.title("GreenLightFlashing")#创建Canvascanvas=tk.Canvas(root,width=200,height=200)canvas.place(x=50,y=50)#在Canvas上创建一个圆形作为绿灯green_light=canvas.create_oval(70,70,130,130,fill="white")#创建闪烁线程green_flicker_thread=threading.Thread(target=green_flicker,args=(canvas,green_light))#启动闪烁线程green_flicker_thread.start()#Tkinter事件循环root.mainloop()在这个示例中,首先导入了必要的模块,定义了全局变量greenFlickerStatus,然后创建了green_flicker函数。该函数在一个无限循环中检查greenFlickerStatus的值,并相应地改变green_light的颜色。创建了一个Tkinter窗口,一个Canvas,以及一个圆形代表绿灯。然后,创建了一个线程green_flicker_thread来运行green_flicker函数,并在主线程中启动了Tkinter的事件循环。另外创建线程实例,是通过调用threading.Thread构造函数来实现,Thread类有两个关键字参数:1)target=green_flicker:它指定了当线程启动时应该调用的函数或方法。在这个例子中,green_flicker是一个函数名,它应该定义在某个地方,并准备好在线程中执行。2)args=(canvas,green_light):它接受一个元组,该元组中的元素作为位置参数传递给target指定的函数。在这个例子中,canvas是TkinterCanvas对象的引用,green_light是Canvas上的一个项(一个椭圆形),它们的值将被传递给green_flicker函数。【任务实施】实施准备设备工具准备设备清单表3-4-SEQ表3-4-\*ARABIC1工具设备清单分类名称数量图例规格要求实训设备路杆设备1套/笔记本电脑(含鼠标和充电线)1套Windows7以上系统防护用品工作服1套/安全帽1个/工作手套1双/辅助材料无纺布1张/场地准备(1)锁止路杆设备(2)设置隔离栏(3)放置安全警示牌(4)启动路杆设备SPAT消息处理项目开发确认配时方案在进行SPAT消息处理项目开发前,需确认交通信号灯的配时方案,交通信号灯的配时方案在前面的任务已经配置完成,在信号机上可查看配置的参数,如REF_Ref170378343\h图3-5-1所示。图3-5-SEQ图3-5-\*ARABIC1交通信号灯的配时方案以此配置方案为例,该交叉路口在一个信号周期内,包含两个不同的信号相位。两个信号相位的配时方案相同,绿灯时长(绿灯常亮)为25s,黄灯时长为3s,绿闪时长为3s,信号绿灯采用的是通行保护相位,因此红灯时长为31s(25+3+3),信号配时图如REF_Ref170378349\h图3-5-2所示。图3-5-SEQ图3-5-\*ARABIC2信号配时图确认开发内容注意:此次任务基于Python脚本语言处理SPAT消息,并使用Python的图形用户界面(GUI)库Tkinter来实时显示交通信号灯相位状态。项目内容包括以下几点:(1)云服务器通过MQTT通信接收SPAT消息。(2)云服务器处理SPAT消息。(3)通过Tkinter窗口实时显示交通信号灯相位状态(包括灯色、运行状态和倒计时信息)。REF_Ref170378359\h图3-5-3和REF_Ref170378364\h图3-5-4为简略版Python脚本伪代码(包含全部模块),详细的伪代码请查看gxx_spat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论