凌动的“奇”手 --仿生机械手

摘要

本系统主要以 EPCM-505C 开发平台为核心,利用虚拟现实与视觉技术,借助 Intel AtomTME645C 处理器,FPGA 及 Intel IPP、OpenMP、OpenNI、OpenCV、RTP 视频传输协议,旨在代替人完成轻量级的危险任务。该系统采用服务器、客户端架构模式。其中,服务器平台负责采集用户的手臂动作信息,客户端平台负责现场视频的采集传输以及仿生机械手臂的控制。客户端平台装于遥控小车上,程序启动,客户端平台开始采集、传回现场视频,并在客户端的屏幕上显示小车周遭场景。位于服务器端的用户根据传回的视频控制小车躲避障碍物进去危险区域后,首先通过安置在终端的体态传感器获取人体的手臂运动姿态并实时传输给客户端平台,然后由平台cpu 通过 PCIE 将捕获的数据传至 FPGA,再由 FPGA 控制仿生机械臂的运动,使得机械臂远程完成与人体手臂相同的动作,从而达到远程遥控机械臂完成轻量级任务的目的。

关键词 :仿生机械臂,远程体态控制, RTP 无线视频通信

系统设计

系统方案

系统采用 C/S 模式,由服务器端和客户端组成。其中客户端基于以 Intel Atom E645C处理器为核心的嵌入式系统,包括装载在遥控车上的机械臂和电源系统,并外扩了摄像头。服务器端包括采集用户信息的体态传感器及视频显示终端。客户端通过无线网络将视频传输给服务器端,在服务器端接收显示。同时,服务器端远程控制客户端仿生机械手完成轻量级的替代人工作业的任务。

系统方案

系统工作流程分为如下几个部分:

  • 远程服务器端启动,客户端 EPCM-505C 启动,安装在小车上的摄像头开始工作。
  • 服务器开始接受客户端通过无线网络传回的视频并显示在软件窗口。
  • 用户根据显示的视频,得到路况信息,遥控小车进入工作区域。
  • 小车进入工作位置完毕,用户站于体态传感器前,通过服务器识别认证,获得机械手臂的控制权。
  • 用户根据小车传回的视频,控制机械手臂完成任务。
  • 任务完毕之后,用户停止对机械手臂的控制,小车收起机械手臂,用户遥控小车返回。

软件流程图

系统软件流程分作两个部分:仿生机械手臂控制流程和视频采集传输流程
系统软件流程图

仿生机械手臂控制流程

OpenNI,OpenCV 一些常规变量进行了定义与初始化,为后面程序的执行做好基础。当 RTP 初始化完成后,体态传感器开始工作,软件提示框提示用户举起双手做出“校验”姿势,进行用户识别,当用户识别成功之后,体态传感器开始源源不断的更新数据。

体态传感器捕获到用户骨骼坐标,通过“骨骼坐标采集算法”得到用户右手手腕,肘关节以及肩关节的三维坐标。由于体态传感器采集到的数据存在抖动现象,我们将采集到的骨骼坐标经过“骨骼防抖动算法”滤波,得到平滑变化的骨骼数据。
体态传感器成功采集到平滑的骨骼数据之后,“手臂移动角度采集算法”开始对骨骼数据进行处理,将手臂骨骼移动的信息提取为四个角度的变化,同时,“手掌握合检测算法”开始采集手掌握合的信息,然后再将这些信息提取为第五个角度的变化,因为提取到的角度也存在抖动现象,类似“骨骼防抖动算法”一样,我们也加入了“角度防抖动算法”,使最后得到的角度值不会突变过大。

在服务器端得到了手臂移动的五个角度值后,程序对这五个角度进行打包处理,加入校验信息,然后使用 rtp 协议对其进行传输,客户端 EPCM-505C 同步接收到含有角度信息的数据包并且校验成功后,CPU 会将这些数据发送给 FPGA 处理。FPGA 在得到这些角度信息之后,通过“获取多路 PWM 波算法”,产生五路包含角度信息的 PWM 波,五路舵机在 PWM 波的驱动下,转动相应的角度值,即机械手臂开始工作,在同一时刻完成与用户相同的动作。

视频采集传输流程

客户端程序启动,开始对 OpenCV 及 RTP 协议做必要的初始化,然后尝试连接服务器。每个 RPT 服务都需要客户端及服务器端提供 IP 地址及两个传输端口(一个发送,一个接受),程序会根据这些信息,建立连接 RTP 连接。服务器连接成功之后,客户端视频采集程序启动,通过 OpenCV 捕获视频流,然后获取一帧图像,并且打包成数据包供给 RTP 传输,我们“视频采集传输算法”就是完成这些工作的。

系统核心算法

骨骼坐标的采集与滤波

用户骨骼坐标主要是通过我们自己写的whu_MyHand类的成员函数whu_GetSkeleton来获取的,whu_GetSkeleton有三个参数:m_RHand,m_RElbow ,m_RShoulder,分别代表右手手腕,右手肘关节及右肩关节的三维坐标。
程序初始化完成之后, OpenNI开始检测当前可视区域是否存在用户,区域内出现用户的时候,用户会被体态传感器一直跟踪,如果有多个用户,OpenNI还会为每个用户添加编号以识别不同的用户。
OpenNI检测出用户之后,开始检测用户是否做出“校验”姿势,所谓的“校验”姿势,即用户双手举过头,作投降状。

