基于传感原理的虚拟仿生模型的动作设计

2019-05-17 02:43张婧婧张隅希
计算机技术与发展 2019年5期
关键词:手臂姿态角度

白 晓,张婧婧,张隅希

(新疆农业大学 计算机与信息工程学院,新疆 乌鲁木齐 830052)

0 引 言

仿生设计学是仿生学与设计学互相交叉渗透而形成的一门的边缘学科,其研究范围广泛、内容丰富多彩[1],涉及到多门类的自然科学,相关研究的领域和研究的方法也不尽相同。仿生设计学的主要研究方法为“模型分析法”[2],该系统的研究即为虚拟仿生模型的一种构造技术。通过构造虚拟手臂模型,模仿测试者的手臂姿态变化,实现人机互动的虚拟现实效果,该技术在动画制作、步态分析、生物力学、人机工程等领域应用广泛[3-4]。

设计中应用惯性传感器的传感原理,将三维角度数据送至3D视频软件的模型控制脚本中进行处理,旨在实现仿生模型与测试者姿态同步变化的虚拟仿真效果[5-6]。

1 仿生动作的姿态解算原理

仿生动作的姿态变化受控于模型中不同节点的角度数据,每个节点的三维角度数据包括:滚转角φ、俯仰角φ和偏航角θ[7],如图1所示。其中Y0轴指向水平东,X0指向水平南,Z0轴竖直向上,为绝对参考系。Xn、Yn、Zn(其中n=1,2,3)分别为节点的当前坐标系,Xn指向节点右侧方向,Yn指向节点前进方向,Zn指向垂直于节点的方向,其角度测量的范围由控制模型的角度传感器决定。该设计中采用的角度传感器型号为JY61[8],其数据量程中角度X、Z轴为±180°,Y轴为±90°。

图1 三维数据的参考坐标系

基于Jy61采集的角度数据,系统虚拟仿生模型的姿态解算方式如下:

角速度计算公式:

滚转角(x轴)

Roll=((RollH<<8)|RollL)/32 768*180(°)

俯仰角(y轴)

Pitch=((PitchH<<8)|PitchL)/32 768*180(°)

偏航角(z轴)

Yaw=((YawH<<8)|YawL)/32 768*180(°)

2 虚拟仿生模型的设计

2.1 手臂模型的设计

基于Unity3D视频开发工具,该设计中手臂仿生模型的外观及节点选取如图2所示。首先创建基于3D动画的手臂骨骼模型[9-10],生成后缀为.fbx的模型外观文件;其次在手臂的上部关节处先放置控制节点1(即图2的根节点1),用于建立模型的绝对坐标系;随后依次放置以节点1为根的子节点2,及以子节点2为根的下一级子节点3,后二者均为相对坐标系,以前一级节点坐标为参考,旨在模仿手臂3个关节处的相对动作。利用Unity3D中每个节点的transform组件,实时更新上述3个节点的三维角度数据(欧拉角),即可呈现上肢仿生动作的变化效果。

图2 手臂仿生模型

2.2 手臂模型的渲染

为了使模型的虚拟仿生效果更为逼真,设计中增加了必要的场景布置和模型肤色渲染。首先在Unity3D的工程中创建材质球,并为材质球增加皮肤贴图,然后将处理后的材质球拖拽到手臂模型中,即可生成彩色图片;其次在模型中还进行了场景布置,在场景中加入Camera组件和Light组件,用于观察3D视图和调整背景光线。

2.3 虚拟手臂模型的3D脚本设计

在Unity3D开发工具中,虚拟仿生模型的姿态变化取决于挂接该模型的脚本设计[11]。脚本的姿态控制可与节点的transform组件关联,将从串口获取的欧拉角配置到transform组件的rotation(x,y,z)中即可完成不同节点的角度更新。该设计中虚拟手臂模型有三处节点需分别控制,因此控制脚本代码也分为三个部分,其中根节点1的控制过程较为复杂,其程序流程设计如图3所示。

图3 根节点1的脚本控制流程

需要注意的是,读取所有节点的数据后,系统通过SerialPort.WriteLine方法将数据送入Transform组件中,因此在接收一帧数据后,串口需要执行先送数后关闭的动作。对节点2和节点3而言,只需根据根节点1读取的欧拉角数据更新节点2、3的相对角度,即可实现姿态的相应变化。

3 虚拟仿生系统的硬件设计

3.1 惯性传感器的工作原理

