全向机器人开发指南.docx
《全向机器人开发指南.docx》由会员分享,可在线阅读,更多相关《全向机器人开发指南.docx(23页珍藏版)》请在冰豆网上搜索。
![全向机器人开发指南.docx](https://file1.bdocx.com/fileroot1/2022-12/29/7d67f003-fe88-4700-ae65-58224acb028b/7d67f003-fe88-4700-ae65-58224acb028b1.gif)
全向机器人开发指南
全向机器人开发指南
MT-ODRobot源程序采用COM接口,COM是一项功能强大的集成技术,它允许您在运行时将各种异构的软件部分混合起来。
COM使得开发人员可以编写出能够混合起来运行的软件,而不用担心诸如线程特性以及所用开发语言等问题。
COM协议将一个软件模块同另一个软件模块连接起来,然后其自身不再参与两者之间的通信过程。
当这种连接建立起来之后,两个模块之间就可以通过称为“接口”的机制来进行通信。
这些接口既不需要静态的或动态的链接入口点,也不需要硬编码的地址,而且不同于那些用于启动通信过程的一般COM函数。
下面详细介绍各种接口函数:
5.1系统函数接口描述
◆CreateDevice
Ø原型:
MT_EXPHERROR__stdcallCreateDevice(LPSTRpModule,IMTDevice*&prDevice);
Ø参数说明:
参数1为需要创建的设备名称;
如运动设备名称为:
MOTION,TCP/IP网络通讯客户端:
NETWORK_CLIENT、服务器端:
NETWORK_SERVER,UDP网络通讯客户端:
UDPVIDEO_CLIENT、服务器端:
UDPVIDEO_SERVER,超声:
MTULTRASONIC,PSD:
MTPSD,图像采集:
IMAGE_CAP_DS或IMAGE_CAP_DS_BALL,图像处理:
MT_IMAGE_PROCESS或MT_IMAGE_PROCESS_BALL,DIDO设备:
MTDIDO,码盘:
MTENCODER,语音:
MTVOICE
参数2为创建的设备接口;
Ø功能:
根据给定的设备名称创建对应设备,若创建成功,给传入的设备接口赋值。
◆AddMsgReceiver
Ø原型:
MT_EXPintAddMsgReceiver(IMTDevice*inReceiver);
Ø参数说明:
参数1为当前设备指针;
返回值为当前设备列表中的设备数;
Ø功能:
将当前设备加入用户程序的设备列表;
◆Broadcast
Ø原型:
MT_EXPboolBroadcast(MessageTinMessage,void*ioParam=0,void*ioParam2=0);
Ø参数说明:
参数1为预定消息,在此一般为NTY_MSG_DEV_PTR;
参数2为消息发送的目标设备;
参数3为用户程序的设备列表指针;
Ø功能:
将设备列表指针发送给指定目标设备,这样各设备之间可以实现互访。
◆IMTObject
接口原形:
interfaceIMTObject
{
virtualHERROR__stdcallQueryInterface(InterfaceID,LPVOID*)=0;
virtualvoid__stdcallAddRef()=0;
virtualvoid__stdcallRelease()=0;
};
所有部件基接口,客户可以使用该接口查询需要的目标接口,部件自己维护自身的生命周期,所有具体的底层部件必须实现该接口
接口描述:
ØQueryInterface
查询部件实现的接口。
参数1对应接口标识;
如运动接口标识为:
InterfaceID_MOTION,网络:
InterfaceID_NETWORK,
超声:
InterfaceID_ULTRASONIC,PSD:
InterfaceID_PSD,图像采集:
InterfaceID_IMAGECAPTURE或InterfaceID_IMAGECAPTURE_BALL,图像处理:
InterfaceID_IMAGE,DIDO设备:
InterfaceID_DIDO,码盘:
InterfaceID_ENCODER,语音:
MT_IID_Voice,云台控制:
InterfaceID_CAMERA,硬件自检:
InterfaceID_CHECK
参数2对应设备对象地址,若设备创建失败,返回NULL;
如:
定义:
IMTMotion*m_pMotion;
m_pMotion=NULL;
m_pDevMotion->QueryInterface(InterfaceID_MOTION,(LPVOID*)&m_pMotion);
ØAddRef
用户成功查询到一个,引用计数增1
ØRelease
用户不再需要使用该接口,引用计数减1
COM术语中有“类对象”(classobject)的概念,有时也被称为“类厂”(classfactory)。
精确地来讲,它实际上应该被称为“对象厂”(objectfactory)。
COM中的一个类对象代表了一个特定COM类的全局静态域。
其意义与MFC中的CRuntimeClass是等价的。
类对象之所以被称为类厂,其原因在于它实现了一个名为IClassFactory的特殊的COM接口。
因为我们无法直接调用目标类的构造函数,所以只能让组建模块来决定如何构造对象。
为此组建提供了类厂,从而将具体的创建步骤封装了起来。
◆IMTFactory
接口原形
interfaceIMTFactory
{
virtualHERROR__stdcallCreateObject(IMTObject*&)=0;
virtualvoid__stdcallRelease()=0;
};
接口描述:
ØCreateObject
工厂创建部件的标准方法
参数1为部件的接口指针的引用。
成功时指向刚创建的部件,否则返回NULL
ØRelease
用户不再需要使用该工厂接口,释放该工厂
◆IMTDEVFunc
接口原形
interfaceIMTDEVFunc
{
virtualHERROR__stdcallDevFunc(LPVOIDpParam)=0;
};
接口描述:
ØDevFunc
执行用户设定的命令,与特定的部件关联
参数1为与命令本体关联的设备
◆IMTDevice
接口原形
interfaceIMTDevice:
publicIMTObject
{
virtualHERROR__stdcallInit()=0;
virtualHERROR__stdcallPause()=0;
virtualHERROR__stdcallStart()=0;
virtualHERROR__stdcallEnd()=0;
virtualboolReceiveMessage(long,void*,void*)=0;
virtualboolBroadcast(MessageTinMessage,void*,void*)=0;
virtualHERROR__stdcallSetDevFunc(IMTDEVFunc*pDevFunc)=0;
virtualHERROR__stdcallReadSettings()=0;
virtualHERROR__stdcallWriteSettings()=0;
};
接口描述:
ØInit
初始化部件;
ØPause
将部件转换到暂时停止转态;
ØStart
启动设备;
ØEnd
将部件转换到停止转态;
ØReceiveMessage
处理接收到的消息及相应参数指针;
参数1为预定义的消息值;
参数2和参数3为需要传递的参数指针;
ØBroadcast
向当前设备列表发送消息及相应参数指针;
参数1为预定义的消息值;
参数2和参数3为需要传递的参数指针;
ØSetDevFunc
把指定命令对象绑定到当前设备;
ØReadSettings
获取设备上次的配置参数;
ØWriteSettings
保存设备上次的配置参数;
5.2设备接口参考说明
5.2.3网络模块接口
◆IMTNetwork接口
使用前,需先使用SetParam函数配置网络工作参数,然后调用Init初始化网络环境,再用Start函数启动。
可以调用Send函数,发送数据到指定的IP地址。
函数列表
ØGetParam:
获得当前该设备的工作参数
●原型:
NET_DESC__stdcallGetParam()
●返回类型:
NET_DESC
●备注:
获得当前该设备的工作参数。
这些参数包括IP地址、端口号、缓冲区大小等参数
ØSetParam
●原型
virtualvoid__stdcallSetParam(constNET_STRU&)
●参数说明
NET_STRU&:
设备工作参数,包括IP地址、端口和缓冲区长度。
●备注
设置特定的网络的参数,必须在Init前调用。
ØInit
●备注
初始化网络工作环境,并改变设备的状态为DEVICE_INIT。
在调用该函数前,必须调用SetParam来配置网络参数。
然后,可以调用Start函数来启动网络模型。
如果成功,返回0。
ØStart
●备注
设备状态切换到DEVICE_RUNNING。
在设备启动后,就可以用Send函数发送数据,同时,自动接收客户端发送的数据。
之后,调用Pause可以暂停设备运行,也可调用End终止设备运行。
ØPause
●备注
暂停网络设备运行,并将设备状态切换到DEVICE_PAUSE。
该函数必须在设备初始化或运行时调用,否则将返回错误编码。
在该函数调用后,可调用Start到启动设备继续运行,也可调用End函数终止设备运行。
ØEnd
●备注
结束网络设备,并将设备状态切换到DEVICE_RAW。
调用该函数后,终止网络设备的运行。
如果想要再次启动设备,必须先调用Init对设备初始化后,才能调用Start函数来启动设备。
ØSend
●原型
HERROR__stdcallSend(LPSTR,LPSTR,LONG)
●参数说明
a)LPSTR:
指定对方的IP地址
b)LPSTR:
用户需要传送的字符数据
c)LONG:
用户需要传送的字符数据长度
●备注
该函数向指定的地址发送数据。
如果发送成功,返回0,否则,返回错误的编码值。
该函数只有在网络启动后,才会有效,也就是必须在Start函数后,才可调用。
ØResponseRecvEvent:
设定事件处理过程(接收到数据)
●原 型
void__stdcallResponseRecvEvent(PEVENTPROC,LONG)
●参数说明:
a)PEVENTPROC:
传入一个函数指针。
该函数接收到事件后,交由该指针指向的函数处理。
PEVENTPROC原型定义如下:
typedefbool(*PEVENTPROC)(LONGnOwner,void*lpReturn)
b)LONG:
PEVENTPROC指向的函数所需的参数,一般为一个类或者结构的指针。
●备 注:
设定事件处理过程,接收到数据后,调用指定的函数处理。
PEVENTPROC为一个函数指针,指向处理事件的函数。
LONG为指向一个结构的指针。
该类或结构为PEVENTPROC指向的函数所需的参数。
结构参数
ØNET_STRU
●原型:
typedefstruct
{
charszAddrIP[32];
intnPort;
intnBufLen;
boolbSource;
}NET_DESC;
●说明:
szAddrIP:
指定IP地址
nPort:
指定端口号
nBufLen:
指定缓冲区大小
ØNETVIDEODATAFORMAT
●原型:
typedefstruct
{
unsignedshortnWidth;
unsignedshortnHeight;
}NETVIDEODATAFORMAT;
●说明:
nWidth:
像素宽
nHeight:
像素高
5.2.4图像采集接口
◆IMTImageCapture
利用DirectShow来驱动WDM摄像设备,完成对视频的采集。
函数列表
ØBindCapWnd
●原型
HERROR__stdcallBindCapWnd(HWNDhWnd)
●参数说明
hWnd:
要绑定的窗口的句柄
●备注
将视频输出绑定到指定的窗口上。
ØBindStillWnd
●原型
HERROR__stdcallBindStillWnd(HWNDhWnd)
●参数说明
hWnd:
要绑定的窗口的句柄
●备注
将静态图的抓拍输出绑定到指定的窗口。
ØCapStill
●原型
HERROR__stdcallCapStill(intlWidth,intlHeight)
●参数说明
lWidth:
窗口宽
lHeight:
窗口高
●备注
抓拍当前图像帧,并在绑定窗口中显示。
ØGetDeviceName
●原型
short__stdcallGetDeviceName(char**pDevList)
●参数说明
摄像头设备名称列表指针
●备注
获取当前主机连接的摄像头设备名称列表指针
ØBindDevName
●原型
HERROR__stdcallBindDevName(char*strName,intm_nIndex)
参数说明
strName:
需要绑定的摄像头名称及通道。
m_nIndex:
通道
●备注
将当前设备绑定到指定摄像头。
ØInit
●原型
HERROR__stdcallInit()
●参数说明
●备注
ØStart
●原型
●参数说明
●备注
该函数将启动设备进行视频采集,并输出到由BindCapWnd函数指定
的窗口中,可以调用End函数终止采集。
在调用该函数前,确保设备
已经初始化,即已经调用过Init函数,否则将返回一个错误值。
ØEnd
●备注
该函数终止视频的采集。
但并不释放设备环境,之后,如果调用Start函数可以继续视频的采集。
ØSetVideoSettings
●原型
HERROR__stdcallSetVideoSettings(shortnWid,shortnHei,shortnFrameRate)
●参数说明
参数1为图像宽度象素大小;
参数2为图像高度象素大小;
参数3为图像采集帧率;
●备注
设置图像参数
结构参数
ØCAP_STRU
●原型
typedefstruct
{
WORDwWidth;
WORDwHeight;
intnFramePerSec;
}CAP_STRU;
●备注
wWidth:
图像的宽度(字节为单位)
wHeight:
图像的高度(字节为单位)
nFramePerSec:
每秒的帧数
◆IMTImageCaptureBall
利用DirectShow来驱动WDM摄像设备,完成对视频的采集,该接口主要用于比赛程序时使用,网络图像传输时需要使用IMTImageCapture。
函数列表
ØBindCapWnd
●原型
HERROR__stdcallBindCapWnd(HWNDhWnd)
●参数说明
hWnd:
要绑定的窗口的句柄
●备注
将视频输出绑定到指定的窗口上。
ØBindStillWnd
●原型
HERROR__stdcallBindStillWnd(HWNDhWnd)
●参数说明
hWnd:
要绑定的窗口的句柄
●备注
将静态图的抓拍输出绑定到指定的窗口。
ØCapStill
●原型
HERROR__stdcallCapStill(intlWidth,intlHeight)
参数说明
lWidth:
窗口宽
lHeight:
窗口高
●备注
抓拍当前图像帧,并在绑定窗口中显示。
ØGetDeviceName
●原型
short__stdcallGetDeviceName(char**pDevList)
●参数说明
摄像头设备名称列表指针
●备注
获取当前主机连接的摄像头设备名称列表指针
ØBindDevIndex
●原型
HERROR__stdcallBindDevIndex(intm_nIndex)
参数说明
m_nIndex:
通道
●备注
将当前设备绑定到指定摄像头。
ØCaptureImage
●原型
virtualvoid__stdcallCaptureImage(char*ImageBuffer)=0;
参数说明
ImageBuffer:
图像缓存
●备注
捕获一帧图像
ØInit
●原型
HERROR__stdcallInit()
●参数说明
●备注
ØStart
●原型
●参数说明
●备注
该函数将启动设备进行视频采集,并输出到由BindCapWnd函数指定
的窗口中,可以调用End函数终止采集。
在调用该函数前,确保设备
已经初始化,即已经调用过Init函数,否则将返回一个错误值。
ØEnd
●备注
该函数终止视频的采集。
但并不释放设备环境,之后,如果调用Start函数可以继续视频的采集。
ØSetVideoSettings
●原型
HERROR__stdcallSetVideoSettings(shortnWid,shortnHei,shortnFrameRate)
●参数说明
参数1为图像宽度象素大小;
参数2为图像高度象素大小;
参数3为图像采集帧率;
●备注
设置图像参数
结构参数
ØCAP_STRU
●原型
typedefstruct
{
WORDwWidth;
WORDwHeight;
intnFramePerSec;
}CAP_STRU;
●备注
wWidth:
图像的宽度(字节为单位)
wHeight:
图像的高度(字节为单位)
nFramePerSec:
每秒的帧数
5.2.5图像处理接口
◆Image接口
操作图像文件,如打开、关闭文件等操作。
函数列表
ØSetParam
●原型
HERROR __stdcall SetParam(IMAGEPROC_DESC&)
●参数说明
IMAGEPROC_DESC&:
图像处理的参数设置
●备注
IMAGEPROC_DESC结构里,存储的是设备信息。
如设备长度、宽度。
使用该函数来格式化输出图像。
如果,设置的长、宽与原图像不相同,
则会把图像缩放。
ØBackupDIB
●原型
HERROR __stdcall BackupDIB();
●参数说明
●备注
复制当前图像数据到内存当中,在需要时,使用RestoreDIB把这些数据
还原到原图像。
一般情况下,在图像打开后,把图像备份。
图像经过
一些处理,如果处理失误,就可以把备份的图像数据还原。
ØRestoreDIB
●原型
HERRORRestoreDIB __stdcall RestoreDIB(BOOLbClear);
●参数说明
bClear:
TRUE表示清除备份的数据,FALSE表示保留备份数据
●备注
该函数将备份的图像还原,如果没有备份数据,则不做出反映。
通常,
在图像打开后,调用BackupDIB把图像备份。
图像经过一些处理,如果
处理失误,就可以把备份的图像数据还原。
ØCopyDIBObject
●原型
LPSTR__stdcall CopyDIBObject();
●参数说明
bClear:
TRUE表示清除备份的数据,FALSE表示保留备份数据
●备注
复制图像数据到一块内存区,并返回指向该内存的句柄。
该函数同
BackupDIB类似。
但比BackupDIB更加灵活。
BackupDIB复制的数据
的句柄是隐藏的,不能够对其进行操作。
而CopyDIBObject则是得到
当前图像数据的一个副本,并可对它进行处理。
ØLoadDIBFile
●原型
LPSTR __stdcall LoadDIBFile(char*lpFilePath);
●参数说明
lpFilePath:
需要处理的图像文件文件名
●备注
加载图像文件,并初始化IMTImage对像。
只有当调用了该函数后,
才可以进行后续处理,否则后续的调用将会返回错误信息。
ØSaveDIBToFile
●原型
HERROR __stdcall SaveDIBToFile(char*lpFilePath);
●参数说明
lpFilePath:
需要处理的图像文件文件名
●备注
将图像数据保存到参数中指定的文件,如果文件为空,将创建一个新文件,如果文件已经存在,将覆盖现有文件。
ØGetDIBPtr
●原型
LPSTR __stdcall GetDIBPtr();
●参数说明
返回图像数据的指针。
●备注
得到图像的指针,该指针指向BITMAPINFOHEADER结构。
得到该指针后,就可以用它来进行自定义的操作。
如可以把它绘制在窗口上,或保存为文件。
ØGetWidth
●原型
LONG __stdcall GetWidth();
●参数说明
返回图像的宽度。
●备注
获取图像的宽度值,该值是以实际的字节数计算的,并且必须是4的整倍数。
与图像的BITMAPINFOHEADER结构中保存的宽度值可能会不一样。
BITMAPINFOHEADER中保存的值是以像素数计算的,而一个像素可能会占用多个字节。
如8位图像,一个像素占用一个字节,24位图像,一个像素占用三个字节(B,G,R),即蓝、绿、红。
32位图像一个像素占用四个字节(B,G,R,A),即蓝、绿、红、透明度。
所以,计算图像的实际宽度时,
须用BITMAPINFOHEADER中的宽度乘以每像素的字节数,然后取其离4的整数次倍最近一个数。
并且它必须是大于或等于bi.biWidth。
ØGetHeight
●原型
LONG __stdcall GetHeight();
●参数说明
返回图像的高度。
●备注
获取图像的高度值。
以字节数计算。
该值总是信任图像的BITMAPINFOHEADER结构中提供的高度值。
ØGetDIBSize
●原型
LONG __stdcall GetDIBSize();
●参数说明
返回图像数据的大小。
●备注
获取图像数据部分的大小。
不包括BITMAPINFOHEADER结构和调色板数据。
采用公式:
biSize=biWidth'×biHeight。
其中biWidth'必须是4的整倍数,表示大于或等于biWidth,离4最近的整倍数。
请参见GetWidth函数。
ØPaintDib
●原型
HERROR __stdcall PaintDib(HWNDhWnd);
●参数说明
hWnd:
窗体对像的指针。
●