Python调用ahrs库Complementary互补滤波器出现shape相关报错如何解决
问题原因
你传入的参数维度不符合类的设计要求,不是框架本身的bug。
ahrs库的Complementary类构造函数默认是为批量离线处理设计的,入参gyr、acc、mag要求的是形状为(N, 3)的二维数组,其中N为采样点总数量。你当前传入的是单采样点的一维数组(形状为(3,)),当框架内部执行self.acc[0]取第一个采样点数据时,实际取到的是单浮点值,该值的shape为空元组,因此执行acc.shape[-1]判断时直接触发索引越界错误。
修复方案
根据你的使用场景二选一即可:
场景1:离线批量处理所有IMU数据
无需循环逐点传入,直接把完整的陀螺仪数组、加速度数组传入构造函数即可:
# gl形状为(N,3),al形状为(N,3),N为总采样点数 comp_filter = ahrs.filters.complementary.Complementary(gyr=gl, acc=al, frequency=200) # 所有采样点对应的四元数结果存在comp_filter.Q中
场景2:实时逐帧处理单组IMU数据
不要每次新建Complementary实例,改用update方法逐点更新姿态:
# 先初始化滤波器 comp_filter = ahrs.filters.complementary.Complementary(frequency=200) # 初始姿态可以设为单位四元数,也可以用第一帧加速度数据自行计算 comp_filter.Q = np.array([1., 0., 0., 0.]) # 逐帧处理时调用 for gyr_data, acc_data in zip(gl, al): current_q = comp_filter.update(q=comp_filter.Q, gyr=gyr_data, acc=acc_data) # 处理当前帧的四元数结果current_q
如果非要沿用你原有逐点初始化的写法(非常不推荐,性能极低),只需要把单帧数据升为二维即可:
comp.append(ahrs.filters.complementary.Complementary(ele[0].reshape(1,3), ele[1].reshape(1,3), None, 200))
内容的提问来源于stack exchange,提问作者Lukas S
相关产品推荐
相关产品推荐

