LEAPMotion机械手

Created by miccall (转载请注明出处 miccall.tech)

介绍智能机械手的控制系统,从主动控制和自动检测两方面完成智能化,主动控制运用leapmotion+HV_hand ,自动检测运用多传感器对压力,触感,滑动,震动等数据的分析,自动辅助机械手的操作。

一. Leap-motion输入系统

1. 噪声抑制方法

尽管Leap motion的轨迹跟踪精度达到亚毫米级别,但是他的采集设备,是两个640 * 240的高帧率摄像头。
使用过程中,难免产生不稳定。器件的分辨率,热磁噪声,人手抖动,视觉遮挡,以及数值解算的奇异值等可能引入噪声信号。
为解决滤波问题采用的自适应截止频率低通滤波方法,通过手掌掌心点的速度实时改变滤波器的截至频率。
所谓自适应滤波,就是利用前一是时刻已经获得的滤波器参数,自动调节当前时刻的参数。具体的公式为

 H`(i) = a H(i) + (1-a) H`(i-1) 
 // H` 就是最后得出的平滑向量

他是由上一帧的平滑向量和当前帧的实时向量同时决定的
参数a的计算方法:

 a = 1/(1+t/T) // 其中 t = 1 / 2Πf 

 f = fc + B| V |

a的范围是[ 0 , 1 ] ,它由周期 T 时间常数 t 计算,f为截止频率。 V 是 H 的导数 。
代表手掌运动的线性速度 。
B 是一个系数 ,取0.5 , fc = 1Hz 。

部分代码如下

class LowPassFilter:Filter{
private:
    double[] prevACC;
    double factor ;
public :
    LowPassFilter()
    {
        this.factor = 0.01 ;
        this.reset();
    }
    LowPassFilter(double factor)
    {
        this.factor = factor ;
        this.reset();
    }
    override void reset()
    {
        this.prevAcc = new double [] {0.0,0.0,0.0};
    }
    override double[] filterAlorithm(double vector)
    {
        double [] retVal = new double[3];
        retVal[0] = vector[0] * this.factor + this.prevACC[0] * (1.0 - this.factor);

        retVal[1] = vector[1] * this.factor + this.prevACC[1] * (1.0 - this.factor);

        retVal[2] = vector[2] * this.factor + this.prevACC[2] * (1.0 - this.factor);

        this.prevACC = retVal ;
        return retVal;
    }
}

其次就是获取手的数据。


using namespace Leap;
class LeapROSListener: public Listener {
    public:
        // 方法的声明 
        LeapROSListener(ros::NodeHandle &nh);
        virtual void onInit(const Controller&);
        virtual void onConnect(const Controller&);
        virtual void onDisconnect(const Controller&);
        virtual void onExit(const Controller&);
        virtual void processFrame(const Frame&);
    private:
        ros::Publisher hand_info_pub;
};

主函数中 ,只有新生成一个LeapROSListener ,用于监听数据,就可以了。


    LeapROSListener listener(nh);
    Leap::Controller controller;
    ros::Rate loop_rate(refresh_rate);

    controller.addListener(listener);

    while(ros::ok()){
        listener.processFrame(controller.frame());
        ros::spinOnce();
        loop_rate.sleep();
    }

2. API映射

用户手部姿态的的变化将映射到实体,从而驱动模型再6个自由度运动。ros控制器接口传入手指以及方向信息

Public :
  float   Period = .1f
  IHandModel  HandModel = null
  Finger.FingerType   FingerName = Finger.FingerType.TYPE_INDEX
  PointingType  PointingType = PointingType.RelativeToHorizon
  Vector3   PointingDirection = Vector3.forward
  Transform   TargetObject = null
  float   OnAngle = 15f
  float   OffAngle = 25f
  bool  ShowGizmos = true
  Vector3 FingerName.Dirction
  Transform   palm
  Transform   forearm
  Transform   wristJoint
  Transform   elbowJoint

自定义接口方法


Vector3   TipPosition ();
Vector3   JointPosition (int joint);
Vector3   BoneCenter (int bone_type);
Vector3   BoneDirection (int bone_type);
Quaternion  BoneRotation (int bone_type);
float   BoneLength (int bone_type);
float   BoneWidth (int bone_type);
float   FingerJointStretchMecanim (int joint_type);
float   FingerJointSpreadMecanim ();

4. 性能分析

二. ROS机械系统

1. 模型

2. 运动描述

