07第7章 视频信号的输入.docx
《07第7章 视频信号的输入.docx》由会员分享,可在线阅读,更多相关《07第7章 视频信号的输入.docx(28页珍藏版)》请在冰点文库上搜索。
07第7章视频信号的输入
第7章高级版实践2
7.2全向运动足球机器人2
7.2.1任务的提出2
7.2.2任务分析与策略规划3
7.2.3结构设计和摄像头安装5
7.2.4原理分析7
7.2.5程序编写10
7.2.6颜色阈值标定20
7.2.7程序的运行21
7.2.8思考与提高22
第7章高级版实践
学习目标
·熟悉创意之星高级版套件
·掌握PXA270控制器的使用方法
·熟悉语音模块的使用方法
·熟悉全向轮的使用方法
·熟悉图像处理方法
7.2全向运动足球机器人
本节的目的是让您通过学习,了解和掌握MultiFLEX™2-PXA270控制器视觉处理的使用方式,掌握全向轮的使用特点。
本章的教学道具是一套带视觉的全向运动机器人,和前面的章节一样,您需要根据本章的指引将之一步步实现出来。
7.2.1任务的提出
1.任务要求
利用创意之星高级版中摄像头的图像处理能力,设计一个足球机器人,让该机器人应具备如下功能:
·能够区分足球和场地的颜色,并找到足球,朝足球方向移动
·能够在原地不用转弯,就朝任意一个方向运动
2.任务背景
RoboCup机器人足球世界杯赛及学术大会是国际上级别最高、规模最大、影响最广泛的机器人足球赛事和学术会议,每年举办一次。
机器人足球赛的最初想法是由加拿大不列颠哥伦比亚大学的艾伦·马克沃斯教授于1992年提出的。
日本学者迅速对此进行了系统的调研和可行性分析。
1993年6月,浅田埝和北野宏明等著名学者决定创办日本机器人足球赛,并暂命名为RoboCupJ联赛(J联赛是日本足球职业联赛的名称)。
一个月之内,他们就收到了来自国外的热烈反响,要求将其扩展为一个国际性的比赛,并将其定名为机器人足球世界杯赛(theRobotWorldCupSoccerGames),简称RoboCup。
RobuCup迄今为止已经办了12届,比赛规则难度不断提高,参加比赛的机器人队伍的技术也有了突飞猛进的提高。
参赛机器人经过12年的进化,和刚开始几年的机器人相比有了明显的不同。
刚开始几年的机器人一般使用两轮差动式机构,随着全向轮在机器人上日益广泛的运用,全向机器人迅速取代常规的两轮差动式机器人。
全向机器人在任意一点上,都可以往任何方向前进,没有物理上的前方,不用转弯,在赛场非常灵活。
本节所设计的机器人无法与真正参加RoboCup比赛的机器人相比,但我们从中可以对足球机器人的原理有一个基本认识。
7.2.2任务分析与策略规划
1.了解全向轮的特点
全向机器人的根本特征是使用全向轮,可以任意方向行进。
那么我们需要了解一下什么是全向轮,与常规的轮子有何区别。
图7.24各种全向轮
图7.24是当前比较常见的全向轮,根据载荷的不同,全向轮的大小、面积、辊子数量各有不同。
如图7.25所示,我们可以看到全向轮整体是一个圆形,可以和常规轮子一样由电机带动,实现转动。
全向轮四周镶嵌着可以自由滚动的辊子,这些辊子可以在垂直于轮轴的方向自由转动。
根据上述的构造特点,全向轮可以当成普通轮子,实现轮轴方向转动,也可以在地面自由滑动。
图7.25全向轮转动特点
2.构建我们的全向底盘
“创意之星”高级版有20个CDS5500、四个全向轮和众多结构件,用于搭建一套全向机器人是足够的。
通过第四章任务一的分析,我们对机器人底盘的搭建有了一定的思路。
首先,我们确定使用几个驱动轮子,这个控制方式密切相关。
1、2轮式:
它需要配套使用万向轮用于保持底盘平衡,我们不采用这个方案。
2、3轮式:
3点可以支撑起一个平面,这个方案是可行的。
如图7.26所示,我们采用圆周布局,将三个全向轮呈120°夹角排列。
1号、2号轮子如箭头方向转动,3号轮子作为从动轮,机器人即可向两个转动方向的矢量叠加方向前进。
同理可以设计出机器人水平侧移、后退、原地旋转等等方向的运动。
图7.263轮全向平台
3、4轮式:
如图7.27所示,四个全向轮圆周排列,夹角90°,由四个轮子的转动方向进行矢量叠加可以方便地得到前进、后退、转向、侧移等各种动作。
图7.274轮全向平台
根据上述分析可知,3轮和4轮都是可行的方案,根据图7.26和7.27的对比可以发现,3轮的动力要远小于4轮结构,比如在前进时只有2个轮子起作用。
我们最常用的方向是前进、后退、侧移、旋转,3轮全向的侧移很不好控制(您可以通过绘制三个轮子的转动矢量图进行计算)。
所以,我们选择4轮全向构型。
3.视觉系统
全向运动足球机器人由两大系统构成:
全向运动平台、视觉系统,上一小节我们已经选定了全向运动平台的构型。
视觉系统我们的选择是唯一的:
摄像头和MultiFLEX™2-PXA270控制器。
在“创意之星”高级版套装中,包含了一个USB摄像头,借助MultiFLEX™2-PXA270控制器强劲的性能,我们能够在这个轻量级的平台上也能实现大型机器人才具备的颜色识别。
MultiFLEX™2-PXA270控制器使用NorthSTAR开发环境,您不用编写图像识别引擎,只需要设置NorthSTAR视觉空间的属性,就能够得到我们目标物(小足球)在图像范围内的坐标。
根据这个坐标信息就可以判定机器人和足球的相对位置,进而控制机器人的运动,去接近足球。
4.任务规划
①搭建全向平台和视觉系统,这是接下去实验的基础。
②熟悉图像识别的基础知识。
③编写程序,进行图像采集和机器人基本运动控制。
④对颜色进行标定,去除背景干扰,实现比较好的识别效果,
⑤完成整个项目的程序设计。
7.2.3结构设计和摄像头安装
如图7.28所示,使用创意之星的结构件,我们可以轻易的构造一个全向移动的机器人底盘。
以下是搭建的步骤:
图7.28全向运动足球机器人
第一步搭建运动平台
《创意之星机器人套件组装指南》5.4小节以示意图的方式对全向运动平台的搭建过程进行了详细的说明。
您可以依照该指南进行平台搭建,完成到图7.29的程度即可。
图7.29全向运动平台
第二步搭建视觉部分
如图7.30我们给机器人设计了一个带摄像头的头部,图示的摄像头外壳是用“创意之星”头部的外壳手工改装的。
您大可不必如此麻烦,直接将摄像头固定在L2-1零件上即可。
我们为机器人视觉部分做了一个像可以俯仰的关节,这样机器人就可以像人一样俯仰头部,寻找目标物。
图7.30搭建视觉部分
第三步总装
图7.31总装
如图7.31,将视觉部分通过U3H固定到控制器上,将控制器固定到底板上,就完成了整台机器人的搭建。
第四步接线:
如图7.32所示,将1、2、3、4号舵机作为底盘驱动舵机,串联起来接到控制器的机器人舵机接口。
将5号舵机接到其它的机器人舵机接口。
将摄像头的USB接到控制器的任意USB接口,接线即告完毕。
图7.32全向足球机器人效果图
7.2.4原理分析
在程序中,获得的图像数据是一个一维的数组,原始的图像数据通常是RGB24格式,即每三个字节一个像素,三个字节分别是该像素红色、绿色、蓝色的颜色分量值。
在RGB颜色空间下一般很难排除光照的影响,因为在亮度突变的环境里,三个颜色分量都会剧烈变化,所以RGB图像不适合用来做颜色区分。
常规的做法是将这个图像数组转换到HSI空间去。
HSI即色调(Hue)、色饱和度(Saturation)和亮度(Intensity),其中前两项受亮度的影响很小,各种颜色在色度(Hue)分量的方向上是连续均匀分布的,是极好的颜色标定坐标系。
对画面中所有像素进行转换后,依次对各点的H值进行检查,符合标定范围要求的就作为有效点,否则为无效点。
遍历完整幅图像的像素之后,就将所有有效点的x和y求和取平均值,这样可以得到该颜色区域在画面中的颜色质心的坐标。
在颜色干扰不是很严重的情况下,我们可以认为桔色区域的质心就是桔色球的中心。
对比桔色球的中心位置在图像的位置,可以判断球相对于机器人的大概方位。
在视频图像平面中,横向为X轴,纵向为Y轴,通过球中心的X值可以判断球相对机器人正前方是偏左还是偏右,若球中心X小于画面中心点X值说明球在机器人左前方,否则反之。
通过球中心的Y值就可以判断球与机器人的距离,虽然距离值和球中心Y值不是严格的线性关系,但是变化趋势是一致的,球离机器人越远,球中心在画面中的Y值就越大。
知道了球相对机器人的方向和距离,要做追球动作就很简单了,偏左了就左转、偏右了就右转,中间设个死区。
球远了就前进,近了就后退。
这两种运动可以通过两个电机速度进行合成,如图7.33。
图7.33视觉原理
1.标定速度
理论上的数值计算已经弄清楚了,下面需要和硬件平台结合起来。
首先我们需要对舵机转动方向与底盘的运动方向进行标定测试。
将底盘右侧两个舵机与多功能调试器连接,将调试器连接到PC上,运行CDS5500的调试程序。
点击“查找设备”,可以看到1号和2号两个舵机,正是连接到机器人上的两个舵机。
停止查找,点击“确定”按钮进入操作界面,如图7.34。
图7.34搜索总线上的舵机
进入操作界面后,在左边设备列表里选择1号舵机,在“操作”页的在控制栏里选择力矩输出,然后拖动速度滑动条,在正负速度之间测试。
可以看出,负速度时该舵机造成的效果是底盘右侧往前运动,正速度则使右侧底盘往后运动,如图7.35。
图7.35标定1号舵机方向
标定完1号舵机方向,切换到2号舵机。
同样的在正负速度之间切换,可以看到,2号舵机对底盘的运动影响和1号舵机一致。
得出结论:
底盘上右侧的舵机,当他们的速度符号相同时,对底盘运动的影响是一致的。
对右侧的舵机来说,正速度使底盘右侧向后运动,负速度则使底盘右侧向前运动,如图7.36。
图7.36标定2号舵机方向
使用相同的方法标定左侧的3号4号舵机,将会得出结论:
底盘上左侧的舵机,当他们的速度符号相同时,对底盘运动的影响是一致的。
对左侧的舵机来说,正速度使底盘左侧向前运动,负速度则使底盘左侧向后运动。
2.速度合成
机器人运动过程,主要是前进和自身旋转两种运动。
前进:
根据上面的标定结果,左侧舵机速度为正数,右侧舵机速度为负数时,机器人将向前运动。
反之则向后退。
旋转:
当两侧所有舵机速度为正数时,机器人将向右顺时针自转;当两侧所有舵机速度为负数时,机器人将向左逆时针自转。
在实际的运动过程中,这两种运动是可以叠加的,只需要将各动作的速度值在每个运动舵机上进行简单求和即可实现。
具体的运动学分析过程,可以自行进行推算,在此不再详述。
7.2.5程序编写
1.新建工程
在NorthSTAR软件中新建一个Project,弹出ProjectConfiguration页面。
“Controller”栏选择当前使用的控制器:
MultiFLEX2-PXA270;由于我们搭建的是非标准构型,“Robot”栏选择“Customized”,点击“next”,弹出Servo页面,如图7.37。
图7.37新建工程
在Servo页面,我们为机器人设置五个舵机,1~4号舵机为机器人底盘电机,配置成MotorMode,5号舵机控制摄像头俯仰,配置成ServoMode,如图7.38。
图7.38舵机配置
由于本实验未使用其它传感器,所以AD和IO的数量都设置为0,如图7.39,7.40。
图7.39AD配置
图7.40IO配置
2.添加变量
本实验将会用到8个变量,用于计算过程中的临时储存。
变量名
类型
说明
Ball_x
Int
储存目标球的颜色质心在画面中的横坐标
Ball_y
Int
储存目标球的颜色质心在画面中的纵坐标
Dx
Int
目标球的颜色质心与期许坐标点的X轴向差值
Dy
Int
目标球的颜色质心与期许坐标点的Y轴向差值
Forward
Int
前进分量
Turn
Int
旋转分量
Left
Int
底盘左侧舵机的速度值
Right
Int
底盘右侧舵机的速度值
添加变量的方式有两种:
一是在流程图空白处右击鼠标,在弹出的菜单中选择“Addvariable”;二是从左侧控件栏“SyntaxWidget”里拖拽一个Variable控件到流程图里。
两者的效果是一样的。
在Variable控件的属性里,输入变量名及变量类型。
在本实验共需要八个变量,每个变量对应一个控件,如图7.41,7.42,7.43。
图7.41添加变量
图7.42变量控件
图7.43变量添加完成
3.初始化
从左侧控件列表“FunctionWidget”里拖拽一个Servo控件至流程图中。
双击该控件,在弹出的属性框里进行舵机的初始化。
将1~4号舵机的Speed设置为0,将5号舵机的Angle设置为512,Speed为256,这是一个停止的状态,初始化完毕,如图7.44。
图7.44初始化舵机
4.获取识别结果
从左侧控件列表“Plug-inWidget”里拖拽一个Vision控件至流程图中。
双击该控件,在弹出的属性框里设置ReturnValue的赋值变量,如图中设置了Ball_x和Ball_y变量,则当视觉系统识别出目标球的颜色质心时,将会将该质心在画面中的x、y坐标值分别赋到Ball_x和Ball_y变量中,如图7.45。
图7.45设置ReturnValue
5.速度计算
有了目标球的坐标,我们就可以开始进行控制量的计算了。
要使机器人能跟上球,一般我们期许球在图像中能处于(160,60)这个坐标点,在具体实验时,可以根据情况上下浮动。
首先我们计算目标球当前位置在X轴向上与预期目标点的差值:
Dx=Ball_x–160(如图7.46)
图7.46计算Dx
类似的,还需要计算目标球当前位置在Y轴向上与预期目标点的差值:
Dy=Ball_y–60(如图7.47)
图7.47计算Dy
根据这两个差值,我们可以计算出一个这种差距的速度值。
这里我们使用一种叫做“比例控制”的控制方法,将误差的输入量进行一个比例放大后直接得到输出量。
我们将Y轴向上的差值放大10倍后,作为前进速度分量的速度值:
Forward=Dy×10(如图7.48)
图7.48计算Forward
然后将X轴向上的差值放大两倍后,作为旋转速度分量的速度值:
Turn=Dx×2(如图7.49)
图7.49计算Turn
有了前进速度和旋转速度,我们就可以将其进行叠加了。
根据原理分析阶段我们标定出的速度与实际方向的关系,叠加的结果应该是:
Left=Forward+Turn
Right=Turn-Forward
其中,Left是底盘左侧所有舵机的速度值,Right是底盘右侧所有舵机的速度值,如图7.50,7.51。
图7.50计算Left
图7.51计算Right
6.执行
运算的过程结束了,下面将运算结果输出,变成机器人移动的速度。
从左侧控件列表“FunctionWidget”里拖拽一个Servo控件至流程图中。
双击该控件,在弹出的属性框里进行舵机速度的赋值。
1号和2号舵机在底盘的右侧,所以我们将Right值作为他们的速度值。
3号和4号舵机在底盘的左侧,所以其速度值为Left。
控制俯仰的5号舵机,我们为其赋值600,让摄像头俯下一些,这样可以跟地面成一定的角度,方便进行距离控制。
至此,一个闭环的控制周期完成,我们添加一个while控件将这个过程周而复始的循环起来,就能让机器人动态的跟踪一个带颜色的目标球了,如图7.52。
为了让控制过程更有效率,通常在这个while循环里面,我们会加入一个Delay控件,进行250毫秒左右的延时,这么做的目的是等待新的图像帧的到来,保证每个周期开始执行时,视频图像已经更新完毕,如图7.53,7.54。
避免出现相同的结果,重复的发送舵机速度指令,减少过多的指令在总线缓冲过程中可能出现堵塞或丢失的风险。
图7.52舵机初始化
图7.53等待延迟
图7.54程序流程
流程图生成的C程序代码如下:
#include"background.h"
intmain(intargc,char*argv[])
{
intRight=0;
intLeft=0;
intTurn=0;
intForward=0;
intDy=0;
intDx=0;
intBall_y=0;
intBall_x=0;
MFCapOpen();
MFCapSetH(30,0);
MFCapSetS(255,101);
MFInit();
MFSetPortDirect(0x00000FFF);
MFSetServoMode(1,1);
MFSetServoMode(2,1);
MFSetServoMode(3,1);
MFSetServoMode(4,1);
MFSetServoMode(5,0);
{
MFSetServoRotaSpd(1,0);
MFSetServoRotaSpd(2,0);
MFSetServoRotaSpd(3,0);
MFSetServoRotaSpd(4,0);
MFSetServoPos(5,512,256);
MFServoAction();
}
while
(1)
{
Ball_x=MFCapGetCenterX();
Ball_y=MFCapGetCenterY();
//CalculateTheDiffofBall_x
Dx=Ball_x-160;
//CalculateTheDiffofBall_y
Dy=Ball_y-60;
//Forward
Forward=Dy*10;
//Turn
Turn=Dx*2;
//left
Left=Forward+Turn;
//Right
Right=Turn-Forward;
//Action!
{
MFSetServoRotaSpd(1,Right);
MFSetServoRotaSpd(2,Right);
MFSetServoRotaSpd(3,Left);
MFSetServoRotaSpd(4,Left);
MFSetServoPos(5,600,512);
MFServoAction();
}
//Waitfornewimageframe
DelayMS(250);
}
}
7.2.6颜色阈值标定
程序设计完成,在运行之前,我们需要对目标颜色阈值范围进行手动标定。
颜色标定的目的是为了将球的颜色标记出来,将背景中相近的颜色去除掉,实现机器人对目标物的识别。
如果这一步没做好,机器人在实际运行时可能出现误识别的情况。
将机器人与PC用网线连接起来,打开机器人开关,稍等20秒左右,待机器人控制器的系统启动完毕,双击流程图里的Vision控件,在弹出的属性框里点击“Opencamera”按钮,界面上会显示机器人看到的图像。
勾选Binarization选择框,图像中的有效像素将会用红色标记出来,拖动画面下方的阈值范围滑杆,画面中的标记也会实时变动。
改变H值范围,将改变标定的颜色阈值;改变S值范围,将改变对色饱和度的要求,通常用于排除背景中相近颜色的干扰,如图7.55。
图7.55标定目标颜色阈值
7.2.7程序的运行
所有工作结束后,就可以编译并下载到机器人上进行验证了。
点击NorthSTAR工具栏上的编译按钮,查看OutputWindow里面的编译信息,提示“Compilesucceeded…”说明编译成功,如图7.56。
图7.56编译成功
点击工具栏上的下载按钮,查看OutputWindow里面的编译信息,提示“downloadingsucceeded…”说明下载成功,如图7.57。
图7.57下载成功
将机器人放在地上,将目标球放在机器人面前10厘米处,点击工具栏上的运行按钮,机器人便开始按照我们设计的逻辑运行起来了。
试着将球拉远或移近,查看机器人是否像预计的那样运动。
7.2.8思考与提高
在这节内容里,我们借助NorthSTAR的Vision控件在“创意之星”高级版平台上实现了一个追逐圆球的全向机器人,它会随着面前目标球的移动而前进后退,试图保持与球的距离在一个定值,并正对着球。
功能的主体实现了,是否还有提高的余地呢?
这个机器人的运动是旋转和前进的叠加,全向移动的特点并未发挥出来,如何实现任意方向的移动?
请大家开动脑筋。
我们的程序逻辑是建立在球在机器人可视范围之内来设计的,如果球离开了视野,跑到机器人背后会怎么样呢?
发挥想象力,一定能设计出属于您自己的机器人。