D传感器获取人体的7个关节的3维坐标,这7个关节的3维坐标 包括左肩关节坐标、右肩关节坐标、肩膀中央关节坐标、臀部中央关节坐标、右肘关节坐标、 右腕关节坐标和右手关节坐标,同时还求取这7个关节的跟踪状态;
[0051] 关节的跟踪状态的值有3种:0、1、2,对应着"跟踪"、"推断""未跟踪" 3种情况。
[0052] 步骤3 :确定用户坐标系,利用步骤2获取的7个关节的3维坐标,确定用户坐标 系,并基于用户坐标系求4个角度的值,记为角度的测算值,这4个角度包括右臂的右倾角 (记为角度1)、前后倾角(记为角度2)、手肘弯曲角(记为角度3)和手腕弯曲角(记为角 度4),同时根据关节的跟踪状态确定每个测算值的有效状态;
[0053] 测算值的有效状态取值有2种:1、0,分别表示有效、无效。
[0054] 步骤4 :对角度的测算值进行抖动消除处理;
[0055] 步骤5 :抖动消除处理的结果,记为角度的平滑值,通过映射过程转化为用于交互 的角度值,记为角度的交互值,传递给通信模块;
[0056] 步骤6 :通信模块将交互值进行封装,并发送给远程端的交互端;
[0057] 步骤7 :交互端根据接收的数据,更新虚拟机械臂的状态;
[0058] 步骤8 :返回到步骤2 ;
[0059] 步骤9 :进行映射参数校正处理,完成后进入步骤2。
[0060] 步骤1中所述的初始化系统参数和设备,包括连接并启动3D传感器Kinect,开启 骨骼跟踪功能,同时进行卡尔曼滤波器的初始化工作。卡尔曼滤波器的初始化工作的细节 将在后面的步骤K1中介绍。
[0061] 下面就步骤3中角度的测算值的求取过程做详细说明
[0062] 获取的用户的左肩、右肩、肩膀中央、臀部中央、右肘、右腕、右手的三维坐标分别 记为0、h、@、泛巨、互互,其跟踪状态分别记为Sts、SRS、Ses、SCH、 SRE、SRW、SRH。设用户坐标系x轴正方向向量、y轴正方向向量、z轴正方向向量分别为0X、0Y、 0Z,这3个向量在传感器坐标系中表不为:
[0063]
[0064] 计算右肩-右肘向量XI:XI= 设XI在用户坐标系中表示为 (X,y,z),则有:
[0068] 再由下公式计算角度1、角度2的测算值Ag[l]和Ag[2]:[0069]
[0070]
[0071] 计算右肘-右腕向量X2、右腕-右手向量X3 :X2 = - X3二i_I,再由下公式计算角度3、角度4的测算值Ag[3]和Ag[4]。
[0072]
[0073]
[0074] 由下面法则可得Ag[i]的有效状态M[i]:[0075]
[0076]
[0077]
[0078]
[0079] 所述的步骤4抖动消除处理,如图2所示,包括如下步骤:
[0080] 步骤201 :求4个角度的测算值Ag[i]和有效状态M[i];进行卡尔曼滤波器的预 测,获取4个角度的预测值Ap[i];此处i表示角度i的数据,下文都是如此;令i= 1,转到 步骤202 ;
[0081] 步骤202 :若角度i的测算值Ag[i]的有效状态M[i]等于1,转到步骤203 ;否则, 跳到步骤209 ;
[0082] 步骤203 :判断角度i的测算值Ag[i]是否超过上下界Up[i]和Dn[i],即是否满 足条件Ag[i] >Up[i]或Ag[i] <Dn[i],若是,转到步骤204;否则,跳到步骤205 ;
[0083] 步骤204 :将角度i的测算值Ag[i]调整到上下界范围内,即若Ag[i] >Up[i],则 令 Ag[i] =Up[i];若 Ag[i] <Dn[i],则令 Ag[i] =Dn[i];转到步骤 205;
[0084] 步骤205 :对角度i的测算值Ag[i]与预测值Ap[i]作差,再求绝对值,结果记为 (11:即d|Ag[i]-Ap[i] |,转到步骤 206 ;
[0085]步骤206 :判断屯是否大于阈值thi,若是,转到步骤207 ;否则,跳到步骤210 ;
[0086] 步骤207 :求角度i的变化量d2,其中角度i的上时刻的测算值记为Ag' [i]。若 Ag'[i]不存在或无效,贝>1令(12=0° ;否则,令d2= |Ag[i]-Ag'[i]|,转到步骤208;
[0087] 步骤208 :判断d2是否大于阈值th2,若是,转到步骤209 ;否则,跳到步骤210 ;
[0088]步骤209 :用角度i的预测值Ap[i]替换其测算值Ag[i],即令Ag[i] =Ap[i],转 到步骤210 ;
[0089] 步骤210 :判断i是否等于4,若是,跳到步骤212 ;否则,转到步骤211 ;
[0090] 步骤211 :令i=i+1,跳到步骤202 ;
[0091] 步骤212 :以4个角度的测算值Ag[i]作为卡尔曼滤波器的观测结果,进行卡尔曼 滤波器的校正,得到抖动消除的结果,记为角度的平滑值A[i]。
[0092] 所述的步骤4抖动消除处理中的卡尔曼滤波器的使用是:
[0093] x(k|k_l)是估计的k时刻的状态向量,x(k|k)是校正的k时刻状态向量。 P(k|k-1)和P(k|k)是分别对应着状态向量x(k|k-l)和x(k|k)的协方差。u(k)是k时刻 的输入向量,z(k)是k时刻的观测向量,Kg(k)是k时刻卡尔曼增益矩阵。其主要的迭代方 程为:
[0094] x(k|k_l) =A?x(k_l|k_l)+B?u(k)...........................(8)
[0095] P(k|k-1) =A?P(k-11k-1) ?At+Q...........................(9)
[0096] x(k|k) =x(k|k_l)+Kg(k) ?[z(k)_H?x(k|k_l) ]............(10)
[0097] Kg(k) =P(k|k-1) ?HT ?[H?P(k|k-1) ?HT+R] 1............(11)
[0098] P(k|k) = [I-Kg(k) ?H] ?P(k|k-1)...........................(12)
[0099] 这里A是状态转移矩阵,B是控制矩阵,H是观测矩阵,Q是过程噪声协方差矩阵, R是观测噪声协方差矩阵。
[0100] 卡尔曼滤波器的具体实施是在步骤1、步骤201、步骤212中进行的,这里为了便于 介绍,将这3块的具体实施分解为步骤K1、步骤K2、步骤K3详细说明:
[0101] 步骤K1 :进行卡尔曼滤波器的初始化工作。设置状态向量维度为8,观测向量维度 为4,控制向量维度为0。其次,设置状态转移矩阵A和观测矩阵H:
[0102]
[0103] 设置过程噪声协方差矩阵Q、观测噪声协方差矩阵R:
[0104]
[0105]
[0106] 初始化X(kIk)和P(kIk):
[0107] x(k|k) = [0 0 0 0 0 0 0 0]T
[0108]
[0109] 步骤K2 :进行卡尔曼滤波器的预测。将x(k-l|k-l)代入公式(8),这里矩阵B= 0,得到x(k|k_l)。将P(k_l|k_l)代入公式(9),得到P(k|k_l)。
[0110] 步骤K3 :进行卡尔曼滤波器的更新。将P(k|k-1)代入公式(11),得Kg(k),再求 z(k) :z(k) = [A[l]A[2]A[3]A[4]]T,然后将z(k)、Kg(k)和x(k|k-l)代入公式(10), 得x(k|k)。最后,将P(k|k-1)和Kg(k)代入公式(12),求得P(k|k)。
[0111] 所述的步骤5中的映射过程,将4个角度的平滑值A[i],通过映射过程转化为4个 交互值Ir[i],包括:
[0112] 平滑值A[i]到交互值Ir[i]的映射关系可表示为:
[0113]
[0114] UpLi」、DnLi」是角度i的上卜界,MaxLi」、MinLi」是角度i的最大值和最小值。这 里4个角度的上下界设为:
[0115] Up[l] = 90。,Dn[l] = 0。,Up[2] = 90。,Dn[2] =-90°
[0116] Up[3] = 90。,Dn[3] = 0。,Up[4] = 90。,Dn[4] = 0。
[0117] 默认情况下,角度i的上下界与其最大最小值是一致的,即Up[i]等于