Kinect2.0获取关节姿态(Joint Orientation)
- Bones Hierarchy
骨骼层次结构从SpineBase作为根节点开始,一直延伸到肢体末端(头、指尖、脚):

层级结构如下图所示:

通过IBody::GetJointOrientations函数可以获取到关节的姿态:
HRESULT = pBody -> GetJointOrientations(_countof(joints), jointOrientations);
关节姿态是一个结构体,其中包含了代表姿态的四元数部分:
typedef struct _JointOrientation {
JointType JointType;
Vector4 Orientation; // quaternion
} JointOrientation;
这里要搞清楚很关键的一点就是姿态是相对于哪个坐标系来描述的以及坐标系是如何定义的。网上说法不一(根本就找不到一个官方的解释...),MSDN论坛上有些人说是相对于父节点来描述的,那样的话要获得某一节点的绝对姿态必须遍历骨骼层次结构直到根节点,并将遍历路径上的旋转矩阵(四元数)相乘,以获得相对于固定坐标系的姿态矩阵. To calculate the absolute orientation of each bone, multiply the rotation matrix of the bone by the rotation matrices of the parents (up to the root joint). 不过也有讨论说这个姿态就是摄像机坐标下的,而不是相对于父节点的。如果是这样的话就省去了很多中间计算步骤。下面进行测试来看看关节姿态到底是怎么描述的:
1. 末端节点(Head、HandTip、Thumb、Feet)不含有姿态信息,这些关节返回的四元数各分量都为0:

2. 所有的关节姿态描述都以摄像机坐标系为参考,当人体站正朝向Kinect时SpineBase关节处的坐标系如下图所示。此时返回的关节四元数理论上应为(w,x,y,z)=(0,0,1,0),对应的Z-Y-X欧拉角为(180°,0,180°)或(0,180°,0)

站正后进行测试,输出SpineBase关节的四元数,可以看出与理论结果很接近:

下面我保持身体竖直,绕着从头顶到脚底的轴线(Y轴)旋转一定角度,将SpineBase关节的姿态四元数转换成欧拉角并记录在CSV文件中。下图是根据原始数据绘制的曲线图,可以看出我在绕Y轴旋转身体时X轴和Z轴角度是没有太大变化的(由于Kinect精度所限和各种噪声干扰也不可能一直是180°),而Y轴角度数据有明显的线性增长趋势,对应了我身体的匀速转动:

3. 关节坐标系的Y轴沿着骨骼的方向,Z轴为骨骼转动轴( Z-axis points to the direction that makes sense for the joint to rotate),X轴与Y轴和Z轴垂直,构成右手坐标系:
- Bone direction(Y green) - always matches the skeleton.
- Normal(Z blue) - joint roll, perpendicular to the bone
- Binormal(X red) - perpendicular to the bone and norma
比如对于肘关节和膝关节来说,只有一个转动自由度,因此Z轴(平行于冠状轴)朝向身体的两侧,关节带动骨骼绕着Z轴旋转,如下图所示:

当站正朝向kinect时,右肘关节的姿态四元数理论上应为(w,x,y,z)=(0, 0.707, 0, 0.707),下面是站正测试得到的实际值,可以看出还算比较接近:

另外也可以在Kinect Studio中的Monitor 3D View界面上进行设置来查看关节姿态信息:

关节箭头显示的方向就是法向,即旋转轴的指向:

