快捷搜索:  汽车  科技

skt机器人教程(做了这么多年机器人)

skt机器人教程(做了这么多年机器人)注:最后取消了Arduino在中间碍事,直接上从机。全向轮能够直接向任何一个方向移动,不像普通的小车要先转向再移动,这样才能在落地前接住,毕竟落地前空中的停留时间再怎么最长也只有0.79秒(实测),而 时间成本=骨骼追踪 运动学逆向算解 信息传输 小车马达单独运动算解 小车移位(加速->匀速->减速),所以说任务是很艰巨而坎坷的(能够这么快的完成,离不开团队【虽然只有可怜的2个人】的支持大家的共同的努力,再次向你们致敬),但我还是想尝试一下,尽管之前完全没有接触过Kinect和全向轮。1. 项目说明:1-1 为什么要使用Kinect?1-2 为什么要使用全向轮?

这次的项目出自一个自嘲“被强迫写了11年'八股文'然后疯掉了”的高二学生, 除了幽默的文笔和思路清晰度制作步骤,最后呈现的项目的炫技姿势也相当八股文哦~深奥深奥啊!感觉做了这么多年的研发秃头大叔,瞬间被秒成了渣渣!

准备好了吗?一起跪着吃瓜吧!

自我介绍 :

诸位好,我是一名来自成都外国语学校的高二普高学生 Bill Yin,即将成为美国出国党一枚,男,在拿着Genuino 101想项目的时候,睡着,然后半夜惊醒,想出了智能小桶这个项目,利用暑假的时间【5天全身心爆肝投入,我现在困得想死(〃>皿<)】,尝试实现了这个想法,希望大家喜欢,如果有人能受到启发,通过自己的思索再现出来或者改进这个项目,亦或甚者能投入生产,那最好不过了~~

1. 项目说明:

1-1 为什么要使用Kinect?

  • 我有渠道能借用别人的Kinect1.0 【最新的是2.0(买不起),微软,快给我解释为什么停产啊!这个黑科技的应用根本远远不止用于XBOX好吧】
  • Kinect的骨骼追踪很适合这个项目,具体怎么用骨骼追踪来预判轨迹请继续浏览

1-2 为什么要使用全向轮?

全向轮能够直接向任何一个方向移动,不像普通的小车要先转向再移动,这样才能在落地前接住,毕竟落地前空中的停留时间再怎么最长也只有0.79秒(实测),而 时间成本=骨骼追踪 运动学逆向算解 信息传输 小车马达单独运动算解 小车移位(加速->匀速->减速),所以说任务是很艰巨而坎坷的(能够这么快的完成,离不开团队【虽然只有可怜的2个人】的支持大家的共同的努力,再次向你们致敬),但我还是想尝试一下,尽管之前完全没有接触过Kinect和全向轮。

注:最后取消了Arduino在中间碍事,直接上从机。

1-4 开发时间规划

1. 学习Kinect基本功:1天

2. 学习万向轮小车控制:1天

3. Kinect程序编写和测试:1天

4. 小车控制程序魔改测试 通讯硬件和程序编写及测试:1天

5. 两套独立开发的程序整合 Debug:1天

2. 原理解说1 Kinect抛物预判实现 :

skt机器人教程(做了这么多年机器人)(1)

2-1 硬件方面

使用到的Kinect功能介绍

骨骼追踪:微软黑科技,不是一般的佩服,从此黑转粉,能够实时反馈20块骨骼的三维位置和帧序列以及帧时间,其实还有更多的可以采集的源信息,但因为用不到,所以不再枚举,具体原理是通过人工智能采集深度图像特征点【所以说你侧过身她就傻眼了】,Kinect内置,已经训练好了,所以其实理解起来也不是很难,重点在于数据处理以及和其他图像(彩色,红外等)结合,由于Kinect有三只眼睛【你的女票一定来自克鲁苏,说不定是黑山羊什么的(其实是奈亚子啦!)】,得到的图像不在统一的坐标系,就像你的两只眼睛看到的不是同一副图像,会有角度差,所以坐标如何统一也是个难题【我TM玩个游戏居然这么复杂!】,然而这些都是微软已经处理好的问题【微软爸爸(岳父(雾))!!】,所有的都已经封装成了API,但是即便如此,编写最简单的Kinect也仍然极其复杂,不理解Kinect运作原理,很多实际的优化问题根本无从下手,大量的Bug不知道产生的原因,所以还是很有必要。但是实际体验极佳,正如当年的宣传语:你就是传感器! You are the sensor!