当用户做出“校验”动作并且被OpenNI成功检测出来的时候,生产链路开始工作, OpenNI函数GetSkeletonCap开始捕获用户的骨骼信息。实验发现,通过体态传感器直接采集到的骨骼信息存在抖动现象,因此还需要对这些骨骼信息进行防抖动滤波处理,我们设置了一个骨骼瞬时变化的最大距离圆,新的骨骼坐标与旧的骨骼坐标进行比较,当新的骨骼点落在距离圆里面的时候,说明骨骼数据没有抖动,反之,则说明骨骼存在抖动,我们就将新的骨骼点设置为这两个骨骼点连线的中点值。whu_GetSkeleton函数已经将骨骼坐标采集算法和滤波算法封装了,调用whu_GetSkeleton,函数将返回平滑的骨骼坐标值。

手臂移动角度的采集与滤波

通过上面的算法,我们已经得到了所需要的骨骼坐标,用户手臂摆动的时候,其骨骼坐标也会跟着变化,接下来,我们将这些变化的坐标转化成角度。

角度的获取主要是通过whu_MyHand类的成员函数whu_GetAngles实现的,用户摆动手臂的动作,可以分解为左右,前后,上下 三个方向的运动,手臂的左右摆动,我们是通过右手肩关节与腕关节的三维坐标的变化获取的,胳膊的前后摆动,主要反映到腕关节相对肘关节的坐标的变化,小臂的上下移动,可以视为腕关节与肘关节坐标的变化,手臂在这三个自由度的运动,可以直接对应三自由度舵机的转动。

手臂左右摆动:具体是由右手肩关节与腕关节的三维坐标获取的,如图所示,当用户正对着体态传感器做出左右移动手臂的动作的时候,腕关节的X与Z坐标的变化度是最大的,而肩关节几乎没有变化。当手腕从位置1变化到位置3时,对应的角度从角度1增到到角度3,由肩关节与腕关节的XZ坐标,很容易得到手臂左右摆动的角度。

手臂左右摆动

胳膊的前后变动:由下图人胳膊前后的变动主要反映到肘关节坐标的变动。根据实际反复的实验结果,当轴关节的 Z 坐标大于肩关节时,角度一律取 60 度,反之,为了保持角度变化的平滑性,在 60 度的基础再加上图中角度。
胳膊的前后变动

小臂的前后摆动:由下图小臂前后摆动的变化主要反映到腕关节相对肘关节的坐标的变化,当腕关节的位置前于肘关节(即腕关节的 Z 值小于肘关节)时,角度 1 和 2 分别为腕关节位于位置 1 和 2 时的转角,而当腕关节的位置后于肘关节时(如位置 3),为了保持角度的平滑变化,需在角度 3 的基础上加上 90 度。

小臂的前后摆动

以上考虑的是胳膊不动的时候小臂变化的角度,实际上,用户在完成一个手臂动作的时候,胳膊和小臂是一起移动的,因此,为了得到单纯的小臂移动角度,还得消除胳膊移动带来的影响,经反复实验,我们为小臂的摆动增加了修正值。

手掌握合检测算法

由于体态传感器没办法直接捕获到手指的坐标,我们通过上面提到过的whu_MyHand类的
成员函数whu_GetFingerAngle来得到手掌张合,具体算法如下:

  • 通过 OpenNI得到用户的深度资料图,然后将深度图通过平滑算法而后二值化为灰度图,并根据最小的Z值(即指尖的位置)得到手掌区域部分。
  • 将手掌部分的灰度图转化成一个2D矩阵的点集合,由于手掌张开的时候存在凹凸点会有夹角,因此,我们以3个点一组,判定旁边两个点与中间点的连线的夹角值,当夹角小于某个阈值的时候,便可以判定旁边中间点位于指尖位置,而当手掌张开的时候,会有很多个这样的点(平均每次可检测到32个点),这些点大部分都是位于指尖位置和手掌凹陷位置,排除那些离掌心很近的点(即手掌凹陷点),可以得到手指指尖点,如图4.2.6,红点为检测到的指尖位置, 而当手掌握合的时候,点数很少(平局每次检测到1个点)如图4.2.7示。

视频的采集传输

本系统的视频传输功能的实现采用的是实时传输协议(Real-time Transport Protocol,RTP)。RTP 是在 Internet 上处理多媒体数据流的一种网络协议,它是目前解决流媒体实时传输问题的最好办法。利用它能够在一对一(unicas,单播)或者一对多(multicas,多播)的网络环境中实现传流媒体数据的实时传输。

仿生机械臂的控制

从服务器端采集到的五路角度信息会通过RTP远程传输至位于客户端平台,并通过PWM波转换,得到五个舵机相应的转角。舵机控制线的输入是一个宽度可调的周期性方波脉冲信号,方波脉冲信号的周期为 20ms (即频率为 50 Hz)。当方波的脉冲宽度改变时,舵机转轴的角度发生改变,角度变化与脉冲宽度的变化成正比,其利用占空比来控制舵机的位置。
由舵机的工作原理可知,给舵机输入一个周期在 20ms 左右,脉冲宽度在 0.5ms 至 2.5ms之间的周期性脉冲信号,驱动舵机输出轴达到-90°到 90°之间的转角,呈线性变化。并且无论外界转矩怎样改变,舵机的输出轴都会保持在一个相对应的角度上,直到给它提供一个另外宽度的脉冲信号,才会改变输出角度到新的对应的位置上。因此,我们可以通过编程在FPGA 的输出端口得到需要的周期性脉冲信号。

FPGA控制机械臂的流程图

系统结果


机械手臂在用户控制下完成抓取动作杯子并放下的动作