现实版铁甲钢拳
本帖最后由 nille 于 2014-8-8 16:04 编辑不知道大家对2012年春节联欢晚会上的创意节目《机器人总动员》是不是还有印象,几十个人形机器人在台上翩翩起舞,动作整齐划一。作为一个机器人爱好者来说肯定希望拥有这样一个机器人。但如果这个人形机器人只是跳跳舞,走文艺路线,混文艺圈,那就太没意思。能不能让人形机器人干点有意思的事情呢?后来有一天和朋友谈起2011年11月上映的电影《铁甲钢拳》让我萌生了制作一个遥控的格斗机器人的想法。
现在大部分的DIY人形机器人都是用舵机作为关节,包括《机器人总动员》节目中的也是。但是舵机和关节还是有本质的不同的,舵机的运动实际上是在一个平面上做180度的旋转,而关节的运动是以一个点为中心的多轴性旋转运动。所以在人形机器人的制作中可能需要两个舵机来完成一个关节的功能,通过这些舵机模拟人的动作,实现跳舞、行走、起卧、武术表演、翻跟斗等动作。这种形式的机器人对舵机的要求格外重要。我选择了机器人专用舵机DF15HMG,该舵机采用加厚外壳设计,结构坚固、扭矩大、旋转角度大、通讯速度快、主频高,齿轮方面使用了钢和铜的混合齿轮结构更耐用,对于人形这种多关节的机器人这点尤为重要,见图1所示。另外舵机内部选用了日本进口电位器作为反馈,控制角度可以达到200度,控制精度及其使用寿命更高。标准舵机的前后盖,兼容标准舵机支架。
图1 DF15HMG舵机
舵机选定以后,下面就要考虑结构上的制作了。机器人的两条腿我们可以参考DFRobot的双足机器人套装 ,这里我就不多描述了。在我的书《Arduino开发实战指南》中也有专门的介绍。完成后的两条腿如下。
图2 机器人腿部结构
膝关节的运动比较单一,我们用一个舵机就能实现,而髋关节和踝关节则需要使用两个舵机,我们将他们称为关节的前后方向和左右方向。在腿部结构中髋关节只有一个前后方向,它的左右方向的舵机我们放在了机器人的躯干里面,如图3所示。
图3 机器人的躯干
躯干部分可以认为是一个正方形的结构件,其中还安装了控制肩关节前后方向的舵机,我们将躯干封上后装在之前完成的两条腿上。完成后如图4所示。
图4 躯干及两条腿
胳膊的制作是采用了双足中的U型支架和标准舵机支架一节一节拼接出来的,首先在一个舵机上安装舵机支架和U型支架,如图5所示。
图5 胳膊的基本结构
这就构成一个胳膊的基本结构,由于受到pvcbot的影响,手的部分是使用PVC材料做的,将手直接安装在舵机支架上,如图6所示。
图6 小臂及手
在机械臂的设计中我们省略了手腕部分,因为在格斗的动作当中手腕的作用很小,可以将手和小臂看成一个整体。我们在图6的基础上在加一节胳膊的基本结构,如图7所示。
图7 制作完成的手臂
这就是我们制作完成的手臂,其中下面的舵机是肘关节,上面的关节是肩关节的左右方向。安装在躯干上之后如图8所示。
图8 将胳膊安装在躯干上
使用同样的方法制作另外一条胳膊并装在躯干上,然后在装一个舵机作为机器人的脑袋,这样机器人就有了一个可以左右摆动的头。完成后如图9所示。
图9 组装完成后的格斗机器人
组装完成后的格斗机器人总共使用了17个舵机,其中腿部使用5个舵机,胳膊使用3个舵机,两条腿和两个胳膊共16个舵机,再加上头上的一个舵机,总共17个。
接下来就是将这些舵机连接到舵机控制板上,通过软件来调整动作,舵机控制板上有一个串行接口,通过它与电脑的串口相连(若电脑没有串口可以购买一个USB转串口的模块),如图10所示。该软件内有一个3D的人形机器人模型,可以直观的反映我们调整各个舵机后机器人的形态,如图11所示,我们可以调节左侧的滑动条,也可以在3D模型上直接选择要调整的舵机用鼠标滑轮调节。在使用软件之前需要将舵机连接到对应的控制端口上,否则在使用时可能就会出现调整的是胳膊的滑动条,结果实际上机器人在动大腿的情况。
图10 舵机控制板
前期将舵机连接到对应的控制端口以及调整舵机的初始位置需要花费不少时间,有时可能需要将安装好的结构拆开再重新组装一遍。
编辑完成后的动作可以组成一个动作序列并能够下载到舵机控制板中保存起来,同时可以为该动作序列指定一个串口触发命令。
图11 软件界面
动作序列的制作是一个细致费神的活,手部的动作还好一些,最起码机器人不会摔倒;腿部的动作就比较麻烦了,如果调整不好,机器人就会重心偏移而摔倒。这里我们来简单的描述一下如何制作一个动作序列。
假设我们想制作一个图11中敬礼的动作,首先需要将动作分解为一个个的静态的姿势,一个敬礼的动作可以分为两步,首先是由两臂下垂变为右臂抬起做敬礼状,然后再变回两臂下垂姿势。这样就需要3个动作点,我们先在软件界面中放置3个动作标签,如图12所示。
图12 软件界面
双击任意一个动作标签都会弹出图10所示的动作编辑窗口,这里我们将中间那个动作标签中的姿态调整为图11所示的敬礼姿势,第一个和第三个动作标签都设定为初始位置状态,即双臂下垂的状态。
动作编辑完成后我们通过鼠标右键的选项将3个动作标签连接起来,并将第一个动作标签设为开始动作,如图13所示。图中小红旗的标志即表示开始动作。
图13 将动作连接起来
最后可以通过菜单顶部的第6个按钮将动作下载到舵机控制板中,如图14所示。这样一个敬礼的动作序列就制作完了。
图14 动作下载按钮
我们的格斗机器人当然不需要敬礼这样的动作,它需要的是移动、闪躲以及出拳的动作序列。通过几天的努力终于为它制作好以下几个基本动作序列。
考虑到当机器人倒下时,我们希望它能够自己站起来,所以最后还添加了一个向前倒下后起身和一个向后倒下后起身的动作。这些基本动作序列调完之后,我们先将机器人放在一边,来看看遥控端如何处理。
为了在控制机器人时更有娱乐性,本人使用的是基于Arduino的开源游戏手柄,如图15所示。这个遥控器充分的利用了Arduino的资源,按键输入使用数字口,摇杆输入使用模拟口,不过更新手柄的程序需要使用FTDI下载器。
图15 游戏手柄外观,内部图
游戏手柄拆开其内部Arduino的资源使用情况如下表。
知道了手柄上各个按键所使用的资源之后,我们就可以编写手柄的代码了。如下,代码实现每操作一下手柄,就会发送一个控制机器人运动的命令。
//手柄操作程序
//定义变量
int joyLV,joyLH; //左摇杆的X、Y方向数值
int joyRV,joyRH; //右摇杆的X、Y方向数值
int butA,butB,butX,butY; //手柄右侧X、Y、A、B四个按键
int butW,butBL,butU,butD; //十字键上的四个方向
int butWH, butBL; //白色键和黑色键
int butBA,butST; //Back键和Start键
//setup函数,初始化数字端口为输入
void setup()
{
for(int i=2;i<14;i++)
pinMode(i, INPUT); //将2-14脚设为输入
Serial.begin(57600); //设置波特率57600
}
//loop函数,获取各个按键的状态
void loop()
{
joyLV = analogRead(A0);//读取模拟量
joyLH = analogRead(A1);
joyRV = analogRead(A2);
joyRH = analogRead(A3);
butA = digitalRead(5); //读取数字量
butB = digitalRead(4);
butX = digitalRead(3);
butY = digitalRead(2);
butU = digitalRead(8);
butD = digitalRead(10);
butL = digitalRead(9);
butR = digitalRead(11);
butWH = digitalRead(6);
butBL = digitalRead(7);
butST = digitalRead(13);
butBA = digitalRead(12);
if( joyLV > 679) //当左边摇杆向上时的A0口的AD值大于679
{
Serial.write(1);//手柄向机器人发送1,机器人将做出前进的动作
}
else if(joyLV < 338) //当左边摇杆向下时的A0口的AD值小于338
{
Serial.write(2); //手柄向机器人发送2,机器人将做出后退的动作
}
if( joyLH > 682) //当左边摇杆向左时的A1口的AD值大于682
{
Serial.write(15); //手柄向机器人发送15,机器人将做出左转的动作
}
else if(joyLH < 340) //当左边摇杆向右时的A1口的AD值小于340
{
Serial.write(14); //手柄向机器人发送14,机器人将做出右转的动作
}
if(butA == 0)//按下手柄A键
{
Serial.write(4); //手柄向机器人发送4,机器人将做出左摆的动作
}
if(butB == 0)//按下手柄B键
{
Serial.write(3); //手柄向机器人发送3,机器人将做出右摆的动作
}
if(butX == 0)//按下手柄X键
{
Serial.write(6); //手柄向机器人发送6,机器人将做出左拳的动作
}
if(butY == 0) //按下手柄Y键
{
Serial.write(5); //手柄向机器人发送5,机器人将做出右拳的动作
}
if(butU == 0) //按下手柄上键
{
Serial.write(13); //手柄向机器人发送13,机器人将做出起身的动作
}
if(butD == 0) //按下手柄下键
{
Serial.write(12); //手柄向机器人发送12,机器人将做出蹲下的动作
}
if(butL == 0) //按下手柄左键
{
Serial.write(8); //手柄向机器人发送8,机器人将做出左移的动作
}
if(butR == 0) //按下手柄右键
{
Serial.write(7); //手柄向机器人发送7,机器人将做出右移的动作
}
if(butBA == 0) //按下手柄的back键
{
Serial.write(16); //手柄向机器人发送16,机器人将从后爬起
}
if(butST == 0) //按下手柄的start键
{
Serial.write(9); //手柄向机器人发送9,机器人将从前爬起
}
delay(100);
}
程序下载完成后,每当我们操作手柄,就会发送一条控制指令到D1口,那么这个指令如何传输给机器人呢?在图15中我们发现这个开源的游戏手柄能够连接XBee接口形式的无线模块,我们就利用这个接口。这里本人使用的是DFduino wireless,它最大的优势是除了可以进行无线数据传输外,还可以作为Arduino的无线编程模块,在Arduino不便连接或根本就无法连接USB线缆的情况下,对其进行编程。这个特点非常适合这个手柄的使用情况,因为我们无法在合上外壳的情况下使用FTDI下载器对手柄进行编程,每次编程都需要打开外壳、下载程序,然后再合上外壳,拧上螺丝,如果使用DFduino wireless,我们可以在不打开手柄外壳的情况下完成程序下载。模块如图16所示。当然大家也可以使用其他无线模块,Xbee、APC220、蓝牙等等。
图16 DFduino wireless
手柄端完成后,再找一个配对好的DFduino wireless连接到舵机控制板的串行通信口上。我的遥控格斗机器人就基本成型了。当我将手柄上左侧摇杆向上推时,手柄会发送命令“1”,这个命令通过DFduino wireless传送给舵机控制板,舵机控制板收到命令后就按照内部存储的“1”所对应的动作开始执行。其他操作执行过程类似,这样我们就可以遥控这个人形机器人格斗了。
虽然我们的格斗机器人基本成型了,但是造型上还有点简陋,我们会进一步的完善我们的格斗机器人。To be continued...
相关链接:XBee,APC220,人形机器人,
无线程序下载模块,蓝牙v3
呵呵,要是有套曲面的3D打印外壳该多好啊~~~ 有跳舞的视频吗? Phoebe 发表于 2014-8-8 17:01
有跳舞的视频吗?
《现实版铁甲钢拳 2》中格斗机器人 现实版铁甲钢拳 2
页:
[1]