VoyagerII软件基础教程Word下载.docx

上传人:b****4 文档编号:16390546 上传时间:2022-11-23 格式:DOCX 页数:33 大小:1.50MB
下载 相关 举报
VoyagerII软件基础教程Word下载.docx_第1页
第1页 / 共33页
VoyagerII软件基础教程Word下载.docx_第2页
第2页 / 共33页
VoyagerII软件基础教程Word下载.docx_第3页
第3页 / 共33页
VoyagerII软件基础教程Word下载.docx_第4页
第4页 / 共33页
VoyagerII软件基础教程Word下载.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

VoyagerII软件基础教程Word下载.docx

《VoyagerII软件基础教程Word下载.docx》由会员分享,可在线阅读,更多相关《VoyagerII软件基础教程Word下载.docx(33页珍藏版)》请在冰豆网上搜索。

VoyagerII软件基础教程Word下载.docx

这里我们可以看到VisualC++的界面主要分为三个栏,左侧的工作区视图、右侧的代码编辑客户区以及下侧的信息输出窗口。

工作区可以按类或文件的方式组织程序的源代码,另外还可以查看工程里的资源(如显示窗体、图标、图片等)。

代码编辑客户区在工作区选择类视图和文件视图时可以显示类和文件里的源代码,在工作区选择资源时可显示资源的内容。

图1.1VisualC++编程环境

3、类视图

在左侧工作区下侧选取类视图,双击各个类察看客户区的代码显示,这里可以看到类组织形式的特点:

双击类名显示的是类的声明,双击类的成员函数则进入该成员函数的具体定义。

4、资源视图

在左侧工作区下侧选取资源视图,展开各项,双击察看客户区里窗体图表等资源,这里主要是Dialog对话框资源和Icon图标资源。

5、文件视图

在左侧工作区下侧选取文件视图,展开各项,双击察看客户区里各文件的内容显示。

这里可以看到与类组织形式的异同,.h头文件里多是类的声明,而类的定义则在对应的.cpp文件里。

6、程序编译

按下键盘F7,在输出窗口里观察程序的编译组建信息。

正常情况下编译结果应该显示0error(s),0warning(s),如果出现error,则是出现语法错误或是连接错误,是无法运行的;

如果出现warning,则不一定是致命错误,比较多见的是类型转换导致的数值部分信息的丢失,但也需认真排查。

[小结]

这一个试验主要是让我们对如何在VisualC++里进行一个程序的代码编写和组建过程有个大概的认识。

下一个实验我们将自己动手编写一个简单的界面程序。

学会用VisualC++的编译环境编写一些简单的窗体程序,为后续实验确定界面。

2、建立对话框界面程序

MFC是MFC是MicrosoftFoundationClass缩写,即微软基础类库,是一个架构在WindowsAPI之上C++类别库(C++ClassLibrary),里面包含了很多现成的窗体控件类,意图使Windows程式设计过程更有效率,更符合物件导向的精神。

VisualC++里可以创建的MFC窗体程序有三种:

对话框、单文档视图和多文档视图。

其中以对话框结构最为简单,所以我们就以对话框作为我们的第一个Windows视窗程序。

按照如下步骤:

点击左上角菜单项“文件”→“新建”→选择MFCAppWizard→输入工程名:

VoyTest→确定

图2.1选择工程性质

图2.2选择界面类型

图2.3设置对话框属性

图2.4生成的对话框界面

 

3、建立控件

窗体已经建立,下面我们可以在上面添加我们需要的按钮和编辑框等控件。

下面我们为“打开串口”功能建立一个编辑框与按钮,编辑框用于输入串口号,按钮用于启动串口程序。

首先,我们找到VisualC++的控件工具栏。

图2.5控件工具栏

点击按钮控件

,在对话框上按下鼠标左键拖动,即可画出一个按钮。