用户手部姿态的变化将映射到体数据,从而驱动体数据在虚拟空间做6个自由度运动。
空间态和位置解算是3维交互中非常重要的部分,准确的姿态解算能为下出个交互阶段提供可靠输入。
利用用户手部运动数据对体数据进行6个自由度交互映身射,位置信息由掌心点归一化坐标可以得到,而手掌姿态则需要通过计算旋转矩阵获得。
为了获得稳定的手掌姿态信息,采用基手四元数的姿态弹法从手外科学关节活动度来看,
用户手学旋转组厦非精有限料本文采用非同构的旋转探制大角度旋转.

3. 算法:

步骤1 通过Leap motion传感器获得当前跟踪的指尖向量d1,d2,d3,d4,d5以及手掌法向量Ni,
并计算指尖向量的和在向量Ni的垂面上的投影分量,记为Di
步骤2 通过向量Ni和上一帧的手掌法向量Ni-1,计算相应的旋转四元数QNi
步骤3 按照QNi 计算相应的旋转矩阵CNi,并通过CNi将上一帧向量Di-1旋转至向量Di-1,若Di-1与 D 不重合则计算它们之间的旋转四元数QDi
步驟4 将四元数QDi左乘QNi 得第i-1 和 i 的四数△Q ,通过公式更新当元数Q.。在公式中,引入控制比例因子 K ,调节k改变帧间四元数△Q
在计算Q时的计算权重,从而实现非同构的3D旋转,本文根据Leviral的操控需求取经验值k=25
步骤5 根据当前四元数Q=(q0 q1 q2 g3 )来确定手掌姿态矩阵C

3. 模块配置

4. 控制器接口

5. 人机交互

三. Arduino控制器

四. 多传感器数据整合

1 . 介绍

我们在仿生手的五个手指尖端,贴合感应传感器 FSR 。

Force Sensing Resistor 是著名Interlink Electronics 公司生产的一款重量轻,体积小,感测精度高,超薄型电阻式压力传感器。

它的材料是PVDF(聚偏氟乙烯),可以将施加在FSR传感器薄膜区域的压力转换成电阻值的变化,从而获得压力信息。压力越大,电阻越低。它允许用在压力100g-10kg的场合。

2. 功能

利用传感器的数据,将所有信号进行分析,融合与处理,我们可以保证他在接触不同的物体时,能够对不同的物体进行不同的力度控制,使易碎品保持完好,高温物体自动弹开等。

3. 设计方案

系统由采集单元,信号处理,采样保持电路 A/D转换单元,中央处理单元,机械手等部分组成。

传感器的信号,传入的电荷,通过范围传输会损耗,一般的做法都是置入电荷放大器作为放大电路。其二,他的工作范围时30Hz以下,电源使用的是50Hz,信号会受到工频的干扰,我们还要在第二级加入低通巴特沃兹有源滤波器,去掉干扰和高频噪声。在此之后,我们再加一个额外的电路放大器,提高灵敏度和降低中央处理采集的误差。

机械手试抓,触发手指的传感器与物体接触,顺序分析 温度,触觉,滑动,震动。
具体判断过程如图。直到物体抓取稳定。

数据融合 ,通过A/D 采样之后,我们得到的传感器数据,反应的是手指的压电信号,机械手综合物体的空间抓握以及手指的触觉信号,分析物体的大致形状,分析滑动趋势,获得下一步指令。

4. 测试与数据分析

<iframe height=498 width=510 src='http://player.youku.com/embed/XMjQzMzc1ODA0' frameborder=0 'allowfullscreen'></iframe>

5.部分代码


int fsrPin = 0;     // A0 接口
int fsrReading;
void setup(void) {
  Serial.begin(9600);
}
void loop(void) {
  fsrReading = analogRead(fsrPin);
  Serial.print("Analog reading = ");
  Serial.print(fsrReading);
  if (fsrReading < 10) {
    Serial.println(" - No pressure");
  } else if (fsrReading < 200) {
    Serial.println(" - Light touch");
  } else if (fsrReading < 500) {
    Serial.println(" - Light squeeze");
  } else if (fsrReading < 800) {
    Serial.println(" - Medium squeeze");
  } else {
    Serial.println(" - Big squeeze");
  }
  delay(1000);
}

6. 操作逻辑图

7. 测试结果

五.参考文献

https://pan.baidu.com/s/1o8iMtfG 密码 : y4km

  1. 基于多传感器数据融合的机械手研究
  2. 基于手势识别的装配机器人控制系统研发
  3. 气动类机器人仿生手设计