未来之星实验指导书第二版Word文档格式.docx
《未来之星实验指导书第二版Word文档格式.docx》由会员分享,可在线阅读,更多相关《未来之星实验指导书第二版Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
图3.6实例化控制类
3、硬件层与协议层对接
硬件通讯层和协议层的类已经实例化,要使他们工作起来还得进行对接。
对接
工作很简单,通过CSerialCom的SetCmd函数接口将协议类地址指针传递进去即可。
图3.7硬件通讯层与协议层对接
4、建立控制按钮
下面我们需要界面上的一些按钮来控制机器人的具体行动。
在主窗体上建立5
个按钮控件,分别对应前进、后退、左转、右转和刹车。
图3.8绘出按钮
图3.9前进按钮控件属性
图3.10后退按钮控件属性
图3.11左转按钮控件属性
图3.12右转按钮控件属性
图3.13刹车按钮控件属性
图3.14修改后的界面
图3.15添加映射函数
相应的可以添加其他四个按钮的响应函数,如下图:
[小结]
图3.16函数体
我们已经能够控制机器人进行基本的移动了,要实现自主功能还需要借助传感器。
实验四基于避碰开关的漫游行为设计
能从机器人底层获取传感器信息并显示在软件界面上,为机器人决策提供依据。
5、配置了避碰开关且工作正常
1、按实验三建立已包含串口类、协议类和行为类的对话框界面。
2、绘制窗体显示控件,添加相关变量。
为了直观的显示返回数据,我们需要在界面上设置四个图标。
这里我们使用Picture控件。
为了形象的显示避碰开关的状态。
我们首先给程序新建两个图标,红色的表示避碰开关按下,绿色表示避碰开关未比按下。
图4.1避碰开关未按下的图标
图4.2避碰开关按下时的图标
图4.3避碰开关未启用时的图标
添加完图标后,为了便于使用。
我们在主对话框类CFstarTestDlg中添加三个变
量保存图标。
如图4.4。
其中类CFstarCmd中应经添加,仅需要初始化,如图4.5。
图4.4添加图标变量
图4.5图标变量的赋值
添加完图标变量后,在界面上按下面步骤添加控件。
首先删除“确定”和“取
消”按钮。
图4.6添加控件
其中“避碰开关”“障碍方位”为静态文本控件,只需修改属性-〉标题即可。
图
中的4个灰色方框即为Picture控件。
属性设置如下:
图4.7左前方避碰开关对应的Picture控件属性
图4.8右前方避碰开关对应的Picture控件属性
图4.9左后方避碰开关对应的Picture控件属性
图4.10右后方避碰开关对应的Picture控件属性
图4.11漫游行为开始按钮属性
图4.12障碍方位静态文本控件属性设置
添加完控件后,为四个Picture控件和静态文本控件添加相关变量。
图4.13给控件添加相关变量
3、自动显示功能的实现
给“漫游开始”按钮添加消息响应函数。
这里只用一个按钮同时实现行为开始
和终止功能,具体实现见下图。
图4.14添加按钮消息响应函数
图4.15按钮消息响应函数的实现
4、编译运行程序。
打开对应的端口后。
点击“漫游开始”后,机器人即可开始漫游行为,同时按钮文本变为“终止漫游”。
机器人行进中,如果避碰开关触到障碍,机器人就会后退并改变前进方向。
再次点击按钮,即可终止漫游行为。
如果想要了解漫游执行的具体策略,可以在CFstarCmd类中,m_AwayObstacle函数
中查看源代码。
因为只有4个避碰开关,总共只有16种状态,在函数m_AwayObstacle
中,分别对16种情况作了处理。
为了防止机器人进入死胡同,针对左前方和右前方避碰开关按下的状态做了特殊处理——即如果避碰开关不停的在左前和右前避碰开关被按下的状态之间循环,程序将加入一个扰动,使机器人跳出死循环。
现在我们已经利用避碰开关实现了避障行为,下一节我们将讲述利用红外传感器进行边缘检测的行为。
实验五基于红外传感器的边缘检测行为设计
学习红外传感器的使用,应用红外传感器返回信息进行简单的决策。
。
5、配置了红外传感器且工作正常
1、本实验可以在实验三的基础上进行,只需按实验四添加图标变量即可,具体内容参考实验四。
下面以实验四为基础来讲述本实验的步骤。
所以请先按实验四建立程序。
2、绘制窗体显示控件,添加相关变量
“红外传感器”静态文本控件只需设置标题即可。
其他三个控件的设置和界面
布局如下图。
图5.1左边红外传感器图标属性
图5.2左边红外传感器图标属性
图5.4按钮属性
图5.5给图标关联变量
3、添加消息响应函数
编辑完控件后我们需要添加消息响应函数。
与实验四相似,我们仍然只用一个
按钮同时实现行为开始和终止功能。
图5.2行为类对象
图5.3消息响应函数的实现
打开对应的端口后,点击“边缘检测开始”后,机器人即可开始边缘检测行为,同时按钮文本变为“终止边缘检测”。
机器人行进中,如果红外传感器采集到的值大于设定的阈值,机器人就会后退并改变前进方向。
如果想要了解边缘检测执行的具体策略,可以在CFstarCmd类中,m_ForEdge函数中查看源代码。
因为只有2个避碰开关,总共只有4种状态,在函数m_ForEdge中,分别对4种情况作了处理。
要说明的是,红外传感器返回的数据为0-255,在该行为中,用一个阈值分成两种状态——有返回和无返回。
有返回证明没有检测到边缘,无返回证明存在边缘。
这里的阈值在不同环境下需要重新设置。
m_ForEdge中的阈值就是判断条件中的3。
我们已经完成了边缘检测行为的练习。
到这里,我们已经用到了两种传感器,
避碰开关和红外传感器。
接下来,我们将用到超声传感器。
实验六基于超声传感器的避障行为设计
学习使用超声传感器,使用传感器返回的数据进行逻辑决策。
1、装有windows系统的PC一台2、安装VisualC++6.03、硬件上与机器人建立通讯连接
4、机器人处于开启状态
5、配置了超声传感器且工作正常
1、本实验仍然可以从实验三出发,但为了保持连续性,我们从实验五出发。
2、绘制界面控件,并关联变量。
在界面添加一个静态文本控件用于显示超声传感器检测到的距离,然后添加一
个按钮用于行为的开始和结束。
“超声传感器”和“cm”静态文本控件只需设置相
应的标题即可。
如图所示:
图6.1用于显示超声检测到的距离的静态文本属性
图6.2按钮控件属性
图6.3为静态文本关联变量
为按钮“超声避障”添加消息响应函数,实现超声避障行为。
图6.4为按钮添加消息响应函数
图6.5消息响应函数具体内容
打开对应的端口后,点击“超声避障”后,机器人即可开始超声避障行为,同时按钮文本变为“终止避障”。
机器人行进中,如果超声传感器采集到的值大于设定的阈值,机器人就会左转。
再次点击按钮,即可终止避障行为。
如果想要了解超声避障执行的具体策略,可以在CFstarCmd类中,m_UsAwayObstacle
函数中查看源代码。
这一章我们学习了使用超声传感器实现避障行为。
接下里我们使用超声传感器来进行跟踪。
实验七基于超声传感器的跟踪行为设计
学习使用控制类使机器人在陀螺仪导航状态下运动。
1、按实验六建立程序。
2、绘制界面控件
有了实验六的基础,本实验实现起来非常简单。
只需添加一个按钮即可。
如图所示:
图7.1控制界面添加控件
图7.2添加消息响应函数
图7.2消息响应函数内容
打开对应的端口后,点击“超声跟踪”后,机器人即可开始超声跟踪行为,同时按钮文本变为“终止跟踪”。
机器人行进中,如果超声传感器采集到的值大于设定的较大阈值,机器人就会前进;
该值位于较大阈值和较小阈值之间,机器人停止;
小于较小阈值,机器人呢后退。
如果想要了解超声跟踪执行的具体策略,可以在CFstarCmd类中,m_UsFollow函数中查看源代码。
这一张我们实现了超声跟踪行为。
到这里,我们应用超声传感器进行了两个行为的练习。
接下来,我们将学习光敏传感器的使用和寻光行为的实现。
实验八基于光敏的寻找光源行为设计
5、配置了光敏传感器并且工作正常
1、本实验以前面的实验七作为基础,实验前请先建立实验七的程序。
本实验需要添加四个静态文本控件显示两个光敏返回的数值,他们的差值和均值,另外再添加一个按钮用于行为的开始和终止。
其他的其标识作用的静态文本控件,如“光敏传感器”“左”“右”“均值”“差值”只需按照图示改变其标题属性即可。
图8.1左光敏返回数值静态文本属性
图8.2右光敏返回数值静态文本属性
图8.3左右光敏均值静态文本属性
图8.4左右光敏差值静态文本属性
图8.5按钮属性然后给四个静态文本关联变量,如下图:
图8.6为四个静态文本控件添加的关联变量
3、添加消息响应函数。
图8.7添加消息响应函数
图8.8消息响应函数实现
4、编译运行程序
打开对应的端口后,放置一个比环境光更亮的光源在机器人光敏可感知范围内,然后点击“寻光开始”后,机器人即可开始寻光行为,同时按钮文本变为“终止寻光”。
机器人将根据两个光敏采集到的光线强度进行调整,向着光线强的地方前进。
移动光源,可以看到机器人可以跟着调整前进方向。
如果想要了解寻光行为执行的具体策略,可以在CFstarCmd类中,m_Forligh函数中查看源代码。
寻光行为中需要人为设置两个阈值,即CFstarCmd类中的minLgt(最小阈值)和maxLgt(最大阈值)。
当光敏采集到的光强小于最小阈值,机器人将原地转圈;
大于最大阈值时,机器人做小幅度的调整,使自己面向光源;
位于最小阈值和最大阈值之间时,机器人将根据左右光敏的数值差做实时调整,向着光源前进。
这一章我们实现了机器人的寻光行为。
接下来在实现更高级行为之前,我们先
来学习如何安装相关的SDK。
实验九视频图像采集
学习使用视频类对USB视频设备进行图像采集。
2、安装VisualC++6.0
3、正确安装DirectX9.0SDK完整包
4、USB摄像装置
1、建立新工程
用VisualC++新建一个MFC对话框工程。
将通用类里的所有文件拷贝到工程目录下,并将这些文件引入新工程中。
设置工程属性,点击VisualC++的“工程”菜单,选择“设置”。
在弹出的选项
卡中选择“连接”,在“对象/库模块”中输入DirectShow标准库路径。
如果DirectXSDK包安装时使用的是默认路径,则Debug编译的标准连接库是:
C:
\DXSDK\Samples\C++\DirectShow\BaseClasses\Debug\strmbasd.lib
Release编译的标准连接库是:
\DXSDK\Samples\C++\DirectShow\BaseClasses\Release\strmbasd.lib需要注意的是这个路径和文件名是严格区分大小写的,务必保证准确无误。
在StdAfx.h文件里包含三个DirectShowSDK的头文件:
#include<
atlbase.h>
streams.h>
qedit.h>
编译一下工程,排除编译上的错误。
图9.1包含相应头文件
图9.2工程设置
图9.3新建对话框
2、添加界面控件
在界面上划定一个范围,限定视频图像的显示位置和大小。
这里我们使用一个Picture控件做显示。
设置控件ID为IDC_PREVIEW,类型为矩形。
为了传递这个控件的位置参数,需要在类向导里为它映射一个CStatic类型的控件变量。
为视频预览的开启和关闭各自添加一个按钮,并生成相应的映射函数。
图9.4添加界面控件
图9.5预览空间属性
图9.6映射控件变量
3、视频流捕捉的实现
为了实现视频流的捕捉,我们的窗体程序中必须要有一个CCaptureVideo对象,所以得在窗体类头文件里包含CCaptureVideo类头文件。
由于CCaptureVideo类中包含了前面用到的CFstarCmd类对象,所以如果不想修改代码的话,请添加相关的文件。
这里不再赘述。
图9.7包含视频类头文件
CCaptureVideo类的视频捕捉有多个模式,每个模式所搭建的视频流Graph都有所不同,为了统一处理,我们在窗体里只保留一个CCaptureVideo类型的指针,在需要进行视频捕捉的时候才生成具体对象,捕捉结束时将对象连同体内的Graph销毁。
图9.8生成对象指针
图9.9初始化指针
视频类的启动接口是Create函数,将视频设备编号、显示控件指针以及捕捉模式作为参数传递进去。
调用该函数后,CCaptureVideo对象会启动对应编号的视频设备的视频流捕捉工作,并将画面显示与指定的显示控件上。
视频类的关闭接口是Stop函数,调用后即刻停止捕获视频。
为了保证视频设备的成功绑定,每次重启视频时请将原来的CCaptureVideo对
象删除,生成新的对象来打开视频。
图9.10视频捕获开启操作(“开启视频”按钮消息响应函数)
图9.11视频捕获关闭操作(“关闭视频”按钮消息响应函数)
4、图像接口
CCaptureVideo类里有个CSampleGrabberCB类型对象mCB,这是视频流Graph里的一个Filter,它的主要作用就是把视频流中的图像数据暴露出来,以供我们使用。
CSampleGrabberCB类里图像数据的接口是BufferCB函数,该函数里包含了我们对视频的操作,基于图像的行为调用、图像的远程传输以及静态图像的截取都在这个函数里进行。
这一章实验,我们实现了数字图像的捕获,最后还简要介绍了视频图像的接口函数,为我们今后基于图像的各种研究奠定了基础。
基于图像的高级应用,我们将在后面的高级教程中提到,有兴趣的用户可以先进行一些尝试。