skt机器人教程(做了这么多年机器人)(2)

2-2 软件方面

基本功练习

由于Kinect只支持C#和C 开发,而C 开发Kinect的资料在国内几乎为0,有也只有零散的CSDN博客只有我手指头那么多【我确实只有10根,而且我确实数过有几篇博客】,所以肯定是要学学C# 的,但也不用学的过于深奥,只要理解了面对对象的思维方式(学过JavaScript的同学肯定表示秒懂,可以直接跳过)和基本语法,就足够了,毕竟难点不在语言,而在API调用和算法设计

学习的资源主要分为三类

【你绝对猜不到我在找资源这件事情上花了多久的时间】

官方文档(要不然连API框架都搞不定),官网有一些,对应SDK上有一些,SDK里面的样例非常有用,非常有利于缩短开发周期,里面的算法实现很多时候可以说是醍醐灌顶

skt机器人教程(做了这么多年机器人)(3)

中文专业书籍

我在看过后,比较推荐《Kinect应用开发实战》,先是Kinect工作原理讲解,然后是Kinect编程讲解,里面的例子简单明了,从易到难,从控制台开发到体感水果忍者开发应有尽有,且源代码公开,是非常适合入门的书籍,最后甚至有应用的展望,一次性搞定Kinect基础学习。

CSDN里面的博客,这些都非常的难懂,绝对不要尝试直接看,直接Kinect从入门到入坟,但是我还是列出来了,因为这些针对特定技术的讲解对缩短开发周期仍然有用,当然是指在搞定第二类的情况下且很容易被淹没在知识的海洋中,有用就拿走,没用就迅速跳过,切忌,切忌,切忌!

编程软件选择

