image.png

MotionVenus SDK与MotionVenus软件配合使用,将人体骨骼数据及传感器数据转发到第三方软件进行二次解析与开发。

SDK提供Windows、Ubuntu 32位、Ubuntu 64位演示工程。SDK提供所有源码,用户可以在其它Linux发行版系统自行编译。

可以通过SDK获取的数据包括以下内容:人体53段骨骼的位置、旋转,传感器原始加速度、角速度、线性加速度、磁力值等。

image.png

SDK网络结构

SDK通过网络接收数据包,进行数据解析或二次开发。

如上图所示,局域网内一台PC运行MotionVenus客户端软件,通过TCP/IP协议经过路由器或交换机,将数据包发送到其他的设备。其它设备接收到数据包后,进行解析及开发。

将FOHEART MAGIC动作捕捉套装接收器通过6类以上网线连接到千兆路由器或交换机上,并将您的计算机连接到同一个路由器或交换机上。

确保计算机与动捕接收器处于同一网段,例如192.168.1.x网段。

1. 配置选项

MotionVenus端选择工具栏->选项->插件->转发规则->自定义

MotionVenus数据转发界面.png 

图1 选项

 

 数据转发说明.png 

数据转发说明

各个功能的含义可将鼠标悬停在内容后的图标上查看详细含义。

网络协议:数据流通过UDP协议发送,可以同时转发到多个地址。发送的目的地址和端口,在插件->数据转发中配置。

发送帧率:100Hz

3.5二进制数据流的结构

PART1数据包头部+PART2人体姿态数据

数据包头部固定长度128字节,从第129字节开始存储人体骨骼位置+旋转数据。

 

PART1:数据包头部

数据包头部.png

PART2:人体姿态数据

从数据包的129字节开始。

共53段骨骼,按照躯干+右上半身+右手指+左上半身+左手指+右下半身+左下半身顺序放置。

放置顺序如下:

放置顺序.txt

3.6字符串数据流的结构

字符串数据流使用Json格式组织并发送。下面是一帧标准的Json字符流:

Json Data Stream.txt

内容项说明:

2~20行为控制字段,用于说明数据帧里的内容:

表1 SDK字符串流数据项说明

1725467057822.png

20行之后为每一段骨骼的具体数值信息,key为骨骼名称的缩写,value中的项为骨骼内的数值信息,以胯部为例:

"PELV": {  

         "A": [0.0381, 0.9907, 0.1606],  

        "G": [0, 0.061, -0.061],  

        "KE": [-0.0594, -1.3518, -0.2268],  

         "LA": [-0.0009, 0.0044, 0.0007],  

        "LOC": [-0.0024, -0.0751, 0.9131],  

        "M": [0.1042, -0.3916, 0.3821],  

         "SQ": [0.1497, -0.6306, -0.7334, 0.205]  

}, 

"PELV":胯部骨骼的缩写名称。

"KE":骨骼欧拉角,单位Degree。对应SingleSkeletonDef结构体中的euler_degree;

"KQ":骨骼四元数,顺序xyzw。对应SingleSkeletonDef结构体中的quat_xyzw;

"LOC":骨骼起始点全局位置,单位m。对应SingleSkeletonDef结构体中的position_meter;

"A":传感器加速度值,单位g;对应SingleSkeletonDef结构体中的sensorAccel_g;

"G":传感器角速度值,单位Degree/s。对应SingleSkeletonDef结构体中的sensorGyro_DegreePerSecond;

"LA":传感器线性加速度,单位g。对应SingleSkeletonDef结构体中的sensorLAccel_g;

"M":传感器磁力值,单位mGauss。对应SingleSkeletonDef结构体中的sensorMag_mGauss;

"SQ":传感器四元数,顺序xyzw。对应SingleSkeletonDef结构体中的sensorQuat_xyzw;

"SE":传感器欧拉角,单位Degree。对应SingleSkeletonDef结构体中的sensorEuler_degree;

表2 53段骨骼名称及缩写

1725466295309.png

表3 52段关节名称

52 JointAngle Name.png

3.7 Windows SDK工程说明

3.7.1开启巨型帧

由于SDK原始数据单帧数据量较大,通常在3000~8000Byte,为了保证接收端的数据完整和转发效率,需要开启网卡的巨型帧功能。