鼠标右击该按钮,在弹出的菜单里选择“属性”,即可以修改该按钮控件的资源ID和显示文字,因为我们后面需要为这个按钮映射出一个函数,所以这里最好将资源ID修改为容易识别而没有其他重复的单词,这里改为“IDC_OPEN”。

然后我们再绘制一个编辑栏控件

,将其资源ID改为“IDC_PORT”,下一步我们需要为它映射一个变量,记录输入的串口号。

图2.6控件菜单

图2.7按钮控件属性

图2.8编辑框控件属性

4、添加映射变量

Windows的窗体程序的交互是基于消息映射机制,比如我们的编辑框可以映射一个变量,我们在编辑框里输入数据后,这个数据可以传递到映射变量中;

而我们的按钮可以映射出一个函数,当我们在运行的窗体点击这个按钮时,相应的映射函数就被执行。

映射变量的添加在类向导里进行,点击菜单栏的“察看”,选择“建立类向导”。

在类向导里,

Project选择工程名:

VoyTest。

Classname选择主对话框类CVoyTestDlg

选择MemberVariables选项卡。

找到刚才定义的编辑框ID:

IDC_PORT。

点击右侧的AddVariable按钮,为其映射一个UINT或者int类型的变量,这里的变量名我们定为m_nPort。

图2.9类向导

图2.10类向导添加映射变量

5、添加映射函数

按钮的映射函数添加较为方便,只需要在资源预览中双击按钮控件,便会弹出一个AddMemberFunction的对话框。

这里我们使用默认的函数名OnOpen,点击OK进入函数体内编写我们的响应函数。

这里我们先用UpdateData函数从编辑框获取m_nPort的值,然后用一个CString对象将这个变量显示出来。

图2.11映射函数

图2.12映射函数体

图2.13运行效果

6、从静态控件输出。

现在我们已经建立了一个具有界面输入输出功能的窗体程序,下一个实验我们将学习如何用这个程序控制机器人。

在前一实验基础上,利用现有的框架代码,学习基本的机器人控制。

3、安装与机器人控制方式相对应的无线通讯设备

4、机器人处于可运行状态

1、按实验二建立基本的对话框界面。

2、引入控制类

将IPhy.hSerialCom.hSerialCom.cppVoyCmd.hVoyCmd.cppIBehavior.hDemo.hDemo.cpp拷贝到工程文件夹内(VoyTest)。

向工程中引入串口类、协议类和行为类,即刚才拷贝的几个文件,这些类即可构成一个完整的机器人控制系统。

要使用这些类,我们还需要将其实例化,即在主窗体内创建他们的对象。

首先在主窗体头文件引入控制类的头文件,然后在主窗体类的声明里生成三个类的对象。

图3.1向工程中添加文件

图3.2选取添加的文件

图3.3包含头文件

图3.4实例化控制类

3、硬件层与协议层对接

硬件通讯层和协议层的类已经实例化,要使他们工作起来还得进行对接。

对接工作很简单,通过CSerialCom的SetCmd函数接口将协议类地址指针传递进去即可。

图3.4硬件通讯层与协议层对接

4、建立控制按钮

下面我们需要界面上的一些按钮来控制机器人的具体行动。

在主窗体上建立5个按钮控件,分别对应前进、后退、左转、右转和刹车。

图3.5绘出按钮

图3.6前进按钮控件属性

图3.7后退按钮控件属性

图3.8左转按钮控件属性

图3.9右转按钮控件属性

图3.10刹车按钮控件属性

图3.11修改后的界面

图3.12添加映射函数

图3.13函数体

下面是各种动作的控制指令,将其添加到相应按钮的映射函数中即可。

m_Cmd.SetBothMotorsSpeed(100,100);

//前行

m_Cmd.SetBothMotorsSpeed(-100,-100);

//后退

m_Cmd.SetBothMotorsSpeed(-100,100);

//左转

m_Cmd.SetBothMotorsSpeed(100,-100);

//右转

