使用陀螺仪和加速度计数据旋转立方体

问题描述

我在 Panda3d 中创建了一个简单的演示,目的是使用手机的陀螺仪和加速度计控制基本立方体围绕 Y 轴(或垂直于屏幕的轴)的旋转。

以下是我的主循环

def update(self,task):
    global AA
    readSerialData()
    
    ga = getAccGyro()

    if(ga != None):
        g = (ga[0],ga[1],ga[2])
        a = (ga[3],ga[4],ga[5])


        cur_t = time.time()
        dt = cur_t - self.prev_t
        self.prev_t = cur_t

        gy_rate = g[1] * 0.07

        accYangle = -math.degrees(math.atan2(a[0],math.sqrt(a[1]**2 + a[2]**2) ))

        self.cy = AA * (self.cy + gy_rate * dt) + (1 - AA) * accYangle       

        self.Box.setR(self.Box,self.cy)

    return task.cont

此处为 AA = 0.98 和用于融合陀螺仪和加速度计数据的互补滤波器。

我遇到的问题是立方体在稳定之前开始向任何一个方向(顺时针或逆时针)漂移一段时间,即使我尽可能保持手机静止。

我尝试在 getAccGyro() 函数中对来自传感器的原始输入值设置阈值:

if(abs(gx - baseAccGyrovalues.gx) < 1):
    gx = 0

if(abs(gy - baseAccGyrovalues.gy) < 1):
    gy = 0

if(abs(gz - baseAccGyrovalues.gz) < 1):
    gz = 0

if(abs(ax - baseAccGyrovalues.ax) < 4):
    ax = 0

if(abs(ay - baseAccGyrovalues.ay) < 4):
    ay = 0

if(abs(az - baseAccGyrovalues.az) < 4):
    az = 0

但问题仍然存在,这是有道理的,因为如果所有值都为零,则方程 self.cy = AA * (self.cy + gy_rate * dt) + (1 - AA) * accYangle 简化为 self.cy = AA * (self.cy)。作为创可贴,我补充了

if(gx_rate == 0 and gy_rate == 0 and accXangle == 0 and accYangle == 0):
    return task.cont

self.cy 中更新 update() 之前。这产生了非常紧张的运动。


我想知道如何让我的旋转更加“快速”,这样即使我让手机保持静止,立方体也不会向两个方向漂移太多。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)