打开 控制面板所有控制面板项网络连接:

image.png 

图2 网络连接

右键当前的网卡,选择属性

image.png

图3 网卡属性

在打开的页面选择配置

image.png 

图4 网卡配置

在打开的页面中,选择高级选项卡,找到巨型帧,右侧的值选择9KB MTU。

image.png 

图5 MTU选择

如果是英文设置页面,为Jumbo Frame:

image.png 

图6 MTU选择2

设置完成后单击确定,配置生效。

3.7.2软件需求

安装MotionVenus 2021.x或更高版本(要求操作系统为Win10 64Bit以上)。安装Visual Studio 2013或以上版本,需要安装Visual C++工具包。

SDK工程包括两个:

a. MotionVenusSDK:SDK工程,编译后生成DLL与LIB文件。b. MotionVenusSDK_Test:例程,调用MotionVenusSDK以获取和解析数据流。

3.7.3使用流程

使用Visual Studio 2013或以上版本打开MotionVenusSDK_VS2013.sln工程,成功加载后如下:

image.png 

设置MotionVenusSDK_Test为启动项目。

在MotionVenus端如下设置:

Windows端设置.png 

连接动捕设备并运行MotionVenusSDK_Test工程:

image.png 

成功接收到数据并解析。

通过改变MotionVenus端的不同设置以设定不同的数据格式。

3.7.4回调函数的说明

首先我们在main函数中注册一个回调函数FullBodyPosAttitudeCB 每当sdk收到一帧有效的数据 就回调一次FullBodyPosAttitudeCB函数,所有与人体姿态位置等相关的信息 都可以从FullBodyPosAttitudeCB函数内部获取到。

FullBodyPosAttitudeCB函数的定义如下:

1. void __stdcall FullBodyPosAttitudeCB( SOCKET_REF sender, StreamHeader* header,  SingleSkeletonDef humanFullBodySkeleton[KHS53_SkeletonCount])  

我们感兴趣的所有数据都通过最后一个参数humanFullBodySkeleton传递进来,它包含所有人体53段骨骼的所有数据。

通过骨骼的索引获取某一段骨骼的SingleSkeletonDef。

例如:获取左大腿骨骼的传感器加速度

1. humanFullBodySkeleton[KHS53_LeftUpperLeg].sensorEuler_degree  

3.8 Ubuntu SDK工程说明

Ubuntu 32位与64位的源码一致,使用时在不同平台编译后使用。源码在ubuntu 16.04 LTS 32Bit/64Bit上测试通过。

3.8.1 依赖库

如果接收的是字符串格式,那么需要jsoncpp库的支持,使用下面命令安装libjsoncpp库:

   sudo apt-get install libjsoncpp-dev

3.8.2 开启巨型帧

image.png 

图7 打开Ubuntu网络设置

image.png 

图8 打开当前网络设置

image.png 

图9 设置MTU

3.8.3 配置转发IP及端口

查看Ubuntu当前的IP地址:

image.png 

image.png 

可以看到Ubuntu的ip地址是192.168.182.128。

3.8.4 MotionVenus的网络设置

image.png 

在1处直接输入Ubuntu的网络ip,即192.168.182.128,端口填入5001,点击添加。

这样动作数据就开始向Ubuntu端输出了。

3.8.5 编译并执行测试文件

SDK已经编译为静态库,编译测试文件motionVenus_test.cpp:

g++ motionVenus_test.cpp -Isdk -Lsdk –lmotionVenusSDK -ljsoncpp -fshort-enums -pthread -o motionVenusSDK_test

生成了测试应用motionVenusSDK_test 下面执行它:./ motionVenusSDK_test

可以看到绑定了本地端口5001并能正确接收并解析数据:

image.png 

3.8.6 重新编译sdk的方法

如果修改了sdk中的文件,则需要再次编译。

进入sdk文件夹:cd sdk 

将motionVenusSDK.cpp编译为静态库libmotionVenusSDK.a,需要执行下面两个指令:

g++ *.cpp -fshort-enums –pthread -ljsoncpp -fPIC -c

ar rcs libmotionVenusSDK.a *.o

执行完后会出现libmotionVenusSDK.a这个文件。