m_Cmd.Brake

(1);

//刹车

我们已经能够控制机器人进行基本的移动了,要实现自主功能还需要借助传感器。

能从机器人底层获取传感器信息并显示在软件界面上,为机器人决策提供依据。

1、按实验三建立已包含串口类、协议类和行为类的对话框界面。

2、绘制窗体显示控件。

为了直观的显示返回数据,我们需要一个控件来显示传感器数据。

这里我们使用ListBox控件

,在界面上绘制出该控件并在类察看向导里为其映射一个CListBox类型变量m_cShowList。

通过这个变量我们可以对界面上的ListBox控件进行一系列操作,如用其成员函数AddString往ListBox控件里添加显示字符串。

对ListBox控件的操作我们稍候介绍,在界面上还需要一个编辑框控件来输入传感器扫描时间,以及按钮控件来激活和停止自动扫描功能。

如图绘制完控件之后,为编辑框添加映射变量,为按钮添加映射函数。

在激活函数里,调用协议层对象的自动扫描函数:

m_Cmd.AutoQueryUSonic(m_nUSonicTime);

//自动查询超声信息

m_Cmd.AutoQueryInfraRed(m_nInfraRedTime);

//自动查询红外信息

里面的参数就是自动查询的循环周期,以毫秒为单位。

控制程序按这个周期发送查询指令,每一个查询指令机器人都会返回相应的传感器数据。

图4.1绘制界面控件

图4.2修改ListBox控件ID

图4.3修改ListBox控件属性

图4.4为ListBox控件映射变量

图4.5映射变量列表

图4.6激活按钮的函数体

3、自动显示功能的实现

查询指令发送后,机器人直接将数据返回到协议层对象m_Cmd的成员数组ValUSonic[24](对应超声数据)ValInfrared[24](对应红外数据)。

我们可以在主窗体中使用定时器,按照查询周期去读取和显示传感器信息。

在激活函数里调用SetTimer()函数启动定时器,这里我们使用0号定时器显示超声传感器信息,使用1号定时器显示红外传感器信息;

在类察看向导里为主窗体添加定时器溢出消息WM_TIMER的映射函数OnTimer()。

在这个映射函数体里添加传感器数据的读取和显示代码;

可以看到在这里,只对1号传感器信息进行了显示。

将其格式化成一个字符串对象,然后添加到ListBox控件里进行显示。

图4.7添加定时器响应消息

4、自动查询的停止

可以对协议层对象的自动查询函数的参数赋值来控制自动查询的启动和停止:

当参数为0时,停止自动查询;

当参数非0时,自动查询启动。

图4.8停止查询函数体

现在我们已经能自动获取传感器信息了,下一个实验我们学习如何根据传感器信息设计机器人的一些自主行为。

学习在现有框架下实现一些简单的机器人自主行为,为复杂决策奠定基础。

1、按实验四建立能自动查询传感器数据的对话框界面。

2、编写行为逻辑

我们在实验三中添加的CDemo类就是一个空的行为类,里面有各个传感器信息的响应函数体,每当传感器信息返回到协议层时,协议层就会试图调用行为层的相应响应函数。

所以我们只需要在特定的响应函数体内编写相应的行为逻辑即可。

行为逻辑的一个重要依据就是机器人当前的运动状态,也就是参数里的nState,整个行为规划应该以这个运动状态进行分类处理。

图5.1CDemo类结构

AfterSendCommand()//发送指令完毕后的处理函数

AfterUpdateVideoSample()//接收到一桢图象后的处理函数

AfterUpdateUSonic()//超声传感器信息更新后的处理函数

AfterUpdateInfrared()//红外传感器信息更新后的处理函数

switch(nState)

{

caseSTOP:

//机器人处于停止状态

break;

caseFORWARD:

//机器人处于往前直行状态

caseBACKWARD:

//机器人处于往后直行状态

caseRIGHT:

//机器人处于原地右转状态

break;

caseRIGHTFRONT:

//机器人处于右转前行状态

caseLEFT:

//机器人处于原地左转状态

caseLEFTFRONT:

//机器人处于左转前行状态

}

