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

2024-04-29 04:47:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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

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


我想知道如何使我的旋转更“快速”,所以即使我保持手机静止,立方体也不会在任何方向上漂移太多


Tags: selftaskifratedtabsaagy