可以看出肩关节和髋关节的Z轴都是指向身体前方。有了这些关节姿态信息我们就可以方便的控制虚拟人物或者实体机器人(当然得到每个关节的三位坐标点然后计算关节夹角也可以)。
参考:
Adventures in Motion Capture: Using Kinect Data (Part 1)
Adventures in Motion Capture: Using Kinect Data (Part 2)
Adventures in Motion Capture: Using Kinect Data (Part 3)
How to interpret JointOrientation data
Meaning of Rotation Data of K4W v2
Kinect2.0获取关节姿态(Joint Orientation)的更多相关文章
- 使用Kinect2.0获取点云以在GLUT中显示
这篇文章用来记录Kinect2.0如何生成点云. 以下示例源自Kinect提供的example修改完成,其名称会在小标题下方注解. 首先,要获取点云需要获取图像的深度数据和颜色数据.最后再将深度数据与 ...
- Kinect2.0获取数据
最近事情真是多,今天抽空研究一下Kinec2.0的数据获取! 系统要求 https://developer.microsoft.com/en-us/windows/kinect/hardware-se ...
- 使用Kinect2.0控制VREP中的虚拟模型
VREP中直接设置物体姿态的函数有3个: simSetObjectOrientation:通过欧拉角设置姿态 simSetObjectQuaternion:通过四元数设置姿态 simSetObject ...
- Kinect2.0点云数据获取
接上一篇:Kinect2.0获取数据 http://blog.csdn.net/jiaojialulu/article/details/53087988 博主好细心,代码基本上帖过来就可以用,注释掉的 ...
- Kinect2.0骨骼跟踪与数据平滑
Kinect v1和Kinect v2传感器的配置比较: Kinect v1 Kinect v2 颜色(Color) 分辨率(Resolution) 640×480 1920× ...
- C#微信公众号开发-高级接口-之网页授权oauth2.0获取用户基本信息(二)
C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一) 中讲解了如果通过微信授权2.0snsapi_base获取已经关注用户的基本信息,然而很多情况下我们经常需要获取非关注用户的信息,方法 ...
- Ext4.0 获取选中行及遍历
var grid= Ext.getCmp('grid'); var records=grid.getSelectionModel().getSelection(); if(records!=null& ...
- 微信公众平台开发—利用OAuth2.0获取微信用户基本信息
在借鉴前两篇获取微信用户基本信息的基础下,本人也总结整理了一些个人笔记:如何通过OAuth2.0获取微信用户信息 1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url ...
- servlet3.0获取参数与文件上传代码示例
转: servlet3.0获取参数与文件上传代码示例 2018年08月26日 20:25:35 苏凯勇往直前 阅读数:98 package com.igeek.servlet; import ...
随机推荐
- Orchard之在前台显式一个属于自己的列表
一:当前现状 Orchard 并不提供筛选 Owner 的 Query,但是 Gallery 中有提供,那就是:Owner Queries. Install 之,然后在解决方案中引入该 Project ...
- 基于Python的卷积神经网络和特征提取
基于Python的卷积神经网络和特征提取 用户1737318发表于人工智能头条订阅 224 在这篇文章中: Lasagne 和 nolearn 加载MNIST数据集 ConvNet体系结构与训练 预测 ...
- SVG.js 颜色渐变使用
一.SVG.Gradient 1.线性渐变.径向渐变,设置渐变的起始点,设置径向渐变的外层半径 var draw = SVG('svg1').size(300, 300); //SVG.Gradien ...
- 代理服务器polipo;socks5代理转http代理
安装: brew install polipo 使用: To have launchd start polipo now and restart at login: brew services sta ...
- JQuery的ajaxFileUpload的使用
https://www.cnblogs.com/zhanghaoliang/p/6513964.html 最近在工作中使用了Jquery的ajaxFileUpload的图片上传插件,感觉这种异步上传的 ...
- sql server获取标识,获取最后ID IDENT_CURRENT、IDENTITY、SCOPE_IDENTITY区别
概念解释 IDENT_CURRENT returns the last identity value generated for a specific table in any session and ...
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\AllowRemoteConnection
ylbtech-Error-WebForm: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters\ ...
- Tiny210 U-BOOT(二)----配置时钟频率基本原理
U-BOOT在启动的过程中,需要配置系统时钟. 配置系统时钟,大概是以下几个步骤: (1)设置系统PLL锁定时间 (2)配置PLL (3)配置各模块分频系数 (4)切换到PLL时钟 1.基本原理 首先 ...
- c#中的数组、ArrayList、List区别【转】
首先说明C#中的Array类:Array 类是 C# 中所有数组的基类,它是在 System 命名空间中定义.Array 类提供了各种用于数组的属性和方法.关于Array类的一些属性及方法详见博文:C ...
- Redis2.2.2源码学习——Server&Client链接的建立以及相关Event
Redis中Server和User建立链接(图中的client是服务器端用于描述与客户端的链接相关的信息) Redis Server&Client链接的建立时相关Event的建立(图中的cli ...