3、实例化行为类对象

编写完行为类后,我们需要将其实例化。

如同硬件通讯类和协议类的实例华过程一样,在主界面类(CVoyTestDlg)的声明里(.h头文件)添加CDemo类型对象m_Demo。

图5.2行为类对象

4、与协议类对接

行为类对象需要依附协议类对象才能起作用,通过协议类的SetBehavior函数完成对接工作。

5、行为的激活与停止

避障行为以传感器信息为基准,将行为类接到协议类即完成行为的激活,打开传感器自动查询功能机器人便按照设计逻辑开始动作。

停止行为的方式有两种,一是通过调用协议类的SetBehavior函数传递一个空指针,断开行为层与协议层的连接;

二是停止传感器的自动查询功能。

需要注意的是仅单纯的刹车并不能停止行为层的工作。

到这里,我们不仅已经能够控制机器人做一些移动动作,还能够通过传感器采集周围的信息,最后融合起来编写一些简单的自主逻辑。

学习使用控制类读取机器人上电子罗盘的数据信息,为机器人决策提供依据。

3、硬件上与机器人建立通讯连接

4、机器人处于开启状态

5、机器人平台安装了电子罗盘装置

1、按实验五建立已包含串口类、协议类和行为类的对话框界面。

2、绘制界面控件

在界面添加一个输入框用于输入罗盘查询周期,添加一个“激活”和一个“停止”按钮,用于控制罗盘数据的读取操作。

另外添加一个静态文本对编辑框进行说明。

图6.1控制界面添加控件

为编辑框添加映射变量,用于获取查询周期,为按钮添加映射函数,以便添加操作函数。

图6.2添加映射变量

3、自动查询与数据显示的实现

电子罗盘的自动查询只需要调用CVoyCmd类的AutoQueryCompass接口函数即可,程序会按照参数里的周期从硬件平台读取罗盘数据,换算成与正北方向的角度值,储存到CVoyCmd类的m_angle成员变量里。

因此我们需要为主窗体添加一个定时器,按照查询周期定时去读取角度数据并显示在界面上。

在激活函数里,首先获取界面输入的查询周期数值,然后调用AutoQueryCompass函数激活罗盘的自动查询,同时打开2号定时器。

在OnTimer()定时响应函数里,为2号定时器添加响应操作,将角度数值显示到列表框控件里。

图6.3激活罗盘映射函数

图6.4罗盘数据的显示操作

4、停止查询

电子罗盘自动查询的停止也是调用CVoyCmd类的AutoQueryCompass接口函数,与超声红外的接口类似,传递参数0就是停止自动查询操作。

图6.5罗盘自动查询的停止

这一章试验里我们学会了如何读取电子罗盘的数据,为将来进行机器人的姿态控制奠定了基础。

罗盘数据为机器人导航提供了一个宏观的依据,如果对机器人的短时间内的精确导航要求较高,建议使用电子陀螺仪。

在下一章试验我们将体验一下陀螺仪导航的奇妙效果。

学习使用控制类使机器人在陀螺仪导航状态下运动。

5、机器人安装了电子陀螺仪装置

1、按实验六建立已包含串口类、协议类和行为类的对话框界面。

电子陀螺仪使用前需要进行标定,所以在界面上添加一个“标定”按钮;

直行导航只需要输入行走速度值,在界面上添加一个编辑框用于直行速度值的输入,同时添加一个“直行”按钮;

转向导航需要输入转向的速度和角度,所以需要添加两个编辑框,同时添加一个“转向”按钮。

图7.1控制界面添加控件

3、陀螺仪的标定

电子陀螺仪使用前需要进行标定,电子陀螺仪的标定只需要调用CVoyCmd类的Demarcate接口函数。

需要特别注意的是,调用这个函数后的4秒钟之内,必须保证机器人机体处于静止状态,任何轻微的震动都有可能导致导航精度的下降。

图7.2陀螺仪的标定

4、陀螺仪直行导航

电子陀螺仪的直行导航只需要调用CVoyCmd类的SpeedByGyro接口函数,将直行速度作为参数传递。

直行状态的停止,与普通控制的刹车一样,调用CVoyCmd类的Brake函数。

图7.3直行导航操作

开启连接机器人的端口后,需要点击“标定”按钮,保持机器人静止4秒钟。

点击“直行”按钮开始直行导航。

在导航状态中,搬动机器人改变其前进方向,观察机器人的反应。

5、陀螺仪转向导航

电子陀螺仪的转向导航只需要调用CVoyCmd类的CircleByGyro接口函数,将转向的角度和速度作为参数传递。

转向状态的停止,与普通控制的刹车一样,调用CVoyCmd类的Brake函数。

图7.4转向导航操作

开启连接机器人的端口后,对陀螺仪进行标定(若之前刚进行过标定,可省略)。

利用陀螺仪的导航,可以保证机器人在不依赖其他传感器的情况下能进行短距离的精确航行。

如果加上罗盘的辅助,足以保证长距离的行走精度。

这方面相关试验将在高级教程中介绍,有兴趣的同学可以先自己尝试一下。

学习使用视频类对USB视频设备进行图像采集。

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>

编译一下工程,排除编译上的错误。

图8.1包含相应头文件

图8.2工程设置

图8.3新建对话框

2、添加界面控件

在界面上划定一个范围,限定视频图像的显示位置和大小。

这里我们使用一个图片框做显示。

设置控件ID为IDC_PREVIEW,类型为矩形。

为了传递这个控件的位置参数,需要在类向导里为它映射一个CStatic类型的控件变量。

为视频预览的开启和关闭各自添加一个按钮,并生成相应的映射函数。

图8.4添加界面控件

图8.5预览空间属性

图8.6映射控件变量

3、视频流捕捉的实现

为了实现视频流的捕捉,我们的窗体程序中必须要有一个CCaptureVideo对象,所以得在窗体类头文件里包含CCaptureVideo类头文件。

图8.7包含视频类头文件

CCaptureVideo类的视频捕捉有多个模式,每个模式所搭建的视频流Graph都有所不同,为了统一处理,我们在窗体里只保留一个CCaptureVideo类型的指针,在需要进行视频捕捉的时候才生成具体对象,捕捉结束时将对象连同体内的Graph销毁。

图8.8生成类型指针

图8.9初始化指针

视频类的启动接口是Create函数,将视频设备编号、显示控件指针以及捕捉模式作为参数传递进去。

调用该函数后,CCaptureVideo对象会启动对应编号的视频设备的视频流捕捉工作,并将画面显示与指定的显示控件上。

视频类的关闭接口是Stop函数,调用后即刻停止捕获视频。

为了保证视频设备的成功绑定,每次重启视频时请将原来的CCaptureVideo对象删除,生成新的对象来打开视频。

图8.10视频捕获开启操作

图8.11视频捕获关闭操作

4、图像接口

CCaptureVideo类里有个CSampleGrabberCB类型对象mCB,这是视频流Graph里的一个Filter,它的主要作用就是把视频流中的图像数据暴露出来,以供我们使用。

CSampleGrabberCB类里图像数据的接口是BufferCB函数,该函数里包含了我们对视频的操作,基于图像的行为调用、图像的远程传输以及静态图像的截取都在这个函数里进行。

这一章试验,我们实现了数字图像的捕获,最后还简要介绍了视频图像的接口函数,为我们今后基于图像的各种研究奠定了基础。

基于图像的高级应用,我们将在后面的高级教程中提到,有兴趣的同学可以先进行一些尝试。

DirectX9.0

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1