1. Processing—— 我原本就打算用这个的,但是我就是死活都安装不对对应的版本(由于我用的是Kinect1.0,这个版本和2.0的开发环境完全不同,又老又旧,所以下载对应的软件版本和对应的非官方封装库十分重要,所以无可奈何只能放弃,用这个开发应该会更快些,毕竟比直接写C#多一层封装,Processing语法简单,容易看懂,哪像C#这种玩意儿。

2. Visual Studio 2013——这个版本要对,具体怎么建立C#WPT或者控制台工程,怎么添加KinectAPI引用,请移步CSDN,谢谢!【赞美自动补全功能,赞美微软爸爸!】

算法实现

重点来了,你怀疑我其他代码只是抄袭和拼凑,但是这个算法确实是我原创的,是我在测试了超过500遍代码后【感觉差点把手给甩脱臼(苦笑)】,一点一点改进出来的,每个参数我都测了几十遍,不停的记录,对比,分类统计分析才得出来的,下面进行理论讲解,但是实际的代码只会公布完成版本之前好几个版本,即不全有大量的BUG,但是能够看到基本雏形,如果能够看懂,相信你也能立马理解我的思路,也就能举一反三了。

主体理论——由于每个人的投掷动作相符,且动作在正常情况下也就那么几个:从下往上抛,从上往下扔,从前往后扔,大概就这三种,我只讲解第一种,因为其他的思路方向差不多,只要能够把握动作的特征点,就能举一反三。我先描述一下从下往上抛的动作过程:人手在基准线(可以是人的中心位置)以下,然后同时向前向上以弧线轨迹加速,在某个位置,突然开始减速,然而就在这个时候物体实际上已经脱离手掌,之后的动作都无所谓了,其实之前所采集的信息已经完全足够预测了。

skt机器人教程(做了这么多年机器人)(4)

skt机器人教程(做了这么多年机器人)(5)

skt机器人教程(做了这么多年机器人)(6)

skt机器人教程(做了这么多年机器人)(7)

▲运动位置波动分析图

减速的判断是靠三帧之间的位移除以时间得到的速度求导(可以特定简化)来算速度是否减弱(加速度),一旦加速度小于某个值,即可判断人体抛物的部分结束。大家都知道,视频是由图片组成的,即所谓的帧,每个帧之间的时间间隔相同,只要间隔够小,就能实现动态的效果,在Kinect中也相同,每次返回的数据都是一帧一帧的,大概每0.036秒一次,如果用上滤波和其他技术来帧润滑,可能会跳帧,即没用或者导致出现大误差的帧直接舍弃不用,但是我们处理的是动态的东西,所以需要冗余数据,方便在需要的时候提取使用,实现方法在下面会讲,在有了足够且有效的数据后,尽可能的截取时间间隔短的帧数据,然后用同一块骨骼的两次三维位置来计算位移,用两次的帧时间来算时间差(由于间隔过短,可能数会很小,下面会讲如何确保数据精读,且让计算机好算一些【看我多温柔,多体谅我的电脑(你TM有毒吧!!)】),然后用位移和时间计算三维矢量版本的抛物线线速度,然后通过x y坐标系平面投影,拆分成两个抛物线,然后分别预判x和y两个落地坐标值【高中物理 数学题,很简单对吧(坏笑)】,然后合在一起,再减去小车本身的坐标,就是小车以自己为原点的相对坐标(尽可能的达到两个优化目的:减少传输成本来减少通讯时间成本,尽可能的把所有运算交给电脑和Kinect【论计算能力用树莓派或者Lattepanda还可以考虑考虑,Arduino请绕行】),然后小车上的单片机得到这两个值后进行运动学解析,通过PID控制,来精确调整速度和姿态,如果加上速度反馈和位置反馈【只要有带光电码盘的电机就可以逆向实现】,效果【味道】更佳【你以为是饮料哇?】

主体框架——冗余数据-->速度向量-->抛物线求解-->落地点预测

实现思路

①冗余数据:通过类似于队列的数据类型,在任何时刻都会先把队伍向后挪一个位置,然后直接抛弃最末尾那个没用的数据,然后每一帧都会直接在提取需要的数据并简单的放大处理(和精度确保有关)后,直接录入队列头部,每次都这样执行,确保需要的数据一直在更新,这用类队列可以直接通过数组实现,以确保冗余不会无限增大,同样也可以用链这种特殊的数据结构来实现,可以通过两组数据模拟链,但能明显前者会更容易实现且资源占用更小【难得数组战胜了链表什么的,可喜可贺~】

②方程解算:通过函数式编程的抽象(其实就是函数啦~),为了方便解释,我还专门画了方程图【快快快!使劲夸我!用你们的呼喊和掌声砸死我(想的美!)】

——数学部分——

skt机器人教程(做了这么多年机器人)(8)

除去负值,尽可能提取相同的中间量,就可以得到

skt机器人教程(做了这么多年机器人)(9)

下面的4.3就是通过提前算好B/2A(换元的思想)来优化计算过程

——物理部分——

skt机器人教程(做了这么多年机器人)(10)

直接带入上面的数学方程,可以得到t,即在空中停留的时间

skt机器人教程(做了这么多年机器人)(11)

得到最终的相对于Kinect的X坐标值,Y轴同理,只要再减去小车坐标即可

优化实现

①帧润滑:

我本来打算用滤波,但是KinectAPI自带过滤,只要写入参数即可,但是参数的配置无法预测计算,只能瞎猜和查看实际效果,我得出的参数配置为Smoothing = 0.5f Correction = 0.5f Prediction = 0.5f JitterRadius = 0.05f MaxDeviationRadius = 0.04f

②精度确保:

  • 在浮点类型数据带入方程解算函数前,进行放大,我一般放大10000倍,然后转换成long型整数,然后计算完成后再缩小10000倍导出为浮点数即可
  • 固定常量采用实际测量的数据,比如这里的g重力加速度,我测出来是9.7964左右
  • 方程计算优化:上面已写
  • 坐标系的转换(Kinect坐标,人体坐标,抛物坐标,小车坐标互相转化)
  • 这部分网上的教程也比较多,用矩阵运算转换是比较常用的方法

3. 原理解说2 桥接通讯实现:

Arduino或者其他单片机如果是互相通信,采用串口(简单实用,尽管速度和宽带都不高),高级一点的可以采用CAN总线的方式,非常快宽带又足【数据闪电返回不再是梦】

从电脑到单片机,采用蓝牙或者WIFI(Kinect的C#有串口封装库,可以自己查找使用)

说到物联网,我再推荐几个资源:

1.Ruff的JavaScript版本的物联网非常棒,我体验了一下,充分体现了面对对象语言在物联网上面的优势,而且他们家的物联网单片机非常的厉害且十分完善,甚至能自动计算引脚接口,简直不能再棒,几乎将物联网简化到了极致,就是物联网中的Arduino

2. Rokid(是的,就是那个卖音响的)的物联网方案也非常完善,在用户体验上面几乎无人能敌,整合度极其优秀,特别是语音识别的API简化,简直不能再简单,也是采用JavaScript语言写,各种开发的工具都准备好了,开发过程非常流利爽快,满分不解释

3. Microchip公司的物联网单片机开发过程很像Arduino,Arduino的大部分库稍加修改也可以直接移植,计算能力异常彪悍,支持!

4. Intelligent Cloud,微软的黑科技 值得信赖

这些都是基本操作,网上的资料满天飞【自己找去】

4. 原理解说3 三轮全向轮小车控制实现 :

DFRobot上面有相关的产品,但是很贵,但是甚至直接有Kinect支持,有条件的朋友可以尝试尝试这个HCR家用机器人开源项目平台,很有潜力。

我目前实现的是P控制,以后有时间再尝试尝试其他PID控制,具体原理可以参考,连选材都讲解的十分详细的一篇帖子,大爱 Intel curienano 硬件试用 之 智能垃圾桶: 第一期(底盘篇)@饶厂长 非常感谢他所作出的努力,我在想出项目后,确实非常惊讶在中国,在DF论坛,在不久前,就已经有了先驱者,和我的想法不谋而合,我们的底层代码的魔改很多都是从这个帖子里面来的,极大的缩短了开发周期,再次表示感激,并十分期待这位道友能实现目标,毕竟要论能力和技能我们这个小团队是完全比不上的。

ROS:这个是专业级别的机器人控制体系,非常高效厉害,我目前还在学习这个,没有用上,希望有人能用这个做个更智能的出来【什么一键导航,导航建模呀之类的高级玩意,都可以通过ROS直接实现,非常厉害,用过的都表示好评如潮】

最终的成果展示:

视频加载中...

5. 项目开源&相关资料分享:

内容清单:

1. 各种版本的不完整版代码,可以学习思路,不要直接抄袭,反正给的也是有BUG的,里面除了上述的完成思路,这个还包括其他实现思路的半成品代码,说不定走得通

2. 部分版本带有C#版本的蓝牙串口通讯,可以看看,这方面的代码国内仅此一家,谢谢!

3. 单片机方面的代码没有公布,因为这个不是本文的重点难点,而且在读懂别人的控制教程后就可立马实现,所以没有上传【国内的Github速度你又不是不知道,很多我搜集的资料我想上传都不行,只能上传代码才能过日子的样子】

分享链接等我有空再传(我等会尝试用百度网盘来上传代码和相关资料

百度云链接更新:包括代码和我整理的Kinect和三轮全向轮小车控制学习资源

请尽情抄袭,转载,转发到其他论坛,上传到其他网站,我只希望有人能够看到这个作品,这样我就很满足了!但请标明作者!

Please share this project with others as soon as possible!

6. 改进方案:

图像识别:让人工智能算法追踪物体,可以真正实现物体实时追踪,然后直接修正预判轨道,可以直接消除阻力对较轻物体带来的影响,从一开始就打算用骨骼识别,所以没有采用这个方案,但是以后会考虑出个这个的版本,用DFrobot最近出的Pixy 2代 CMUcam5 开源图像识别传感器就可以做一个这种方案。

手势手环:定位方案和手势识别方案整合,OYmotion的gForce开发套件(甚至可以用人工智能训练手势识别的精度,任何手势的识别都可以做到,做机械臂的dalao应该会非常感兴趣)应该可以做到,但是开发时间不够,暂时没有做着方面。

7. 评价分析:

未来这项技术的应用非常丰富,比如空中接物,各种球类的接球机,导弹拦截,跳楼救人等,Kinect是一项伟大的实验,微软的努力是不会白费被埋没的,极客本来就是一群化腐朽为神奇的人才,不是吗?这位极客!

8. 精彩瞬间:

skt机器人教程(做了这么多年机器人)(12)

skt机器人教程(做了这么多年机器人)(13)

skt机器人教程(做了这么多年机器人)(14)

skt机器人教程(做了这么多年机器人)(15)

最后@Bill Yin 本尊

↓↓↓↓

skt机器人教程(做了这么多年机器人)(16)


*欢迎转发。如需转载,请注明出处和原作者

猜您喜欢: