课程设计(创意之星)
课程设计
(基于“创意之星”的四足爬虫壁障机器人)
一、课程设计目的:
1 了解一个机器人的基本组成部分及结构 2 了解并掌握舵机的调整方法
3 通过编程使机器人具有基本的智能
二、课程设计内容
Ⅰ.系统简介
⑴ 创意之星简介:
图一:创意之星
博创科技推出的最新UP-InnoSTAR创意之星机器人套件产品,以替换上一代“创意之星”产品。该套件是一套用于开展机器人创新实验的模块化机器人套件。分为入门版、标准版和高级版,并有多种配件可选购。
创意之星机器人套件的总体特点类似LEGO Mindstorms NXT套件,都是具备多种基本“积木”构件的模块化零件套装,包括多种数百个结构零件,一个控制器,多个电机、舵机执行器,多种传感器,以及电池、电缆等附件。用这些“积木”可以搭建出各种发挥想象力的机器人模型来。
创意之星机器人套件主要为创作机器人而设计。具备32位520MHz的处理器,可处理视频、语音、大容量存储;支持最多254个CDS5500总线式舵机(也可作减速电机使用,指令兼容Robotis的Dynamixel AX12+),并同时具备多个I/O和A/D转换器,以及USB、WiFi等端口。另外,机器人的结构件和创新的连接方式专为创作机器人而设计,连接刚度和结构强度不逊色于铝合金构件,并且连接非常方便。
(2) 控制器:
图二:MultiFLEX2控制器
MultiFLEX2控制器是一款专为智能机器人和小型智能设备设计的多功能控制器,适合作为为智能机器人的主控制器。它具备以下功能:
1. 具备520MHz、32位的高性能嵌入式处理器和
Linux操作系统,运算处理能力强大,而功耗只有2瓦,尺寸只有11厘米 X 7厘米,重不到250克; 2. 控制直流电机(须配合BDMC系列伺服驱动器),控制舵机(包括所有的传统航模舵机、博创的机器人舵机、韩国AX12+等机器人舵机);调速、位置控制、力矩控制;可控制多达64路电机/舵机;
3. 连接各种传感器。通过20个数字/模拟量的输入/输出端口,可以连接数百种传感器,采集传感器数据并处理、决策;
4. 可连接摄像头,实现人联识别、颜色识别、形状识别等智能特性;可实现中文语音识别和语音合成,非常适合家庭服务机器人、教育娱乐机器人和特种服务机器人使用;
5. 具备RS422总线、USB总线、CAN总线和无线以太网(WiFi),市场上的各种功能模块,例如U盘、网络、视频监控系统、电子罗盘、GPS等设备,均可以直接连接到这款控制器上;
(3) NorthSTAR图形化软件: 目前来说,阻碍机器人技术普及和大规模发展的主要因素有两个,一个是硬件没有统一标准,另一个是各种机器人都有自己独立的软件,无法通用。
假设A厂商和B厂商都生产硬件类似的扫地机器人。目前,如果要将A机器人的功能移植到B机器人,除了编写程序之外别无他法。而对比目前巨大的PC市场,会发现如果A、B两个厂商生产的是PC机,那么只需要简单地把相应的程序拷贝过去就可以实现同样的功能。这是PC机市场能够发展到今天的规模的重要原因,即软件通用化。 在当前机器人硬件标准不统一的阶段,博创科技为提高机器人软件的通用性,降低开发难度,推出了NorthSTAR图形化机器人开发环境。包括以下三个部分的功能:
1. 用图形化、可视化的方式给机器人编程,同步生成C语言代码,在后台编译、并下载到机器人控制器上执行;
2. 集成3D仿真。可进行动作仿真、步态及路径规划等。仿真数据能输入图形化编程
环境;集成实时、可视化数据采集与显示。类似虚拟示波器的功能,能在机器人运行的时候实时监控机器人各部分的数据,并用波形的方式显示在
PC
机上。
图三:北极星软件
Ⅱ.爬行机器人设计及组装
机器爬虫的结构组装如下图所示:
图四:爬虫机器人(1)
机器爬虫每个腿部构型由2 个基本构型B,1 个L1-1,一个L3-1 以及相应的连接件构成。四只腿两两对称,组装的时候需注意。机器爬虫的头部构型由1 个基本构型B,2 个红外传感器,1 个L3-3,2 个V2-2 以及相应的连接件构成。机器爬虫控制盒由2 个电路板底座,6 个U1-2-1,1 块电路板以及相应的连接件构成。整个机器爬虫由1 个头部构型,4 个腿部构型,1
个控制盒,1 个支撑架,1 个L5-1,1 个电池组以及相应的连接件构成。建议腿部与躯干用螺钉连接以保证机体的稳定性。组装好后的机器爬虫如下图所示:
图五:爬虫机器人(2)
由于两个红外传感器平行不利于分辨光源方向,所以我们要对机器爬虫的头部进行改装。改装的机器人头部如下所示:
图六:摄像头改装
机器人头部由1 个U1-2-1,一个V2-2,两个D8x6 轮轴,两个红外传感器以及一些连接螺钉装配而成,两传感器之间呈大概30 度夹角(这样更有利于辨别光源方向)。改装后的机器爬虫如下所示:
图七:整体模型
四只腿中八个舵机与控制卡的连接顺序还是和前面的四足爬虫一样。头部的左、右(以爬虫为基准的左右)光强传感器分别连接至控制卡的AD0 和AD1 接口上。
在实际安装中为了加强其壁障能力又进行了进一步修改,传感器数量改为4个,分布如下图:
图八:摄像头实际设置
Ⅲ.程序设计
(1) 逻辑分析:
总体来讲,机器人的壁障行为应该细分为发现障碍、躲避障碍等基本行为,在两个基本行为之中又夹杂着若干的逻辑判断,其具体分析如下问所述:
器爬虫开机复位后, 机器人默认为向前爬向,其四个传感器分为两种:内侧的两个为一组,外侧的两个为一组。首先对内侧的两个红外传感器进行判断,如果两个中任意一个有信号,按照上图的传感器布局可以发现此证明机器人距障碍物已太近,需要后退规避。当中间两个传感器均无信号时,在对外侧的两个传感器进行判断,均无信号时机器人前进,均有信号时机器人后退,右侧有信号左侧无信号时左转,反之右转。
实际逻辑结构如下图:
图九:最终逻辑图
在上图中,第一个IF选择为内侧两个传感器的判断,之后的3个IF判断为外侧的两个传感器的判断。
(2)程序代码:
#include "Apps/SystemTask.h" MFInitServoMapping(&SERVO_MAPPING[0],uint8 SERVO_MAPPING[10] = 10); {1,2,3,4,5,6,7,8,9,10}; MFSetPortDirect(0x00000FF0); int main() MFSetServoMode(1,0); { MFSetServoMode(2,0); int io0 = 0; MFSetServoMode(3,0); int io1 = 0; MFSetServoMode(4,0); int io2 = 0; MFSetServoMode(5,0); int io3 = 0; MFSetServoMode(6,0);
MFInit(); MFSetServoMode(7,0); MFSetServoMode(8,0);
MFSetServoMode(9,0); MFSetServoMode(10,0); MFSetServoPos(1,512,512); MFSetServoPos(2,512,512); MFSetServoPos(3,512,512); MFSetServoPos(4,512,512); MFSetServoPos(5,512,512); MFSetServoPos(6,512,512); MFSetServoPos(7,512,512); MFSetServoPos(8,512,512); MFSetServoPos(9,512,512); MFSetServoPos(10,512,512); MFServoAction(); DelayMS(1000); while (1) {
io0 = MFGetDigiInput(0); io1 = MFGetDigiInput(1); io2 = MFGetDigiInput(2); io3 = MFGetDigiInput(3); if ((io1==0)||(io2==0)) {
//后退
MFSetServoPos(1,440,512); MFSetServoPos(2,195,512); MFSetServoPos(3,649,512); MFSetServoPos(4,196,512); MFSetServoPos(5,359,512); MFSetServoPos(6,190,1023); MFSetServoPos(7,675,512); MFSetServoPos(8,189,512); MFSetServoPos(9,512,512); MFSetServoPos(10,512,512); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,302); MFSetServoPos(2,195,300); MFSetServoPos(3,580,300); MFSetServoPos(4,196,300); MFSetServoPos(5,459,302); MFSetServoPos(6,190,300); MFSetServoPos(7,375,908); MFSetServoPos(8,512,978); MFSetServoPos(9,512,300); MFSetServoPos(10,512,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,300); MFSetServoPos(5,459,300); MFSetServoPos(7,375,300); MFSetServoPos(8,189,978); MFServoAction(); DelayMS(300);
MFSetServoPos(1,640,908); MFSetServoPos(2,512,960); MFSetServoPos(3,449,396); MFSetServoPos(5,559,302); MFSetServoPos(7,475,302); MFSetServoPos(8,189,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,640,300); MFSetServoPos(2,195,960); MFSetServoPos(3,449,300); MFSetServoPos(5,559,300); MFSetServoPos(7,475,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,602,300); MFSetServoPos(2,195,300); MFSetServoPos(3,749,908); MFSetServoPos(4,512,956); MFSetServoPos(5,659,302); MFSetServoPos(7,522,300); MFServoAction(); DelayMS(300);
MFSetServoPos(3,749,300); MFSetServoPos(4,196,956); MFSetServoPos(5,659,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,440,490); MFSetServoPos(3,649,302); MFSetServoPos(4,196,300); MFSetServoPos(5,359,908); MFSetServoPos(6,512,975); MFSetServoPos(7,675,463); MFServoAction(); DelayMS(300); } else {
if ((io0==1)&&(io3==1)) {
//前进
MFSetServoPos(1,640,512); MFSetServoPos(2,195,512); MFSetServoPos(3,349,512); MFSetServoPos(4,196,1023); MFSetServoPos(5,559,512); MFSetServoPos(6,190,512); MFSetServoPos(7,475,512);
MFSetServoPos(8,189,512); MFSetServoPos(9,512,512); MFSetServoPos(10,312,512); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,908); MFSetServoPos(2,512,960); MFSetServoPos(3,383,300); MFSetServoPos(4,196,300); MFSetServoPos(5,459,302); MFSetServoPos(6,190,300); MFSetServoPos(7,375,302); MFSetServoPos(8,189,300); MFSetServoPos(9,512,300); MFSetServoPos(10,712,900); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,300); MFSetServoPos(2,195,960); MFSetServoPos(3,449,300); MFSetServoPos(5,459,300); MFSetServoPos(7,375,300); MFSetServoPos(10,312,900); MFServoAction(); DelayMS(300);
MFSetServoPos(1,440,302); MFSetServoPos(2,195,300); MFSetServoPos(3,549,302); MFSetServoPos(5,359,302); MFSetServoPos(7,675,908); MFSetServoPos(8,512,978); MFSetServoPos(10,712,900); MFServoAction(); DelayMS(300);
MFSetServoPos(1,440,300); MFSetServoPos(3,549,300); MFSetServoPos(5,359,300); MFSetServoPos(7,675,300); MFSetServoPos(8,189,978); MFSetServoPos(10,312,900); MFServoAction(); DelayMS(300);
MFSetServoPos(1,540,302); MFSetServoPos(3,649,302); MFSetServoPos(5,659,908); MFSetServoPos(6,512,975); MFSetServoPos(7,623,300); MFSetServoPos(8,189,300); MFSetServoPos(10,712,900); MFServoAction(); DelayMS(300); MFSetServoPos(1,540,300); MFSetServoPos(3,649,300); MFSetServoPos(5,659,300); MFSetServoPos(6,190,975); MFSetServoPos(7,575,300); MFSetServoPos(10,312,900); MFServoAction(); DelayMS(300);
MFSetServoPos(1,640,302); MFSetServoPos(3,349,908); MFSetServoPos(4,512,956); MFSetServoPos(5,559,302); MFSetServoPos(6,190,300); MFSetServoPos(7,475,302); MFSetServoPos(10,712,900); MFServoAction(); DelayMS(300); } else {
if ((io0==0)&&(io3==0)) {
//后退(与上后退相同故省略) } else {
if (io0==0) {
//左转
MFSetServoPos(1,540,512); MFSetServoPos(2,195,512); MFSetServoPos(3,749,512); MFSetServoPos(4,196,512); MFSetServoPos(5,459,512); MFSetServoPos(6,190,512); MFSetServoPos(7,375,512); MFSetServoPos(8,189,1023); MFSetServoPos(9,512,512); MFSetServoPos(10,512,512); MFServoAction(); DelayMS(300);
MFSetServoPos(1,640,302); MFSetServoPos(2,195,300); MFSetServoPos(3,449,908); MFSetServoPos(4,512,956); MFSetServoPos(5,559,302); MFSetServoPos(6,190,300); MFSetServoPos(7,475,302); MFSetServoPos(8,189,300); MFSetServoPos(9,512,300); MFSetServoPos(10,512,300);
MFServoAction(); DelayMS(300);
MFSetServoPos(1,640,300); MFSetServoPos(3,449,300); MFSetServoPos(4,196,956); MFSetServoPos(5,559,300); MFSetServoPos(7,475,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,908); MFSetServoPos(2,512,960); MFSetServoPos(3,549,302); MFSetServoPos(4,196,300); MFSetServoPos(7,675,605); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,300); MFSetServoPos(2,195,960); MFSetServoPos(3,549,300); MFSetServoPos(7,675,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,440,302); MFSetServoPos(2,195,300); MFSetServoPos(3,649,302); MFSetServoPos(5,359,605); MFSetServoPos(6,512,975); MFServoAction(); DelayMS(300);
MFSetServoPos(1,440,300); MFSetServoPos(3,649,300); MFSetServoPos(5,359,300); MFSetServoPos(6,190,975); MFServoAction(); DelayMS(300);
MFSetServoPos(1,540,302); MFSetServoPos(3,749,302); MFSetServoPos(5,459,302); MFSetServoPos(6,190,300); MFSetServoPos(7,375,908); MFSetServoPos(8,512,978); MFServoAction(); DelayMS(300); } else {
//右转
MFSetServoPos(1,540,512); MFSetServoPos(2,195,1023); MFSetServoPos(3,749,512); MFSetServoPos(4,196,512); MFSetServoPos(5,459,512); MFSetServoPos(6,190,512); MFSetServoPos(7,375,512); MFSetServoPos(8,189,512); MFSetServoPos(9,512,512); MFSetServoPos(10,512,512); MFServoAction(); DelayMS(300);
MFSetServoPos(1,440,302); MFSetServoPos(2,195,300); MFSetServoPos(3,649,302); MFSetServoPos(4,196,300); MFSetServoPos(5,359,302); MFSetServoPos(6,190,300); MFSetServoPos(7,675,908); MFSetServoPos(8,512,978); MFSetServoPos(9,512,300); MFSetServoPos(10,512,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,440,300); MFSetServoPos(3,649,300); MFSetServoPos(5,359,300); MFSetServoPos(7,675,300); MFSetServoPos(8,189,978); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,302); MFSetServoPos(3,549,302); MFSetServoPos(5,659,908); MFSetServoPos(6,512,975); MFSetServoPos(7,575,302); MFSetServoPos(8,189,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,340,300); MFSetServoPos(3,549,300); MFSetServoPos(5,659,300); MFSetServoPos(6,190,975); MFSetServoPos(7,575,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,640,908); MFSetServoPos(2,512,960); MFSetServoPos(3,449,302); MFSetServoPos(5,559,302); MFSetServoPos(6,190,300); MFSetServoPos(7,475,302); MFServoAction(); DelayMS(300);
MFSetServoPos(1,640,300);
MFSetServoPos(2,195,960); MFSetServoPos(3,449,300); MFSetServoPos(5,559,300); MFSetServoPos(7,475,300); MFServoAction(); DelayMS(300);
MFSetServoPos(1,540,302); MFSetServoPos(2,195,300); MFSetServoPos(3,749,908); MFSetServoPos(4,512,956);
MFSetServoPos(5,459,302); MFSetServoPos(7,375,302); MFServoAction(); DelayMS(300); } } } } } }
Ⅳ. 实验调试过程
1.传感器数量的修改:开始时,设计基本参考指导书使用双传感器感知障碍,在实际测试中发现效果不甚理想,主要体现在壁障不及时、容易进入死胡同等,所以将传感器数量改为四个,好处主要体现在感知范围增大,前瞻性好。
2.对步态的调整:开始时的范例步态,有不少部分存在不美观,浪费的问题,在很多移动的步态上进行了修改。
3.对步态数量的控制:在改进前很多情况下机器人即使发现了障碍但是因为该步态未完成所以机器很难停下来,所以将判断步态缩短为半个,并将一开始的左右转步态由1个变为1.5个。
图十:最终的爬虫机器人
Ⅴ .心得体会
通过本次实验尝试了一个简单机器人系统的组装,对机器人所应该具备的组成包括:传感器、移动机构、处理器有了一定的认识。对基于C语言的机器人控制算法有了一定的体会,对足类爬行机器人的步态运动和其他不同形式的运动方式有了一定的了解和体会。该系统有团队完成,在团队合作中,进一步锻炼了与人合作交往的能力。总的来说,此次课设过程顺利,收获颇多,取得了一定的成功。
三、参考文献
[1] 姚宪华,梁建宏主编.创意之星:模块化机器人创新设计与竞赛[M].北京:北京航空航天大学出版社,2010
[2] 谭浩强.C程序设计[M].北京:清华大学出版社,2005
[3] (美) Joseph L. Jones著. 机器人编程技术:基于行为的机器人实战指南[M].北京: 机械工业出版社,2006
[4] 王立权,陈东良,陈凯云编著. 机器人创新设计与制作[M].北京:清华大学出版社,2007