利用固定于人体上肢的3只惯性传感器,该系统获得了手臂仿生模型所需的姿态数据,然后经过无线传输方式将姿态信号传送至上位机。设计中选用的Jy61传感器属于高精度惯性传感器的一种,该模块主要采用高精度的陀螺加速度计MPU6050。基于I2C总线,MPU6050可输出三轴加速度和三轴角速度,其中针对三轴的角速度进行积分,即可获取3个方向上的旋转角度,即为欧拉角。然而由于误差噪声的存在,陀螺仪的积分过程无法获得准确的姿态,尤其在运行一段时间后,积分误差的累加会使得模型姿态和实际的动作相差甚远,为此Jy61需配合动态卡尔曼滤波算法[12-14],降低获取动态角度数据的误差,确保在较长时间的动态环境下准确输出当前的姿态数据。

在Jy61传感器中,三维角度数据获取时通常以0x55为包头,在读取0x53角度包标识后开始接收角度数据,依次读取的数据包括:X轴角度低字节、X轴角度高字节、Y轴角度低字节、Y轴角度高字节、Z轴角度低字节。

3.2 系统的硬件设计原理

基于ARDUINO UNO R3开发板[15],该系统实现了惯性传感器的数据采集及与上位机的数据传送。在开发板的低位I/O口中,以模拟软串口的方式,放置了3组JY61传感器,并将其固定于测试者的手掌、前臂、上臂之间(参考图2的位置),用于采集三个节点的三维角度数据。获取角度数据后,利用HC-05蓝牙模块将数据送至上位机,再通过更新transform组件的参数,即可随机改变仿生手臂中3个节点的欧拉角(即更新姿态)。即当测试者随意变化手臂姿态时,Unity 3D中的仿生模型就会跟随传感节点同步变化且实时更新姿态。

4 虚拟仿生模型的实现

4.1 传感器的数据采集及处理

在ARDUINO平台中,针对Jy61传感器的数据采集、处理过程较为简单,该设计中首先模拟了3组软串口,其串口的波特率均设定为:9 600 bps。在接收到标识包0x53后,系统开始读取角度数据,其中采集并处理角度数据的核心代码如下:

if(counter==0&&Re_buf[0]!=0x55) return; //第0号数据不是帧头

counter++;

if(counter==11)//每帧接收到11个数据

{

counter=0;//重新赋值,准备下一帧数据的接收

sign=1;

}

if(sign)

{

sign=0;

if(Re_buf[0]==0x55) /检查帧头

{

if(Re_buf [1]==0x53) //取角速度数据

{

angle[0]=(short(Re_buf[3]≪8|Re_buf[2]))/32 768.0*

180;

angle[1]=(short(Re_buf[5]≪8|Re_buf[4]))/32 768.0*

180;

angle[2]=(short(Re_buf[7]≪8|Re_buf[6]))/32 768.0*

180;

Serial.print("!");

Serial.print(angle[0]); //显示节点1的欧拉角

Serial.print("#");

Serial.print(angle[1]); //显示节点2的欧拉角

Serial.print("#");

Serial.print(angle[2]); //显示节点3的欧拉角

mySerial1.flush();

mySerial1.end(); //关闭串口1,打开串口2,接收第2个节点数据

mySerial2.begin(9600);

}

}

}

依据上述代码,依次采集三组惯性传感器的数据,并发送至Unity 3D中,由控制仿生模型姿态变化的3D脚本接收,并实施相应动作。

4.2 系统的测试

根据上述设计内容,在Unity3D中进行虚拟仿生模型的动作测试。基于ARDUINO平台中固定于测试者上肢的3个传感器节点,系统实时获取虚拟仿生模型所需的欧拉角,以实现动作跟踪。当测试者做举手和放下的动作时,虚拟仿生模型中的测试效果如图4所示。

图4 虚拟仿生手臂的动作测试

5 结束语

根据系统测试结果表明,初步实现了基于传感原理的虚拟仿生模型的设计要求,能够模拟手臂相应关节的翻转、伸缩、倾斜等姿态变化,且系统设计优势在于测试者做动作时基本不受束缚,解算得到的姿态运动范围大、动态性能高。同时Jy61传感器体积小,便于佩戴且成本相对低廉,因此系统符合虚拟仿生模型的设计要求。

设计的不足之处在于,基于ARDUINO平台的硬件开发过程中,由于I/O口数量有限,无法获取更多的传感节点数据,使得部分关节节点的动作僵硬;此外,在硬件平台的数据采集过程中,对采取的数据进行分时传输,就3个节点的数据传输速度而言,未出现明显动作延时,如增大传感节点数量,数据的传输延时将不容忽视。

猜你喜欢
手臂姿态角度
手臂上的抓痕
攀爬的姿态
一个涉及角度和的几何不等式链的改进
全新一代宋的新姿态
角度不同
人啊
另一种姿态
完美的手臂
大树为什么有那么多手臂
7个动作,还原纤细手臂